@mohasinac/appkit 4.59.0 → 4.60.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.build-stamp.json +3 -3
- package/dist/_internal/client/features/layout/DashboardLayoutClient.js +62 -5
- package/dist/_internal/client/features/maintenance/views/MaintenanceDashboardView.js +2 -2
- package/dist/_internal/server/features/brands/actions.js +78 -4
- package/dist/_internal/server/features/checkout/actions.d.ts +36 -13
- package/dist/_internal/server/features/checkout/actions.js +668 -183
- package/dist/_internal/server/features/checkout/supplier-identity.js +18 -1
- package/dist/_internal/server/features/gateway-events/index.d.ts +10 -0
- package/dist/_internal/server/features/gateway-events/index.js +10 -0
- package/dist/_internal/server/features/gateway-events/ingest.d.ts +127 -0
- package/dist/_internal/server/features/gateway-events/ingest.js +188 -0
- package/dist/_internal/server/features/gateway-events/redact.d.ts +66 -0
- package/dist/_internal/server/features/gateway-events/redact.js +151 -0
- package/dist/_internal/server/features/grievance/actions.d.ts +63 -0
- package/dist/_internal/server/features/grievance/actions.js +173 -0
- package/dist/_internal/server/features/grievance/index.d.ts +8 -0
- package/dist/_internal/server/features/grievance/index.js +8 -0
- package/dist/_internal/server/features/grouped/data.js +28 -3
- package/dist/_internal/server/features/lottery/actions.js +99 -4
- package/dist/_internal/server/features/order-completion/actions.d.ts +92 -0
- package/dist/_internal/server/features/order-completion/actions.js +336 -0
- package/dist/_internal/server/features/order-completion/index.d.ts +7 -0
- package/dist/_internal/server/features/order-completion/index.js +7 -0
- package/dist/_internal/server/features/orders/actions.d.ts +13 -0
- package/dist/_internal/server/features/orders/actions.js +56 -2
- package/dist/_internal/server/features/orders/adapters.d.ts +20 -2
- package/dist/_internal/server/features/orders/adapters.js +44 -0
- package/dist/_internal/server/features/orders/cancellation-refund.d.ts +116 -0
- package/dist/_internal/server/features/orders/cancellation-refund.js +466 -0
- package/dist/_internal/server/features/orders/index.d.ts +2 -1
- package/dist/_internal/server/features/orders/index.js +1 -1
- package/dist/_internal/server/features/orders/service.d.ts +60 -0
- package/dist/_internal/server/features/orders/service.js +74 -0
- package/dist/_internal/server/features/payment-cases/disputes.d.ts +76 -0
- package/dist/_internal/server/features/payment-cases/disputes.js +241 -0
- package/dist/_internal/server/features/payment-cases/index.d.ts +9 -0
- package/dist/_internal/server/features/payment-cases/index.js +9 -0
- package/dist/_internal/server/features/payouts/actions.d.ts +28 -3
- package/dist/_internal/server/features/payouts/actions.js +84 -10
- package/dist/_internal/server/features/points/adjust.d.ts +61 -0
- package/dist/_internal/server/features/points/adjust.js +121 -0
- package/dist/_internal/server/features/points/award.d.ts +65 -0
- package/dist/_internal/server/features/points/award.js +145 -0
- package/dist/_internal/server/features/price-index/market.d.ts +33 -0
- package/dist/_internal/server/features/price-index/market.js +54 -1
- package/dist/_internal/server/features/products/data.js +40 -22
- package/dist/_internal/server/features/protection-claims/actions.d.ts +72 -0
- package/dist/_internal/server/features/protection-claims/actions.js +228 -0
- package/dist/_internal/server/features/protection-claims/index.d.ts +8 -0
- package/dist/_internal/server/features/protection-claims/index.js +8 -0
- package/dist/_internal/server/features/refunds/actions.d.ts +20 -0
- package/dist/_internal/server/features/refunds/actions.js +259 -17
- package/dist/_internal/server/features/refunds/capacity.d.ts +29 -0
- package/dist/_internal/server/features/refunds/capacity.js +37 -0
- package/dist/_internal/server/features/reviews/actions.js +3 -2
- package/dist/_internal/server/features/search/index-build/sources.js +20 -1
- package/dist/_internal/server/features/shipping/reconcile.d.ts +10 -1
- package/dist/_internal/server/features/shipping/reconcile.js +34 -3
- package/dist/_internal/server/features/shipping/reimbursement.d.ts +117 -0
- package/dist/_internal/server/features/shipping/reimbursement.js +223 -0
- package/dist/_internal/server/features/stores/tabs.d.ts +19 -4
- package/dist/_internal/server/features/stores/tabs.js +24 -4
- package/dist/_internal/server/functions/https.d.ts +31 -1
- package/dist/_internal/server/functions/https.js +52 -1
- package/dist/_internal/server/functions/scheduled.d.ts +72 -1
- package/dist/_internal/server/functions/scheduled.js +124 -1
- package/dist/_internal/server/jobs/core/autoPayoutEligibility.js +62 -16
- package/dist/_internal/server/jobs/core/boxRollupReconcile.d.ts +46 -0
- package/dist/_internal/server/jobs/core/boxRollupReconcile.js +142 -0
- package/dist/_internal/server/jobs/core/dailyDataCleanup.js +149 -1
- package/dist/_internal/server/jobs/core/dailyStatusDigest.d.ts +14 -0
- package/dist/_internal/server/jobs/core/dailyStatusDigest.js +79 -1
- package/dist/_internal/server/jobs/core/index.d.ts +2 -0
- package/dist/_internal/server/jobs/core/index.js +2 -0
- package/dist/_internal/server/jobs/core/marketPriceRollup.d.ts +64 -0
- package/dist/_internal/server/jobs/core/marketPriceRollup.js +153 -0
- package/dist/_internal/server/jobs/core/obligationSweep.d.ts +36 -0
- package/dist/_internal/server/jobs/core/obligationSweep.js +503 -0
- package/dist/_internal/server/jobs/core/paymentReconcile.d.ts +79 -0
- package/dist/_internal/server/jobs/core/paymentReconcile.js +614 -0
- package/dist/_internal/server/jobs/core/paymentWindowTimeout.js +34 -0
- package/dist/_internal/server/jobs/core/weeklyPayoutEligibility.js +35 -4
- package/dist/_internal/server/jobs/handlers/boxRollupReconcile.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/boxRollupReconcile.js +15 -0
- package/dist/_internal/server/jobs/handlers/countersReconcileNow.d.ts +65 -0
- package/dist/_internal/server/jobs/handlers/countersReconcileNow.js +89 -0
- package/dist/_internal/server/jobs/handlers/index.d.ts +5 -0
- package/dist/_internal/server/jobs/handlers/index.js +5 -0
- package/dist/_internal/server/jobs/handlers/marketPriceRollup.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/marketPriceRollup.js +2 -0
- package/dist/_internal/server/jobs/handlers/obligationSweep.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/obligationSweep.js +15 -0
- package/dist/_internal/server/jobs/handlers/onShipmentAllocationSync.js +30 -1
- package/dist/_internal/server/jobs/handlers/paymentReconcile.d.ts +2 -0
- package/dist/_internal/server/jobs/handlers/paymentReconcile.js +6 -0
- package/dist/_internal/shared/actions/action-registry.d.ts +1 -1
- package/dist/_internal/shared/actions/action-registry.js +71 -0
- package/dist/_internal/shared/checkout/coupon-discount.d.ts +73 -0
- package/dist/_internal/shared/checkout/coupon-discount.js +103 -0
- package/dist/_internal/shared/checkout/lanes.d.ts +42 -0
- package/dist/_internal/shared/checkout/lanes.js +46 -0
- package/dist/_internal/shared/checkout/order-math.d.ts +149 -1
- package/dist/_internal/shared/checkout/order-math.js +251 -3
- package/dist/_internal/shared/checkout/refundable-base.d.ts +116 -0
- package/dist/_internal/shared/checkout/refundable-base.js +122 -0
- package/dist/_internal/shared/features/auctions/config.d.ts +14 -1
- package/dist/_internal/shared/features/auctions/config.js +30 -1
- package/dist/_internal/shared/features/brands/schema.d.ts +42 -0
- package/dist/_internal/shared/features/brands/schema.js +18 -0
- package/dist/_internal/shared/features/orders/refund-copy.d.ts +22 -0
- package/dist/_internal/shared/features/orders/refund-copy.js +34 -0
- package/dist/_internal/shared/features/print/label-profiles.d.ts +198 -0
- package/dist/_internal/shared/features/print/label-profiles.js +350 -0
- package/dist/_internal/shared/features/products/to-product-item.js +33 -5
- package/dist/_internal/shared/fees/calculator.d.ts +31 -2
- package/dist/_internal/shared/fees/calculator.js +103 -5
- package/dist/_internal/shared/fees/india-states.d.ts +195 -0
- package/dist/_internal/shared/fees/india-states.js +190 -0
- package/dist/_internal/shared/fees/payout-hold.d.ts +80 -0
- package/dist/_internal/shared/fees/payout-hold.js +74 -0
- package/dist/_internal/shared/obligations/deadlines.d.ts +94 -0
- package/dist/_internal/shared/obligations/deadlines.js +155 -0
- package/dist/_internal/shared/shipping/quote.d.ts +96 -0
- package/dist/_internal/shared/shipping/quote.js +67 -0
- package/dist/_internal/shared/time/business-days.d.ts +91 -0
- package/dist/_internal/shared/time/business-days.js +185 -0
- package/dist/cli/index.js +0 -2
- package/dist/client.d.ts +10 -4
- package/dist/client.js +29 -3
- package/dist/configs/tailwind.d.ts +0 -12
- package/dist/configs/tailwind.js +28 -15
- package/dist/constants/api-endpoints.d.ts +51 -9
- package/dist/constants/api-endpoints.js +23 -7
- package/dist/constants/index.d.ts +1 -1
- package/dist/constants/index.js +1 -1
- package/dist/contracts/index.d.ts +1 -1
- package/dist/contracts/payment.d.ts +131 -0
- package/dist/features/about/components/AboutView.js +1 -1
- package/dist/features/about/components/DeveloperView.js +5 -2
- package/dist/features/about/components/FAQPageView.js +2 -1
- package/dist/features/about/components/FeesView.js +2 -1
- package/dist/features/about/components/HelpPageView.js +2 -1
- package/dist/features/about/components/HowAuctionsWorkView.js +2 -1
- package/dist/features/about/components/HowCheckoutWorksView.js +2 -1
- package/dist/features/about/components/HowEmiWorksView.js +2 -1
- package/dist/features/about/components/HowOffersWorkView.js +2 -1
- package/dist/features/about/components/HowOrdersWorkView.js +2 -1
- package/dist/features/about/components/HowPayoutsWorkView.js +2 -1
- package/dist/features/about/components/HowPreOrdersWorkView.js +2 -1
- package/dist/features/about/components/HowReviewsWorkView.js +2 -1
- package/dist/features/about/components/PolicyPageView.js +2 -1
- package/dist/features/about/components/ProseHero.d.ts +73 -0
- package/dist/features/about/components/ProseHero.js +18 -0
- package/dist/features/about/components/SecurityPrivacyView.js +2 -1
- package/dist/features/about/components/ShippingPolicyView.js +2 -1
- package/dist/features/about/components/TrackOrderView.js +2 -1
- package/dist/features/about/components/UnauthorizedView.js +1 -1
- package/dist/features/about/index.d.ts +2 -0
- package/dist/features/about/index.js +5 -0
- package/dist/features/account/actions/address-actions.d.ts +26 -2
- package/dist/features/account/actions/address-actions.js +25 -1
- package/dist/features/account/components/BuyerShoppingGuideView.js +1 -1
- package/dist/features/account/components/NotificationPreferencesPanel.js +1 -1
- package/dist/features/account/components/UserOrdersView.js +17 -0
- package/dist/features/account/components/UserSidebar.js +1 -1
- package/dist/features/account/hooks/useNotifications.js +29 -0
- package/dist/features/admin/actions/admin-coupon-actions.js +36 -0
- package/dist/features/admin/components/AdminBeysView.js +2 -2
- package/dist/features/admin/components/AdminBlogEditorView.js +2 -2
- package/dist/features/admin/components/AdminBrandEditorView.js +32 -2
- package/dist/features/admin/components/AdminBundleEditorView.js +1 -1
- package/dist/features/admin/components/AdminCarouselEditorView.js +1 -1
- package/dist/features/admin/components/AdminCategoriesView.js +1 -1
- package/dist/features/admin/components/AdminCategoryEditorView.js +73 -17
- package/dist/features/admin/components/AdminContactEditorView.js +1 -1
- package/dist/features/admin/components/AdminCouponEditorView.js +26 -1
- package/dist/features/admin/components/AdminFaqEditorView.js +1 -1
- package/dist/features/admin/components/AdminFaqsView.js +2 -2
- package/dist/features/admin/components/AdminGatewayEventsView.d.ts +54 -0
- package/dist/features/admin/components/AdminGatewayEventsView.js +209 -0
- package/dist/features/admin/components/AdminGuideHubView.js +1 -1
- package/dist/features/admin/components/AdminMoneyCasesView.d.ts +60 -0
- package/dist/features/admin/components/AdminMoneyCasesView.js +287 -0
- package/dist/features/admin/components/AdminPartsView.js +2 -2
- package/dist/features/admin/components/AdminProductsView.js +75 -4
- package/dist/features/admin/components/AdminSidebar.js +2 -2
- package/dist/features/admin/components/AdminSiteSettingsView.js +65 -7
- package/dist/features/admin/components/AdminSublistingCategoriesView.js +2 -0
- package/dist/features/admin/components/AdminSupportTicketDetailView.js +1 -1
- package/dist/features/admin/components/AdminSupportTicketsView.js +2 -2
- package/dist/features/admin/components/AdminTesterChecklistView.js +2 -2
- package/dist/features/admin/components/AdminUsersView.js +72 -1
- package/dist/features/admin/components/AdminViewCards.d.ts +3 -1
- package/dist/features/admin/components/AdminViewCards.js +4 -4
- package/dist/features/admin/components/DataListingView.d.ts +28 -0
- package/dist/features/admin/components/DataListingView.js +175 -14
- package/dist/features/admin/components/DataTable.d.ts +12 -1
- package/dist/features/admin/components/DataTable.js +3 -3
- package/dist/features/admin/components/OwnerQuickActions.d.ts +1 -1
- package/dist/features/admin/components/OwnerQuickActions.js +60 -2
- package/dist/features/admin/components/RecordOwnerQuickActions.d.ts +1 -1
- package/dist/features/admin/components/RecordOwnerQuickActions.js +61 -14
- package/dist/features/admin/components/analytics/AdminStatCard.d.ts +35 -1
- package/dist/features/admin/components/analytics/AdminStatCard.js +77 -2
- package/dist/features/admin/components/index.d.ts +4 -0
- package/dist/features/admin/components/index.js +6 -0
- package/dist/features/admin/constants/filter-tabs.d.ts +156 -0
- package/dist/features/admin/constants/filter-tabs.js +106 -0
- package/dist/features/admin/repository/site-settings.repository.d.ts +22 -0
- package/dist/features/admin/repository/site-settings.repository.js +82 -1
- package/dist/features/admin/schemas/admin-editor-forms.d.ts +21 -0
- package/dist/features/admin/schemas/admin-editor-forms.js +44 -0
- package/dist/features/admin/schemas/firestore.js +5 -1
- package/dist/features/admin/schemas/site-settings-form.js +30 -1
- package/dist/features/auctions/actions/bid-actions.js +13 -1
- package/dist/features/auctions/components/AuctionBottomActions.js +2 -2
- package/dist/features/auctions/components/AuctionDetailPageView.js +3 -1
- package/dist/features/auctions/components/MarketplaceAuctionCard.d.ts +11 -0
- package/dist/features/auctions/components/MarketplaceAuctionCard.js +5 -3
- package/dist/features/auctions/components/PlaceBidFormClient.d.ts +8 -1
- package/dist/features/auctions/components/PlaceBidFormClient.js +2 -2
- package/dist/features/audit-log/schemas/firestore.d.ts +28 -0
- package/dist/features/audit-log/schemas/firestore.js +14 -0
- package/dist/features/auth/permissions/constants.d.ts +17 -1
- package/dist/features/auth/permissions/constants.js +18 -0
- package/dist/features/blog/components/BlogPostView.js +1 -1
- package/dist/features/catalogue/components/AdminCatalogueApprovalsView.js +1 -1
- package/dist/features/categories/api/[id]/description-template/route.js +107 -1
- package/dist/features/categories/components/BrandDetailPageView.js +2 -2
- package/dist/features/categories/components/BreadcrumbTrail.js +7 -1
- package/dist/features/categories/components/BundleDetailView.js +1 -1
- package/dist/features/categories/components/CategoryDetailPageView.js +2 -2
- package/dist/features/categories/components/CategoryForm.js +12 -1
- package/dist/features/categories/components/CategoryTemplatePicker.js +38 -5
- package/dist/features/categories/repository/market-price-index.repository.d.ts +123 -0
- package/dist/features/categories/repository/market-price-index.repository.js +105 -0
- package/dist/features/categories/repository/price-observation.repository.d.ts +166 -0
- package/dist/features/categories/repository/price-observation.repository.js +132 -0
- package/dist/features/events/components/EventSaleBanner.js +1 -1
- package/dist/features/events/components/EventStatusBadge.js +1 -1
- package/dist/features/faq/components/FAQAccordion.js +2 -1
- package/dist/features/faq/components/FAQCategorySidebar.js +2 -2
- package/dist/features/faq/components/FAQHelpfulButtons.js +4 -4
- package/dist/features/faq/components/RelatedFAQs.js +1 -1
- package/dist/features/filters/FilterFacetSection.js +1 -1
- package/dist/features/filters/SwitchFilter.js +1 -1
- package/dist/features/gateway-events/repository/gateway-events.repository.d.ts +117 -0
- package/dist/features/gateway-events/repository/gateway-events.repository.js +274 -0
- package/dist/features/gateway-events/schemas/firestore.d.ts +217 -0
- package/dist/features/gateway-events/schemas/firestore.js +125 -0
- package/dist/features/gateway-events/schemas/index.d.ts +81 -0
- package/dist/features/gateway-events/schemas/index.js +79 -0
- package/dist/features/grouped/components/GroupedListingDetailView.js +1 -1
- package/dist/features/homepage/components/AnnouncementBar.js +37 -1
- package/dist/features/homepage/components/AnnouncementBar.style.css +30 -0
- package/dist/features/homepage/components/BrandsSection.js +1 -1
- package/dist/features/homepage/components/CTABannerSection.js +1 -1
- package/dist/features/homepage/components/FeaturedBundlesSection.js +14 -24
- package/dist/features/homepage/components/HeroCarousel.js +2 -2
- package/dist/features/homepage/components/SocialPostCard.js +1 -1
- package/dist/features/inventory/components/AdminMoveLedgerView.d.ts +7 -0
- package/dist/features/inventory/components/AdminMoveLedgerView.js +157 -0
- package/dist/features/inventory/components/AdminStorageBoxesView.d.ts +11 -0
- package/dist/features/inventory/components/AdminStorageBoxesView.js +168 -0
- package/dist/features/inventory/components/ReceiveStationView.d.ts +39 -0
- package/dist/features/inventory/components/ReceiveStationView.js +413 -0
- package/dist/features/inventory/components/operator-message.d.ts +29 -0
- package/dist/features/inventory/components/operator-message.js +41 -0
- package/dist/features/inventory/index.d.ts +13 -0
- package/dist/features/inventory/index.js +28 -0
- package/dist/features/inventory/repository/inventory-movements.repository.d.ts +97 -0
- package/dist/features/inventory/repository/inventory-movements.repository.js +186 -0
- package/dist/features/inventory/repository/inventory-placements.repository.d.ts +179 -0
- package/dist/features/inventory/repository/inventory-placements.repository.js +345 -0
- package/dist/features/inventory/repository/storage-boxes.repository.d.ts +83 -0
- package/dist/features/inventory/repository/storage-boxes.repository.js +127 -0
- package/dist/features/inventory/schemas/firestore.d.ts +197 -0
- package/dist/features/inventory/schemas/firestore.js +159 -0
- package/dist/features/layout/AppLayoutShell.d.ts +12 -1
- package/dist/features/layout/AppLayoutShell.js +25 -12
- package/dist/features/layout/AutoBreadcrumbs.js +162 -3
- package/dist/features/layout/AutoBreadcrumbs.style.css +45 -0
- package/dist/features/layout/BottomNavbar.d.ts +1 -1
- package/dist/features/layout/BottomNavbar.js +2 -2
- package/dist/features/media/MediaAvatar.js +1 -1
- package/dist/features/media/MediaImage.d.ts +24 -4
- package/dist/features/media/MediaImage.js +44 -4
- package/dist/features/media/MediaLightbox.js +1 -1
- package/dist/features/media/modals/ImageCropModal.js +1 -1
- package/dist/features/media/modals/ImageEditor.js +1 -1
- package/dist/features/media/upload/MediaUploadField.js +91 -3
- package/dist/features/obligations/constants/policies.d.ts +92 -0
- package/dist/features/obligations/constants/policies.js +378 -0
- package/dist/features/obligations/repository/obligations.repository.d.ts +68 -0
- package/dist/features/obligations/repository/obligations.repository.js +158 -0
- package/dist/features/obligations/schemas/firestore.d.ts +160 -0
- package/dist/features/obligations/schemas/firestore.js +87 -0
- package/dist/features/orders/actions/order-actions.d.ts +43 -4
- package/dist/features/orders/actions/order-actions.js +60 -3
- package/dist/features/orders/actions/refund-actions.js +70 -10
- package/dist/features/orders/components/OrderCompletionPanel.d.ts +27 -0
- package/dist/features/orders/components/OrderCompletionPanel.js +192 -0
- package/dist/features/orders/components/OrdersList.js +2 -2
- package/dist/features/orders/components/RefundHistoryTable.js +3 -1
- package/dist/features/orders/components/index.d.ts +2 -0
- package/dist/features/orders/components/index.js +6 -0
- package/dist/features/orders/constants/transitions.d.ts +59 -0
- package/dist/features/orders/constants/transitions.js +104 -0
- package/dist/features/orders/repository/orders.repository.d.ts +109 -6
- package/dist/features/orders/repository/orders.repository.js +464 -21
- package/dist/features/orders/schemas/firestore.d.ts +270 -0
- package/dist/features/orders/schemas/firestore.js +24 -0
- package/dist/features/orders/schemas/index.d.ts +61 -0
- package/dist/features/orders/schemas/index.js +22 -0
- package/dist/features/orders/types/index.d.ts +79 -0
- package/dist/features/parts/components/PartsIndexPageView.js +8 -1
- package/dist/features/payment-cases/repository/payment-cases.repository.d.ts +170 -0
- package/dist/features/payment-cases/repository/payment-cases.repository.js +342 -0
- package/dist/features/payment-cases/schemas/firestore.d.ts +229 -0
- package/dist/features/payment-cases/schemas/firestore.js +105 -0
- package/dist/features/payment-cases/schemas/resolve-form.d.ts +97 -0
- package/dist/features/payment-cases/schemas/resolve-form.js +114 -0
- package/dist/features/payments/repository/payout.repository.d.ts +0 -1
- package/dist/features/payments/repository/payout.repository.js +0 -1
- package/dist/features/points/repository/points.repository.d.ts +122 -0
- package/dist/features/points/repository/points.repository.js +304 -1
- package/dist/features/points/schemas/adjust-form.d.ts +58 -0
- package/dist/features/points/schemas/adjust-form.js +63 -0
- package/dist/features/points/schemas/firestore.d.ts +108 -1
- package/dist/features/points/schemas/firestore.js +84 -0
- package/dist/features/pre-orders/components/MarketplacePreorderCard.js +3 -3
- package/dist/features/pre-orders/components/PreOrderBadge.js +1 -1
- package/dist/features/pre-orders/components/PreOrderDetailPageView.js +1 -1
- package/dist/features/price-index/components/PriceIndexToolView.d.ts +23 -4
- package/dist/features/price-index/components/PriceIndexToolView.js +71 -6
- package/dist/features/price-index/market-stats.d.ts +82 -0
- package/dist/features/price-index/market-stats.js +230 -0
- package/dist/features/print/components/BoxLabelPrintView.d.ts +25 -0
- package/dist/features/print/components/BoxLabelPrintView.js +66 -0
- package/dist/features/print/components/LabelProfilePicker.d.ts +13 -0
- package/dist/features/print/components/LabelProfilePicker.js +38 -0
- package/dist/features/print/components/labels.d.ts +117 -0
- package/dist/features/print/components/labels.js +258 -0
- package/dist/features/print/components/labels.style.css +46 -0
- package/dist/features/print/index.d.ts +6 -0
- package/dist/features/print/index.js +16 -0
- package/dist/features/products/columns/productTableColumns.js +5 -4
- package/dist/features/products/components/MarketplaceBundleCard.js +2 -2
- package/dist/features/products/components/MarketplacePrizeDrawCard.js +6 -6
- package/dist/features/products/components/PrizeDrawCollage.js +1 -1
- package/dist/features/products/components/PrizeDrawItemsEditor.js +1 -1
- package/dist/features/products/components/PrizeRevealModal.js +2 -2
- package/dist/features/products/components/ProductDetailPageView.js +18 -4
- package/dist/features/products/components/ProductForm.js +34 -23
- package/dist/features/products/components/ProductGrid.js +86 -62
- package/dist/features/products/constants/card-badges.d.ts +97 -0
- package/dist/features/products/constants/card-badges.js +100 -0
- package/dist/features/products/repository/products.repository.js +34 -1
- package/dist/features/products/schemas/firestore.d.ts +46 -3
- package/dist/features/products/schemas/firestore.js +21 -0
- package/dist/features/promotions/components/PromotionsView.js +1 -1
- package/dist/features/promotions/repository/claimed-coupons.repository.d.ts +32 -0
- package/dist/features/promotions/repository/claimed-coupons.repository.js +58 -0
- package/dist/features/promotions/schemas/firestore.js +30 -3
- package/dist/features/promotions/schemas/index.d.ts +6 -6
- package/dist/features/protection-claims/repository/protection-claims.repository.d.ts +54 -0
- package/dist/features/protection-claims/repository/protection-claims.repository.js +174 -0
- package/dist/features/protection-claims/schemas/firestore.d.ts +168 -0
- package/dist/features/protection-claims/schemas/firestore.js +130 -0
- package/dist/features/reviews/actions/review-actions.js +3 -2
- package/dist/features/reviews/components/ReviewModal.js +1 -1
- package/dist/features/reviews/components/ReviewsList.js +1 -1
- package/dist/features/reviews/schemas/firestore.d.ts +20 -1
- package/dist/features/scams/constants/scam-types.d.ts +2 -0
- package/dist/features/scams/constants/scam-types.js +18 -0
- package/dist/features/scams/schemas/report-form.d.ts +3 -3
- package/dist/features/scams/schemas/report-form.js +26 -1
- package/dist/features/search/components/Search.js +9 -9
- package/dist/features/search/components/SearchResultsClient.js +18 -3
- package/dist/features/search/components/SearchResultsPageView.d.ts +1 -6
- package/dist/features/search/components/SearchResultsPageView.js +2 -2
- package/dist/features/seller/actions/offer-actions.js +16 -1
- package/dist/features/seller/actions/seller-actions.js +14 -3
- package/dist/features/seller/components/CategoryInlineSelect.js +75 -11
- package/dist/features/seller/components/PrintCenterView.d.ts +5 -0
- package/dist/features/seller/components/PrintCenterView.js +41 -30
- package/dist/features/seller/components/SellerOrdersView.js +1 -1
- package/dist/features/seller/components/SellerPayoutRequestView.js +16 -5
- package/dist/features/seller/components/SellerPayoutSettingsView.js +1 -1
- package/dist/features/seller/components/SellerProductShell.d.ts +16 -0
- package/dist/features/seller/components/SellerProductShell.js +123 -13
- package/dist/features/seller/components/SellerReviewsView.js +4 -2
- package/dist/features/seller/components/SellerSidebar.js +1 -1
- package/dist/features/seller/schemas/coupon-form.d.ts +26 -0
- package/dist/features/seller/schemas/coupon-form.js +27 -0
- package/dist/features/seller/schemas/product-form.d.ts +3 -0
- package/dist/features/seller/schemas/product-form.js +5 -0
- package/dist/features/shell/FormShell.js +2 -2
- package/dist/features/shell/QuickFormDrawer.js +14 -0
- package/dist/features/shell/SectionForm.d.ts +19 -0
- package/dist/features/shell/SectionForm.js +133 -9
- package/dist/features/shell/SectionForm.style.css +54 -0
- package/dist/features/shipments/components/AdminShipmentsView.js +16 -1
- package/dist/features/shipments/repository/shipment-items.repository.d.ts +9 -0
- package/dist/features/shipments/repository/shipment-items.repository.js +14 -0
- package/dist/features/site-settings/components/ActionPermissionsManager.js +1 -1
- package/dist/features/sticker-trace/components/StickerCommitPanel.js +1 -1
- package/dist/features/store-extensions/schemas/report-review-form.d.ts +8 -8
- package/dist/features/stores/components/StoreGuideHubView.js +1 -1
- package/dist/features/stores/components/StoreHeader.js +1 -1
- package/dist/features/support/schemas/firestore.d.ts +73 -2
- package/dist/features/support/schemas/firestore.js +59 -0
- package/dist/index.d.ts +16 -24
- package/dist/index.js +38 -47
- package/dist/next/ErrorBoundary.js +1 -1
- package/dist/next/routing/route-map.d.ts +24 -0
- package/dist/next/routing/route-map.js +40 -0
- package/dist/providers/payment-manual/index.d.ts +15 -1
- package/dist/providers/payment-manual/index.js +37 -0
- package/dist/providers/payment-phonepe/index.d.ts +14 -1
- package/dist/providers/payment-phonepe/index.js +36 -0
- package/dist/providers/payment-razorpay/index.d.ts +44 -1
- package/dist/providers/payment-razorpay/index.js +99 -0
- package/dist/providers/shipping-shiprocket/index.d.ts +18 -0
- package/dist/providers/shipping-shiprocket/index.js +18 -0
- package/dist/schemas/registry.d.ts +44 -11
- package/dist/server-entry.d.ts +2 -0
- package/dist/server-entry.js +27 -0
- package/dist/server.d.ts +43 -0
- package/dist/server.js +98 -0
- package/dist/styles.css +418 -149
- package/dist/tailwind-utilities.css +1 -1
- package/dist/tokens/themes/default-dark.js +15 -12
- package/dist/tokens/themes/default-light.js +14 -11
- package/dist/tokens/tokens.css +106 -23
- package/dist/ui/DataTable.style.css +4 -4
- package/dist/ui/columns/cell-renderers.d.ts +20 -0
- package/dist/ui/columns/cell-renderers.js +26 -1
- package/dist/ui/columns/index.d.ts +1 -1
- package/dist/ui/columns/index.js +4 -1
- package/dist/ui/components/Badge.style.css +1 -1
- package/dist/ui/components/Breadcrumb.js +19 -1
- package/dist/ui/components/BulkActionBar.style.css +4 -4
- package/dist/ui/components/Button.style.css +1 -1
- package/dist/ui/components/Checkbox.style.css +1 -1
- package/dist/ui/components/FallbackShell.js +1 -1
- package/dist/ui/components/Form.d.ts +14 -1
- package/dist/ui/components/Form.js +2 -2
- package/dist/ui/components/FormField.js +18 -4
- package/dist/ui/components/FormField.style.css +43 -3
- package/dist/ui/components/GatedPrice.style.css +1 -1
- package/dist/ui/components/IconButton.style.css +1 -1
- package/dist/ui/components/Input.js +22 -1
- package/dist/ui/components/Input.style.css +38 -22
- package/dist/ui/components/ListingFilterDrawer.js +1 -1
- package/dist/ui/components/ListingToolbar.js +1 -1
- package/dist/ui/components/PaginatedSelect.js +0 -0
- package/dist/ui/components/Radio.style.css +1 -1
- package/dist/ui/components/Repeater.d.ts +53 -0
- package/dist/ui/components/Repeater.js +7 -0
- package/dist/ui/components/RichTextEditor.d.ts +20 -1
- package/dist/ui/components/RichTextEditor.js +23 -2
- package/dist/ui/components/Select.style.css +7 -21
- package/dist/ui/components/Semantic.js +27 -3
- package/dist/ui/components/TagInput.style.css +4 -9
- package/dist/ui/components/Textarea.style.css +4 -18
- package/dist/ui/components/Toggle.style.css +1 -1
- package/dist/ui/components/Typography.d.ts +3 -3
- package/dist/ui/components/Typography.js +15 -15
- package/dist/ui/components/ViewToggle.style.css +4 -4
- package/dist/ui/forms/AddAnotherToggle.d.ts +16 -0
- package/dist/ui/forms/AddAnotherToggle.js +56 -0
- package/dist/ui/forms/ColorPickerField.js +15 -2
- package/dist/ui/forms/FieldCheckbox.js +15 -2
- package/dist/ui/forms/FieldInput.d.ts +22 -1
- package/dist/ui/forms/FieldInput.js +19 -5
- package/dist/ui/forms/FieldLabel.d.ts +35 -0
- package/dist/ui/forms/FieldLabel.js +70 -0
- package/dist/ui/forms/FieldSelect.d.ts +4 -1
- package/dist/ui/forms/FieldSelect.js +27 -5
- package/dist/ui/forms/FieldTextarea.d.ts +4 -1
- package/dist/ui/forms/FieldTextarea.js +22 -5
- package/dist/ui/forms/FormShell.d.ts +17 -1
- package/dist/ui/forms/FormShell.js +36 -2
- package/dist/ui/forms/FormShell.style.css +41 -33
- package/dist/ui/forms/index.d.ts +5 -1
- package/dist/ui/forms/index.js +2 -0
- package/dist/ui/icons/icon-registry.d.ts +1 -0
- package/dist/ui/icons/icon-registry.js +17 -1
- package/dist/utils/id-generators.d.ts +80 -0
- package/dist/utils/id-generators.js +93 -0
- package/dist/utils/search-txt-builders.d.ts +12 -0
- package/dist/utils/search-txt-builders.js +17 -0
- package/package.json +1 -1
- package/scripts/seed-cli.mjs +106 -5
- package/dist/features/loyalty/api/admin/loyalty/grant/route.d.ts +0 -12
- package/dist/features/loyalty/api/admin/loyalty/grant/route.js +0 -38
- package/dist/features/loyalty/api/balance/route.d.ts +0 -12
- package/dist/features/loyalty/api/balance/route.js +0 -41
- package/dist/features/loyalty/api/earn/route.d.ts +0 -12
- package/dist/features/loyalty/api/earn/route.js +0 -38
- package/dist/features/loyalty/api/history/route.d.ts +0 -12
- package/dist/features/loyalty/api/history/route.js +0 -58
- package/dist/features/loyalty/api/redeem/route.d.ts +0 -12
- package/dist/features/loyalty/api/redeem/route.js +0 -38
- package/dist/features/loyalty/columns/index.d.ts +0 -17
- package/dist/features/loyalty/columns/index.js +0 -40
- package/dist/features/loyalty/components/CoinsDisplay.d.ts +0 -12
- package/dist/features/loyalty/components/CoinsDisplay.js +0 -10
- package/dist/features/loyalty/components/index.d.ts +0 -1
- package/dist/features/loyalty/components/index.js +0 -1
- package/dist/features/loyalty/hooks/useLoyaltyBalance.d.ts +0 -4
- package/dist/features/loyalty/hooks/useLoyaltyBalance.js +0 -25
- package/dist/features/loyalty/index.d.ts +0 -6
- package/dist/features/loyalty/index.js +0 -6
- package/dist/features/loyalty/manifest.d.ts +0 -2
- package/dist/features/loyalty/manifest.js +0 -16
- package/dist/features/loyalty/messages/en.json +0 -19
- package/dist/features/loyalty/repository/loyalty.repository.d.ts +0 -8
- package/dist/features/loyalty/repository/loyalty.repository.js +0 -22
- package/dist/features/loyalty/schemas/index.d.ts +0 -85
- package/dist/features/loyalty/schemas/index.js +0 -40
- package/dist/features/loyalty/server.d.ts +0 -6
- package/dist/features/loyalty/server.js +0 -6
- package/dist/features/loyalty/types/index.d.ts +0 -31
- package/dist/features/loyalty/types/index.js +0 -1
- package/dist/features/loyalty/types/loyalty-config.d.ts +0 -7
- package/dist/features/loyalty/types/loyalty-config.js +0 -1
- package/dist/features/loyalty/types/loyalty-math.d.ts +0 -9
- package/dist/features/loyalty/types/loyalty-math.js +0 -27
- package/dist/features/products/components/ProductOwnerQuickActions.d.ts +0 -11
- package/dist/features/products/components/ProductOwnerQuickActions.js +0 -120
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A failed inventory write, as something an operator can act on.
|
|
3
|
+
*
|
|
4
|
+
* 🛑 THIS EXISTS BECAUSE `toUserMessage(undefined, undefined, { fallback })`
|
|
5
|
+
* IS THE `?? error` ANTI-PATTERN. Passing `undefined` for the code means the
|
|
6
|
+
* mapping never runs and the server's own message is always what shows — which
|
|
7
|
+
* is precisely the bug Rule #9 records: an unmapped failure printed server
|
|
8
|
+
* internals to the user, and a Node `MODULE_NOT_FOUND` with a require stack was
|
|
9
|
+
* rendered inside a modal. I wrote that call before noticing.
|
|
10
|
+
*
|
|
11
|
+
* But the inventory screens genuinely need the server's words for the 4xx
|
|
12
|
+
* cases, and that is not a contradiction. "AC60-03 is retired", "holds 2,
|
|
13
|
+
* cannot move 5" and "duplicate box code" are messages written FOR the
|
|
14
|
+
* operator, naming the box and the count, and they tell them what to do next.
|
|
15
|
+
* `GENERIC_USER_MESSAGE` in their place turns a recoverable mistake into a
|
|
16
|
+
* mystery at a station where someone is holding the physical item.
|
|
17
|
+
*
|
|
18
|
+
* So the rule is split on STATUS, which is the thing that actually
|
|
19
|
+
* distinguishes the two:
|
|
20
|
+
*
|
|
21
|
+
* · 4xx — deliberate, authored, operator-facing. Show it.
|
|
22
|
+
* · 5xx (and anything with no status) — unplanned. Route through the code map,
|
|
23
|
+
* which terminates in a constant and never returns server text. `mapToHttpError`
|
|
24
|
+
* also scrubs 5xx messages in production, so the server text may well already
|
|
25
|
+
* be generic by the time it arrives — but relying on that would make this
|
|
26
|
+
* correct only in production, and the station is also used against a local
|
|
27
|
+
* server.
|
|
28
|
+
*/
|
|
29
|
+
import { toUserMessage } from "../../../errors/error-display-map.js";
|
|
30
|
+
export function operatorMessage(err, t) {
|
|
31
|
+
const e = (err ?? {});
|
|
32
|
+
const status = typeof e.status === "number" ? e.status : undefined;
|
|
33
|
+
const code = typeof e.code === "string" ? e.code : undefined;
|
|
34
|
+
const message = typeof e.message === "string" ? e.message : undefined;
|
|
35
|
+
if (status !== undefined && status >= 400 && status < 500 && message) {
|
|
36
|
+
return message;
|
|
37
|
+
}
|
|
38
|
+
// No fallback argument: the point is that this branch must NOT reach the
|
|
39
|
+
// server's text. `toUserMessage` ends at `errors.codes.UNKNOWN`.
|
|
40
|
+
return toUserMessage(code, t);
|
|
41
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { STORAGE_BOXES_COLLECTION, INVENTORY_PLACEMENTS_COLLECTION, INVENTORY_MOVEMENTS_COLLECTION, BoxTypeValues, BoxStatusValues, MovementKindValues, placementId, STORAGE_BOX_FIELDS, INVENTORY_PLACEMENT_FIELDS, INVENTORY_MOVEMENT_FIELDS, } from "./schemas/firestore";
|
|
2
|
+
export type { BoxType, BoxStatus, MovementKind, StorageBoxDocument, InventoryPlacementDocument, InventoryMovementDocument, } from "./schemas/firestore";
|
|
3
|
+
export { StorageBoxesRepository, storageBoxesRepository, } from "./repository/storage-boxes.repository";
|
|
4
|
+
export type { StorageBoxCreateInput } from "./repository/storage-boxes.repository";
|
|
5
|
+
export { InventoryPlacementsRepository, inventoryPlacementsRepository, } from "./repository/inventory-placements.repository";
|
|
6
|
+
export type { PlaceInput, MoveInput, PickInput, } from "./repository/inventory-placements.repository";
|
|
7
|
+
export { InventoryMovementsRepository, inventoryMovementsRepository, } from "./repository/inventory-movements.repository";
|
|
8
|
+
export type { InventoryMovementCreateInput } from "./repository/inventory-movements.repository";
|
|
9
|
+
export { AdminStorageBoxesView, RegisterBoxForm } from "./components/AdminStorageBoxesView";
|
|
10
|
+
export { AdminMoveLedgerView, MOVEMENT_KIND_TABS } from "./components/AdminMoveLedgerView";
|
|
11
|
+
export { ReceiveStationView } from "./components/ReceiveStationView";
|
|
12
|
+
export type { ReceiveStationViewProps, ReceivableItem, UnlinkedItem, BoxOption, } from "./components/ReceiveStationView";
|
|
13
|
+
export { operatorMessage } from "./components/operator-message";
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The inventory feature's surface.
|
|
3
|
+
*
|
|
4
|
+
* 🛑 NOT re-exported from `appkit/src/index.ts`. Every one of these reaches
|
|
5
|
+
* `firebase-admin` through `BaseRepository`, and the main barrel is reachable
|
|
6
|
+
* from the CLIENT bundle — Turbopack resolves a module's full static import
|
|
7
|
+
* graph before any tree-shaking, so one reachable repository drags
|
|
8
|
+
* `node:child_process` into a browser chunk and the production build fails on
|
|
9
|
+
* every page (Root Cause #6 / #24). Server code imports the defining module
|
|
10
|
+
* or `appkit/src/server.ts`.
|
|
11
|
+
*
|
|
12
|
+
* @tag domain:inventory
|
|
13
|
+
* @tag layer:feature
|
|
14
|
+
* @tag access:server
|
|
15
|
+
*/
|
|
16
|
+
export { STORAGE_BOXES_COLLECTION, INVENTORY_PLACEMENTS_COLLECTION, INVENTORY_MOVEMENTS_COLLECTION, BoxTypeValues, BoxStatusValues, MovementKindValues, placementId, STORAGE_BOX_FIELDS, INVENTORY_PLACEMENT_FIELDS, INVENTORY_MOVEMENT_FIELDS, } from "./schemas/firestore.js";
|
|
17
|
+
export { StorageBoxesRepository, storageBoxesRepository, } from "./repository/storage-boxes.repository.js";
|
|
18
|
+
export { InventoryPlacementsRepository, inventoryPlacementsRepository, } from "./repository/inventory-placements.repository.js";
|
|
19
|
+
export { InventoryMovementsRepository, inventoryMovementsRepository, } from "./repository/inventory-movements.repository.js";
|
|
20
|
+
/*
|
|
21
|
+
* The admin views. Client components, so they are safe in the main barrel —
|
|
22
|
+
* but the REPOSITORIES above are not, which is why nothing here is
|
|
23
|
+
* re-exported from `appkit/src/index.ts`.
|
|
24
|
+
*/
|
|
25
|
+
export { AdminStorageBoxesView, RegisterBoxForm } from "./components/AdminStorageBoxesView.js";
|
|
26
|
+
export { AdminMoveLedgerView, MOVEMENT_KIND_TABS } from "./components/AdminMoveLedgerView.js";
|
|
27
|
+
export { ReceiveStationView } from "./components/ReceiveStationView.js";
|
|
28
|
+
export { operatorMessage } from "./components/operator-message.js";
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { BaseRepository, parseSieveDateValue, type SieveModel, type FirebaseSieveResult } from "../../../providers/db-firebase";
|
|
2
|
+
import { type InventoryMovementDocument, type MovementKind } from "../schemas/firestore";
|
|
3
|
+
export interface InventoryMovementCreateInput {
|
|
4
|
+
kind: MovementKind;
|
|
5
|
+
productId: string;
|
|
6
|
+
/** Always positive — direction is `from`/`to`, never the sign. */
|
|
7
|
+
quantity: number;
|
|
8
|
+
fromBoxId?: string;
|
|
9
|
+
toBoxId?: string;
|
|
10
|
+
occurredAt?: Date;
|
|
11
|
+
actorUid: string;
|
|
12
|
+
reason?: string;
|
|
13
|
+
shipmentId?: string;
|
|
14
|
+
productTitle?: string;
|
|
15
|
+
fromBoxCode?: string;
|
|
16
|
+
toBoxCode?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class InventoryMovementsRepository extends BaseRepository<InventoryMovementDocument> {
|
|
19
|
+
constructor();
|
|
20
|
+
/**
|
|
21
|
+
* Append one movement.
|
|
22
|
+
*
|
|
23
|
+
* Validates the shape before writing, because a ledger row that is
|
|
24
|
+
* internally inconsistent cannot be fixed afterwards — `update` throws.
|
|
25
|
+
*/
|
|
26
|
+
append(input: InventoryMovementCreateInput): Promise<InventoryMovementDocument>;
|
|
27
|
+
/**
|
|
28
|
+
* 🛑 THE LEDGER IS APPEND-ONLY. These two throw on purpose.
|
|
29
|
+
*
|
|
30
|
+
* Not `@deprecated`, not a comment — the method bodies refuse. A ledger
|
|
31
|
+
* whose rows can be edited cannot be used as evidence, and the caller who
|
|
32
|
+
* edited one would never find out: a Firestore update succeeds silently.
|
|
33
|
+
*/
|
|
34
|
+
update(): Promise<never>;
|
|
35
|
+
delete(): Promise<never>;
|
|
36
|
+
/** This product's history, newest first. */
|
|
37
|
+
listByProduct(productId: string, limit?: number): Promise<InventoryMovementDocument[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Everything that entered or left one box.
|
|
40
|
+
*
|
|
41
|
+
* 🛑 TWO QUERIES MERGED, not an `or`. A movement names a box in either
|
|
42
|
+
* `fromBoxId` or `toBoxId`, and Firestore cannot `OR` across two fields
|
|
43
|
+
* without a composite that still orders by one of them — so the honest
|
|
44
|
+
* shape is two bounded reads merged and re-sorted in memory. Each is
|
|
45
|
+
* `limit`-capped, so the worst case is `2 × limit` documents.
|
|
46
|
+
*/
|
|
47
|
+
listByBox(boxId: string, limit?: number): Promise<InventoryMovementDocument[]>;
|
|
48
|
+
/** Everything received from one procurement shipment. */
|
|
49
|
+
listByShipment(shipmentId: string, limit?: number): Promise<InventoryMovementDocument[]>;
|
|
50
|
+
listForAdmin(model: SieveModel): Promise<FirebaseSieveResult<InventoryMovementDocument>>;
|
|
51
|
+
/** Every Timestamp field carries `parseSieveDateValue` — Root Cause #47. */
|
|
52
|
+
static readonly SIEVE_FIELDS: {
|
|
53
|
+
id: {
|
|
54
|
+
canFilter: boolean;
|
|
55
|
+
canSort: boolean;
|
|
56
|
+
};
|
|
57
|
+
kind: {
|
|
58
|
+
canFilter: boolean;
|
|
59
|
+
canSort: boolean;
|
|
60
|
+
};
|
|
61
|
+
productId: {
|
|
62
|
+
canFilter: boolean;
|
|
63
|
+
canSort: boolean;
|
|
64
|
+
};
|
|
65
|
+
quantity: {
|
|
66
|
+
canFilter: boolean;
|
|
67
|
+
canSort: boolean;
|
|
68
|
+
};
|
|
69
|
+
fromBoxId: {
|
|
70
|
+
canFilter: boolean;
|
|
71
|
+
canSort: boolean;
|
|
72
|
+
};
|
|
73
|
+
toBoxId: {
|
|
74
|
+
canFilter: boolean;
|
|
75
|
+
canSort: boolean;
|
|
76
|
+
};
|
|
77
|
+
actorUid: {
|
|
78
|
+
canFilter: boolean;
|
|
79
|
+
canSort: boolean;
|
|
80
|
+
};
|
|
81
|
+
shipmentId: {
|
|
82
|
+
canFilter: boolean;
|
|
83
|
+
canSort: boolean;
|
|
84
|
+
};
|
|
85
|
+
occurredAt: {
|
|
86
|
+
canFilter: boolean;
|
|
87
|
+
canSort: boolean;
|
|
88
|
+
parseValue: typeof parseSieveDateValue;
|
|
89
|
+
};
|
|
90
|
+
createdAt: {
|
|
91
|
+
canFilter: boolean;
|
|
92
|
+
canSort: boolean;
|
|
93
|
+
parseValue: typeof parseSieveDateValue;
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
export declare const inventoryMovementsRepository: InventoryMovementsRepository;
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WHY: The ledger is the only thing that can answer "where did this go". That
|
|
3
|
+
* is worth nothing unless it is EVIDENCE, and evidence that can be
|
|
4
|
+
* edited is not evidence.
|
|
5
|
+
* WHAT: Append, and read back by product, by box, or by shipment.
|
|
6
|
+
*
|
|
7
|
+
* ── 🛑 APPEND-ONLY, ENFORCED IN CODE AND NOT BY CONVENTION ────────────────
|
|
8
|
+
*
|
|
9
|
+
* `update` and `delete` are overridden to THROW. A comment saying "do not
|
|
10
|
+
* edit these" is one forgetful caller away from being false, and the caller
|
|
11
|
+
* would not find out — a Firestore update succeeds silently and the row that
|
|
12
|
+
* used to prove where an item went now proves something else.
|
|
13
|
+
*
|
|
14
|
+
* `audit-inventory-ledger-append-only` blocks the other direction: a new
|
|
15
|
+
* caller reaching past this repository to the raw collection.
|
|
16
|
+
*
|
|
17
|
+
* 🛑 Immutability is also why the denormalised `productTitle` / `*BoxCode` on
|
|
18
|
+
* these rows are deliberately NEVER repaired. They are what things were
|
|
19
|
+
* CALLED at the time, which is the correct thing for a historical record to
|
|
20
|
+
* say — repairing them would rewrite history to match the present, and the
|
|
21
|
+
* whole point of the row is that it does not.
|
|
22
|
+
*
|
|
23
|
+
* Holds no PII: `actorUid` is a uid, never a name.
|
|
24
|
+
*
|
|
25
|
+
* EXPORTS: InventoryMovementsRepository, inventoryMovementsRepository,
|
|
26
|
+
* InventoryMovementCreateInput
|
|
27
|
+
*
|
|
28
|
+
* @tag domain:inventory
|
|
29
|
+
* @tag layer:feature
|
|
30
|
+
* @tag pattern:repository
|
|
31
|
+
* @tag access:server
|
|
32
|
+
* @tag sideEffects:firestore
|
|
33
|
+
*/
|
|
34
|
+
import { BaseRepository, parseSieveDateValue, } from "../../../providers/db-firebase/index.js";
|
|
35
|
+
import { INVENTORY_MOVEMENTS_COLLECTION, INVENTORY_MOVEMENT_FIELDS, MovementKindValues, } from "../schemas/firestore.js";
|
|
36
|
+
/**
|
|
37
|
+
* Which endpoints each kind requires.
|
|
38
|
+
*
|
|
39
|
+
* 🛑 A `Record<MovementKind, …>`, so a sixth kind is a COMPILE error rather
|
|
40
|
+
* than a movement that validates against nothing. This is the shape Root
|
|
41
|
+
* Cause #58/#61 are about: a `Set<string>` or an array keyed on a union
|
|
42
|
+
* silently accepts a member nobody mapped.
|
|
43
|
+
*/
|
|
44
|
+
const ENDPOINTS = {
|
|
45
|
+
// Stock arrives from outside the system, so there is no origin box.
|
|
46
|
+
receive: { from: false, to: true },
|
|
47
|
+
move: { from: true, to: true },
|
|
48
|
+
// Stock leaves the system. No destination box.
|
|
49
|
+
pick: { from: true, to: false },
|
|
50
|
+
/*
|
|
51
|
+
* An adjustment is a correction to ONE box's count — a found item or a
|
|
52
|
+
* missing one — so it names the box it corrects and nothing else. Which
|
|
53
|
+
* direction it went is carried by… nothing, deliberately: `reason` is
|
|
54
|
+
* required on an adjust, and a human sentence is more use than a sign.
|
|
55
|
+
*/
|
|
56
|
+
adjust: { from: false, to: true },
|
|
57
|
+
// A count that agreed. Records that the box was verified, moves nothing.
|
|
58
|
+
audit: { from: false, to: true },
|
|
59
|
+
};
|
|
60
|
+
export class InventoryMovementsRepository extends BaseRepository {
|
|
61
|
+
constructor() {
|
|
62
|
+
super(INVENTORY_MOVEMENTS_COLLECTION);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Append one movement.
|
|
66
|
+
*
|
|
67
|
+
* Validates the shape before writing, because a ledger row that is
|
|
68
|
+
* internally inconsistent cannot be fixed afterwards — `update` throws.
|
|
69
|
+
*/
|
|
70
|
+
async append(input) {
|
|
71
|
+
if (!MovementKindValues.includes(input.kind)) {
|
|
72
|
+
throw new Error(`Unknown movement kind: ${input.kind}`);
|
|
73
|
+
}
|
|
74
|
+
if (!Number.isInteger(input.quantity) || input.quantity < 1) {
|
|
75
|
+
throw new Error(`Movement quantity must be a positive whole number, got ${input.quantity}. ` +
|
|
76
|
+
`Direction is carried by fromBoxId/toBoxId, never by the sign.`);
|
|
77
|
+
}
|
|
78
|
+
const shape = ENDPOINTS[input.kind];
|
|
79
|
+
if (shape.from && !input.fromBoxId) {
|
|
80
|
+
throw new Error(`A ${input.kind} movement needs a fromBoxId`);
|
|
81
|
+
}
|
|
82
|
+
if (!shape.from && input.fromBoxId) {
|
|
83
|
+
throw new Error(`A ${input.kind} movement must not carry a fromBoxId`);
|
|
84
|
+
}
|
|
85
|
+
if (shape.to && !input.toBoxId) {
|
|
86
|
+
throw new Error(`A ${input.kind} movement needs a toBoxId`);
|
|
87
|
+
}
|
|
88
|
+
if (!shape.to && input.toBoxId) {
|
|
89
|
+
throw new Error(`A ${input.kind} movement must not carry a toBoxId`);
|
|
90
|
+
}
|
|
91
|
+
/*
|
|
92
|
+
* 🛑 An `adjust` without a reason is a variance nobody explained, which
|
|
93
|
+
* is indistinguishable from a typo three weeks later — and the row cannot
|
|
94
|
+
* be amended to add one.
|
|
95
|
+
*/
|
|
96
|
+
if (input.kind === "adjust" && !input.reason?.trim()) {
|
|
97
|
+
throw new Error("An adjust movement needs a reason");
|
|
98
|
+
}
|
|
99
|
+
return this.create({
|
|
100
|
+
...input,
|
|
101
|
+
occurredAt: input.occurredAt ?? new Date(),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 🛑 THE LEDGER IS APPEND-ONLY. These two throw on purpose.
|
|
106
|
+
*
|
|
107
|
+
* Not `@deprecated`, not a comment — the method bodies refuse. A ledger
|
|
108
|
+
* whose rows can be edited cannot be used as evidence, and the caller who
|
|
109
|
+
* edited one would never find out: a Firestore update succeeds silently.
|
|
110
|
+
*/
|
|
111
|
+
async update() {
|
|
112
|
+
throw new Error("inventoryMovements is append-only. Record a correcting `adjust` movement instead of editing history.");
|
|
113
|
+
}
|
|
114
|
+
async delete() {
|
|
115
|
+
throw new Error("inventoryMovements is append-only. A movement that did not happen is corrected with an `adjust`, not removed.");
|
|
116
|
+
}
|
|
117
|
+
/** This product's history, newest first. */
|
|
118
|
+
async listByProduct(productId, limit = 50) {
|
|
119
|
+
const snap = await this.getCollection()
|
|
120
|
+
.where(INVENTORY_MOVEMENT_FIELDS.PRODUCT_ID, "==", productId)
|
|
121
|
+
.orderBy(INVENTORY_MOVEMENT_FIELDS.OCCURRED_AT, "desc")
|
|
122
|
+
.limit(limit)
|
|
123
|
+
.get();
|
|
124
|
+
return snap.docs.map((d) => this.mapDoc(d));
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Everything that entered or left one box.
|
|
128
|
+
*
|
|
129
|
+
* 🛑 TWO QUERIES MERGED, not an `or`. A movement names a box in either
|
|
130
|
+
* `fromBoxId` or `toBoxId`, and Firestore cannot `OR` across two fields
|
|
131
|
+
* without a composite that still orders by one of them — so the honest
|
|
132
|
+
* shape is two bounded reads merged and re-sorted in memory. Each is
|
|
133
|
+
* `limit`-capped, so the worst case is `2 × limit` documents.
|
|
134
|
+
*/
|
|
135
|
+
async listByBox(boxId, limit = 50) {
|
|
136
|
+
const [into, outOf] = await Promise.all([
|
|
137
|
+
this.getCollection()
|
|
138
|
+
.where(INVENTORY_MOVEMENT_FIELDS.TO_BOX_ID, "==", boxId)
|
|
139
|
+
.orderBy(INVENTORY_MOVEMENT_FIELDS.OCCURRED_AT, "desc")
|
|
140
|
+
.limit(limit)
|
|
141
|
+
.get(),
|
|
142
|
+
this.getCollection()
|
|
143
|
+
.where(INVENTORY_MOVEMENT_FIELDS.FROM_BOX_ID, "==", boxId)
|
|
144
|
+
.orderBy(INVENTORY_MOVEMENT_FIELDS.OCCURRED_AT, "desc")
|
|
145
|
+
.limit(limit)
|
|
146
|
+
.get(),
|
|
147
|
+
]);
|
|
148
|
+
const rows = [...into.docs, ...outOf.docs].map((d) => this.mapDoc(d));
|
|
149
|
+
rows.sort((a, b) => b.occurredAt.getTime() - a.occurredAt.getTime());
|
|
150
|
+
return rows.slice(0, limit);
|
|
151
|
+
}
|
|
152
|
+
/** Everything received from one procurement shipment. */
|
|
153
|
+
async listByShipment(shipmentId, limit = 200) {
|
|
154
|
+
const snap = await this.getCollection()
|
|
155
|
+
.where(INVENTORY_MOVEMENT_FIELDS.SHIPMENT_ID, "==", shipmentId)
|
|
156
|
+
.orderBy(INVENTORY_MOVEMENT_FIELDS.OCCURRED_AT, "desc")
|
|
157
|
+
.limit(limit)
|
|
158
|
+
.get();
|
|
159
|
+
return snap.docs.map((d) => this.mapDoc(d));
|
|
160
|
+
}
|
|
161
|
+
async listForAdmin(model) {
|
|
162
|
+
return this.sieveQuery(model, InventoryMovementsRepository.SIEVE_FIELDS, { defaultPageSize: 25, maxPageSize: 50 });
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/** Every Timestamp field carries `parseSieveDateValue` — Root Cause #47. */
|
|
166
|
+
InventoryMovementsRepository.SIEVE_FIELDS = {
|
|
167
|
+
id: { canFilter: true, canSort: false },
|
|
168
|
+
[INVENTORY_MOVEMENT_FIELDS.KIND]: { canFilter: true, canSort: false },
|
|
169
|
+
[INVENTORY_MOVEMENT_FIELDS.PRODUCT_ID]: { canFilter: true, canSort: false },
|
|
170
|
+
[INVENTORY_MOVEMENT_FIELDS.QUANTITY]: { canFilter: true, canSort: true },
|
|
171
|
+
[INVENTORY_MOVEMENT_FIELDS.FROM_BOX_ID]: { canFilter: true, canSort: false },
|
|
172
|
+
[INVENTORY_MOVEMENT_FIELDS.TO_BOX_ID]: { canFilter: true, canSort: false },
|
|
173
|
+
[INVENTORY_MOVEMENT_FIELDS.ACTOR_UID]: { canFilter: true, canSort: false },
|
|
174
|
+
[INVENTORY_MOVEMENT_FIELDS.SHIPMENT_ID]: { canFilter: true, canSort: false },
|
|
175
|
+
[INVENTORY_MOVEMENT_FIELDS.OCCURRED_AT]: {
|
|
176
|
+
canFilter: true,
|
|
177
|
+
canSort: true,
|
|
178
|
+
parseValue: parseSieveDateValue,
|
|
179
|
+
},
|
|
180
|
+
[INVENTORY_MOVEMENT_FIELDS.CREATED_AT]: {
|
|
181
|
+
canFilter: true,
|
|
182
|
+
canSort: true,
|
|
183
|
+
parseValue: parseSieveDateValue,
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
export const inventoryMovementsRepository = new InventoryMovementsRepository();
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { BaseRepository, parseSieveDateValue, type SieveModel, type FirebaseSieveResult } from "../../../providers/db-firebase";
|
|
2
|
+
import { type InventoryPlacementDocument, type MovementKind } from "../schemas/firestore";
|
|
3
|
+
export interface PlaceInput {
|
|
4
|
+
boxId: string;
|
|
5
|
+
boxCode: string;
|
|
6
|
+
productId: string;
|
|
7
|
+
productTitle: string;
|
|
8
|
+
productSku?: string;
|
|
9
|
+
quantity: number;
|
|
10
|
+
slot?: string;
|
|
11
|
+
actorUid: string;
|
|
12
|
+
/** Carried onto the ledger row. `receive` when it came from a shipment. */
|
|
13
|
+
kind: Extract<MovementKind, "receive" | "adjust">;
|
|
14
|
+
reason?: string;
|
|
15
|
+
shipmentId?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface MoveInput {
|
|
18
|
+
fromBoxId: string;
|
|
19
|
+
fromBoxCode: string;
|
|
20
|
+
toBoxId: string;
|
|
21
|
+
toBoxCode: string;
|
|
22
|
+
productId: string;
|
|
23
|
+
productTitle: string;
|
|
24
|
+
productSku?: string;
|
|
25
|
+
quantity: number;
|
|
26
|
+
actorUid: string;
|
|
27
|
+
}
|
|
28
|
+
export interface PickInput {
|
|
29
|
+
boxId: string;
|
|
30
|
+
boxCode: string;
|
|
31
|
+
productId: string;
|
|
32
|
+
productTitle: string;
|
|
33
|
+
quantity: number;
|
|
34
|
+
actorUid: string;
|
|
35
|
+
reason?: string;
|
|
36
|
+
}
|
|
37
|
+
export declare class InventoryPlacementsRepository extends BaseRepository<InventoryPlacementDocument> {
|
|
38
|
+
constructor();
|
|
39
|
+
/**
|
|
40
|
+
* Is this product in this box, and how many?
|
|
41
|
+
*
|
|
42
|
+
* 🛑 One document READ, because the id is deterministic. With a generated
|
|
43
|
+
* id this would be a two-field query needing its own composite index — and
|
|
44
|
+
* a double-submit could create a second row for the same pair that silently
|
|
45
|
+
* doubles the count.
|
|
46
|
+
*/
|
|
47
|
+
get(boxId: string, productId: string): Promise<InventoryPlacementDocument | null>;
|
|
48
|
+
/** What is in this box. One equality, served by the automatic index. */
|
|
49
|
+
listByBox(boxId: string, limit?: number): Promise<InventoryPlacementDocument[]>;
|
|
50
|
+
/** Where is this product. Also one equality — this is the pair that matters. */
|
|
51
|
+
listByProduct(productId: string, limit?: number): Promise<InventoryPlacementDocument[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Put stock into a box — a receive, or an adjustment that found some.
|
|
54
|
+
*
|
|
55
|
+
* 🛑 Idempotent upsert via the deterministic id, and the increment happens
|
|
56
|
+
* INSIDE the transaction from the value read inside it. Reading first and
|
|
57
|
+
* writing after would lose one of two concurrent receives of the same
|
|
58
|
+
* product into the same box, which is exactly what a receive station with
|
|
59
|
+
* two people scanning does.
|
|
60
|
+
*/
|
|
61
|
+
place(input: PlaceInput): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Box → box.
|
|
64
|
+
*
|
|
65
|
+
* 🛑 REFUSES rather than going negative. A move of more than the source
|
|
66
|
+
* holds is a miscount, and clamping it would make the ledger assert a
|
|
67
|
+
* movement of a quantity that was not there — the one thing that makes the
|
|
68
|
+
* ledger unusable as evidence.
|
|
69
|
+
*/
|
|
70
|
+
move(input: MoveInput): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Take stock out of a box.
|
|
73
|
+
*
|
|
74
|
+
* 🛑 MANUAL, and never fired from checkout. An automatic decrement on
|
|
75
|
+
* payment would have the ledger assert a movement nobody performed — the
|
|
76
|
+
* stock is sold, but it is still in the box until a person walks over and
|
|
77
|
+
* picks it. A ledger recording intentions instead of actions cannot be used
|
|
78
|
+
* to find a missing item, which is its only real job.
|
|
79
|
+
*
|
|
80
|
+
* 🛑 And this does NOT touch `product.stockQuantity`. That stays
|
|
81
|
+
* authoritative and is owned by the order path; writing both is how a
|
|
82
|
+
* reserved unit gets handed back to the shelf (see the schema header).
|
|
83
|
+
*/
|
|
84
|
+
pick(input: PickInput): Promise<void>;
|
|
85
|
+
/**
|
|
86
|
+
* The receive station's bulk commit — many rows, ONE transaction.
|
|
87
|
+
*
|
|
88
|
+
* 🛑 ONE TRANSACTION FOR THE WHOLE TABLE, not a loop of them. A partial
|
|
89
|
+
* receive is the worst outcome available: the operator has already
|
|
90
|
+
* physically put everything in the boxes, so a half-written commit leaves
|
|
91
|
+
* the ledger disagreeing with the shelf and no way to tell which rows
|
|
92
|
+
* landed.
|
|
93
|
+
*
|
|
94
|
+
* Firestore caps a transaction at 500 writes and each row here is two (the
|
|
95
|
+
* placement and its movement), so the caller's row limit of 50 is what
|
|
96
|
+
* keeps this inside the cap — that is why the limit exists, rather than
|
|
97
|
+
* being a UI preference.
|
|
98
|
+
*
|
|
99
|
+
* 🛑 Lives HERE rather than in the route for two reasons. API routes do not
|
|
100
|
+
* touch Firestore directly in this codebase, and more specifically
|
|
101
|
+
* `audit-inventory-ledger-append-only` allows only this file and the
|
|
102
|
+
* movements repository to write the ledger — a route doing it would be the
|
|
103
|
+
* second writer the audit exists to prevent, and I wrote exactly that before
|
|
104
|
+
* the audit caught me.
|
|
105
|
+
*
|
|
106
|
+
* 🛑 Does NOT touch `product.stockQuantity`. The shipment-link route already
|
|
107
|
+
* does, and doing both double-counts. This records WHERE stock is, never how
|
|
108
|
+
* much exists.
|
|
109
|
+
*/
|
|
110
|
+
receiveBatch(input: {
|
|
111
|
+
rows: ReadonlyArray<{
|
|
112
|
+
boxId: string;
|
|
113
|
+
boxCode: string;
|
|
114
|
+
productId: string;
|
|
115
|
+
productTitle: string;
|
|
116
|
+
productSku?: string;
|
|
117
|
+
quantity: number;
|
|
118
|
+
slot?: string;
|
|
119
|
+
}>;
|
|
120
|
+
actorUid: string;
|
|
121
|
+
shipmentId?: string;
|
|
122
|
+
}): Promise<{
|
|
123
|
+
rows: number;
|
|
124
|
+
units: number;
|
|
125
|
+
}>;
|
|
126
|
+
private assertQuantity;
|
|
127
|
+
/**
|
|
128
|
+
* Append a ledger row inside the caller's transaction.
|
|
129
|
+
*
|
|
130
|
+
* 🛑 Written through the raw collection rather than
|
|
131
|
+
* `inventoryMovementsRepository.append`, because that method is not
|
|
132
|
+
* transaction-aware and a second, non-transactional write would reopen the
|
|
133
|
+
* gap this whole design closes. The VALIDATION it performs is mirrored by
|
|
134
|
+
* the typed `MovementKind` endpoints above and by the quantity assert — so
|
|
135
|
+
* the shape is still checked, by the compiler rather than at runtime.
|
|
136
|
+
*
|
|
137
|
+
* `audit-inventory-ledger-append-only` allows this one path by name.
|
|
138
|
+
*/
|
|
139
|
+
private appendMovement;
|
|
140
|
+
listForAdmin(model: SieveModel): Promise<FirebaseSieveResult<InventoryPlacementDocument>>;
|
|
141
|
+
/** Every Timestamp field carries `parseSieveDateValue` — Root Cause #47. */
|
|
142
|
+
static readonly SIEVE_FIELDS: {
|
|
143
|
+
id: {
|
|
144
|
+
canFilter: boolean;
|
|
145
|
+
canSort: boolean;
|
|
146
|
+
};
|
|
147
|
+
boxId: {
|
|
148
|
+
canFilter: boolean;
|
|
149
|
+
canSort: boolean;
|
|
150
|
+
};
|
|
151
|
+
productId: {
|
|
152
|
+
canFilter: boolean;
|
|
153
|
+
canSort: boolean;
|
|
154
|
+
};
|
|
155
|
+
quantity: {
|
|
156
|
+
canFilter: boolean;
|
|
157
|
+
canSort: boolean;
|
|
158
|
+
};
|
|
159
|
+
boxCode: {
|
|
160
|
+
canFilter: boolean;
|
|
161
|
+
canSort: boolean;
|
|
162
|
+
};
|
|
163
|
+
productSku: {
|
|
164
|
+
canFilter: boolean;
|
|
165
|
+
canSort: boolean;
|
|
166
|
+
};
|
|
167
|
+
createdAt: {
|
|
168
|
+
canFilter: boolean;
|
|
169
|
+
canSort: boolean;
|
|
170
|
+
parseValue: typeof parseSieveDateValue;
|
|
171
|
+
};
|
|
172
|
+
updatedAt: {
|
|
173
|
+
canFilter: boolean;
|
|
174
|
+
canSort: boolean;
|
|
175
|
+
parseValue: typeof parseSieveDateValue;
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
export declare const inventoryPlacementsRepository: InventoryPlacementsRepository;
|