@mohasinac/appkit 4.59.0 β 4.60.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-stamp.json +3 -3
- package/dist/_internal/client/features/layout/DashboardLayoutClient.js +62 -5
- package/dist/_internal/client/features/maintenance/views/MaintenanceDashboardView.js +2 -2
- package/dist/_internal/server/features/brands/actions.js +78 -4
- package/dist/_internal/server/features/checkout/actions.d.ts +36 -13
- package/dist/_internal/server/features/checkout/actions.js +668 -183
- package/dist/_internal/server/features/checkout/supplier-identity.js +18 -1
- package/dist/_internal/server/features/gateway-events/index.d.ts +10 -0
- package/dist/_internal/server/features/gateway-events/index.js +10 -0
- package/dist/_internal/server/features/gateway-events/ingest.d.ts +127 -0
- package/dist/_internal/server/features/gateway-events/ingest.js +188 -0
- package/dist/_internal/server/features/gateway-events/redact.d.ts +66 -0
- package/dist/_internal/server/features/gateway-events/redact.js +151 -0
- package/dist/_internal/server/features/grievance/actions.d.ts +63 -0
- package/dist/_internal/server/features/grievance/actions.js +173 -0
- package/dist/_internal/server/features/grievance/index.d.ts +8 -0
- package/dist/_internal/server/features/grievance/index.js +8 -0
- package/dist/_internal/server/features/grouped/data.js +28 -3
- package/dist/_internal/server/features/lottery/actions.js +99 -4
- package/dist/_internal/server/features/order-completion/actions.d.ts +92 -0
- package/dist/_internal/server/features/order-completion/actions.js +336 -0
- package/dist/_internal/server/features/order-completion/index.d.ts +7 -0
- package/dist/_internal/server/features/order-completion/index.js +7 -0
- package/dist/_internal/server/features/orders/actions.d.ts +13 -0
- package/dist/_internal/server/features/orders/actions.js +56 -2
- package/dist/_internal/server/features/orders/adapters.d.ts +20 -2
- package/dist/_internal/server/features/orders/adapters.js +44 -0
- package/dist/_internal/server/features/orders/cancellation-refund.d.ts +116 -0
- package/dist/_internal/server/features/orders/cancellation-refund.js +466 -0
- package/dist/_internal/server/features/orders/index.d.ts +2 -1
- package/dist/_internal/server/features/orders/index.js +1 -1
- package/dist/_internal/server/features/orders/service.d.ts +60 -0
- package/dist/_internal/server/features/orders/service.js +74 -0
- package/dist/_internal/server/features/payment-cases/disputes.d.ts +76 -0
- package/dist/_internal/server/features/payment-cases/disputes.js +241 -0
- package/dist/_internal/server/features/payment-cases/index.d.ts +9 -0
- package/dist/_internal/server/features/payment-cases/index.js +9 -0
- package/dist/_internal/server/features/payouts/actions.d.ts +28 -3
- package/dist/_internal/server/features/payouts/actions.js +84 -10
- package/dist/_internal/server/features/points/adjust.d.ts +61 -0
- package/dist/_internal/server/features/points/adjust.js +121 -0
- package/dist/_internal/server/features/points/award.d.ts +65 -0
- package/dist/_internal/server/features/points/award.js +145 -0
- package/dist/_internal/server/features/price-index/market.d.ts +33 -0
- package/dist/_internal/server/features/price-index/market.js +54 -1
- package/dist/_internal/server/features/products/data.js +40 -22
- package/dist/_internal/server/features/protection-claims/actions.d.ts +72 -0
- package/dist/_internal/server/features/protection-claims/actions.js +228 -0
- package/dist/_internal/server/features/protection-claims/index.d.ts +8 -0
- package/dist/_internal/server/features/protection-claims/index.js +8 -0
- package/dist/_internal/server/features/refunds/actions.d.ts +20 -0
- package/dist/_internal/server/features/refunds/actions.js +259 -17
- package/dist/_internal/server/features/refunds/capacity.d.ts +29 -0
- package/dist/_internal/server/features/refunds/capacity.js +37 -0
- package/dist/_internal/server/features/reviews/actions.js +3 -2
- package/dist/_internal/server/features/search/index-build/sources.js +20 -1
- package/dist/_internal/server/features/shipping/reconcile.d.ts +10 -1
- package/dist/_internal/server/features/shipping/reconcile.js +34 -3
- package/dist/_internal/server/features/shipping/reimbursement.d.ts +117 -0
- package/dist/_internal/server/features/shipping/reimbursement.js +223 -0
- package/dist/_internal/server/features/stores/tabs.d.ts +19 -4
- package/dist/_internal/server/features/stores/tabs.js +24 -4
- package/dist/_internal/server/functions/https.d.ts +31 -1
- package/dist/_internal/server/functions/https.js +52 -1
- package/dist/_internal/server/functions/scheduled.d.ts +72 -1
- package/dist/_internal/server/functions/scheduled.js +124 -1
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +62 -16
- package/dist/_internal/server/jobs/core/boxRollupReconcile.d.ts +46 -0
- package/dist/_internal/server/jobs/core/boxRollupReconcile.js +142 -0
- package/dist/_internal/server/jobs/core/dailyDataCleanup.js +149 -1
- package/dist/_internal/server/jobs/core/dailyStatusDigest.d.ts +14 -0
- package/dist/_internal/server/jobs/core/dailyStatusDigest.js +79 -1
- package/dist/_internal/server/jobs/core/index.d.ts +2 -0
- package/dist/_internal/server/jobs/core/index.js +2 -0
- package/dist/_internal/server/jobs/core/marketPriceRollup.d.ts +64 -0
- package/dist/_internal/server/jobs/core/marketPriceRollup.js +153 -0
- package/dist/_internal/server/jobs/core/obligationSweep.d.ts +36 -0
- package/dist/_internal/server/jobs/core/obligationSweep.js +503 -0
- package/dist/_internal/server/jobs/core/paymentReconcile.d.ts +79 -0
- package/dist/_internal/server/jobs/core/paymentReconcile.js +614 -0
- package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +34 -0
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +35 -4
- package/dist/_internal/server/jobs/handlers/boxRollupReconcile.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/boxRollupReconcile.js +15 -0
- package/dist/_internal/server/jobs/handlers/countersReconcileNow.d.ts +65 -0
- package/dist/_internal/server/jobs/handlers/countersReconcileNow.js +89 -0
- package/dist/_internal/server/jobs/handlers/index.d.ts +5 -0
- package/dist/_internal/server/jobs/handlers/index.js +5 -0
- package/dist/_internal/server/jobs/handlers/marketPriceRollup.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/marketPriceRollup.js +2 -0
- package/dist/_internal/server/jobs/handlers/obligationSweep.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/obligationSweep.js +15 -0
- package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.js +30 -1
- package/dist/_internal/server/jobs/handlers/paymentReconcile.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/paymentReconcile.js +6 -0
- package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
- package/dist/_internal/shared/actions/action-registry.js +71 -0
- package/dist/_internal/shared/checkout/coupon-discount.d.ts +73 -0
- package/dist/_internal/shared/checkout/coupon-discount.js +103 -0
- package/dist/_internal/shared/checkout/lanes.d.ts +42 -0
- package/dist/_internal/shared/checkout/lanes.js +46 -0
- package/dist/_internal/shared/checkout/order-math.d.ts +149 -1
- package/dist/_internal/shared/checkout/order-math.js +251 -3
- package/dist/_internal/shared/checkout/refundable-base.d.ts +116 -0
- package/dist/_internal/shared/checkout/refundable-base.js +122 -0
- package/dist/_internal/shared/features/auctions/config.d.ts +14 -1
- package/dist/_internal/shared/features/auctions/config.js +30 -1
- package/dist/_internal/shared/features/brands/schema.d.ts +42 -0
- package/dist/_internal/shared/features/brands/schema.js +18 -0
- package/dist/_internal/shared/features/orders/refund-copy.d.ts +22 -0
- package/dist/_internal/shared/features/orders/refund-copy.js +34 -0
- package/dist/_internal/shared/features/print/label-profiles.d.ts +198 -0
- package/dist/_internal/shared/features/print/label-profiles.js +350 -0
- package/dist/_internal/shared/features/products/to-product-item.js +33 -5
- package/dist/_internal/shared/fees/calculator.d.ts +31 -2
- package/dist/_internal/shared/fees/calculator.js +103 -5
- package/dist/_internal/shared/fees/india-states.d.ts +195 -0
- package/dist/_internal/shared/fees/india-states.js +190 -0
- package/dist/_internal/shared/fees/payout-hold.d.ts +80 -0
- package/dist/_internal/shared/fees/payout-hold.js +74 -0
- package/dist/_internal/shared/obligations/deadlines.d.ts +94 -0
- package/dist/_internal/shared/obligations/deadlines.js +155 -0
- package/dist/_internal/shared/shipping/quote.d.ts +96 -0
- package/dist/_internal/shared/shipping/quote.js +67 -0
- package/dist/_internal/shared/time/business-days.d.ts +91 -0
- package/dist/_internal/shared/time/business-days.js +185 -0
- package/dist/cli/index.js +0 -2
- package/dist/client.d.ts +10 -4
- package/dist/client.js +29 -3
- package/dist/configs/tailwind.d.ts +0 -12
- package/dist/configs/tailwind.js +28 -15
- package/dist/constants/api-endpoints.d.ts +51 -9
- package/dist/constants/api-endpoints.js +23 -7
- package/dist/constants/index.d.ts +1 -1
- package/dist/constants/index.js +1 -1
- package/dist/contracts/index.d.ts +1 -1
- package/dist/contracts/payment.d.ts +131 -0
- package/dist/features/about/components/AboutView.js +1 -1
- package/dist/features/about/components/DeveloperView.js +5 -2
- package/dist/features/about/components/FAQPageView.js +2 -1
- package/dist/features/about/components/FeesView.js +2 -1
- package/dist/features/about/components/HelpPageView.js +2 -1
- package/dist/features/about/components/HowAuctionsWorkView.js +2 -1
- package/dist/features/about/components/HowCheckoutWorksView.js +2 -1
- package/dist/features/about/components/HowEmiWorksView.js +2 -1
- package/dist/features/about/components/HowOffersWorkView.js +2 -1
- package/dist/features/about/components/HowOrdersWorkView.js +2 -1
- package/dist/features/about/components/HowPayoutsWorkView.js +2 -1
- package/dist/features/about/components/HowPreOrdersWorkView.js +2 -1
- package/dist/features/about/components/HowReviewsWorkView.js +2 -1
- package/dist/features/about/components/PolicyPageView.js +2 -1
- package/dist/features/about/components/ProseHero.d.ts +73 -0
- package/dist/features/about/components/ProseHero.js +18 -0
- package/dist/features/about/components/SecurityPrivacyView.js +2 -1
- package/dist/features/about/components/ShippingPolicyView.js +2 -1
- package/dist/features/about/components/TrackOrderView.js +2 -1
- package/dist/features/about/components/UnauthorizedView.js +1 -1
- package/dist/features/about/index.d.ts +2 -0
- package/dist/features/about/index.js +5 -0
- package/dist/features/account/actions/address-actions.d.ts +26 -2
- package/dist/features/account/actions/address-actions.js +25 -1
- package/dist/features/account/components/BuyerShoppingGuideView.js +1 -1
- package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
- package/dist/features/account/components/UserOrdersView.js +17 -0
- package/dist/features/account/components/UserSidebar.js +1 -1
- package/dist/features/account/hooks/useNotifications.js +29 -0
- package/dist/features/admin/actions/admin-coupon-actions.js +36 -0
- package/dist/features/admin/components/AdminBeysView.js +2 -2
- package/dist/features/admin/components/AdminBlogEditorView.js +2 -2
- package/dist/features/admin/components/AdminBrandEditorView.js +32 -2
- package/dist/features/admin/components/AdminBundleEditorView.js +1 -1
- package/dist/features/admin/components/AdminCarouselEditorView.js +1 -1
- package/dist/features/admin/components/AdminCategoriesView.js +1 -1
- package/dist/features/admin/components/AdminCategoryEditorView.js +73 -17
- package/dist/features/admin/components/AdminContactEditorView.js +1 -1
- package/dist/features/admin/components/AdminCouponEditorView.js +26 -1
- package/dist/features/admin/components/AdminFaqEditorView.js +1 -1
- package/dist/features/admin/components/AdminFaqsView.js +2 -2
- package/dist/features/admin/components/AdminGatewayEventsView.d.ts +54 -0
- package/dist/features/admin/components/AdminGatewayEventsView.js +209 -0
- package/dist/features/admin/components/AdminGuideHubView.js +1 -1
- package/dist/features/admin/components/AdminMoneyCasesView.d.ts +60 -0
- package/dist/features/admin/components/AdminMoneyCasesView.js +287 -0
- package/dist/features/admin/components/AdminPartsView.js +2 -2
- package/dist/features/admin/components/AdminProductsView.js +75 -4
- package/dist/features/admin/components/AdminSidebar.js +2 -2
- package/dist/features/admin/components/AdminSiteSettingsView.js +65 -7
- package/dist/features/admin/components/AdminSublistingCategoriesView.js +2 -0
- package/dist/features/admin/components/AdminSupportTicketDetailView.js +1 -1
- package/dist/features/admin/components/AdminSupportTicketsView.js +2 -2
- package/dist/features/admin/components/AdminTesterChecklistView.js +2 -2
- package/dist/features/admin/components/AdminUsersView.js +72 -1
- package/dist/features/admin/components/AdminViewCards.d.ts +3 -1
- package/dist/features/admin/components/AdminViewCards.js +4 -4
- package/dist/features/admin/components/DataListingView.d.ts +28 -0
- package/dist/features/admin/components/DataListingView.js +175 -14
- package/dist/features/admin/components/DataTable.d.ts +12 -1
- package/dist/features/admin/components/DataTable.js +3 -3
- package/dist/features/admin/components/OwnerQuickActions.d.ts +1 -1
- package/dist/features/admin/components/OwnerQuickActions.js +60 -2
- package/dist/features/admin/components/RecordOwnerQuickActions.d.ts +1 -1
- package/dist/features/admin/components/RecordOwnerQuickActions.js +61 -14
- package/dist/features/admin/components/analytics/AdminStatCard.d.ts +35 -1
- package/dist/features/admin/components/analytics/AdminStatCard.js +77 -2
- package/dist/features/admin/components/index.d.ts +4 -0
- package/dist/features/admin/components/index.js +6 -0
- package/dist/features/admin/constants/filter-tabs.d.ts +156 -0
- package/dist/features/admin/constants/filter-tabs.js +106 -0
- package/dist/features/admin/repository/site-settings.repository.d.ts +22 -0
- package/dist/features/admin/repository/site-settings.repository.js +82 -1
- package/dist/features/admin/schemas/admin-editor-forms.d.ts +21 -0
- package/dist/features/admin/schemas/admin-editor-forms.js +44 -0
- package/dist/features/admin/schemas/firestore.js +5 -1
- package/dist/features/admin/schemas/site-settings-form.js +30 -1
- package/dist/features/auctions/actions/bid-actions.js +13 -1
- package/dist/features/auctions/components/AuctionBottomActions.js +2 -2
- package/dist/features/auctions/components/AuctionDetailPageView.js +3 -1
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +11 -0
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +5 -3
- package/dist/features/auctions/components/PlaceBidFormClient.d.ts +8 -1
- package/dist/features/auctions/components/PlaceBidFormClient.js +2 -2
- package/dist/features/audit-log/schemas/firestore.d.ts +28 -0
- package/dist/features/audit-log/schemas/firestore.js +14 -0
- package/dist/features/auth/permissions/constants.d.ts +17 -1
- package/dist/features/auth/permissions/constants.js +18 -0
- package/dist/features/blog/components/BlogPostView.js +1 -1
- package/dist/features/catalogue/components/AdminCatalogueApprovalsView.js +1 -1
- package/dist/features/categories/api/[id]/description-template/route.js +107 -1
- package/dist/features/categories/components/BrandDetailPageView.js +2 -2
- package/dist/features/categories/components/BreadcrumbTrail.js +7 -1
- package/dist/features/categories/components/BundleDetailView.js +1 -1
- package/dist/features/categories/components/CategoryDetailPageView.js +2 -2
- package/dist/features/categories/components/CategoryForm.js +12 -1
- package/dist/features/categories/components/CategoryTemplatePicker.js +38 -5
- package/dist/features/categories/repository/market-price-index.repository.d.ts +123 -0
- package/dist/features/categories/repository/market-price-index.repository.js +105 -0
- package/dist/features/categories/repository/price-observation.repository.d.ts +166 -0
- package/dist/features/categories/repository/price-observation.repository.js +132 -0
- package/dist/features/events/components/EventSaleBanner.js +1 -1
- package/dist/features/events/components/EventStatusBadge.js +1 -1
- package/dist/features/faq/components/FAQAccordion.js +2 -1
- package/dist/features/faq/components/FAQCategorySidebar.js +2 -2
- package/dist/features/faq/components/FAQHelpfulButtons.js +4 -4
- package/dist/features/faq/components/RelatedFAQs.js +1 -1
- package/dist/features/filters/FilterFacetSection.js +1 -1
- package/dist/features/filters/SwitchFilter.js +1 -1
- package/dist/features/gateway-events/repository/gateway-events.repository.d.ts +117 -0
- package/dist/features/gateway-events/repository/gateway-events.repository.js +274 -0
- package/dist/features/gateway-events/schemas/firestore.d.ts +217 -0
- package/dist/features/gateway-events/schemas/firestore.js +125 -0
- package/dist/features/gateway-events/schemas/index.d.ts +81 -0
- package/dist/features/gateway-events/schemas/index.js +79 -0
- package/dist/features/grouped/components/GroupedListingDetailView.js +1 -1
- package/dist/features/homepage/components/AnnouncementBar.js +37 -1
- package/dist/features/homepage/components/AnnouncementBar.style.css +30 -0
- package/dist/features/homepage/components/BrandsSection.js +1 -1
- package/dist/features/homepage/components/CTABannerSection.js +1 -1
- package/dist/features/homepage/components/FeaturedBundlesSection.js +14 -24
- package/dist/features/homepage/components/HeroCarousel.js +2 -2
- package/dist/features/homepage/components/SocialPostCard.js +1 -1
- package/dist/features/inventory/components/AdminMoveLedgerView.d.ts +7 -0
- package/dist/features/inventory/components/AdminMoveLedgerView.js +157 -0
- package/dist/features/inventory/components/AdminStorageBoxesView.d.ts +11 -0
- package/dist/features/inventory/components/AdminStorageBoxesView.js +168 -0
- package/dist/features/inventory/components/ReceiveStationView.d.ts +39 -0
- package/dist/features/inventory/components/ReceiveStationView.js +413 -0
- package/dist/features/inventory/components/operator-message.d.ts +29 -0
- package/dist/features/inventory/components/operator-message.js +41 -0
- package/dist/features/inventory/index.d.ts +13 -0
- package/dist/features/inventory/index.js +28 -0
- package/dist/features/inventory/repository/inventory-movements.repository.d.ts +97 -0
- package/dist/features/inventory/repository/inventory-movements.repository.js +186 -0
- package/dist/features/inventory/repository/inventory-placements.repository.d.ts +179 -0
- package/dist/features/inventory/repository/inventory-placements.repository.js +345 -0
- package/dist/features/inventory/repository/storage-boxes.repository.d.ts +83 -0
- package/dist/features/inventory/repository/storage-boxes.repository.js +127 -0
- package/dist/features/inventory/schemas/firestore.d.ts +197 -0
- package/dist/features/inventory/schemas/firestore.js +159 -0
- package/dist/features/layout/AppLayoutShell.d.ts +12 -1
- package/dist/features/layout/AppLayoutShell.js +25 -12
- package/dist/features/layout/AutoBreadcrumbs.js +162 -3
- package/dist/features/layout/AutoBreadcrumbs.style.css +45 -0
- package/dist/features/layout/BottomNavbar.d.ts +1 -1
- package/dist/features/layout/BottomNavbar.js +2 -2
- package/dist/features/media/MediaAvatar.js +1 -1
- package/dist/features/media/MediaImage.d.ts +24 -4
- package/dist/features/media/MediaImage.js +44 -4
- package/dist/features/media/MediaLightbox.js +1 -1
- package/dist/features/media/modals/ImageCropModal.js +1 -1
- package/dist/features/media/modals/ImageEditor.js +1 -1
- package/dist/features/media/upload/MediaUploadField.js +91 -3
- package/dist/features/obligations/constants/policies.d.ts +92 -0
- package/dist/features/obligations/constants/policies.js +378 -0
- package/dist/features/obligations/repository/obligations.repository.d.ts +68 -0
- package/dist/features/obligations/repository/obligations.repository.js +158 -0
- package/dist/features/obligations/schemas/firestore.d.ts +160 -0
- package/dist/features/obligations/schemas/firestore.js +87 -0
- package/dist/features/orders/actions/order-actions.d.ts +43 -4
- package/dist/features/orders/actions/order-actions.js +60 -3
- package/dist/features/orders/actions/refund-actions.js +70 -10
- package/dist/features/orders/components/OrderCompletionPanel.d.ts +27 -0
- package/dist/features/orders/components/OrderCompletionPanel.js +192 -0
- package/dist/features/orders/components/OrdersList.js +2 -2
- package/dist/features/orders/components/RefundHistoryTable.js +3 -1
- package/dist/features/orders/components/index.d.ts +2 -0
- package/dist/features/orders/components/index.js +6 -0
- package/dist/features/orders/constants/transitions.d.ts +59 -0
- package/dist/features/orders/constants/transitions.js +104 -0
- package/dist/features/orders/repository/orders.repository.d.ts +109 -6
- package/dist/features/orders/repository/orders.repository.js +464 -21
- package/dist/features/orders/schemas/firestore.d.ts +270 -0
- package/dist/features/orders/schemas/firestore.js +24 -0
- package/dist/features/orders/schemas/index.d.ts +61 -0
- package/dist/features/orders/schemas/index.js +22 -0
- package/dist/features/orders/types/index.d.ts +79 -0
- package/dist/features/parts/components/PartsIndexPageView.js +8 -1
- package/dist/features/payment-cases/repository/payment-cases.repository.d.ts +170 -0
- package/dist/features/payment-cases/repository/payment-cases.repository.js +342 -0
- package/dist/features/payment-cases/schemas/firestore.d.ts +229 -0
- package/dist/features/payment-cases/schemas/firestore.js +105 -0
- package/dist/features/payment-cases/schemas/resolve-form.d.ts +97 -0
- package/dist/features/payment-cases/schemas/resolve-form.js +114 -0
- package/dist/features/payments/repository/payout.repository.d.ts +0 -1
- package/dist/features/payments/repository/payout.repository.js +0 -1
- package/dist/features/points/repository/points.repository.d.ts +122 -0
- package/dist/features/points/repository/points.repository.js +304 -1
- package/dist/features/points/schemas/adjust-form.d.ts +58 -0
- package/dist/features/points/schemas/adjust-form.js +63 -0
- package/dist/features/points/schemas/firestore.d.ts +108 -1
- package/dist/features/points/schemas/firestore.js +84 -0
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -3
- package/dist/features/pre-orders/components/PreOrderBadge.js +1 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +1 -1
- package/dist/features/price-index/components/PriceIndexToolView.d.ts +23 -4
- package/dist/features/price-index/components/PriceIndexToolView.js +71 -6
- package/dist/features/price-index/market-stats.d.ts +82 -0
- package/dist/features/price-index/market-stats.js +230 -0
- package/dist/features/print/components/BoxLabelPrintView.d.ts +25 -0
- package/dist/features/print/components/BoxLabelPrintView.js +66 -0
- package/dist/features/print/components/LabelProfilePicker.d.ts +13 -0
- package/dist/features/print/components/LabelProfilePicker.js +38 -0
- package/dist/features/print/components/labels.d.ts +117 -0
- package/dist/features/print/components/labels.js +258 -0
- package/dist/features/print/components/labels.style.css +46 -0
- package/dist/features/print/index.d.ts +6 -0
- package/dist/features/print/index.js +16 -0
- package/dist/features/products/columns/productTableColumns.js +5 -4
- package/dist/features/products/components/MarketplaceBundleCard.js +2 -2
- package/dist/features/products/components/MarketplacePrizeDrawCard.js +6 -6
- package/dist/features/products/components/PrizeDrawCollage.js +1 -1
- package/dist/features/products/components/PrizeDrawItemsEditor.js +1 -1
- package/dist/features/products/components/PrizeRevealModal.js +2 -2
- package/dist/features/products/components/ProductDetailPageView.js +18 -4
- package/dist/features/products/components/ProductForm.js +34 -23
- package/dist/features/products/components/ProductGrid.js +86 -62
- package/dist/features/products/constants/card-badges.d.ts +97 -0
- package/dist/features/products/constants/card-badges.js +100 -0
- package/dist/features/products/repository/products.repository.js +34 -1
- package/dist/features/products/schemas/firestore.d.ts +46 -3
- package/dist/features/products/schemas/firestore.js +21 -0
- package/dist/features/promotions/components/PromotionsView.js +1 -1
- package/dist/features/promotions/repository/claimed-coupons.repository.d.ts +32 -0
- package/dist/features/promotions/repository/claimed-coupons.repository.js +58 -0
- package/dist/features/promotions/schemas/firestore.js +30 -3
- package/dist/features/promotions/schemas/index.d.ts +6 -6
- package/dist/features/protection-claims/repository/protection-claims.repository.d.ts +54 -0
- package/dist/features/protection-claims/repository/protection-claims.repository.js +174 -0
- package/dist/features/protection-claims/schemas/firestore.d.ts +168 -0
- package/dist/features/protection-claims/schemas/firestore.js +130 -0
- package/dist/features/reviews/actions/review-actions.js +3 -2
- package/dist/features/reviews/components/ReviewModal.js +1 -1
- package/dist/features/reviews/components/ReviewsList.js +1 -1
- package/dist/features/reviews/schemas/firestore.d.ts +20 -1
- package/dist/features/scams/constants/scam-types.d.ts +2 -0
- package/dist/features/scams/constants/scam-types.js +18 -0
- package/dist/features/scams/schemas/report-form.d.ts +3 -3
- package/dist/features/scams/schemas/report-form.js +26 -1
- package/dist/features/search/components/Search.js +9 -9
- package/dist/features/search/components/SearchResultsClient.js +18 -3
- package/dist/features/search/components/SearchResultsPageView.d.ts +1 -6
- package/dist/features/search/components/SearchResultsPageView.js +2 -2
- package/dist/features/seller/actions/offer-actions.js +16 -1
- package/dist/features/seller/actions/seller-actions.js +14 -3
- package/dist/features/seller/components/CategoryInlineSelect.js +75 -11
- package/dist/features/seller/components/PrintCenterView.d.ts +5 -0
- package/dist/features/seller/components/PrintCenterView.js +41 -30
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutRequestView.js +16 -5
- package/dist/features/seller/components/SellerPayoutSettingsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.d.ts +16 -0
- package/dist/features/seller/components/SellerProductShell.js +123 -13
- package/dist/features/seller/components/SellerReviewsView.js +4 -2
- package/dist/features/seller/components/SellerSidebar.js +1 -1
- package/dist/features/seller/schemas/coupon-form.d.ts +26 -0
- package/dist/features/seller/schemas/coupon-form.js +27 -0
- package/dist/features/seller/schemas/product-form.d.ts +3 -0
- package/dist/features/seller/schemas/product-form.js +5 -0
- package/dist/features/shell/FormShell.js +2 -2
- package/dist/features/shell/QuickFormDrawer.js +14 -0
- package/dist/features/shell/SectionForm.d.ts +19 -0
- package/dist/features/shell/SectionForm.js +133 -9
- package/dist/features/shell/SectionForm.style.css +54 -0
- package/dist/features/shipments/components/AdminShipmentsView.js +16 -1
- package/dist/features/shipments/repository/shipment-items.repository.d.ts +9 -0
- package/dist/features/shipments/repository/shipment-items.repository.js +14 -0
- package/dist/features/site-settings/components/ActionPermissionsManager.js +1 -1
- package/dist/features/sticker-trace/components/StickerCommitPanel.js +1 -1
- package/dist/features/store-extensions/schemas/report-review-form.d.ts +8 -8
- package/dist/features/stores/components/StoreGuideHubView.js +1 -1
- package/dist/features/stores/components/StoreHeader.js +1 -1
- package/dist/features/support/schemas/firestore.d.ts +73 -2
- package/dist/features/support/schemas/firestore.js +59 -0
- package/dist/index.d.ts +16 -24
- package/dist/index.js +38 -47
- package/dist/next/ErrorBoundary.js +1 -1
- package/dist/next/routing/route-map.d.ts +24 -0
- package/dist/next/routing/route-map.js +40 -0
- package/dist/providers/payment-manual/index.d.ts +15 -1
- package/dist/providers/payment-manual/index.js +37 -0
- package/dist/providers/payment-phonepe/index.d.ts +14 -1
- package/dist/providers/payment-phonepe/index.js +36 -0
- package/dist/providers/payment-razorpay/index.d.ts +44 -1
- package/dist/providers/payment-razorpay/index.js +99 -0
- package/dist/providers/shipping-shiprocket/index.d.ts +18 -0
- package/dist/providers/shipping-shiprocket/index.js +18 -0
- package/dist/schemas/registry.d.ts +44 -11
- package/dist/server-entry.d.ts +2 -0
- package/dist/server-entry.js +27 -0
- package/dist/server.d.ts +43 -0
- package/dist/server.js +98 -0
- package/dist/styles.css +418 -149
- package/dist/tailwind-utilities.css +1 -1
- package/dist/tokens/themes/default-dark.js +15 -12
- package/dist/tokens/themes/default-light.js +14 -11
- package/dist/tokens/tokens.css +106 -23
- package/dist/ui/DataTable.style.css +4 -4
- package/dist/ui/columns/cell-renderers.d.ts +20 -0
- package/dist/ui/columns/cell-renderers.js +26 -1
- package/dist/ui/columns/index.d.ts +1 -1
- package/dist/ui/columns/index.js +4 -1
- package/dist/ui/components/Badge.style.css +1 -1
- package/dist/ui/components/Breadcrumb.js +19 -1
- package/dist/ui/components/BulkActionBar.style.css +4 -4
- package/dist/ui/components/Button.style.css +1 -1
- package/dist/ui/components/Checkbox.style.css +1 -1
- package/dist/ui/components/FallbackShell.js +1 -1
- package/dist/ui/components/Form.d.ts +14 -1
- package/dist/ui/components/Form.js +2 -2
- package/dist/ui/components/FormField.js +18 -4
- package/dist/ui/components/FormField.style.css +43 -3
- package/dist/ui/components/GatedPrice.style.css +1 -1
- package/dist/ui/components/IconButton.style.css +1 -1
- package/dist/ui/components/Input.js +22 -1
- package/dist/ui/components/Input.style.css +38 -22
- package/dist/ui/components/ListingFilterDrawer.js +1 -1
- package/dist/ui/components/ListingToolbar.js +1 -1
- package/dist/ui/components/PaginatedSelect.js +0 -0
- package/dist/ui/components/Radio.style.css +1 -1
- package/dist/ui/components/Repeater.d.ts +53 -0
- package/dist/ui/components/Repeater.js +7 -0
- package/dist/ui/components/RichTextEditor.d.ts +20 -1
- package/dist/ui/components/RichTextEditor.js +23 -2
- package/dist/ui/components/Select.style.css +7 -21
- package/dist/ui/components/Semantic.js +27 -3
- package/dist/ui/components/TagInput.style.css +4 -9
- package/dist/ui/components/Textarea.style.css +4 -18
- package/dist/ui/components/Toggle.style.css +1 -1
- package/dist/ui/components/Typography.d.ts +3 -3
- package/dist/ui/components/Typography.js +15 -15
- package/dist/ui/components/ViewToggle.style.css +4 -4
- package/dist/ui/forms/AddAnotherToggle.d.ts +16 -0
- package/dist/ui/forms/AddAnotherToggle.js +56 -0
- package/dist/ui/forms/ColorPickerField.js +15 -2
- package/dist/ui/forms/FieldCheckbox.js +15 -2
- package/dist/ui/forms/FieldInput.d.ts +22 -1
- package/dist/ui/forms/FieldInput.js +19 -5
- package/dist/ui/forms/FieldLabel.d.ts +35 -0
- package/dist/ui/forms/FieldLabel.js +70 -0
- package/dist/ui/forms/FieldSelect.d.ts +4 -1
- package/dist/ui/forms/FieldSelect.js +27 -5
- package/dist/ui/forms/FieldTextarea.d.ts +4 -1
- package/dist/ui/forms/FieldTextarea.js +22 -5
- package/dist/ui/forms/FormShell.d.ts +17 -1
- package/dist/ui/forms/FormShell.js +36 -2
- package/dist/ui/forms/FormShell.style.css +41 -33
- package/dist/ui/forms/index.d.ts +5 -1
- package/dist/ui/forms/index.js +2 -0
- package/dist/ui/icons/icon-registry.d.ts +1 -0
- package/dist/ui/icons/icon-registry.js +17 -1
- package/dist/utils/id-generators.d.ts +80 -0
- package/dist/utils/id-generators.js +93 -0
- package/dist/utils/search-txt-builders.d.ts +12 -0
- package/dist/utils/search-txt-builders.js +17 -0
- package/package.json +1 -1
- package/scripts/seed-cli.mjs +106 -5
- package/dist/features/loyalty/api/admin/loyalty/grant/route.d.ts +0 -12
- package/dist/features/loyalty/api/admin/loyalty/grant/route.js +0 -38
- package/dist/features/loyalty/api/balance/route.d.ts +0 -12
- package/dist/features/loyalty/api/balance/route.js +0 -41
- package/dist/features/loyalty/api/earn/route.d.ts +0 -12
- package/dist/features/loyalty/api/earn/route.js +0 -38
- package/dist/features/loyalty/api/history/route.d.ts +0 -12
- package/dist/features/loyalty/api/history/route.js +0 -58
- package/dist/features/loyalty/api/redeem/route.d.ts +0 -12
- package/dist/features/loyalty/api/redeem/route.js +0 -38
- package/dist/features/loyalty/columns/index.d.ts +0 -17
- package/dist/features/loyalty/columns/index.js +0 -40
- package/dist/features/loyalty/components/CoinsDisplay.d.ts +0 -12
- package/dist/features/loyalty/components/CoinsDisplay.js +0 -10
- package/dist/features/loyalty/components/index.d.ts +0 -1
- package/dist/features/loyalty/components/index.js +0 -1
- package/dist/features/loyalty/hooks/useLoyaltyBalance.d.ts +0 -4
- package/dist/features/loyalty/hooks/useLoyaltyBalance.js +0 -25
- package/dist/features/loyalty/index.d.ts +0 -6
- package/dist/features/loyalty/index.js +0 -6
- package/dist/features/loyalty/manifest.d.ts +0 -2
- package/dist/features/loyalty/manifest.js +0 -16
- package/dist/features/loyalty/messages/en.json +0 -19
- package/dist/features/loyalty/repository/loyalty.repository.d.ts +0 -8
- package/dist/features/loyalty/repository/loyalty.repository.js +0 -22
- package/dist/features/loyalty/schemas/index.d.ts +0 -85
- package/dist/features/loyalty/schemas/index.js +0 -40
- package/dist/features/loyalty/server.d.ts +0 -6
- package/dist/features/loyalty/server.js +0 -6
- package/dist/features/loyalty/types/index.d.ts +0 -31
- package/dist/features/loyalty/types/index.js +0 -1
- package/dist/features/loyalty/types/loyalty-config.d.ts +0 -7
- package/dist/features/loyalty/types/loyalty-config.js +0 -1
- package/dist/features/loyalty/types/loyalty-math.d.ts +0 -9
- package/dist/features/loyalty/types/loyalty-math.js +0 -27
- package/dist/features/products/components/ProductOwnerQuickActions.d.ts +0 -11
- package/dist/features/products/components/ProductOwnerQuickActions.js +0 -120
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Indian states and union territories, resolved to ONE canonical key from any
|
|
3
|
+
* of the three spellings that actually occur in our data.
|
|
4
|
+
*
|
|
5
|
+
* WHY (G2): place of supply was compared by normalised STRING EQUALITY β
|
|
6
|
+
* lowercase, strip punctuation, collapse whitespace, then `a === b`. That is
|
|
7
|
+
* correct only when both sides happen to be written the same way, and they are
|
|
8
|
+
* not:
|
|
9
|
+
*
|
|
10
|
+
* Β· `StoreDocument`'s pickup address state is typed by a seller ("Karnataka",
|
|
11
|
+
* "karnataka", "KA", "Karnatak")
|
|
12
|
+
* Β· a buyer's delivery address is typed by the buyer
|
|
13
|
+
* Β· a GSTIN carries the state as a two-digit CODE in its first two
|
|
14
|
+
* characters ("29" = Karnataka) β and the old normaliser's
|
|
15
|
+
* `.replace(/[^a-z\s]/g, " ")` stripped digits entirely, so a numeric
|
|
16
|
+
* state resolved to `null`
|
|
17
|
+
*
|
|
18
|
+
* So `"KA"` vs `"Karnataka"` compared unequal, the supply read as INTER-state,
|
|
19
|
+
* and the order recorded **IGST where CGST+SGST was due**. Silently: there is
|
|
20
|
+
* no error, and the TOTAL is identical either way (IGST total == CGST+SGST
|
|
21
|
+
* total), so nothing downstream disagreed. Only the invoice's tax split was
|
|
22
|
+
* wrong, which is exactly the part a GST return is built from.
|
|
23
|
+
*
|
|
24
|
+
* π The total being unaffected is why this is a COMPLIANCE defect rather than
|
|
25
|
+
* a money defect, and why it could live indefinitely. Do not downgrade it on
|
|
26
|
+
* that basis: the split is what gets filed.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Canonical key β the GST state code and the display name.
|
|
30
|
+
*
|
|
31
|
+
* Codes are the official GST state codes (the first two digits of a GSTIN).
|
|
32
|
+
* π They are LITERAL and ordered by code, so the table can be read against
|
|
33
|
+
* the published list rather than trusted.
|
|
34
|
+
*/
|
|
35
|
+
export declare const INDIA_STATES: {
|
|
36
|
+
readonly "jammu-kashmir": {
|
|
37
|
+
readonly code: "01";
|
|
38
|
+
readonly name: "Jammu and Kashmir";
|
|
39
|
+
};
|
|
40
|
+
readonly "himachal-pradesh": {
|
|
41
|
+
readonly code: "02";
|
|
42
|
+
readonly name: "Himachal Pradesh";
|
|
43
|
+
};
|
|
44
|
+
readonly punjab: {
|
|
45
|
+
readonly code: "03";
|
|
46
|
+
readonly name: "Punjab";
|
|
47
|
+
};
|
|
48
|
+
readonly chandigarh: {
|
|
49
|
+
readonly code: "04";
|
|
50
|
+
readonly name: "Chandigarh";
|
|
51
|
+
};
|
|
52
|
+
readonly uttarakhand: {
|
|
53
|
+
readonly code: "05";
|
|
54
|
+
readonly name: "Uttarakhand";
|
|
55
|
+
};
|
|
56
|
+
readonly haryana: {
|
|
57
|
+
readonly code: "06";
|
|
58
|
+
readonly name: "Haryana";
|
|
59
|
+
};
|
|
60
|
+
readonly delhi: {
|
|
61
|
+
readonly code: "07";
|
|
62
|
+
readonly name: "Delhi";
|
|
63
|
+
};
|
|
64
|
+
readonly rajasthan: {
|
|
65
|
+
readonly code: "08";
|
|
66
|
+
readonly name: "Rajasthan";
|
|
67
|
+
};
|
|
68
|
+
readonly "uttar-pradesh": {
|
|
69
|
+
readonly code: "09";
|
|
70
|
+
readonly name: "Uttar Pradesh";
|
|
71
|
+
};
|
|
72
|
+
readonly bihar: {
|
|
73
|
+
readonly code: "10";
|
|
74
|
+
readonly name: "Bihar";
|
|
75
|
+
};
|
|
76
|
+
readonly sikkim: {
|
|
77
|
+
readonly code: "11";
|
|
78
|
+
readonly name: "Sikkim";
|
|
79
|
+
};
|
|
80
|
+
readonly "arunachal-pradesh": {
|
|
81
|
+
readonly code: "12";
|
|
82
|
+
readonly name: "Arunachal Pradesh";
|
|
83
|
+
};
|
|
84
|
+
readonly nagaland: {
|
|
85
|
+
readonly code: "13";
|
|
86
|
+
readonly name: "Nagaland";
|
|
87
|
+
};
|
|
88
|
+
readonly manipur: {
|
|
89
|
+
readonly code: "14";
|
|
90
|
+
readonly name: "Manipur";
|
|
91
|
+
};
|
|
92
|
+
readonly mizoram: {
|
|
93
|
+
readonly code: "15";
|
|
94
|
+
readonly name: "Mizoram";
|
|
95
|
+
};
|
|
96
|
+
readonly tripura: {
|
|
97
|
+
readonly code: "16";
|
|
98
|
+
readonly name: "Tripura";
|
|
99
|
+
};
|
|
100
|
+
readonly meghalaya: {
|
|
101
|
+
readonly code: "17";
|
|
102
|
+
readonly name: "Meghalaya";
|
|
103
|
+
};
|
|
104
|
+
readonly assam: {
|
|
105
|
+
readonly code: "18";
|
|
106
|
+
readonly name: "Assam";
|
|
107
|
+
};
|
|
108
|
+
readonly "west-bengal": {
|
|
109
|
+
readonly code: "19";
|
|
110
|
+
readonly name: "West Bengal";
|
|
111
|
+
};
|
|
112
|
+
readonly jharkhand: {
|
|
113
|
+
readonly code: "20";
|
|
114
|
+
readonly name: "Jharkhand";
|
|
115
|
+
};
|
|
116
|
+
readonly odisha: {
|
|
117
|
+
readonly code: "21";
|
|
118
|
+
readonly name: "Odisha";
|
|
119
|
+
};
|
|
120
|
+
readonly chhattisgarh: {
|
|
121
|
+
readonly code: "22";
|
|
122
|
+
readonly name: "Chhattisgarh";
|
|
123
|
+
};
|
|
124
|
+
readonly "madhya-pradesh": {
|
|
125
|
+
readonly code: "23";
|
|
126
|
+
readonly name: "Madhya Pradesh";
|
|
127
|
+
};
|
|
128
|
+
readonly gujarat: {
|
|
129
|
+
readonly code: "24";
|
|
130
|
+
readonly name: "Gujarat";
|
|
131
|
+
};
|
|
132
|
+
readonly "dadra-nagar-haveli-daman-diu": {
|
|
133
|
+
readonly code: "26";
|
|
134
|
+
readonly name: "Dadra and Nagar Haveli and Daman and Diu";
|
|
135
|
+
};
|
|
136
|
+
readonly maharashtra: {
|
|
137
|
+
readonly code: "27";
|
|
138
|
+
readonly name: "Maharashtra";
|
|
139
|
+
};
|
|
140
|
+
readonly karnataka: {
|
|
141
|
+
readonly code: "29";
|
|
142
|
+
readonly name: "Karnataka";
|
|
143
|
+
};
|
|
144
|
+
readonly goa: {
|
|
145
|
+
readonly code: "30";
|
|
146
|
+
readonly name: "Goa";
|
|
147
|
+
};
|
|
148
|
+
readonly lakshadweep: {
|
|
149
|
+
readonly code: "31";
|
|
150
|
+
readonly name: "Lakshadweep";
|
|
151
|
+
};
|
|
152
|
+
readonly kerala: {
|
|
153
|
+
readonly code: "32";
|
|
154
|
+
readonly name: "Kerala";
|
|
155
|
+
};
|
|
156
|
+
readonly "tamil-nadu": {
|
|
157
|
+
readonly code: "33";
|
|
158
|
+
readonly name: "Tamil Nadu";
|
|
159
|
+
};
|
|
160
|
+
readonly puducherry: {
|
|
161
|
+
readonly code: "34";
|
|
162
|
+
readonly name: "Puducherry";
|
|
163
|
+
};
|
|
164
|
+
readonly "andaman-nicobar": {
|
|
165
|
+
readonly code: "35";
|
|
166
|
+
readonly name: "Andaman and Nicobar Islands";
|
|
167
|
+
};
|
|
168
|
+
readonly telangana: {
|
|
169
|
+
readonly code: "36";
|
|
170
|
+
readonly name: "Telangana";
|
|
171
|
+
};
|
|
172
|
+
readonly "andhra-pradesh": {
|
|
173
|
+
readonly code: "37";
|
|
174
|
+
readonly name: "Andhra Pradesh";
|
|
175
|
+
};
|
|
176
|
+
readonly ladakh: {
|
|
177
|
+
readonly code: "38";
|
|
178
|
+
readonly name: "Ladakh";
|
|
179
|
+
};
|
|
180
|
+
};
|
|
181
|
+
export type IndiaStateKey = keyof typeof INDIA_STATES;
|
|
182
|
+
/**
|
|
183
|
+
* Resolve any spelling β canonical key, full name, abbreviation, former name,
|
|
184
|
+
* or a two-digit GST state code β to one canonical key, or `null`.
|
|
185
|
+
*
|
|
186
|
+
* π The numeric branch runs FIRST and before any letter-stripping, because
|
|
187
|
+
* the old normaliser destroyed digits. A state held as `"29"` or as a full
|
|
188
|
+
* GSTIN (`"29ABCDE1234F1Z5"`) is a real shape in this data: `resolveSupplierIdentity`
|
|
189
|
+
* reads a store's GSTIN, and its first two characters are the authoritative
|
|
190
|
+
* place of supply for the seller β more reliable than their typed pickup
|
|
191
|
+
* address, which is what G3 is about.
|
|
192
|
+
*/
|
|
193
|
+
export declare function resolveStateKey(raw: string | undefined | null): IndiaStateKey | null;
|
|
194
|
+
/** The GST state code for any spelling, or `null`. */
|
|
195
|
+
export declare function resolveStateCode(raw: string | undefined | null): string | null;
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Indian states and union territories, resolved to ONE canonical key from any
|
|
3
|
+
* of the three spellings that actually occur in our data.
|
|
4
|
+
*
|
|
5
|
+
* WHY (G2): place of supply was compared by normalised STRING EQUALITY β
|
|
6
|
+
* lowercase, strip punctuation, collapse whitespace, then `a === b`. That is
|
|
7
|
+
* correct only when both sides happen to be written the same way, and they are
|
|
8
|
+
* not:
|
|
9
|
+
*
|
|
10
|
+
* Β· `StoreDocument`'s pickup address state is typed by a seller ("Karnataka",
|
|
11
|
+
* "karnataka", "KA", "Karnatak")
|
|
12
|
+
* Β· a buyer's delivery address is typed by the buyer
|
|
13
|
+
* Β· a GSTIN carries the state as a two-digit CODE in its first two
|
|
14
|
+
* characters ("29" = Karnataka) β and the old normaliser's
|
|
15
|
+
* `.replace(/[^a-z\s]/g, " ")` stripped digits entirely, so a numeric
|
|
16
|
+
* state resolved to `null`
|
|
17
|
+
*
|
|
18
|
+
* So `"KA"` vs `"Karnataka"` compared unequal, the supply read as INTER-state,
|
|
19
|
+
* and the order recorded **IGST where CGST+SGST was due**. Silently: there is
|
|
20
|
+
* no error, and the TOTAL is identical either way (IGST total == CGST+SGST
|
|
21
|
+
* total), so nothing downstream disagreed. Only the invoice's tax split was
|
|
22
|
+
* wrong, which is exactly the part a GST return is built from.
|
|
23
|
+
*
|
|
24
|
+
* π The total being unaffected is why this is a COMPLIANCE defect rather than
|
|
25
|
+
* a money defect, and why it could live indefinitely. Do not downgrade it on
|
|
26
|
+
* that basis: the split is what gets filed.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Canonical key β the GST state code and the display name.
|
|
30
|
+
*
|
|
31
|
+
* Codes are the official GST state codes (the first two digits of a GSTIN).
|
|
32
|
+
* π They are LITERAL and ordered by code, so the table can be read against
|
|
33
|
+
* the published list rather than trusted.
|
|
34
|
+
*/
|
|
35
|
+
export const INDIA_STATES = {
|
|
36
|
+
"jammu-kashmir": { code: "01", name: "Jammu and Kashmir" },
|
|
37
|
+
"himachal-pradesh": { code: "02", name: "Himachal Pradesh" },
|
|
38
|
+
punjab: { code: "03", name: "Punjab" },
|
|
39
|
+
chandigarh: { code: "04", name: "Chandigarh" },
|
|
40
|
+
uttarakhand: { code: "05", name: "Uttarakhand" },
|
|
41
|
+
haryana: { code: "06", name: "Haryana" },
|
|
42
|
+
delhi: { code: "07", name: "Delhi" },
|
|
43
|
+
rajasthan: { code: "08", name: "Rajasthan" },
|
|
44
|
+
"uttar-pradesh": { code: "09", name: "Uttar Pradesh" },
|
|
45
|
+
bihar: { code: "10", name: "Bihar" },
|
|
46
|
+
sikkim: { code: "11", name: "Sikkim" },
|
|
47
|
+
"arunachal-pradesh": { code: "12", name: "Arunachal Pradesh" },
|
|
48
|
+
nagaland: { code: "13", name: "Nagaland" },
|
|
49
|
+
manipur: { code: "14", name: "Manipur" },
|
|
50
|
+
mizoram: { code: "15", name: "Mizoram" },
|
|
51
|
+
tripura: { code: "16", name: "Tripura" },
|
|
52
|
+
meghalaya: { code: "17", name: "Meghalaya" },
|
|
53
|
+
assam: { code: "18", name: "Assam" },
|
|
54
|
+
"west-bengal": { code: "19", name: "West Bengal" },
|
|
55
|
+
jharkhand: { code: "20", name: "Jharkhand" },
|
|
56
|
+
odisha: { code: "21", name: "Odisha" },
|
|
57
|
+
chhattisgarh: { code: "22", name: "Chhattisgarh" },
|
|
58
|
+
"madhya-pradesh": { code: "23", name: "Madhya Pradesh" },
|
|
59
|
+
gujarat: { code: "24", name: "Gujarat" },
|
|
60
|
+
"dadra-nagar-haveli-daman-diu": {
|
|
61
|
+
code: "26",
|
|
62
|
+
name: "Dadra and Nagar Haveli and Daman and Diu",
|
|
63
|
+
},
|
|
64
|
+
maharashtra: { code: "27", name: "Maharashtra" },
|
|
65
|
+
karnataka: { code: "29", name: "Karnataka" },
|
|
66
|
+
goa: { code: "30", name: "Goa" },
|
|
67
|
+
lakshadweep: { code: "31", name: "Lakshadweep" },
|
|
68
|
+
kerala: { code: "32", name: "Kerala" },
|
|
69
|
+
"tamil-nadu": { code: "33", name: "Tamil Nadu" },
|
|
70
|
+
puducherry: { code: "34", name: "Puducherry" },
|
|
71
|
+
"andaman-nicobar": { code: "35", name: "Andaman and Nicobar Islands" },
|
|
72
|
+
telangana: { code: "36", name: "Telangana" },
|
|
73
|
+
"andhra-pradesh": { code: "37", name: "Andhra Pradesh" },
|
|
74
|
+
ladakh: { code: "38", name: "Ladakh" },
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Every alternative spelling we accept, mapped to the canonical key.
|
|
78
|
+
*
|
|
79
|
+
* Deliberately NOT exhaustive-by-guessing: each entry is a form that plausibly
|
|
80
|
+
* appears in an address field or a dropdown β the two-letter postal
|
|
81
|
+
* abbreviation, the pre-2019 names (`orissa`, `pondicherry`), and the common
|
|
82
|
+
* run-together spellings. A form that is not here resolves to `null`, which is
|
|
83
|
+
* honest; a wrong guess resolves to the WRONG STATE, which is worse than
|
|
84
|
+
* unknown. See `resolveStateKey`'s undetermined handling.
|
|
85
|
+
*/
|
|
86
|
+
const ALIASES = {
|
|
87
|
+
// two-letter abbreviations
|
|
88
|
+
jk: "jammu-kashmir", hp: "himachal-pradesh", pb: "punjab", ch: "chandigarh",
|
|
89
|
+
uk: "uttarakhand", ua: "uttarakhand", hr: "haryana", dl: "delhi",
|
|
90
|
+
rj: "rajasthan", up: "uttar-pradesh", br: "bihar", sk: "sikkim",
|
|
91
|
+
ar: "arunachal-pradesh", nl: "nagaland", mn: "manipur", mz: "mizoram",
|
|
92
|
+
tr: "tripura", ml: "meghalaya", as: "assam", wb: "west-bengal",
|
|
93
|
+
jh: "jharkhand", or: "odisha", od: "odisha", cg: "chhattisgarh",
|
|
94
|
+
ct: "chhattisgarh", mp: "madhya-pradesh", gj: "gujarat", mh: "maharashtra",
|
|
95
|
+
ka: "karnataka", ga: "goa", ld: "lakshadweep", kl: "kerala",
|
|
96
|
+
tn: "tamil-nadu", py: "puducherry", pondy: "puducherry",
|
|
97
|
+
an: "andaman-nicobar", tg: "telangana", ts: "telangana",
|
|
98
|
+
ap: "andhra-pradesh", la: "ladakh", dn: "dadra-nagar-haveli-daman-diu",
|
|
99
|
+
dd: "dadra-nagar-haveli-daman-diu",
|
|
100
|
+
// former / alternative names
|
|
101
|
+
orissa: "odisha",
|
|
102
|
+
pondicherry: "puducherry",
|
|
103
|
+
uttaranchal: "uttarakhand",
|
|
104
|
+
"new delhi": "delhi",
|
|
105
|
+
"nct of delhi": "delhi",
|
|
106
|
+
"national capital territory of delhi": "delhi",
|
|
107
|
+
"jammu kashmir": "jammu-kashmir",
|
|
108
|
+
"andaman and nicobar": "andaman-nicobar",
|
|
109
|
+
"andaman nicobar islands": "andaman-nicobar",
|
|
110
|
+
"dadra and nagar haveli": "dadra-nagar-haveli-daman-diu",
|
|
111
|
+
"daman and diu": "dadra-nagar-haveli-daman-diu",
|
|
112
|
+
};
|
|
113
|
+
/** Collapse to a comparison form: lowercase, letters and spaces only. */
|
|
114
|
+
function flatten(raw) {
|
|
115
|
+
return raw
|
|
116
|
+
.normalize("NFKD")
|
|
117
|
+
.toLowerCase()
|
|
118
|
+
.replace(/[^a-z\s]/g, " ")
|
|
119
|
+
.replace(/\s+/g, " ")
|
|
120
|
+
.trim();
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Resolve any spelling β canonical key, full name, abbreviation, former name,
|
|
124
|
+
* or a two-digit GST state code β to one canonical key, or `null`.
|
|
125
|
+
*
|
|
126
|
+
* π The numeric branch runs FIRST and before any letter-stripping, because
|
|
127
|
+
* the old normaliser destroyed digits. A state held as `"29"` or as a full
|
|
128
|
+
* GSTIN (`"29ABCDE1234F1Z5"`) is a real shape in this data: `resolveSupplierIdentity`
|
|
129
|
+
* reads a store's GSTIN, and its first two characters are the authoritative
|
|
130
|
+
* place of supply for the seller β more reliable than their typed pickup
|
|
131
|
+
* address, which is what G3 is about.
|
|
132
|
+
*/
|
|
133
|
+
export function resolveStateKey(raw) {
|
|
134
|
+
if (!raw)
|
|
135
|
+
return null;
|
|
136
|
+
const trimmed = String(raw).trim();
|
|
137
|
+
if (!trimmed)
|
|
138
|
+
return null;
|
|
139
|
+
// A bare code, or the leading two digits of a GSTIN.
|
|
140
|
+
const codeMatch = /^(\d{2})/.exec(trimmed);
|
|
141
|
+
if (codeMatch) {
|
|
142
|
+
const code = codeMatch[1];
|
|
143
|
+
for (const [key, meta] of Object.entries(INDIA_STATES)) {
|
|
144
|
+
if (meta.code === code)
|
|
145
|
+
return key;
|
|
146
|
+
}
|
|
147
|
+
// A two-digit prefix that is not a valid state code is NOT a state.
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
const flat = flatten(trimmed);
|
|
151
|
+
if (!flat)
|
|
152
|
+
return null;
|
|
153
|
+
// Canonical key (hyphenated) β its flattened form is the key with spaces.
|
|
154
|
+
for (const key of Object.keys(INDIA_STATES)) {
|
|
155
|
+
if (flat === key.replace(/-/g, " "))
|
|
156
|
+
return key;
|
|
157
|
+
}
|
|
158
|
+
// Display name.
|
|
159
|
+
for (const [key, meta] of Object.entries(INDIA_STATES)) {
|
|
160
|
+
if (flat === flatten(meta.name))
|
|
161
|
+
return key;
|
|
162
|
+
}
|
|
163
|
+
// Alias table.
|
|
164
|
+
const alias = ALIASES[flat];
|
|
165
|
+
if (alias)
|
|
166
|
+
return alias;
|
|
167
|
+
/*
|
|
168
|
+
* A last resort: drop "and"/"&" joiners, which is the single most common
|
|
169
|
+
* divergence in real addresses ("Jammu and Kashmir" vs "Jammu Kashmir",
|
|
170
|
+
* "Andaman and Nicobar Islands" vs "Andaman Nicobar"). Compared against the
|
|
171
|
+
* same reduction of each display name, so it cannot match across states.
|
|
172
|
+
*/
|
|
173
|
+
const noJoiners = flat.replace(/\band\b/g, " ").replace(/\s+/g, " ").trim();
|
|
174
|
+
if (noJoiners !== flat) {
|
|
175
|
+
for (const [key, meta] of Object.entries(INDIA_STATES)) {
|
|
176
|
+
const target = flatten(meta.name).replace(/\band\b/g, " ").replace(/\s+/g, " ").trim();
|
|
177
|
+
if (noJoiners === target)
|
|
178
|
+
return key;
|
|
179
|
+
}
|
|
180
|
+
const aliased = ALIASES[noJoiners];
|
|
181
|
+
if (aliased)
|
|
182
|
+
return aliased;
|
|
183
|
+
}
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
/** The GST state code for any spelling, or `null`. */
|
|
187
|
+
export function resolveStateCode(raw) {
|
|
188
|
+
const key = resolveStateKey(raw);
|
|
189
|
+
return key ? INDIA_STATES[key].code : null;
|
|
190
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The payout hold β how long a seller's money is held after delivery, and the
|
|
3
|
+
* ONE place that number is decided.
|
|
4
|
+
*
|
|
5
|
+
* WHY: there were three payout paths and one intended hold, honoured by zero
|
|
6
|
+
* of the three (D25).
|
|
7
|
+
*
|
|
8
|
+
* Β· `weeklyPayoutEligibility` (Saturday) queried
|
|
9
|
+
* `payoutStatus == "eligible" && status == "delivered"` with **no time
|
|
10
|
+
* cutoff at all**, so it paid out an order delivered yesterday.
|
|
11
|
+
* Β· `autoPayoutEligibility` (daily) applied a 7-day window, but computed
|
|
12
|
+
* it with CALENDAR days while calling them business days β measured,
|
|
13
|
+
* that reached 4 calendar days less far back than it should on a
|
|
14
|
+
* Monday, so a "7 business day" hold was really about 5.
|
|
15
|
+
* Β· The manual seller "Request payout" (`seller-actions.ts`) had no time
|
|
16
|
+
* check whatsoever.
|
|
17
|
+
*
|
|
18
|
+
* And `commissions.payoutHoldDays` β the admin-facing setting that looks
|
|
19
|
+
* like it controls all this β was read by NOTHING. It is seeded **2**,
|
|
20
|
+
* which is the trap below.
|
|
21
|
+
*
|
|
22
|
+
* WHAT: `resolvePayoutHoldDays(commissions, returns)` β the honoured number,
|
|
23
|
+
* and `payoutCutoff(...)` β the instant to compare an order's delivery
|
|
24
|
+
* anchor against.
|
|
25
|
+
*/
|
|
26
|
+
import { type BusinessDayOptions } from "../time/business-days";
|
|
27
|
+
/**
|
|
28
|
+
* The hold can never be shorter than any window during which money can still
|
|
29
|
+
* flow back OUT of the order.
|
|
30
|
+
*
|
|
31
|
+
* π WIRING `payoutHoldDays` NAIVELY MAKES THINGS WORSE, which is why this
|
|
32
|
+
* function exists rather than a bare settings read. The setting is seeded at
|
|
33
|
+
* **2 days**; the hardcoded window it would replace is **7**; and the
|
|
34
|
+
* sale-protection claim window is **7 days** (168h). So honouring the stored
|
|
35
|
+
* value as-is would *shorten* the hold from 7 to 2 and release a seller's
|
|
36
|
+
* money four days before the buyer's protection claim window even closes β
|
|
37
|
+
* i.e. we would have sold cover we had already paid out against.
|
|
38
|
+
*
|
|
39
|
+
* The floor is therefore `max(returnWindow, claimWindow)`, and the setting can
|
|
40
|
+
* only ever EXTEND it. An admin who wants a shorter hold has to shorten the
|
|
41
|
+
* return window first, which is the honest ordering of that decision.
|
|
42
|
+
*/
|
|
43
|
+
export declare const PAYOUT_HOLD_FLOOR_DAYS = 7;
|
|
44
|
+
export interface PayoutHoldInputs {
|
|
45
|
+
/** `siteSettings.commissions` β `payoutHoldDays` is the only field read. */
|
|
46
|
+
payoutHoldDays?: number;
|
|
47
|
+
/** `siteSettings.returns.windowDays` β the buyer's return window. */
|
|
48
|
+
returnWindowDays?: number;
|
|
49
|
+
/** Longest protection claim window in HOURS, if protections are enabled. */
|
|
50
|
+
maxClaimWindowHours?: number;
|
|
51
|
+
}
|
|
52
|
+
export interface ResolvedPayoutHold {
|
|
53
|
+
/** Business days actually honoured. */
|
|
54
|
+
days: number;
|
|
55
|
+
/** Which input won, so a log line can say why. */
|
|
56
|
+
source: "setting" | "floor";
|
|
57
|
+
/** The floor that applied, for the same reason. */
|
|
58
|
+
floor: number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Resolve the honoured hold.
|
|
62
|
+
*
|
|
63
|
+
* Returns the SOURCE as well as the number, deliberately: a hold silently
|
|
64
|
+
* raised from the admin's configured 2 to a floor of 7 reads as a bug to
|
|
65
|
+
* whoever set it, so the job logs which one applied rather than leaving the
|
|
66
|
+
* seller and the admin to disagree about it.
|
|
67
|
+
*/
|
|
68
|
+
export declare function resolvePayoutHoldDays(inputs: PayoutHoldInputs): ResolvedPayoutHold;
|
|
69
|
+
/**
|
|
70
|
+
* The cutoff instant: an order whose delivery anchor is at or before this is
|
|
71
|
+
* past its hold.
|
|
72
|
+
*
|
|
73
|
+
* π BUSINESS days, via `businessDayCutoff` β weekends and the Indian holiday
|
|
74
|
+
* list. The previous implementation subtracted calendar days, so every hold
|
|
75
|
+
* spanning a weekend released early.
|
|
76
|
+
*/
|
|
77
|
+
export declare function payoutCutoff(inputs: PayoutHoldInputs, opts?: BusinessDayOptions, now?: Date): {
|
|
78
|
+
cutoff: Date;
|
|
79
|
+
hold: ResolvedPayoutHold;
|
|
80
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The payout hold β how long a seller's money is held after delivery, and the
|
|
3
|
+
* ONE place that number is decided.
|
|
4
|
+
*
|
|
5
|
+
* WHY: there were three payout paths and one intended hold, honoured by zero
|
|
6
|
+
* of the three (D25).
|
|
7
|
+
*
|
|
8
|
+
* Β· `weeklyPayoutEligibility` (Saturday) queried
|
|
9
|
+
* `payoutStatus == "eligible" && status == "delivered"` with **no time
|
|
10
|
+
* cutoff at all**, so it paid out an order delivered yesterday.
|
|
11
|
+
* Β· `autoPayoutEligibility` (daily) applied a 7-day window, but computed
|
|
12
|
+
* it with CALENDAR days while calling them business days β measured,
|
|
13
|
+
* that reached 4 calendar days less far back than it should on a
|
|
14
|
+
* Monday, so a "7 business day" hold was really about 5.
|
|
15
|
+
* Β· The manual seller "Request payout" (`seller-actions.ts`) had no time
|
|
16
|
+
* check whatsoever.
|
|
17
|
+
*
|
|
18
|
+
* And `commissions.payoutHoldDays` β the admin-facing setting that looks
|
|
19
|
+
* like it controls all this β was read by NOTHING. It is seeded **2**,
|
|
20
|
+
* which is the trap below.
|
|
21
|
+
*
|
|
22
|
+
* WHAT: `resolvePayoutHoldDays(commissions, returns)` β the honoured number,
|
|
23
|
+
* and `payoutCutoff(...)` β the instant to compare an order's delivery
|
|
24
|
+
* anchor against.
|
|
25
|
+
*/
|
|
26
|
+
import { businessDayCutoff, } from "../time/business-days.js";
|
|
27
|
+
/**
|
|
28
|
+
* The hold can never be shorter than any window during which money can still
|
|
29
|
+
* flow back OUT of the order.
|
|
30
|
+
*
|
|
31
|
+
* π WIRING `payoutHoldDays` NAIVELY MAKES THINGS WORSE, which is why this
|
|
32
|
+
* function exists rather than a bare settings read. The setting is seeded at
|
|
33
|
+
* **2 days**; the hardcoded window it would replace is **7**; and the
|
|
34
|
+
* sale-protection claim window is **7 days** (168h). So honouring the stored
|
|
35
|
+
* value as-is would *shorten* the hold from 7 to 2 and release a seller's
|
|
36
|
+
* money four days before the buyer's protection claim window even closes β
|
|
37
|
+
* i.e. we would have sold cover we had already paid out against.
|
|
38
|
+
*
|
|
39
|
+
* The floor is therefore `max(returnWindow, claimWindow)`, and the setting can
|
|
40
|
+
* only ever EXTEND it. An admin who wants a shorter hold has to shorten the
|
|
41
|
+
* return window first, which is the honest ordering of that decision.
|
|
42
|
+
*/
|
|
43
|
+
export const PAYOUT_HOLD_FLOOR_DAYS = 7;
|
|
44
|
+
/**
|
|
45
|
+
* Resolve the honoured hold.
|
|
46
|
+
*
|
|
47
|
+
* Returns the SOURCE as well as the number, deliberately: a hold silently
|
|
48
|
+
* raised from the admin's configured 2 to a floor of 7 reads as a bug to
|
|
49
|
+
* whoever set it, so the job logs which one applied rather than leaving the
|
|
50
|
+
* seller and the admin to disagree about it.
|
|
51
|
+
*/
|
|
52
|
+
export function resolvePayoutHoldDays(inputs) {
|
|
53
|
+
const claimDays = inputs.maxClaimWindowHours
|
|
54
|
+
? Math.ceil(inputs.maxClaimWindowHours / 24)
|
|
55
|
+
: 0;
|
|
56
|
+
const floor = Math.max(PAYOUT_HOLD_FLOOR_DAYS, inputs.returnWindowDays ?? 0, claimDays);
|
|
57
|
+
const configured = inputs.payoutHoldDays;
|
|
58
|
+
if (typeof configured === "number" && Number.isFinite(configured) && configured > floor) {
|
|
59
|
+
return { days: Math.floor(configured), source: "setting", floor };
|
|
60
|
+
}
|
|
61
|
+
return { days: floor, source: "floor", floor };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* The cutoff instant: an order whose delivery anchor is at or before this is
|
|
65
|
+
* past its hold.
|
|
66
|
+
*
|
|
67
|
+
* π BUSINESS days, via `businessDayCutoff` β weekends and the Indian holiday
|
|
68
|
+
* list. The previous implementation subtracted calendar days, so every hold
|
|
69
|
+
* spanning a weekend released early.
|
|
70
|
+
*/
|
|
71
|
+
export function payoutCutoff(inputs, opts, now) {
|
|
72
|
+
const hold = resolvePayoutHoldDays(inputs);
|
|
73
|
+
return { cutoff: businessDayCutoff(hold.days, opts, now), hold };
|
|
74
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `deadlinesFor(order)` β every deadline an order currently owes, derived.
|
|
3
|
+
*
|
|
4
|
+
* ## Pure, so a page can render it for free
|
|
5
|
+
*
|
|
6
|
+
* No reads, no writes, no `obligations` lookup. A buyer or seller page calls
|
|
7
|
+
* this on an order it already has and renders "Dispatch by Thu 3 Nov".
|
|
8
|
+
*
|
|
9
|
+
* π That is why deadlines are DERIVED rather than stored on the order. A
|
|
10
|
+
* stored `dispatchDueAt` would need a backfill for every existing order, and
|
|
11
|
+
* would drift from the policy the moment an admin changed the duration β the
|
|
12
|
+
* denormalised-mirror trap (Root Cause #42). The `obligations` collection
|
|
13
|
+
* stores one too, and that copy is explicitly a due-date INDEX for the sweep
|
|
14
|
+
* to query, not the answer.
|
|
15
|
+
*
|
|
16
|
+
* ## Test-window compression is PER SUBJECT
|
|
17
|
+
*
|
|
18
|
+
* π A tester run must be able to watch a 3-day acceptance window close inside
|
|
19
|
+
* a 90-minute session, and a hard-coded duration cannot be shortened β which is
|
|
20
|
+
* what made those cases untestable in any run shorter than the literal. So
|
|
21
|
+
* durations scale by `TESTER_WINDOW_MINUTES`, but **only when the subject
|
|
22
|
+
* itself carries `isTestData: true`.** A global switch would compress every
|
|
23
|
+
* live buyer's deadline the moment somebody ran the tester, which is the one
|
|
24
|
+
* mistake this must not make.
|
|
25
|
+
*/
|
|
26
|
+
import { type Duration, type ObligationPolicy } from "../../../features/obligations/constants/policies";
|
|
27
|
+
import { type ObligationKind } from "../../../features/obligations/schemas/firestore";
|
|
28
|
+
import type { OrderDocument } from "../../../features/orders/schemas/firestore";
|
|
29
|
+
export interface ResolvedDeadline {
|
|
30
|
+
kind: ObligationKind;
|
|
31
|
+
dueAt: Date;
|
|
32
|
+
/** The fact the clock started from. */
|
|
33
|
+
anchoredAt: Date;
|
|
34
|
+
policy: ObligationPolicy;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolve one duration into an absolute date.
|
|
38
|
+
*
|
|
39
|
+
* π `business` goes through `addBusinessDays`, which counts weekends AND the
|
|
40
|
+
* Indian holiday calendar. The predecessor helper subtracted CALENDAR days and
|
|
41
|
+
* called them business days, so the "7-business-day" payout hold was really
|
|
42
|
+
* about 5 β and a missed holiday silently SHORTENS a deadline, which is why
|
|
43
|
+
* the calendar has an owner and a horizon warning.
|
|
44
|
+
*/
|
|
45
|
+
export declare function resolveDueAt(anchor: Date, duration: Duration, opts?: {
|
|
46
|
+
isTestData?: boolean;
|
|
47
|
+
}): Date;
|
|
48
|
+
/**
|
|
49
|
+
* Every deadline this order currently owes.
|
|
50
|
+
*
|
|
51
|
+
* Only kinds whose `precondition` holds AND whose `anchor` has fired appear β
|
|
52
|
+
* an order that has not shipped owes no delivery confirmation, and that is the
|
|
53
|
+
* difference between "not yet" and "overdue".
|
|
54
|
+
*/
|
|
55
|
+
export declare function deadlinesFor(order: OrderDocument): ResolvedDeadline[];
|
|
56
|
+
/**
|
|
57
|
+
* Which obligations this order should have open, and which should be closed.
|
|
58
|
+
*
|
|
59
|
+
* Called from the order's own write (`updateWithHistory`), where the current
|
|
60
|
+
* document is already in hand β so reconciling costs **zero extra reads**.
|
|
61
|
+
*
|
|
62
|
+
* π Derived from the POLICY's own `precondition`, not from a hand-written
|
|
63
|
+
* `Record<OrderStatus, {opens, closes}>` table.
|
|
64
|
+
*
|
|
65
|
+
* The plan proposed that table, and building it this way instead is a
|
|
66
|
+
* deliberate departure worth stating: a statusβopens/closes map is a SECOND
|
|
67
|
+
* encoding of the same facts the preconditions already express, and the two
|
|
68
|
+
* would drift exactly as the plan's own proposed transition map had already
|
|
69
|
+
* drifted from the census (it omitted `pending β processing`, which a live
|
|
70
|
+
* sweep writes). One source, evaluated twice β once for display, once for
|
|
71
|
+
* reconciliation β cannot disagree with itself.
|
|
72
|
+
*/
|
|
73
|
+
export declare function reconcileObligations(order: OrderDocument,
|
|
74
|
+
/**
|
|
75
|
+
* The order as it was BEFORE this write, when the caller has it.
|
|
76
|
+
*
|
|
77
|
+
* π THIS PARAMETER IS A COST FIX, not an optimisation. My first version
|
|
78
|
+
* closed "every kind not currently open", which on an 11-kind union meant
|
|
79
|
+
* **11 Firestore update attempts on every single order write** β each one a
|
|
80
|
+
* billed write against a document that mostly does not exist, on the hottest
|
|
81
|
+
* collection in the project. Rule #6 exists for exactly that.
|
|
82
|
+
*
|
|
83
|
+
* With `previous` in hand the close set is `was-open MINUS is-open`, which is
|
|
84
|
+
* usually empty and never larger than the number of obligations that
|
|
85
|
+
* genuinely just completed. Zero reads either way, because `updateWithHistory`
|
|
86
|
+
* already holds the pre-write document.
|
|
87
|
+
*
|
|
88
|
+
* Omitting it falls back to the full set, which is correct for a deliberate
|
|
89
|
+
* backfill over existing orders and wrong for the write path.
|
|
90
|
+
*/
|
|
91
|
+
previous?: OrderDocument | null): {
|
|
92
|
+
open: ResolvedDeadline[];
|
|
93
|
+
close: ObligationKind[];
|
|
94
|
+
};
|