@mohasinac/appkit 4.58.0 → 4.60.0
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.js +26 -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/messages.d.ts +1 -1
- package/dist/_internal/server/jobs/handlers/messages.js +1 -1
- 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/_internal/shared/types/base-document.d.ts +1 -1
- package/dist/cli/index.js +0 -2
- package/dist/client.d.ts +9 -4
- package/dist/client.js +26 -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/constants/seed-meta.d.ts +113 -0
- package/dist/constants/seed-meta.js +91 -0
- 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 -155
- package/dist/index.js +88 -341
- 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 +42 -69
- package/dist/server.js +93 -69
- 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 +4 -2
- package/scripts/seed-cli.mjs +175 -6
- 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
- package/dist/features/tester/seed-data/_happy-path.d.ts +0 -23
- package/dist/features/tester/seed-data/_happy-path.js +0 -710
- package/dist/features/tester/seed-data/_money-flows.d.ts +0 -23
- package/dist/features/tester/seed-data/_money-flows.js +0 -610
- package/dist/features/tester/seed-data/authored/_types.d.ts +0 -57
- package/dist/features/tester/seed-data/authored/_types.js +0 -35
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/account-auth__profile-settings.js +0 -226
- package/dist/features/tester/seed-data/authored/account-auth__signup-login.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/account-auth__signup-login.js +0 -329
- package/dist/features/tester/seed-data/authored/addresses__address-filters.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__address-filters.js +0 -41
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__postal-lookup.js +0 -76
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__postal-validation.js +0 -78
- package/dist/features/tester/seed-data/authored/addresses__state-picker.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__state-picker.js +0 -59
- package/dist/features/tester/seed-data/authored/addresses__unban-request.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/addresses__unban-request.js +0 -77
- package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__admin-detail-round-trips.js +0 -151
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bans-and-trust.js +0 -265
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__blog-faqs.js +0 -131
- package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bug-hunter-rewards.js +0 -143
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bulk-actions.js +0 -207
- package/dist/features/tester/seed-data/authored/admin__bundles.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__bundles.js +0 -144
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__buyer-data-admin.js +0 -265
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__catalog-listings.js +0 -318
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__category-brand-authoring.js +0 -177
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__classifieds-digitalcodes-live.js +0 -165
- package/dist/features/tester/seed-data/authored/admin__content-deletes.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__content-deletes.js +0 -267
- package/dist/features/tester/seed-data/authored/admin__content-marketing.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__content-marketing.js +0 -188
- package/dist/features/tester/seed-data/authored/admin__coupons.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__coupons.js +0 -215
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__events-raffles-spin.js +0 -202
- package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__firebase-function-effects.js +0 -249
- package/dist/features/tester/seed-data/authored/admin__media-watermark.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__media-watermark.js +0 -148
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__orders-fulfillment.js +0 -350
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__prize-draws-lotteries.js +0 -129
- package/dist/features/tester/seed-data/authored/admin__site-system.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__site-system.js +0 -586
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__uncovered-admin-pages.js +0 -260
- package/dist/features/tester/seed-data/authored/admin__users-trust.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/admin__users-trust.js +0 -569
- package/dist/features/tester/seed-data/authored/buying__bidding.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__bidding.js +0 -449
- package/dist/features/tester/seed-data/authored/buying__browsing-search.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__browsing-search.js +0 -684
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__buying-checkout.js +0 -546
- package/dist/features/tester/seed-data/authored/buying__buying-coupons.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__buying-coupons.js +0 -379
- package/dist/features/tester/seed-data/authored/buying__cart.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__cart.js +0 -1264
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__image-tile-layout.js +0 -122
- package/dist/features/tester/seed-data/authored/buying__my-orders.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__my-orders.js +0 -279
- package/dist/features/tester/seed-data/authored/buying__offers.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__offers.js +0 -1127
- package/dist/features/tester/seed-data/authored/buying__order-detail-actions.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__order-detail-actions.js +0 -153
- package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__order-status-lifecycle.js +0 -252
- package/dist/features/tester/seed-data/authored/buying__product-detail.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__product-detail.js +0 -474
- package/dist/features/tester/seed-data/authored/buying__return-request.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__return-request.js +0 -165
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__reviews-pagination.js +0 -260
- package/dist/features/tester/seed-data/authored/buying__reviews.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__reviews.js +0 -128
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__spares-and-groups.js +0 -96
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-extras.js +0 -283
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__user-dashboard-navigation.js +0 -169
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__user-uncovered-pages.js +0 -105
- package/dist/features/tester/seed-data/authored/buying__wishlist-history.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/buying__wishlist-history.js +0 -374
- package/dist/features/tester/seed-data/authored/community-support__messages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/community-support__messages.js +0 -200
- package/dist/features/tester/seed-data/authored/community-support__public-profile.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/community-support__public-profile.js +0 -54
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/community-support__support-tickets.js +0 -76
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.d.ts +0 -4
- package/dist/features/tester/seed-data/authored/content-discovery__authenticity-checker.js +0 -590
- package/dist/features/tester/seed-data/authored/content-discovery__blog.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__blog.js +0 -110
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__category-brand-relations.js +0 -149
- package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__category-counts-and-rollup.js +0 -145
- package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__category-tabs-franchise-bundles.js +0 -174
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__coupons.js +0 -169
- package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__event-detail-subroutes.js +0 -209
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__event-participation.js +0 -207
- package/dist/features/tester/seed-data/authored/content-discovery__events.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__events.js +0 -377
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__faq-help.js +0 -87
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__notifications.js +0 -147
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__overflowing-pill-rows.js +0 -209
- package/dist/features/tester/seed-data/authored/content-discovery__parts-database.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__parts-database.js +0 -167
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__price-index-and-compare.js +0 -73
- package/dist/features/tester/seed-data/authored/content-discovery__search.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__search.js +0 -363
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__site-wide-index.js +0 -340
- package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/content-discovery__store-reviews-aggregate.js +0 -88
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__checkout-bottom-bar.js +0 -78
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__dialog-footers.js +0 -76
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__editor-action-bar.js +0 -62
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__navbar-ctas.js +0 -163
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/cta-layout__product-bottom-bar.js +0 -61
- package/dist/features/tester/seed-data/authored/design-ux__action-bar-placement.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__action-bar-placement.js +0 -89
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__back-to-top-button.js +0 -95
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__carousel-arrow-bounds.js +0 -191
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__dashboard-layout.js +0 -158
- package/dist/features/tester/seed-data/authored/design-ux__feature-badge-picker.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__feature-badge-picker.js +0 -82
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__footer-theme.js +0 -106
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__form-validation-errors.js +0 -88
- package/dist/features/tester/seed-data/authored/design-ux__general-design.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__general-design.js +0 -204
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__hand-mode-layout.js +0 -301
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__header-brand-mark-centring.js +0 -90
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__header-controls-and-messages.js +0 -85
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__homepage-carousels.js +0 -407
- package/dist/features/tester/seed-data/authored/design-ux__nav-reachability.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__nav-reachability.js +0 -88
- package/dist/features/tester/seed-data/authored/design-ux__rich-text-readability.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__rich-text-readability.js +0 -84
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__status-badge-legibility.js +0 -214
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/design-ux__sticky-cta-bar.js +0 -275
- package/dist/features/tester/seed-data/authored/index.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/index.js +0 -301
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__data-loss.js +0 -125
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__detail-pages.js +0 -85
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__drawer-pages.js +0 -92
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/page-wiring__reachability.js +0 -115
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__auth-error-pages.js +0 -137
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__core-listing-pages.js +0 -263
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__help-how-it-works.js +0 -229
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__help-scams-guides-subpages.js +0 -325
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__legal-policy-pages.js +0 -126
- package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__newly-wired-browse-indexes.js +0 -141
- package/dist/features/tester/seed-data/authored/public-pages__store-tabs.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__store-tabs.js +0 -115
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/public-pages__stores-sellers-directories.js +0 -253
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/search-and-nav__employee-permissions.js +0 -93
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.d.ts +0 -3
- package/dist/features/tester/seed-data/authored/search-and-nav__header-search.js +0 -185
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/search-and-nav__settings-deep-links.js +0 -82
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/search-and-nav__sidebar-search.js +0 -60
- package/dist/features/tester/seed-data/authored/selling__become-seller.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__become-seller.js +0 -117
- package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__digital-content-delivery.js +0 -148
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__final-sale-authoring.js +0 -108
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-a-product.js +0 -274
- package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-edit-roundtrip.js +0 -145
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-lifecycle.js +0 -336
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__listing-type-fields-roundtrip.js +0 -136
- package/dist/features/tester/seed-data/authored/selling__media-limits.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__media-limits.js +0 -135
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__product-upload-details.js +0 -155
- package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__quick-add-minimum-details.js +0 -138
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__sectionised-forms.js +0 -191
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-analytics-payouts.js +0 -138
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-bids-bundles-filters.js +0 -106
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-catalog-org.js +0 -192
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-custom-brands.js +0 -109
- package/dist/features/tester/seed-data/authored/selling__seller-guide.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-guide.js +0 -34
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-listing-types.js +0 -348
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-marketing-extras.js +0 -87
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-ops-comms.js +0 -90
- package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-orders-at-scale.js +0 -85
- package/dist/features/tester/seed-data/authored/selling__seller-orders.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-orders.js +0 -213
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__seller-shipping-payouts-setup.js +0 -192
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__spares-and-group-editing.js +0 -77
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__store-dashboard-navigation.js +0 -165
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/selling__store-uncovered-pages.js +0 -116
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__canonical-and-host.js +0 -127
- package/dist/features/tester/seed-data/authored/seo__og-images.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__og-images.js +0 -107
- package/dist/features/tester/seed-data/authored/seo__page-metadata.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__page-metadata.js +0 -120
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/seo__sitemap-and-robots.js +0 -105
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/tools__sticker-promote-to-listings.js +0 -58
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.d.ts +0 -2
- package/dist/features/tester/seed-data/authored/tools__sticker-tracer.js +0 -284
- package/dist/features/tester/seed-data/index.d.ts +0 -2
- package/dist/features/tester/seed-data/index.js +0 -2
- package/dist/features/tester/seed-data/tester-checklist-seed-data.d.ts +0 -2
- package/dist/features/tester/seed-data/tester-checklist-seed-data.js +0 -7601
- package/dist/features/tester/seed-data/tester-responses-seed-data.d.ts +0 -2
- package/dist/features/tester/seed-data/tester-responses-seed-data.js +0 -95
- package/dist/features/tester/seed-data/tester-window.d.ts +0 -25
- package/dist/features/tester/seed-data/tester-window.js +0 -66
- package/dist/seed/_helpers/brand-rows.d.ts +0 -35
- package/dist/seed/_helpers/brand-rows.js +0 -600
- package/dist/seed/_helpers/category-content-generated.d.ts +0 -24
- package/dist/seed/_helpers/category-content-generated.js +0 -1853
- package/dist/seed/_helpers/category-content.d.ts +0 -68
- package/dist/seed/_helpers/category-content.js +0 -731
- package/dist/seed/_helpers/category-forest.d.ts +0 -4
- package/dist/seed/_helpers/category-forest.js +0 -824
- package/dist/seed/_helpers/category-images-generated.d.ts +0 -57
- package/dist/seed/_helpers/category-images-generated.js +0 -618
- package/dist/seed/_helpers/category-models/chunk0.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk0.js +0 -2648
- package/dist/seed/_helpers/category-models/chunk1.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk1.js +0 -2318
- package/dist/seed/_helpers/category-models/chunk2.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk2.js +0 -2560
- package/dist/seed/_helpers/category-models/chunk3.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk3.js +0 -2196
- package/dist/seed/_helpers/category-models/chunk4.d.ts +0 -2
- package/dist/seed/_helpers/category-models/chunk4.js +0 -1732
- package/dist/seed/_helpers/category-models.d.ts +0 -12
- package/dist/seed/_helpers/category-models.js +0 -45
- package/dist/seed/_helpers/category-names.d.ts +0 -54
- package/dist/seed/_helpers/category-names.js +0 -118
- package/dist/seed/_helpers/category-parts-glossary-map.d.ts +0 -1
- package/dist/seed/_helpers/category-parts-glossary-map.js +0 -2499
- package/dist/seed/_helpers/category-parts.d.ts +0 -9
- package/dist/seed/_helpers/category-parts.js +0 -15022
- package/dist/seed/_helpers/category-tree.d.ts +0 -27
- package/dist/seed/_helpers/category-tree.js +0 -119
- package/dist/seed/_helpers/character-features.d.ts +0 -10
- package/dist/seed/_helpers/character-features.js +0 -120
- package/dist/seed/_helpers/final-sale-fixtures.d.ts +0 -35
- package/dist/seed/_helpers/final-sale-fixtures.js +0 -61
- package/dist/seed/_helpers/franchise-rows.d.ts +0 -43
- package/dist/seed/_helpers/franchise-rows.js +0 -189
- package/dist/seed/_helpers/media.d.ts +0 -67
- package/dist/seed/_helpers/media.js +0 -172
- package/dist/seed/_helpers/part-colours-generated.d.ts +0 -18
- package/dist/seed/_helpers/part-colours-generated.js +0 -273
- package/dist/seed/_helpers/product-search-txt.d.ts +0 -18
- package/dist/seed/_helpers/product-search-txt.js +0 -23
- package/dist/seed/_helpers/search-txt-wrappers.d.ts +0 -26
- package/dist/seed/_helpers/search-txt-wrappers.js +0 -58
- package/dist/seed/addresses-seed-data.d.ts +0 -2
- package/dist/seed/addresses-seed-data.js +0 -78
- package/dist/seed/authenticity-knowledge-seed-data.d.ts +0 -78
- package/dist/seed/authenticity-knowledge-seed-data.js +0 -10729
- package/dist/seed/bey-products-seed-data.d.ts +0 -18
- package/dist/seed/bey-products-seed-data.js +0 -18011
- package/dist/seed/beys/chunk0.d.ts +0 -17
- package/dist/seed/beys/chunk0.js +0 -36733
- package/dist/seed/beys/chunk1.d.ts +0 -17
- package/dist/seed/beys/chunk1.js +0 -35728
- package/dist/seed/beys/chunk2.d.ts +0 -17
- package/dist/seed/beys/chunk2.js +0 -35857
- package/dist/seed/beys/chunk3.d.ts +0 -17
- package/dist/seed/beys/chunk3.js +0 -34476
- package/dist/seed/beys-seed-data.d.ts +0 -18
- package/dist/seed/beys-seed-data.js +0 -11
- package/dist/seed/bids-seed-data.d.ts +0 -2
- package/dist/seed/bids-seed-data.js +0 -206
- package/dist/seed/blog-posts-seed-data.d.ts +0 -6
- package/dist/seed/blog-posts-seed-data.js +0 -442
- package/dist/seed/carousel-slides-seed-data.d.ts +0 -2
- package/dist/seed/carousel-slides-seed-data.js +0 -411
- package/dist/seed/carousels-seed-data.d.ts +0 -2
- package/dist/seed/carousels-seed-data.js +0 -36
- package/dist/seed/cart-seed-data.d.ts +0 -2
- package/dist/seed/cart-seed-data.js +0 -241
- package/dist/seed/catalogue-seed-data.d.ts +0 -2
- package/dist/seed/catalogue-seed-data.js +0 -112
- package/dist/seed/categories-seed-data.d.ts +0 -3
- package/dist/seed/categories-seed-data.js +0 -816
- package/dist/seed/claimed-coupons-seed-data.d.ts +0 -2
- package/dist/seed/claimed-coupons-seed-data.js +0 -85
- package/dist/seed/coupon-usage-seed-data.d.ts +0 -9
- package/dist/seed/coupon-usage-seed-data.js +0 -55
- package/dist/seed/coupons-seed-data.d.ts +0 -2
- package/dist/seed/coupons-seed-data.js +0 -226
- package/dist/seed/defaults/categories.d.ts +0 -2
- package/dist/seed/defaults/categories.js +0 -12
- package/dist/seed/defaults/faqs.d.ts +0 -2
- package/dist/seed/defaults/faqs.js +0 -40
- package/dist/seed/events-seed-data.d.ts +0 -7
- package/dist/seed/events-seed-data.js +0 -482
- package/dist/seed/factories/address.factory.d.ts +0 -21
- package/dist/seed/factories/address.factory.js +0 -44
- package/dist/seed/factories/bid.factory.d.ts +0 -15
- package/dist/seed/factories/bid.factory.js +0 -33
- package/dist/seed/factories/blog-post.factory.d.ts +0 -15
- package/dist/seed/factories/blog-post.factory.js +0 -22
- package/dist/seed/factories/carousel.factory.d.ts +0 -11
- package/dist/seed/factories/carousel.factory.js +0 -17
- package/dist/seed/factories/cart.factory.d.ts +0 -25
- package/dist/seed/factories/cart.factory.js +0 -35
- package/dist/seed/factories/category.factory.d.ts +0 -11
- package/dist/seed/factories/category.factory.js +0 -16
- package/dist/seed/factories/coupon.factory.d.ts +0 -21
- package/dist/seed/factories/coupon.factory.js +0 -43
- package/dist/seed/factories/faq.factory.d.ts +0 -10
- package/dist/seed/factories/faq.factory.js +0 -15
- package/dist/seed/factories/notification.factory.d.ts +0 -18
- package/dist/seed/factories/notification.factory.js +0 -39
- package/dist/seed/factories/order.factory.d.ts +0 -20
- package/dist/seed/factories/order.factory.js +0 -20
- package/dist/seed/factories/payout.factory.d.ts +0 -21
- package/dist/seed/factories/payout.factory.js +0 -38
- package/dist/seed/factories/product.factory.d.ts +0 -27
- package/dist/seed/factories/product.factory.js +0 -80
- package/dist/seed/factories/review.factory.d.ts +0 -14
- package/dist/seed/factories/review.factory.js +0 -52
- package/dist/seed/factories/session.factory.d.ts +0 -15
- package/dist/seed/factories/session.factory.js +0 -31
- package/dist/seed/factories/store.factory.d.ts +0 -23
- package/dist/seed/factories/store.factory.js +0 -47
- package/dist/seed/factories/user.factory.d.ts +0 -19
- package/dist/seed/factories/user.factory.js +0 -56
- package/dist/seed/faq-seed-data.d.ts +0 -18
- package/dist/seed/faq-seed-data.js +0 -1956
- package/dist/seed/firestore-indexes.d.ts +0 -12
- package/dist/seed/firestore-indexes.js +0 -31
- package/dist/seed/grouped-listings-seed-data.d.ts +0 -2
- package/dist/seed/grouped-listings-seed-data.js +0 -283
- package/dist/seed/history-seed-data.d.ts +0 -12
- package/dist/seed/history-seed-data.js +0 -70
- package/dist/seed/homepage-sections-seed-data.d.ts +0 -2
- package/dist/seed/homepage-sections-seed-data.js +0 -1034
- package/dist/seed/index.d.ts +0 -100
- package/dist/seed/index.js +0 -115
- package/dist/seed/lottery-entries-seed-data.d.ts +0 -2
- package/dist/seed/lottery-entries-seed-data.js +0 -108
- package/dist/seed/manifest.d.ts +0 -16
- package/dist/seed/manifest.js +0 -235
- package/dist/seed/media-assets-seed-data.d.ts +0 -22
- package/dist/seed/media-assets-seed-data.js +0 -5593
- package/dist/seed/model-composition-seed-data.d.ts +0 -15
- package/dist/seed/model-composition-seed-data.js +0 -9032
- package/dist/seed/notifications-seed-data.d.ts +0 -2
- package/dist/seed/notifications-seed-data.js +0 -606
- package/dist/seed/offers-seed-data.d.ts +0 -2
- package/dist/seed/offers-seed-data.js +0 -398
- package/dist/seed/orders-seed-data.d.ts +0 -2
- package/dist/seed/orders-seed-data.js +0 -845
- package/dist/seed/part-glossary/chunk0.d.ts +0 -9
- package/dist/seed/part-glossary/chunk0.js +0 -35448
- package/dist/seed/part-glossary/chunk1.d.ts +0 -9
- package/dist/seed/part-glossary/chunk1.js +0 -40494
- package/dist/seed/part-glossary/chunk2.d.ts +0 -9
- package/dist/seed/part-glossary/chunk2.js +0 -51242
- package/dist/seed/part-glossary/chunk3.d.ts +0 -9
- package/dist/seed/part-glossary/chunk3.js +0 -53337
- package/dist/seed/part-glossary/chunk4.d.ts +0 -9
- package/dist/seed/part-glossary/chunk4.js +0 -51454
- package/dist/seed/part-glossary-seed-data.d.ts +0 -15
- package/dist/seed/part-glossary-seed-data.js +0 -25
- package/dist/seed/payouts-seed-data.d.ts +0 -2
- package/dist/seed/payouts-seed-data.js +0 -302
- package/dist/seed/product-features-seed-data.d.ts +0 -3
- package/dist/seed/product-features-seed-data.js +0 -366
- package/dist/seed/products-art-seed-data.d.ts +0 -2
- package/dist/seed/products-art-seed-data.js +0 -289
- package/dist/seed/products-auctions-seed-data.d.ts +0 -2
- package/dist/seed/products-auctions-seed-data.js +0 -475
- package/dist/seed/products-beyblade-x-seed-data.d.ts +0 -2
- package/dist/seed/products-beyblade-x-seed-data.js +0 -476
- package/dist/seed/products-catalogue/chunk0.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk0.js +0 -7262
- package/dist/seed/products-catalogue/chunk1.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk1.js +0 -7290
- package/dist/seed/products-catalogue/chunk10.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk10.js +0 -7290
- package/dist/seed/products-catalogue/chunk11.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk11.js +0 -7005
- package/dist/seed/products-catalogue/chunk12.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk12.js +0 -7002
- package/dist/seed/products-catalogue/chunk13.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk13.js +0 -7002
- package/dist/seed/products-catalogue/chunk14.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk14.js +0 -7002
- package/dist/seed/products-catalogue/chunk15.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk15.js +0 -7002
- package/dist/seed/products-catalogue/chunk16.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk16.js +0 -7002
- package/dist/seed/products-catalogue/chunk17.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk17.js +0 -7002
- package/dist/seed/products-catalogue/chunk18.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk18.js +0 -4398
- package/dist/seed/products-catalogue/chunk2.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk2.js +0 -7268
- package/dist/seed/products-catalogue/chunk3.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk3.js +0 -7264
- package/dist/seed/products-catalogue/chunk4.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk4.js +0 -7268
- package/dist/seed/products-catalogue/chunk5.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk5.js +0 -7258
- package/dist/seed/products-catalogue/chunk6.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk6.js +0 -7268
- package/dist/seed/products-catalogue/chunk7.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk7.js +0 -7311
- package/dist/seed/products-catalogue/chunk8.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk8.js +0 -7304
- package/dist/seed/products-catalogue/chunk9.d.ts +0 -12
- package/dist/seed/products-catalogue/chunk9.js +0 -7309
- package/dist/seed/products-catalogue-seed-data.d.ts +0 -2
- package/dist/seed/products-catalogue-seed-data.js +0 -60
- package/dist/seed/products-classifieds-seed-data.d.ts +0 -7
- package/dist/seed/products-classifieds-seed-data.js +0 -435
- package/dist/seed/products-digital-codes-seed-data.d.ts +0 -7
- package/dist/seed/products-digital-codes-seed-data.js +0 -395
- package/dist/seed/products-live-items-seed-data.d.ts +0 -7
- package/dist/seed/products-live-items-seed-data.js +0 -269
- package/dist/seed/products-preorders-seed-data.d.ts +0 -2
- package/dist/seed/products-preorders-seed-data.js +0 -360
- package/dist/seed/products-prize-draws-seed-data.d.ts +0 -7
- package/dist/seed/products-prize-draws-seed-data.js +0 -427
- package/dist/seed/products-spares-seed-data.d.ts +0 -2
- package/dist/seed/products-spares-seed-data.js +0 -368
- package/dist/seed/products-standard-seed-data.d.ts +0 -2
- package/dist/seed/products-standard-seed-data.js +0 -632
- package/dist/seed/products-stickers-seed-data.d.ts +0 -2
- package/dist/seed/products-stickers-seed-data.js +0 -319
- package/dist/seed/reviews-seed-data.d.ts +0 -1
- package/dist/seed/reviews-seed-data.js +0 -185
- package/dist/seed/runner.d.ts +0 -2
- package/dist/seed/runner.js +0 -125
- package/dist/seed/scammers-seed-data.d.ts +0 -2
- package/dist/seed/scammers-seed-data.js +0 -235
- package/dist/seed/seed-market-config.d.ts +0 -48
- package/dist/seed/seed-market-config.js +0 -199
- package/dist/seed/seed-purpose.d.ts +0 -299
- package/dist/seed/seed-purpose.js +0 -440
- package/dist/seed/sessions-seed-data.d.ts +0 -3
- package/dist/seed/sessions-seed-data.js +0 -116
- package/dist/seed/shipments-seed-data.d.ts +0 -5
- package/dist/seed/shipments-seed-data.js +0 -185
- package/dist/seed/site-settings-seed-data.d.ts +0 -2
- package/dist/seed/site-settings-seed-data.js +0 -1069
- package/dist/seed/store-addresses-seed-data.d.ts +0 -18
- package/dist/seed/store-addresses-seed-data.js +0 -71
- package/dist/seed/store-extensions-seed-data.d.ts +0 -11
- package/dist/seed/store-extensions-seed-data.js +0 -292
- package/dist/seed/stores-seed-data.d.ts +0 -6
- package/dist/seed/stores-seed-data.js +0 -242
- package/dist/seed/support-tickets-seed-data.d.ts +0 -16
- package/dist/seed/support-tickets-seed-data.js +0 -239
- package/dist/seed/tax-codes-seed-data.d.ts +0 -34
- package/dist/seed/tax-codes-seed-data.js +0 -100
- package/dist/seed/test-data-ttl.d.ts +0 -29
- package/dist/seed/test-data-ttl.js +0 -31
- package/dist/seed/test-utils.d.ts +0 -49
- package/dist/seed/test-utils.js +0 -110
- package/dist/seed/types.d.ts +0 -89
- package/dist/seed/types.js +0 -15
- package/dist/seed/users-seed-data.d.ts +0 -2
- package/dist/seed/users-seed-data.js +0 -597
- package/dist/seed/wishlists-seed-data.d.ts +0 -12
- package/dist/seed/wishlists-seed-data.js +0 -54
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
/**
|
|
3
|
+
* Filing and adjudicating a protection claim — the first callers
|
|
4
|
+
* `protectionAvailability()` and `adjudicateClaim()` have ever had.
|
|
5
|
+
*
|
|
6
|
+
* ## What was wrong (D11)
|
|
7
|
+
*
|
|
8
|
+
* We charge 2% (min ₹30) shipment protection and 3% (min ₹49) sale protection
|
|
9
|
+
* at four money sites. The decision logic, the custody state machine, the
|
|
10
|
+
* window constants and the order fields all existed with **zero callers**, and
|
|
11
|
+
* the refund path did not know the add-on existed. A FAQ promised *"we pursue
|
|
12
|
+
* the courier and refund you"* and *"refunded no questions asked"*.
|
|
13
|
+
*
|
|
14
|
+
* ## The two gates, and why both are server-side
|
|
15
|
+
*
|
|
16
|
+
* 1. **Did the buyer actually buy this cover?** Read off the ORDER's own
|
|
17
|
+
* `shipmentProtectionFee` / `saleProtectionFee` — the amount charged — not
|
|
18
|
+
* off the live store or the live settings. A seller must not be able to
|
|
19
|
+
* withdraw cover after the sale, which is the same snapshot reasoning
|
|
20
|
+
* `finalSale` uses on the refund path.
|
|
21
|
+
* 2. **Is the window still open?** The `claim-shipping` / `claim-sale`
|
|
22
|
+
* obligations, derived from `deliveryDate` through
|
|
23
|
+
* `PROTECTION_CLAIM_WINDOW_HOURS` (48h / 168h). One definition, shared with
|
|
24
|
+
* the sweep that closes the window and earns the premium.
|
|
25
|
+
*/
|
|
26
|
+
import { wrapAction } from "../../../shared/types/action-result.js";
|
|
27
|
+
import { requireRoleUser } from "../../../../providers/auth-firebase/helpers.js";
|
|
28
|
+
import { normalizeError } from "../../../../errors/normalize.js";
|
|
29
|
+
import { serverLogger } from "../../../../monitoring/index.js";
|
|
30
|
+
import { ValidationError, NotFoundError } from "../../../../errors/index.js";
|
|
31
|
+
import { orderRepository } from "../../../../features/orders/repository/orders.repository.js";
|
|
32
|
+
import { protectionClaimsRepository } from "../../../../features/protection-claims/repository/protection-claims.repository.js";
|
|
33
|
+
import { PROTECTION_CLAIM_DETAIL_MAX, PROTECTION_CLAIM_DETAIL_MIN, REASON_TO_KIND, createProtectionClaimId, } from "../../../../features/protection-claims/schemas/firestore.js";
|
|
34
|
+
import { adjudicateClaim, SALE_PROTECTION_MAX_VALUE, } from "../../../shared/features/shipping/protections.js";
|
|
35
|
+
import { deadlinesFor } from "../../../shared/obligations/deadlines.js";
|
|
36
|
+
import { paymentCasesRepository } from "../../../../features/payment-cases/repository/payment-cases.repository.js";
|
|
37
|
+
import { orderGoodsValue } from "../../../shared/checkout/order-math.js";
|
|
38
|
+
/**
|
|
39
|
+
* File a claim as the buyer.
|
|
40
|
+
*
|
|
41
|
+
* 🛑 The COVER KIND is derived from the reason, never taken from the caller.
|
|
42
|
+
* `REASON_TO_KIND` maps transit failures to shipment cover and item failures
|
|
43
|
+
* to sale cover — because letting the buyer pick would let them file a
|
|
44
|
+
* non-delivery against the 7-day sale window after the 48-hour transit window
|
|
45
|
+
* had closed, which is the window rule defeated by a dropdown.
|
|
46
|
+
*/
|
|
47
|
+
export async function fileProtectionClaimAction(input) {
|
|
48
|
+
return wrapAction(async () => {
|
|
49
|
+
const user = await requireRoleUser(["user", "buyer", "seller", "admin"]);
|
|
50
|
+
const detail = input.detail?.trim() ?? "";
|
|
51
|
+
if (detail.length < PROTECTION_CLAIM_DETAIL_MIN) {
|
|
52
|
+
throw new ValidationError(`Please describe what happened in at least ${PROTECTION_CLAIM_DETAIL_MIN} characters — a claim with no account of the problem cannot be assessed.`);
|
|
53
|
+
}
|
|
54
|
+
if (detail.length > PROTECTION_CLAIM_DETAIL_MAX) {
|
|
55
|
+
throw new ValidationError(`Please keep the description under ${PROTECTION_CLAIM_DETAIL_MAX} characters.`);
|
|
56
|
+
}
|
|
57
|
+
const order = await orderRepository.findById(input.orderId);
|
|
58
|
+
if (!order)
|
|
59
|
+
throw new NotFoundError(`Order ${input.orderId} not found`);
|
|
60
|
+
if (order.userId !== user.uid) {
|
|
61
|
+
throw new ValidationError("You can only claim against your own order.");
|
|
62
|
+
}
|
|
63
|
+
const kind = REASON_TO_KIND[input.reason];
|
|
64
|
+
/*
|
|
65
|
+
* GATE 1 — did this order actually CARRY the cover?
|
|
66
|
+
*
|
|
67
|
+
* 🛑 Read off the order's own recorded fee, not the live store or the live
|
|
68
|
+
* settings. A seller flipping `supportsSaleProtection` off after the sale
|
|
69
|
+
* must not be able to withdraw cover the buyer paid for — the same
|
|
70
|
+
* reasoning `finalSale` uses on the refund path, and the same reason
|
|
71
|
+
* `OrderDocumentItem.finalSale` exists at all.
|
|
72
|
+
*/
|
|
73
|
+
const feePaid = kind === "shipping" ? order.shipmentProtectionFee : order.saleProtectionFee;
|
|
74
|
+
if (!feePaid || feePaid <= 0) {
|
|
75
|
+
throw new ValidationError(kind === "shipping"
|
|
76
|
+
? "This order does not carry shipment protection."
|
|
77
|
+
: "This order does not carry sale protection.");
|
|
78
|
+
}
|
|
79
|
+
/*
|
|
80
|
+
* GATE 2 — is the window still open?
|
|
81
|
+
*
|
|
82
|
+
* Derived from the obligation policy, so the buyer's form, the sweep that
|
|
83
|
+
* closes the window, and whatever page shows the deadline all read one
|
|
84
|
+
* definition.
|
|
85
|
+
*
|
|
86
|
+
* 🛑 No `deliveryDate` means the clock has not STARTED, which is not the
|
|
87
|
+
* same as closed — a parcel that never arrived is exactly what shipment
|
|
88
|
+
* cover is for, and refusing it for want of a delivery date would deny the
|
|
89
|
+
* claim the cover most exists for.
|
|
90
|
+
*/
|
|
91
|
+
const obligationKind = kind === "shipping" ? "claim-shipping" : "claim-sale";
|
|
92
|
+
const window = deadlinesFor(order).find((d) => d.kind === obligationKind);
|
|
93
|
+
if (order.deliveryDate && window && window.dueAt.getTime() <= Date.now()) {
|
|
94
|
+
throw new ValidationError(`The ${kind === "shipping" ? "shipment" : "sale"} protection claim window for this order closed on ${window.dueAt.toLocaleDateString("en-IN")}.`);
|
|
95
|
+
}
|
|
96
|
+
/*
|
|
97
|
+
* The ceiling. `SALE_PROTECTION_MAX_VALUE` (₹25,000) is tested against what
|
|
98
|
+
* was PAID for the claimed goods, which is why `claimedAmount` is
|
|
99
|
+
* snapshotted at filing rather than recomputed later.
|
|
100
|
+
*/
|
|
101
|
+
const claimedAmount = orderGoodsValue(order);
|
|
102
|
+
if (kind === "sale" && claimedAmount > SALE_PROTECTION_MAX_VALUE) {
|
|
103
|
+
throw new ValidationError(`Sale protection covers orders up to ₹${SALE_PROTECTION_MAX_VALUE.toLocaleString("en-IN")}. This order is above that, so the claim needs a human — please contact support.`);
|
|
104
|
+
}
|
|
105
|
+
const claim = await protectionClaimsRepository().file({
|
|
106
|
+
kind,
|
|
107
|
+
orderId: order.id,
|
|
108
|
+
storeId: order.storeId ?? "",
|
|
109
|
+
buyerId: user.uid,
|
|
110
|
+
reason: input.reason,
|
|
111
|
+
detail,
|
|
112
|
+
claimedAmount,
|
|
113
|
+
...(input.itemIds?.length ? { itemIds: input.itemIds } : {}),
|
|
114
|
+
...(input.evidenceUrls?.length ? { evidenceUrls: input.evidenceUrls } : {}),
|
|
115
|
+
...(order.isTestData ? { isTestData: true } : {}),
|
|
116
|
+
});
|
|
117
|
+
/*
|
|
118
|
+
* Into the operator queue, because a claim is money at risk with a human
|
|
119
|
+
* decision attached — which is exactly what `paymentCases` is for. Keyed on
|
|
120
|
+
* the claim, so re-filing or a sweep re-observing it produces one case.
|
|
121
|
+
*
|
|
122
|
+
* Fire-and-forget: a queue write must never fail the buyer's claim.
|
|
123
|
+
*/
|
|
124
|
+
void paymentCasesRepository()
|
|
125
|
+
.openOrObserve({
|
|
126
|
+
kind: "protection_claim",
|
|
127
|
+
subjectId: `claim:${claim.id}`,
|
|
128
|
+
severity: "warning",
|
|
129
|
+
title: `${kind === "shipping" ? "Shipment" : "Sale"} protection claim — ${order.id}`,
|
|
130
|
+
detail: [
|
|
131
|
+
`A buyer has claimed against protection cover they paid for.`,
|
|
132
|
+
"",
|
|
133
|
+
`Order: ${order.id}`,
|
|
134
|
+
`Store: ${order.storeId ?? "(none)"}`,
|
|
135
|
+
`Cover: ${kind} (fee paid: ${feePaid})`,
|
|
136
|
+
`Reason: ${input.reason}`,
|
|
137
|
+
`Claimed amount: ${claimedAmount}`,
|
|
138
|
+
"",
|
|
139
|
+
detail,
|
|
140
|
+
"",
|
|
141
|
+
`🛑 A PROTECTED claim is refunded unconditionally — the finding decides`,
|
|
142
|
+
`WHO PAYS, never whether the buyer is refunded. See adjudicateClaim.`,
|
|
143
|
+
].join("\n"),
|
|
144
|
+
entityType: "order",
|
|
145
|
+
entityId: order.id,
|
|
146
|
+
amountAtRisk: claimedAmount,
|
|
147
|
+
orderIds: [order.id],
|
|
148
|
+
})
|
|
149
|
+
.catch((err) => {
|
|
150
|
+
void normalizeError(err);
|
|
151
|
+
});
|
|
152
|
+
serverLogger.warn("protection claim filed", {
|
|
153
|
+
claimId: claim.id,
|
|
154
|
+
orderId: order.id,
|
|
155
|
+
kind,
|
|
156
|
+
reason: input.reason,
|
|
157
|
+
});
|
|
158
|
+
return { claimId: claim.id };
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Adjudicate as an admin or moderator.
|
|
163
|
+
*
|
|
164
|
+
* 🛑 THE FINDING DECIDES WHO PAYS, NEVER WHETHER A PROTECTED BUYER IS
|
|
165
|
+
* REFUNDED. `adjudicateClaim` encodes that and this action does not
|
|
166
|
+
* second-guess it: on protected cover a `change-of-mind` finding STILL refunds
|
|
167
|
+
* the buyer and moves the cost to the platform, raising a report — because the
|
|
168
|
+
* promise sold was unconditional, and the only honest enforcement against
|
|
169
|
+
* repeat abuse is withdrawing FUTURE eligibility, not denying this claim.
|
|
170
|
+
*
|
|
171
|
+
* 🛑 It records the decision and does NOT move money. The refund is
|
|
172
|
+
* `processRefundAction`'s job, with its own idempotency key — and keeping them
|
|
173
|
+
* apart means a claim that adjudicated but failed to refund leaves an `upheld`
|
|
174
|
+
* claim with no `refundId`, which is a findable state rather than a lost one.
|
|
175
|
+
*/
|
|
176
|
+
export async function adjudicateProtectionClaimAction(claimId, finding) {
|
|
177
|
+
return wrapAction(async () => {
|
|
178
|
+
const user = await requireRoleUser(["admin", "moderator"]);
|
|
179
|
+
const claim = await protectionClaimsRepository().findById(claimId);
|
|
180
|
+
if (!claim)
|
|
181
|
+
throw new NotFoundError(`Protection claim ${claimId} not found`);
|
|
182
|
+
if (claim.adjudicatedAt) {
|
|
183
|
+
throw new ValidationError("This claim has already been adjudicated.");
|
|
184
|
+
}
|
|
185
|
+
/*
|
|
186
|
+
* `protectedSale` is whether SALE cover was bought — the only tier
|
|
187
|
+
* `adjudicateClaim` branches on. A shipment claim is assessed on the
|
|
188
|
+
* finding alone, which is correct: transit cover is about the parcel
|
|
189
|
+
* arriving, and "the buyer changed their mind" is not a transit outcome.
|
|
190
|
+
*/
|
|
191
|
+
const outcome = adjudicateClaim(claim.kind === "sale", finding);
|
|
192
|
+
await protectionClaimsRepository().adjudicate(claimId, {
|
|
193
|
+
finding,
|
|
194
|
+
outcome,
|
|
195
|
+
adjudicatedBy: user.uid,
|
|
196
|
+
});
|
|
197
|
+
serverLogger.warn("protection claim adjudicated", {
|
|
198
|
+
claimId,
|
|
199
|
+
finding,
|
|
200
|
+
refundBuyer: outcome.refundBuyer,
|
|
201
|
+
costBorneBy: outcome.costBorneBy,
|
|
202
|
+
raisesReport: outcome.raisesReport,
|
|
203
|
+
});
|
|
204
|
+
return { outcome };
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
/** A buyer's own claims, for their order detail page. */
|
|
208
|
+
export async function getMyProtectionClaimsAction() {
|
|
209
|
+
return wrapAction(async () => {
|
|
210
|
+
const user = await requireRoleUser(["user", "buyer", "seller", "admin"]);
|
|
211
|
+
return protectionClaimsRepository().listForBuyer(user.uid);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
/** Whether this order can be claimed against right now, for rendering the CTA. */
|
|
215
|
+
export async function canClaimProtection(order, kind) {
|
|
216
|
+
const feePaid = kind === "shipping" ? order.shipmentProtectionFee : order.saleProtectionFee;
|
|
217
|
+
if (!feePaid || feePaid <= 0)
|
|
218
|
+
return { can: false, reason: "not-covered" };
|
|
219
|
+
const existing = await protectionClaimsRepository().findById(createProtectionClaimId(order.id, kind));
|
|
220
|
+
if (existing)
|
|
221
|
+
return { can: false, reason: "already-claimed" };
|
|
222
|
+
const obligationKind = kind === "shipping" ? "claim-shipping" : "claim-sale";
|
|
223
|
+
const window = deadlinesFor(order).find((d) => d.kind === obligationKind);
|
|
224
|
+
if (order.deliveryDate && window && window.dueAt.getTime() <= Date.now()) {
|
|
225
|
+
return { can: false, reason: "window-closed" };
|
|
226
|
+
}
|
|
227
|
+
return { can: true };
|
|
228
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* protection-claims — server surface.
|
|
3
|
+
*
|
|
4
|
+
* Narrow by design (Root Cause #18): the three actions a route calls, plus the
|
|
5
|
+
* CTA predicate a page needs. The repository is imported directly by anything
|
|
6
|
+
* that queries.
|
|
7
|
+
*/
|
|
8
|
+
export { fileProtectionClaimAction, adjudicateProtectionClaimAction, getMyProtectionClaimsAction, canClaimProtection, type FileProtectionClaimInput, } from "./actions";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* protection-claims — server surface.
|
|
3
|
+
*
|
|
4
|
+
* Narrow by design (Root Cause #18): the three actions a route calls, plus the
|
|
5
|
+
* CTA predicate a page needs. The repository is imported directly by anything
|
|
6
|
+
* that queries.
|
|
7
|
+
*/
|
|
8
|
+
export { fileProtectionClaimAction, adjudicateProtectionClaimAction, getMyProtectionClaimsAction, canClaimProtection, } from "./actions.js";
|
|
@@ -20,6 +20,26 @@ export type ProcessRefundInput = {
|
|
|
20
20
|
confirmIrrevocable: true;
|
|
21
21
|
/** uid of the user processing the refund (admin / seller). */
|
|
22
22
|
refundedBy: string;
|
|
23
|
+
/**
|
|
24
|
+
* 🛑 REQUIRED (D2). The caller's stable key for this logical refund.
|
|
25
|
+
*
|
|
26
|
+
* `refundId` used to be a server-side `randomUUID()` per call, which can
|
|
27
|
+
* never be idempotent: a double-clicked button minted two ids and issued
|
|
28
|
+
* **two real gateway refunds**. The entry id is now
|
|
29
|
+
* `sha256(idempotencyKey)`, so a retry reproduces the identical entry and
|
|
30
|
+
* the claim document refuses the second attempt.
|
|
31
|
+
*
|
|
32
|
+
* Required rather than optional ON PURPOSE — an optional key with a
|
|
33
|
+
* `randomUUID()` fallback is the old bug wearing a new name, and it would
|
|
34
|
+
* be reached by exactly the callers that forgot.
|
|
35
|
+
*
|
|
36
|
+
* What to pass: the submitting UI generates ONE uuid per form OPEN (so a
|
|
37
|
+
* double-click reuses it and a genuine second refund gets a new one);
|
|
38
|
+
* server-initiated paths use a NATURAL key — the out-of-stock auto-refund
|
|
39
|
+
* uses `oos_{merchantOrderId}`, which also makes it idempotent across
|
|
40
|
+
* checkout retries, a money fix in its own right.
|
|
41
|
+
*/
|
|
42
|
+
idempotencyKey: string;
|
|
23
43
|
} & ({
|
|
24
44
|
method: "phonepe";
|
|
25
45
|
/** The order's PhonePe merchantOrderId (order.paymentId) — PhonePe refunds are order-keyed, never payment-keyed. */
|
|
@@ -15,8 +15,16 @@ import { wrapAction } from "@mohasinac/appkit/server";
|
|
|
15
15
|
*
|
|
16
16
|
* Setting `contestable` to false is a side-effect of `orderRepository.postRefundEvent`.
|
|
17
17
|
*/
|
|
18
|
-
|
|
18
|
+
/*
|
|
19
|
+
* `createHash`, not `randomUUID` — see `idempotencyKey` on the input type. A
|
|
20
|
+
* server-minted random id cannot be idempotent, which is what made a
|
|
21
|
+
* double-clicked button issue two real gateway refunds (D2).
|
|
22
|
+
*/
|
|
23
|
+
import { createHash } from "crypto";
|
|
19
24
|
import { getProviders } from "../../../../contracts/registry.js";
|
|
25
|
+
import { siteSettingsRepository } from "../../../../features/admin/repository/site-settings.repository.js";
|
|
26
|
+
import { refundCapacity, wouldBeFullRefund, MONEY_EPSILON, } from "../../../shared/checkout/refundable-base.js";
|
|
27
|
+
import { REFUND_CLAIMS_COLLECTION } from "../../../../features/orders/schemas/firestore.js";
|
|
20
28
|
import { normalizeError } from "../../../../errors/normalize.js";
|
|
21
29
|
import { rupeesToPaise } from "../../../../core/money.js";
|
|
22
30
|
import { orderRepository } from "../../../../features/orders/repository/orders.repository.js";
|
|
@@ -86,8 +94,49 @@ export async function processRefundAction(input) {
|
|
|
86
94
|
throw new NotFoundError(`Order ${input.orderId} not found`);
|
|
87
95
|
if (input.amount <= 0)
|
|
88
96
|
throw new ValidationError("Refund amount must be positive");
|
|
89
|
-
|
|
90
|
-
|
|
97
|
+
/*
|
|
98
|
+
* One settings read, and only for the LEGACY case: orders written before
|
|
99
|
+
* `platformFeeGst` was persisted (2026-10-21) need their fee's GST
|
|
100
|
+
* derived, and deriving it from a rate we had to look up is still far
|
|
101
|
+
* better than D32's mistake of deriving the whole fee from a live
|
|
102
|
+
* percentage. Orders written after that date ignore this value entirely.
|
|
103
|
+
*
|
|
104
|
+
* Accepted cost: one read on an operator-initiated, rare action. The
|
|
105
|
+
* alternative — skipping it — would under-withhold on legacy orders,
|
|
106
|
+
* which sounds buyer-friendly but inflates `refundableBase`, so a
|
|
107
|
+
* "refund everything" would leave a residue and the order would never
|
|
108
|
+
* reach `status: "refunded"` (the D3 defect, reintroduced).
|
|
109
|
+
*/
|
|
110
|
+
const siteSettings = await siteSettingsRepository.getSingleton().catch((err) => {
|
|
111
|
+
void normalizeError(err);
|
|
112
|
+
return null;
|
|
113
|
+
});
|
|
114
|
+
/*
|
|
115
|
+
* ── D1: the cap is the REMAINING balance, not the order total ────────
|
|
116
|
+
*
|
|
117
|
+
* This read `input.amount > order.totalPrice`, i.e. it compared each
|
|
118
|
+
* refund against the whole order — while the function's own docstring
|
|
119
|
+
* promised "≤ remaining refundable amount". So on a ₹600 order, ₹500 and
|
|
120
|
+
* then another ₹500 BOTH passed: ₹1,000 refunded, two real gateway
|
|
121
|
+
* calls, both successful.
|
|
122
|
+
*
|
|
123
|
+
* 🛑 The ceiling is `refundableBase`, not `totalPrice`: the platform fee
|
|
124
|
+
* is non-refundable by policy, which the product already tells the buyer
|
|
125
|
+
* (`REFUND_COPY.request.acknowledgments[2]`).
|
|
126
|
+
*
|
|
127
|
+
* This check is the EARLY, friendly one — it gives the operator a useful
|
|
128
|
+
* message before any provider call. It is NOT the authority: the real
|
|
129
|
+
* cap is re-evaluated inside `reserveRefund`'s transaction, because a
|
|
130
|
+
* check outside a transaction is TOCTOU and two concurrent requests
|
|
131
|
+
* could each see a clear cap and both proceed. That is exactly how the
|
|
132
|
+
* double refund above was reachable even with a correct comparison.
|
|
133
|
+
*/
|
|
134
|
+
const capacity = refundCapacity(order, siteSettings?.commissions?.gstPercent);
|
|
135
|
+
if (input.amount > capacity.remaining + MONEY_EPSILON) {
|
|
136
|
+
throw new ValidationError(`Refund of ₹${input.amount.toFixed(2)} exceeds the ₹${capacity.remaining.toFixed(2)} still refundable on this order` +
|
|
137
|
+
(capacity.withheld > 0
|
|
138
|
+
? ` (₹${capacity.withheld.toFixed(2)} platform fee is non-refundable).`
|
|
139
|
+
: "."));
|
|
91
140
|
}
|
|
92
141
|
// Guard: non-refundable orders (prize draws, bundles). A property of the
|
|
93
142
|
// listing TYPE, decided by the platform — checked first because it
|
|
@@ -118,17 +167,72 @@ export async function processRefundAction(input) {
|
|
|
118
167
|
// SB-UNI-N — digital-code refund gate: block if code is already claimed (revealed).
|
|
119
168
|
const digitalCodeItems = (order.items ?? []).filter((i) => (i.listingType ?? "standard") === "digital-code");
|
|
120
169
|
await assertDigitalCodesNotClaimed(input.orderId, digitalCodeItems);
|
|
121
|
-
|
|
170
|
+
/*
|
|
171
|
+
* ── D2: IDEMPOTENCY ──────────────────────────────────────────────────
|
|
172
|
+
*
|
|
173
|
+
* `const refundId = randomUUID()` was generated SERVER-SIDE, per call.
|
|
174
|
+
* A server-minted id can never be idempotent: a double-clicked button
|
|
175
|
+
* produced two different ids and therefore **two real gateway refunds**.
|
|
176
|
+
*
|
|
177
|
+
* The id is now derived from the caller's `idempotencyKey`, so a retry
|
|
178
|
+
* of the same logical request produces the identical entry. The client
|
|
179
|
+
* generates one key per form OPEN, so a double-click reuses it while a
|
|
180
|
+
* genuine second refund gets a new one.
|
|
181
|
+
*
|
|
182
|
+
* Truncated to 32 chars to stay comfortably inside a Firestore document
|
|
183
|
+
* id while keeping ~128 bits of the digest — collision risk is
|
|
184
|
+
* negligible and a collision degrades to "treated as a retry", which is
|
|
185
|
+
* the safe direction.
|
|
186
|
+
*/
|
|
187
|
+
const refundId = createHash("sha256").update(input.idempotencyKey).digest("hex").slice(0, 32);
|
|
122
188
|
const now = new Date();
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
189
|
+
/*
|
|
190
|
+
* The at-most-once gate, BEFORE any provider call. Same `.create()`
|
|
191
|
+
* fails-if-exists primitive the gateway order claim uses — the fourth
|
|
192
|
+
* use of it in this codebase.
|
|
193
|
+
*
|
|
194
|
+
* 🛑 Claimed first and released on nothing. A claim that outlives a
|
|
195
|
+
* crash is deliberate: it is what stops a retry from issuing a second
|
|
196
|
+
* provider call for a refund that may already have succeeded. An
|
|
197
|
+
* unsettled claim older than an hour is what the reconciler looks for
|
|
198
|
+
* (Phase 4 R3), and resolving it means READING the gateway, never
|
|
199
|
+
* guessing.
|
|
200
|
+
*/
|
|
201
|
+
const claimRef = getAdminDb().collection(REFUND_CLAIMS_COLLECTION).doc(refundId);
|
|
202
|
+
try {
|
|
203
|
+
await claimRef.create({
|
|
204
|
+
orderId: input.orderId,
|
|
205
|
+
amount: input.amount,
|
|
206
|
+
state: "claimed",
|
|
207
|
+
claimedAt: now,
|
|
208
|
+
claimedBy: input.refundedBy,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
catch (claimErr) {
|
|
212
|
+
void normalizeError(claimErr);
|
|
213
|
+
/*
|
|
214
|
+
* Already claimed. Return the WINNER's refundId as a SUCCESS, not an
|
|
215
|
+
* error — the refund either happened or is in flight, and an error
|
|
216
|
+
* here makes the operator click again, which is the behaviour this
|
|
217
|
+
* whole mechanism exists to stop.
|
|
218
|
+
*/
|
|
219
|
+
serverLogger.info("refund: duplicate idempotency key — returning the existing refund", {
|
|
220
|
+
orderId: input.orderId,
|
|
221
|
+
refundId,
|
|
222
|
+
});
|
|
223
|
+
return { success: true, refundId };
|
|
130
224
|
}
|
|
131
|
-
|
|
225
|
+
/*
|
|
226
|
+
* ── D3: `isFull` measured against the REFUNDABLE BASE ────────────────
|
|
227
|
+
*
|
|
228
|
+
* This was `input.amount >= order.totalPrice`, which is unreachable once
|
|
229
|
+
* the platform fee is withheld: the largest possible refund is strictly
|
|
230
|
+
* LESS than `totalPrice`, so an order could **never** reach
|
|
231
|
+
* `status: "refunded"` and stayed fully refundable forever. It also
|
|
232
|
+
* ignored prior partial refunds entirely — ₹300 then ₹200 of ₹500 left
|
|
233
|
+
* the order open.
|
|
234
|
+
*/
|
|
235
|
+
const isFull = wouldBeFullRefund(order, input.amount, siteSettings?.commissions?.gstPercent);
|
|
132
236
|
const event = {
|
|
133
237
|
refundId,
|
|
134
238
|
type: input.type,
|
|
@@ -144,7 +248,6 @@ export async function processRefundAction(input) {
|
|
|
144
248
|
: RETURN_REASON_LABEL[input.reasonCode],
|
|
145
249
|
refundedAt: now,
|
|
146
250
|
refundedBy: input.refundedBy,
|
|
147
|
-
...(phonepeRefundId ? { phonepeRefundId } : {}),
|
|
148
251
|
...(input.method === "manual" && input.manualTransactionId
|
|
149
252
|
? { manualTransactionId: input.manualTransactionId }
|
|
150
253
|
: {}),
|
|
@@ -155,11 +258,117 @@ export async function processRefundAction(input) {
|
|
|
155
258
|
}
|
|
156
259
|
: {}),
|
|
157
260
|
};
|
|
158
|
-
|
|
261
|
+
/*
|
|
262
|
+
* ── D6: TWO-PHASE WRITE AROUND THE PROVIDER CALL ─────────────────────
|
|
263
|
+
*
|
|
264
|
+
* The old sequence was: call the gateway, then `postRefundEvent`, which
|
|
265
|
+
* does `findById` then `[...existing, event]`. Two problems.
|
|
266
|
+
*
|
|
267
|
+
* (a) The append is a read-then-write, so two concurrent refunds both
|
|
268
|
+
* read the same array and the second **loses the first's event
|
|
269
|
+
* entirely**.
|
|
270
|
+
* (b) A crash between the gateway call and the write leaves money gone
|
|
271
|
+
* from the gateway and NO RECORD of it on our side — unrecoverable
|
|
272
|
+
* without manually reading the provider.
|
|
273
|
+
*
|
|
274
|
+
* Reserve (transactional, cap enforced inside) → provider call (outside
|
|
275
|
+
* any transaction, because a transaction RETRIES its body and a retried
|
|
276
|
+
* network call is a second refund) → settle. This is the only ordering
|
|
277
|
+
* in which "money left and we do not know" is impossible: a crash now
|
|
278
|
+
* leaves a `reserved` entry plus an unsettled claim, which is a
|
|
279
|
+
* detectable, resolvable state.
|
|
280
|
+
*/
|
|
281
|
+
await orderRepository.reserveRefund(input.orderId, event, {
|
|
282
|
+
refundableBase: capacity.base,
|
|
283
|
+
epsilon: MONEY_EPSILON,
|
|
284
|
+
});
|
|
285
|
+
let gatewayRefundId;
|
|
286
|
+
let gatewayName;
|
|
287
|
+
if (input.method === "phonepe") {
|
|
288
|
+
const payment = getProviders().payment;
|
|
289
|
+
if (!payment)
|
|
290
|
+
throw new ValidationError("Payment provider not configured");
|
|
291
|
+
try {
|
|
292
|
+
const result = await payment.refund(input.phonepeOrderId, rupeesToPaise(input.amount));
|
|
293
|
+
gatewayRefundId = result.id;
|
|
294
|
+
gatewayName = payment.name;
|
|
295
|
+
}
|
|
296
|
+
catch (providerErr) {
|
|
297
|
+
void normalizeError(providerErr);
|
|
298
|
+
/*
|
|
299
|
+
* Release the reservation by settling it `failed`, so the amount
|
|
300
|
+
* returns to the refundable balance — `committedRefundTotal` skips
|
|
301
|
+
* failed entries, which is why no explicit release exists to forget.
|
|
302
|
+
* Then rethrow: the operator must know the gateway refused.
|
|
303
|
+
*/
|
|
304
|
+
await orderRepository
|
|
305
|
+
.settleRefund(input.orderId, refundId, {
|
|
306
|
+
status: "failed",
|
|
307
|
+
failureReason: providerErr instanceof Error ? providerErr.message : String(providerErr),
|
|
308
|
+
})
|
|
309
|
+
.catch((settleErr) => {
|
|
310
|
+
void normalizeError(settleErr);
|
|
311
|
+
serverLogger.error("refund: could not mark a failed reservation — it will hold the balance until reconciled", {
|
|
312
|
+
orderId: input.orderId,
|
|
313
|
+
refundId,
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
await claimRef
|
|
317
|
+
.update({ state: "failed", settledAt: new Date() })
|
|
318
|
+
.catch(() => { });
|
|
319
|
+
throw providerErr;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/*
|
|
323
|
+
* ── D7: the gateway id, recorded gateway-BLIND and provider-specific ──
|
|
324
|
+
*
|
|
325
|
+
* Razorpay's refund id used to be written to `phonepeRefundId`
|
|
326
|
+
* unconditionally (`phonepeRefundId = result.id`, no branch), while the
|
|
327
|
+
* declared `razorpayRefundId` was written by nothing — so a Razorpay
|
|
328
|
+
* refund existed in their dashboard with no way to tie it to ours.
|
|
329
|
+
*
|
|
330
|
+
* `gatewayRefundId` is what a reconciler reads and needs no knowledge of
|
|
331
|
+
* which provider ran. The provider-specific field is populated too, by
|
|
332
|
+
* the provider that actually produced the id, for an operator searching
|
|
333
|
+
* one dashboard.
|
|
334
|
+
*/
|
|
335
|
+
await orderRepository.settleRefund(input.orderId, refundId, {
|
|
336
|
+
status: "processed",
|
|
337
|
+
...(gatewayRefundId ? { gatewayRefundId } : {}),
|
|
338
|
+
...(gatewayName ? { gateway: gatewayName } : {}),
|
|
339
|
+
providerFields: gatewayRefundId && gatewayName === "razorpay"
|
|
340
|
+
? { razorpayRefundId: gatewayRefundId }
|
|
341
|
+
: gatewayRefundId
|
|
342
|
+
? { phonepeRefundId: gatewayRefundId }
|
|
343
|
+
: {},
|
|
344
|
+
}, isFull);
|
|
345
|
+
await claimRef
|
|
346
|
+
.update({ state: "settled", settledAt: new Date() })
|
|
347
|
+
.catch((err) => {
|
|
348
|
+
void normalizeError(err);
|
|
349
|
+
// Harmless: the refund is recorded. An unsettled claim only means
|
|
350
|
+
// the reconciler will look at it once and find it already done.
|
|
351
|
+
serverLogger.warn("refund: claim not marked settled", { refundId });
|
|
352
|
+
});
|
|
159
353
|
// SB-UNI-N — revoke any available (unclaimed) digital codes linked to this order.
|
|
160
354
|
revokeAvailableDigitalCodes(input.orderId, digitalCodeItems);
|
|
161
|
-
|
|
162
|
-
|
|
355
|
+
/*
|
|
356
|
+
* Clawback — deduct from the store's pending payout if one exists.
|
|
357
|
+
*
|
|
358
|
+
* 🛑 Still fire-and-forget on the FAILURE path, and that part is
|
|
359
|
+
* correct: the refund event is already posted and the buyer's money is
|
|
360
|
+
* already moving, so an accounting side effect must never roll it back.
|
|
361
|
+
*
|
|
362
|
+
* What changed on 2026-10-21 is that the RESULT is no longer discarded.
|
|
363
|
+
* This read `.catch(() => {})` with no `.then`, on the strength of the
|
|
364
|
+
* action's own docstring claiming an unrecovered clawback was "reflected
|
|
365
|
+
* in the next payout cycle" — which is false, verified: there is no
|
|
366
|
+
* seller ledger and each payout is computed fresh from a new batch of
|
|
367
|
+
* delivered orders, so the seller simply keeps money for goods that came
|
|
368
|
+
* back (D10). The action now records that case durably and returns a
|
|
369
|
+
* destination; this logs which one, so a refund and its clawback can be
|
|
370
|
+
* followed in one place.
|
|
371
|
+
*/
|
|
163
372
|
if (order.storeId) {
|
|
164
373
|
applyRefundDeductionAction({
|
|
165
374
|
storeId: order.storeId,
|
|
@@ -169,7 +378,40 @@ export async function processRefundAction(input) {
|
|
|
169
378
|
// Same derived string the refund event records, so the payout
|
|
170
379
|
// deduction and the refund history read identically.
|
|
171
380
|
reason: event.reason,
|
|
172
|
-
})
|
|
381
|
+
})
|
|
382
|
+
.then((res) => {
|
|
383
|
+
if (!res.ok) {
|
|
384
|
+
serverLogger.error("clawback action failed", {
|
|
385
|
+
orderId: input.orderId,
|
|
386
|
+
refundId,
|
|
387
|
+
});
|
|
388
|
+
return;
|
|
389
|
+
}
|
|
390
|
+
if (res.data.applied) {
|
|
391
|
+
serverLogger.info("clawback netted off a pending payout", {
|
|
392
|
+
orderId: input.orderId,
|
|
393
|
+
payoutId: res.data.payoutId,
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
/*
|
|
398
|
+
* The seller has been paid for returned goods. Loud, because
|
|
399
|
+
* there is no automatic recovery — `recordedAs` names the
|
|
400
|
+
* durable row at /admin/maintenance/payment-rollbacks.
|
|
401
|
+
*/
|
|
402
|
+
serverLogger.error("clawback UNRECOVERED — seller retains refunded amount", {
|
|
403
|
+
orderId: input.orderId,
|
|
404
|
+
storeId: res.data.storeId,
|
|
405
|
+
amount: res.data.amount,
|
|
406
|
+
reason: res.data.reason,
|
|
407
|
+
recordedAs: res.data.recordedAs,
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
})
|
|
411
|
+
.catch((clawbackErr) => {
|
|
412
|
+
void normalizeError(clawbackErr);
|
|
413
|
+
serverLogger.error("clawback threw", { orderId: input.orderId, refundId });
|
|
414
|
+
});
|
|
173
415
|
}
|
|
174
416
|
return { success: true, refundId };
|
|
175
417
|
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How much of an order can still be refunded — the one server-side answer.
|
|
3
|
+
*
|
|
4
|
+
* `refundable-base.ts` is deliberately PURE: it takes `legacyGstPercent` as an
|
|
5
|
+
* argument rather than reading settings, so it stays testable and so a caller
|
|
6
|
+
* cannot accidentally apply today's GST rate to a historical order. That purity
|
|
7
|
+
* is right, and it leaves every server caller needing the same three lines to
|
|
8
|
+
* supply the argument.
|
|
9
|
+
*
|
|
10
|
+
* Three callers now need them — `cancelOrderWithRefund`, `obligationSweep`'s
|
|
11
|
+
* auto-refund branches, and `processRefundAction`'s own cap check — and three
|
|
12
|
+
* copies of a money calculation is Root Cause #75's exact shape. So the
|
|
13
|
+
* settings read lives here, once.
|
|
14
|
+
*
|
|
15
|
+
* 🛑 The read is for ONE case and it is not optional. Orders written before
|
|
16
|
+
* `platformFeeGst` was persisted (2026-10-21) carry no stored fee GST, so it
|
|
17
|
+
* has to be derived from the rate — and if two callers derive it differently,
|
|
18
|
+
* or one skips it, they disagree about the cap. The direction of that
|
|
19
|
+
* disagreement matters: skipping the GST INFLATES the refundable base, so a
|
|
20
|
+
* "refund everything" leaves a sub-rupee residue and the order can never reach
|
|
21
|
+
* `status: "refunded"` — which is D3, reintroduced by omission.
|
|
22
|
+
*
|
|
23
|
+
* A failed settings read degrades to `undefined`, which means legacy orders
|
|
24
|
+
* under-withhold rather than the whole refund failing. That is the safer
|
|
25
|
+
* direction for the buyer and it is visible: the residue shows up as an order
|
|
26
|
+
* stuck short of `refunded`, which R5 in `paymentReconcile` reports.
|
|
27
|
+
*/
|
|
28
|
+
import { type RefundCapacity, type RefundableOrderLike } from "../../../shared/checkout/refundable-base";
|
|
29
|
+
export declare function resolveRefundCapacity(order: RefundableOrderLike): Promise<RefundCapacity>;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How much of an order can still be refunded — the one server-side answer.
|
|
3
|
+
*
|
|
4
|
+
* `refundable-base.ts` is deliberately PURE: it takes `legacyGstPercent` as an
|
|
5
|
+
* argument rather than reading settings, so it stays testable and so a caller
|
|
6
|
+
* cannot accidentally apply today's GST rate to a historical order. That purity
|
|
7
|
+
* is right, and it leaves every server caller needing the same three lines to
|
|
8
|
+
* supply the argument.
|
|
9
|
+
*
|
|
10
|
+
* Three callers now need them — `cancelOrderWithRefund`, `obligationSweep`'s
|
|
11
|
+
* auto-refund branches, and `processRefundAction`'s own cap check — and three
|
|
12
|
+
* copies of a money calculation is Root Cause #75's exact shape. So the
|
|
13
|
+
* settings read lives here, once.
|
|
14
|
+
*
|
|
15
|
+
* 🛑 The read is for ONE case and it is not optional. Orders written before
|
|
16
|
+
* `platformFeeGst` was persisted (2026-10-21) carry no stored fee GST, so it
|
|
17
|
+
* has to be derived from the rate — and if two callers derive it differently,
|
|
18
|
+
* or one skips it, they disagree about the cap. The direction of that
|
|
19
|
+
* disagreement matters: skipping the GST INFLATES the refundable base, so a
|
|
20
|
+
* "refund everything" leaves a sub-rupee residue and the order can never reach
|
|
21
|
+
* `status: "refunded"` — which is D3, reintroduced by omission.
|
|
22
|
+
*
|
|
23
|
+
* A failed settings read degrades to `undefined`, which means legacy orders
|
|
24
|
+
* under-withhold rather than the whole refund failing. That is the safer
|
|
25
|
+
* direction for the buyer and it is visible: the residue shows up as an order
|
|
26
|
+
* stuck short of `refunded`, which R5 in `paymentReconcile` reports.
|
|
27
|
+
*/
|
|
28
|
+
import { siteSettingsRepository } from "../../../../features/admin/repository/site-settings.repository.js";
|
|
29
|
+
import { refundCapacity, } from "../../../shared/checkout/refundable-base.js";
|
|
30
|
+
import { normalizeError } from "../../../../errors/normalize.js";
|
|
31
|
+
export async function resolveRefundCapacity(order) {
|
|
32
|
+
const settings = await siteSettingsRepository.getSingleton().catch((err) => {
|
|
33
|
+
void normalizeError(err);
|
|
34
|
+
return null;
|
|
35
|
+
});
|
|
36
|
+
return refundCapacity(order, settings?.commissions?.gstPercent);
|
|
37
|
+
}
|