@tailor-platform/erp-kit 0.4.1 → 0.5.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/CHANGELOG.md +27 -0
- package/README.md +12 -12
- package/dist/cli.mjs +467 -20
- package/package.json +2 -11
- package/skills/erp-kit-app-2-requirements-review/SKILL.md +2 -2
- package/skills/erp-kit-app-2-requirements-review/references/best-practices-check.md +1 -1
- package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +6 -3
- package/skills/erp-kit-app-4-plan-review/SKILL.md +5 -3
- package/skills/erp-kit-app-4-plan-review/references/orphan-detection.md +3 -0
- package/skills/erp-kit-app-4-plan-review/references/story-resolver-parity.md +21 -3
- package/skills/erp-kit-app-5-impl-backend/SKILL.md +12 -3
- package/skills/erp-kit-app-6-impl-frontend/SKILL.md +8 -4
- package/skills/erp-kit-app-7-impl-review/SKILL.md +1 -1
- package/skills/erp-kit-app-shared/references/resolver-classification.md +3 -0
- package/skills/erp-kit-module-2-requirements-review/SKILL.md +3 -30
- package/skills/erp-kit-module-3-update-plan/SKILL.md +132 -0
- package/skills/erp-kit-module-3-update-plan/references/command-extraction.md +87 -0
- package/skills/erp-kit-module-3-update-plan/references/model-extraction.md +72 -0
- package/skills/erp-kit-module-3-update-plan/references/naming.md +73 -0
- package/skills/erp-kit-module-3-update-plan/references/query-extraction.md +59 -0
- package/skills/erp-kit-module-4-plan-review/SKILL.md +3 -69
- package/skills/erp-kit-module-5-impl/SKILL.md +1 -0
- package/skills/erp-kit-module-6-impl-review/SKILL.md +42 -120
- package/skills/erp-kit-module-6-impl-review/references/command-doc-test-parity.md +1 -1
- package/skills/erp-kit-module-6-impl-review/references/{error-implementation-parity.md → command-error-implementation-parity.md} +3 -3
- package/skills/erp-kit-module-6-impl-review/references/impl-parity-report-format.md +1 -1
- package/skills/erp-kit-module-6-impl-review/references/query-doc-code-parity.md +110 -0
- package/skills/erp-kit-module-6-impl-review/references/query-doc-test-parity.md +108 -0
- package/skills/erp-kit-module-6-impl-review/references/query-error-implementation-parity.md +100 -0
- package/src/commands/app/index.ts +18 -3
- package/src/commands/check.test.ts +1 -1
- package/src/commands/doc/module.ts +2 -3
- package/src/commands/doc/modules.test.ts +0 -7
- package/src/commands/doc/modules.ts +1 -2
- package/src/commands/doc/search.ts +1 -2
- package/src/commands/init.ts +4 -0
- package/src/commands/lib/distribute.test.ts +32 -1
- package/src/commands/lib/distribute.ts +47 -5
- package/src/commands/lib/sync-check-source.test.ts +1 -1
- package/src/commands/update.test.ts +16 -0
- package/src/commands/update.ts +4 -1
- package/src/generator/generate-seed.ts +69 -0
- package/src/module.ts +56 -0
- package/src/modules/business-partner/README.md +2 -2
- package/src/modules/inventory/README.md +65 -0
- package/src/modules/inventory/command/approveCountLine.generated.ts +6 -0
- package/src/modules/inventory/command/approveCountLine.test.ts +89 -0
- package/src/modules/inventory/command/approveCountLine.ts +68 -0
- package/src/modules/inventory/command/approveInventoryAdjustment.generated.ts +6 -0
- package/src/modules/inventory/command/approveInventoryAdjustment.test.ts +56 -0
- package/src/modules/inventory/command/approveInventoryAdjustment.ts +50 -0
- package/src/modules/inventory/command/assignSerialNumber.generated.ts +6 -0
- package/src/modules/inventory/command/assignSerialNumber.test.ts +133 -0
- package/src/modules/inventory/command/assignSerialNumber.ts +83 -0
- package/src/modules/inventory/command/cancelInventoryCount.generated.ts +6 -0
- package/src/modules/inventory/command/cancelInventoryCount.test.ts +114 -0
- package/src/modules/inventory/command/cancelInventoryCount.ts +62 -0
- package/src/modules/inventory/command/cancelStockMovement.generated.ts +6 -0
- package/src/modules/inventory/command/cancelStockMovement.test.ts +102 -0
- package/src/modules/inventory/command/cancelStockMovement.ts +56 -0
- package/src/modules/inventory/command/completeInventoryCount.generated.ts +6 -0
- package/src/modules/inventory/command/completeInventoryCount.test.ts +99 -0
- package/src/modules/inventory/command/completeInventoryCount.ts +70 -0
- package/src/modules/inventory/command/confirmInventoryAdjustment.generated.ts +6 -0
- package/src/modules/inventory/command/confirmInventoryAdjustment.test.ts +324 -0
- package/src/modules/inventory/command/confirmInventoryAdjustment.ts +194 -0
- package/src/modules/inventory/command/confirmStockMovement.generated.ts +6 -0
- package/src/modules/inventory/command/confirmStockMovement.test.ts +126 -0
- package/src/modules/inventory/command/confirmStockMovement.ts +131 -0
- package/src/modules/inventory/command/createInventoryAdjustment.generated.ts +6 -0
- package/src/modules/inventory/command/createInventoryAdjustment.test.ts +298 -0
- package/src/modules/inventory/command/createInventoryAdjustment.ts +124 -0
- package/src/modules/inventory/command/createInventoryCount.generated.ts +6 -0
- package/src/modules/inventory/command/createInventoryCount.test.ts +157 -0
- package/src/modules/inventory/command/createInventoryCount.ts +72 -0
- package/src/modules/inventory/command/createLot.generated.ts +6 -0
- package/src/modules/inventory/command/createLot.test.ts +106 -0
- package/src/modules/inventory/command/createLot.ts +72 -0
- package/src/modules/inventory/command/createStockMovement.generated.ts +6 -0
- package/src/modules/inventory/command/createStockMovement.test.ts +342 -0
- package/src/modules/inventory/command/createStockMovement.ts +172 -0
- package/src/modules/inventory/command/createStorageLocation.generated.ts +6 -0
- package/src/modules/inventory/command/createStorageLocation.test.ts +246 -0
- package/src/modules/inventory/command/createStorageLocation.ts +126 -0
- package/src/modules/inventory/command/createValuationPolicy.generated.ts +6 -0
- package/src/modules/inventory/command/createValuationPolicy.test.ts +75 -0
- package/src/modules/inventory/command/createValuationPolicy.ts +52 -0
- package/src/modules/inventory/command/createWarehouse.generated.ts +6 -0
- package/src/modules/inventory/command/createWarehouse.test.ts +143 -0
- package/src/modules/inventory/command/createWarehouse.ts +76 -0
- package/src/modules/inventory/command/deactivateStorageLocation.generated.ts +6 -0
- package/src/modules/inventory/command/deactivateStorageLocation.test.ts +69 -0
- package/src/modules/inventory/command/deactivateStorageLocation.ts +51 -0
- package/src/modules/inventory/command/deactivateWarehouse.generated.ts +6 -0
- package/src/modules/inventory/command/deactivateWarehouse.test.ts +75 -0
- package/src/modules/inventory/command/deactivateWarehouse.ts +45 -0
- package/src/modules/inventory/command/executeStockMovement.generated.ts +6 -0
- package/src/modules/inventory/command/executeStockMovement.test.ts +502 -0
- package/src/modules/inventory/command/executeStockMovement.ts +303 -0
- package/src/modules/inventory/command/reactivateStorageLocation.generated.ts +6 -0
- package/src/modules/inventory/command/reactivateStorageLocation.test.ts +78 -0
- package/src/modules/inventory/command/reactivateStorageLocation.ts +63 -0
- package/src/modules/inventory/command/reactivateWarehouse.generated.ts +6 -0
- package/src/modules/inventory/command/reactivateWarehouse.test.ts +87 -0
- package/src/modules/inventory/command/reactivateWarehouse.ts +65 -0
- package/src/modules/inventory/command/recordCountLine.generated.ts +6 -0
- package/src/modules/inventory/command/recordCountLine.test.ts +211 -0
- package/src/modules/inventory/command/recordCountLine.ts +81 -0
- package/src/modules/inventory/command/rejectCountLine.generated.ts +6 -0
- package/src/modules/inventory/command/rejectCountLine.test.ts +66 -0
- package/src/modules/inventory/command/rejectCountLine.ts +50 -0
- package/src/modules/inventory/command/rejectInventoryAdjustment.generated.ts +6 -0
- package/src/modules/inventory/command/rejectInventoryAdjustment.test.ts +69 -0
- package/src/modules/inventory/command/rejectInventoryAdjustment.ts +50 -0
- package/src/modules/inventory/command/releaseReservation.generated.ts +6 -0
- package/src/modules/inventory/command/releaseReservation.test.ts +65 -0
- package/src/modules/inventory/command/releaseReservation.ts +50 -0
- package/src/modules/inventory/command/reserveStock.generated.ts +6 -0
- package/src/modules/inventory/command/reserveStock.test.ts +141 -0
- package/src/modules/inventory/command/reserveStock.ts +88 -0
- package/src/modules/inventory/command/reviseInventoryAdjustment.generated.ts +6 -0
- package/src/modules/inventory/command/reviseInventoryAdjustment.test.ts +68 -0
- package/src/modules/inventory/command/reviseInventoryAdjustment.ts +48 -0
- package/src/modules/inventory/command/startInventoryCount.generated.ts +6 -0
- package/src/modules/inventory/command/startInventoryCount.test.ts +100 -0
- package/src/modules/inventory/command/startInventoryCount.ts +90 -0
- package/src/modules/inventory/command/submitInventoryAdjustment.generated.ts +6 -0
- package/src/modules/inventory/command/submitInventoryAdjustment.test.ts +53 -0
- package/src/modules/inventory/command/submitInventoryAdjustment.ts +47 -0
- package/src/modules/inventory/command/updateLot.generated.ts +6 -0
- package/src/modules/inventory/command/updateLot.test.ts +88 -0
- package/src/modules/inventory/command/updateLot.ts +52 -0
- package/src/modules/inventory/command/updateStockMovement.generated.ts +6 -0
- package/src/modules/inventory/command/updateStockMovement.test.ts +250 -0
- package/src/modules/inventory/command/updateStockMovement.ts +164 -0
- package/src/modules/inventory/command/updateStorageLocation.generated.ts +6 -0
- package/src/modules/inventory/command/updateStorageLocation.test.ts +72 -0
- package/src/modules/inventory/command/updateStorageLocation.ts +77 -0
- package/src/modules/inventory/command/updateValuationPolicy.generated.ts +6 -0
- package/src/modules/inventory/command/updateValuationPolicy.test.ts +68 -0
- package/src/modules/inventory/command/updateValuationPolicy.ts +74 -0
- package/src/modules/inventory/command/updateWarehouse.generated.ts +6 -0
- package/src/modules/inventory/command/updateWarehouse.test.ts +88 -0
- package/src/modules/inventory/command/updateWarehouse.ts +64 -0
- package/src/modules/inventory/db/.gitkeep +0 -0
- package/src/modules/inventory/db/costLayer.ts +54 -0
- package/src/modules/inventory/db/inventoryAdjustment.ts +88 -0
- package/src/modules/inventory/db/inventoryCount.ts +58 -0
- package/src/modules/inventory/db/inventoryCountLine.ts +61 -0
- package/src/modules/inventory/db/itemValuation.ts +50 -0
- package/src/modules/inventory/db/lot.ts +51 -0
- package/src/modules/inventory/db/lotStockLevel.ts +48 -0
- package/src/modules/inventory/db/serialNumber.ts +53 -0
- package/src/modules/inventory/db/stockLevel.ts +51 -0
- package/src/modules/inventory/db/stockMoveLine.ts +78 -0
- package/src/modules/inventory/db/stockMovement.ts +48 -0
- package/src/modules/inventory/db/storageLocation.ts +56 -0
- package/src/modules/inventory/db/valuationPolicy.ts +33 -0
- package/src/modules/inventory/db/warehouse.ts +45 -0
- package/src/modules/inventory/docs/commands/ApproveCountLine.md +44 -0
- package/src/modules/inventory/docs/commands/ApproveInventoryAdjustment.md +37 -0
- package/src/modules/inventory/docs/commands/AssignSerialNumber.md +46 -0
- package/src/modules/inventory/docs/commands/CancelInventoryCount.md +49 -0
- package/src/modules/inventory/docs/commands/CancelStockMovement.md +44 -0
- package/src/modules/inventory/docs/commands/CompleteInventoryCount.md +47 -0
- package/src/modules/inventory/docs/commands/ConfirmInventoryAdjustment.md +72 -0
- package/src/modules/inventory/docs/commands/ConfirmStockMovement.md +43 -0
- package/src/modules/inventory/docs/commands/CreateInventoryAdjustment.md +75 -0
- package/src/modules/inventory/docs/commands/CreateInventoryCount.md +49 -0
- package/src/modules/inventory/docs/commands/CreateLot.md +40 -0
- package/src/modules/inventory/docs/commands/CreateStockMovement.md +76 -0
- package/src/modules/inventory/docs/commands/CreateStorageLocation.md +66 -0
- package/src/modules/inventory/docs/commands/CreateValuationPolicy.md +45 -0
- package/src/modules/inventory/docs/commands/CreateWarehouse.md +47 -0
- package/src/modules/inventory/docs/commands/DeactivateStorageLocation.md +39 -0
- package/src/modules/inventory/docs/commands/DeactivateWarehouse.md +38 -0
- package/src/modules/inventory/docs/commands/ExecuteStockMovement.md +82 -0
- package/src/modules/inventory/docs/commands/ReactivateStorageLocation.md +42 -0
- package/src/modules/inventory/docs/commands/ReactivateWarehouse.md +42 -0
- package/src/modules/inventory/docs/commands/RecordCountLine.md +52 -0
- package/src/modules/inventory/docs/commands/RejectCountLine.md +42 -0
- package/src/modules/inventory/docs/commands/RejectInventoryAdjustment.md +38 -0
- package/src/modules/inventory/docs/commands/ReleaseReservation.md +37 -0
- package/src/modules/inventory/docs/commands/ReserveStock.md +49 -0
- package/src/modules/inventory/docs/commands/ReviseInventoryAdjustment.md +38 -0
- package/src/modules/inventory/docs/commands/StartInventoryCount.md +47 -0
- package/src/modules/inventory/docs/commands/SubmitInventoryAdjustment.md +37 -0
- package/src/modules/inventory/docs/commands/UpdateLot.md +41 -0
- package/src/modules/inventory/docs/commands/UpdateStockMovement.md +45 -0
- package/src/modules/inventory/docs/commands/UpdateStorageLocation.md +41 -0
- package/src/modules/inventory/docs/commands/UpdateValuationPolicy.md +44 -0
- package/src/modules/inventory/docs/commands/UpdateWarehouse.md +42 -0
- package/src/modules/inventory/docs/features/inventory-adjustment.md +64 -0
- package/src/modules/inventory/docs/features/inventory-count.md +78 -0
- package/src/modules/inventory/docs/features/inventory-valuation.md +77 -0
- package/src/modules/inventory/docs/features/lot-and-batch-tracking.md +81 -0
- package/src/modules/inventory/docs/features/scrap-management.md +63 -0
- package/src/modules/inventory/docs/features/serial-number-tracking.md +68 -0
- package/src/modules/inventory/docs/features/stock-movement.md +72 -0
- package/src/modules/inventory/docs/features/stock-tracking.md +78 -0
- package/src/modules/inventory/docs/features/warehouse-management.md +97 -0
- package/src/modules/inventory/docs/models/CostLayer.md +37 -0
- package/src/modules/inventory/docs/models/InventoryAdjustment.md +69 -0
- package/src/modules/inventory/docs/models/InventoryCount.md +53 -0
- package/src/modules/inventory/docs/models/InventoryCountLine.md +53 -0
- package/src/modules/inventory/docs/models/ItemValuation.md +38 -0
- package/src/modules/inventory/docs/models/Lot.md +45 -0
- package/src/modules/inventory/docs/models/LotStockLevel.md +34 -0
- package/src/modules/inventory/docs/models/SerialNumber.md +53 -0
- package/src/modules/inventory/docs/models/StockLevel.md +41 -0
- package/src/modules/inventory/docs/models/StockMoveLine.md +44 -0
- package/src/modules/inventory/docs/models/StockMovement.md +52 -0
- package/src/modules/inventory/docs/models/StorageLocation.md +55 -0
- package/src/modules/inventory/docs/models/ValuationPolicy.md +38 -0
- package/src/modules/inventory/docs/models/Warehouse.md +50 -0
- package/src/modules/inventory/docs/queries/GetInventoryAdjustment.md +40 -0
- package/src/modules/inventory/docs/queries/GetInventoryCount.md +43 -0
- package/src/modules/inventory/docs/queries/GetItemValuation.md +42 -0
- package/src/modules/inventory/docs/queries/GetLot.md +42 -0
- package/src/modules/inventory/docs/queries/GetSerialNumber.md +43 -0
- package/src/modules/inventory/docs/queries/GetSerialNumberHistory.md +50 -0
- package/src/modules/inventory/docs/queries/GetStockLevel.md +42 -0
- package/src/modules/inventory/docs/queries/GetStockMovement.md +41 -0
- package/src/modules/inventory/docs/queries/GetStorageLocation.md +40 -0
- package/src/modules/inventory/docs/queries/GetValuationPolicy.md +38 -0
- package/src/modules/inventory/docs/queries/GetWarehouse.md +40 -0
- package/src/modules/inventory/docs/queries/GetWarehouseStockSummary.md +50 -0
- package/src/modules/inventory/docs/queries/ListCostLayers.md +49 -0
- package/src/modules/inventory/docs/queries/ListExpiringLots.md +51 -0
- package/src/modules/inventory/docs/queries/ListInventoryAdjustments.md +47 -0
- package/src/modules/inventory/docs/queries/ListInventoryCounts.md +57 -0
- package/src/modules/inventory/docs/queries/ListItemValuations.md +44 -0
- package/src/modules/inventory/docs/queries/ListLots.md +57 -0
- package/src/modules/inventory/docs/queries/ListSerialNumbers.md +44 -0
- package/src/modules/inventory/docs/queries/ListStockLevels.md +49 -0
- package/src/modules/inventory/docs/queries/ListStockMovements.md +47 -0
- package/src/modules/inventory/docs/queries/ListStorageLocations.md +47 -0
- package/src/modules/inventory/docs/queries/ListValuationPolicies.md +38 -0
- package/src/modules/inventory/docs/queries/ListWarehouses.md +42 -0
- package/src/modules/inventory/docs/queries/TraceLotBackward.md +46 -0
- package/src/modules/inventory/docs/queries/TraceLotForward.md +46 -0
- package/src/modules/inventory/executor/.gitkeep +0 -0
- package/src/modules/inventory/generated/.gitkeep +0 -0
- package/src/modules/inventory/generated/enums.ts +131 -0
- package/src/modules/inventory/generated/kysely-tailordb.ts +201 -0
- package/src/modules/inventory/index.ts +2 -0
- package/src/modules/inventory/lib/_db_deps.ts +17 -0
- package/src/modules/inventory/lib/errors.generated.ts +317 -0
- package/src/modules/inventory/lib/permissions.generated.ts +38 -0
- package/src/modules/inventory/lib/types.ts +92 -0
- package/src/modules/inventory/module.ts +202 -0
- package/src/modules/inventory/permissions.ts +3 -0
- package/src/modules/inventory/query/.gitkeep +0 -0
- package/src/modules/inventory/query/getInventoryAdjustment.generated.ts +5 -0
- package/src/modules/inventory/query/getInventoryAdjustment.test.ts +58 -0
- package/src/modules/inventory/query/getInventoryAdjustment.ts +16 -0
- package/src/modules/inventory/query/getInventoryCount.generated.ts +5 -0
- package/src/modules/inventory/query/getInventoryCount.test.ts +65 -0
- package/src/modules/inventory/query/getInventoryCount.ts +27 -0
- package/src/modules/inventory/query/getItemValuation.generated.ts +5 -0
- package/src/modules/inventory/query/getItemValuation.test.ts +72 -0
- package/src/modules/inventory/query/getItemValuation.ts +29 -0
- package/src/modules/inventory/query/getLot.generated.ts +5 -0
- package/src/modules/inventory/query/getLot.test.ts +62 -0
- package/src/modules/inventory/query/getLot.ts +28 -0
- package/src/modules/inventory/query/getSerialNumber.generated.ts +5 -0
- package/src/modules/inventory/query/getSerialNumber.test.ts +59 -0
- package/src/modules/inventory/query/getSerialNumber.ts +18 -0
- package/src/modules/inventory/query/getSerialNumberHistory.generated.ts +5 -0
- package/src/modules/inventory/query/getSerialNumberHistory.test.ts +80 -0
- package/src/modules/inventory/query/getSerialNumberHistory.ts +30 -0
- package/src/modules/inventory/query/getStockLevel.generated.ts +5 -0
- package/src/modules/inventory/query/getStockLevel.test.ts +70 -0
- package/src/modules/inventory/query/getStockLevel.ts +24 -0
- package/src/modules/inventory/query/getStockMovement.generated.ts +5 -0
- package/src/modules/inventory/query/getStockMovement.test.ts +62 -0
- package/src/modules/inventory/query/getStockMovement.ts +26 -0
- package/src/modules/inventory/query/getStorageLocation.generated.ts +5 -0
- package/src/modules/inventory/query/getStorageLocation.test.ts +54 -0
- package/src/modules/inventory/query/getStorageLocation.ts +26 -0
- package/src/modules/inventory/query/getValuationPolicy.generated.ts +5 -0
- package/src/modules/inventory/query/getValuationPolicy.test.ts +42 -0
- package/src/modules/inventory/query/getValuationPolicy.ts +16 -0
- package/src/modules/inventory/query/getWarehouse.generated.ts +5 -0
- package/src/modules/inventory/query/getWarehouse.test.ts +61 -0
- package/src/modules/inventory/query/getWarehouse.ts +26 -0
- package/src/modules/inventory/query/getWarehouseStockSummary.generated.ts +5 -0
- package/src/modules/inventory/query/getWarehouseStockSummary.test.ts +97 -0
- package/src/modules/inventory/query/getWarehouseStockSummary.ts +82 -0
- package/src/modules/inventory/query/listCostLayers.generated.ts +5 -0
- package/src/modules/inventory/query/listCostLayers.test.ts +58 -0
- package/src/modules/inventory/query/listCostLayers.ts +45 -0
- package/src/modules/inventory/query/listExpiringLots.generated.ts +5 -0
- package/src/modules/inventory/query/listExpiringLots.test.ts +70 -0
- package/src/modules/inventory/query/listExpiringLots.ts +74 -0
- package/src/modules/inventory/query/listInventoryAdjustments.generated.ts +5 -0
- package/src/modules/inventory/query/listInventoryAdjustments.test.ts +89 -0
- package/src/modules/inventory/query/listInventoryAdjustments.ts +59 -0
- package/src/modules/inventory/query/listInventoryCounts.generated.ts +5 -0
- package/src/modules/inventory/query/listInventoryCounts.test.ts +78 -0
- package/src/modules/inventory/query/listInventoryCounts.ts +55 -0
- package/src/modules/inventory/query/listItemValuations.generated.ts +5 -0
- package/src/modules/inventory/query/listItemValuations.test.ts +54 -0
- package/src/modules/inventory/query/listItemValuations.ts +39 -0
- package/src/modules/inventory/query/listLots.generated.ts +5 -0
- package/src/modules/inventory/query/listLots.test.ts +120 -0
- package/src/modules/inventory/query/listLots.ts +68 -0
- package/src/modules/inventory/query/listSerialNumbers.generated.ts +5 -0
- package/src/modules/inventory/query/listSerialNumbers.test.ts +58 -0
- package/src/modules/inventory/query/listSerialNumbers.ts +53 -0
- package/src/modules/inventory/query/listStockLevels.generated.ts +5 -0
- package/src/modules/inventory/query/listStockLevels.test.ts +73 -0
- package/src/modules/inventory/query/listStockLevels.ts +79 -0
- package/src/modules/inventory/query/listStockMovements.generated.ts +5 -0
- package/src/modules/inventory/query/listStockMovements.test.ts +98 -0
- package/src/modules/inventory/query/listStockMovements.ts +105 -0
- package/src/modules/inventory/query/listStorageLocations.generated.ts +5 -0
- package/src/modules/inventory/query/listStorageLocations.test.ts +70 -0
- package/src/modules/inventory/query/listStorageLocations.ts +53 -0
- package/src/modules/inventory/query/listValuationPolicies.generated.ts +5 -0
- package/src/modules/inventory/query/listValuationPolicies.test.ts +38 -0
- package/src/modules/inventory/query/listValuationPolicies.ts +39 -0
- package/src/modules/inventory/query/listWarehouses.generated.ts +5 -0
- package/src/modules/inventory/query/listWarehouses.test.ts +60 -0
- package/src/modules/inventory/query/listWarehouses.ts +39 -0
- package/src/modules/inventory/query/traceLotBackward.generated.ts +5 -0
- package/src/modules/inventory/query/traceLotBackward.test.ts +63 -0
- package/src/modules/inventory/query/traceLotBackward.ts +36 -0
- package/src/modules/inventory/query/traceLotForward.generated.ts +5 -0
- package/src/modules/inventory/query/traceLotForward.test.ts +63 -0
- package/src/modules/inventory/query/traceLotForward.ts +36 -0
- package/src/modules/inventory/tailor.config.ts +13 -0
- package/src/modules/inventory/tailor.d.ts +13 -0
- package/src/modules/inventory/testing/commandTestUtils.ts +29 -0
- package/src/modules/inventory/testing/fixtures.ts +412 -0
- package/src/modules/item-management/docs/models/{item.md → Item.md} +1 -1
- package/src/modules/primitives/seed/currencies.ts +22 -0
- package/src/modules/primitives/seed/exchangeRates.ts +22 -0
- package/src/modules/primitives/seed/index.ts +4 -0
- package/src/modules/primitives/seed/seed.test.ts +80 -0
- package/src/modules/primitives/seed/units.ts +62 -0
- package/src/modules/primitives/seed/uomCategories.ts +24 -0
- package/src/modules/purchase/README.md +63 -0
- package/src/modules/purchase/command/.gitkeep +0 -0
- package/src/modules/purchase/command/activatePurchasePaymentTerm.generated.ts +6 -0
- package/src/modules/purchase/command/activatePurchasePaymentTerm.test.ts +53 -0
- package/src/modules/purchase/command/activatePurchasePaymentTerm.ts +39 -0
- package/src/modules/purchase/command/activatePurchasePriceList.generated.ts +6 -0
- package/src/modules/purchase/command/activatePurchasePriceList.test.ts +39 -0
- package/src/modules/purchase/command/activatePurchasePriceList.ts +32 -0
- package/src/modules/purchase/command/activatePurchasePriceRule.generated.ts +6 -0
- package/src/modules/purchase/command/activatePurchasePriceRule.test.ts +133 -0
- package/src/modules/purchase/command/activatePurchasePriceRule.ts +75 -0
- package/src/modules/purchase/command/approvePurchaseOrder.generated.ts +6 -0
- package/src/modules/purchase/command/approvePurchaseOrder.test.ts +161 -0
- package/src/modules/purchase/command/approvePurchaseOrder.ts +89 -0
- package/src/modules/purchase/command/cancelGoodsReceipt.generated.ts +6 -0
- package/src/modules/purchase/command/cancelGoodsReceipt.test.ts +37 -0
- package/src/modules/purchase/command/cancelGoodsReceipt.ts +29 -0
- package/src/modules/purchase/command/cancelPurchaseBill.generated.ts +6 -0
- package/src/modules/purchase/command/cancelPurchaseBill.test.ts +101 -0
- package/src/modules/purchase/command/cancelPurchaseBill.ts +84 -0
- package/src/modules/purchase/command/cancelPurchaseOrder.generated.ts +6 -0
- package/src/modules/purchase/command/cancelPurchaseOrder.test.ts +119 -0
- package/src/modules/purchase/command/cancelPurchaseOrder.ts +65 -0
- package/src/modules/purchase/command/closePurchaseOrder.generated.ts +6 -0
- package/src/modules/purchase/command/closePurchaseOrder.test.ts +128 -0
- package/src/modules/purchase/command/closePurchaseOrder.ts +58 -0
- package/src/modules/purchase/command/createGoodsReceipt.generated.ts +6 -0
- package/src/modules/purchase/command/createGoodsReceipt.test.ts +233 -0
- package/src/modules/purchase/command/createGoodsReceipt.ts +93 -0
- package/src/modules/purchase/command/createPurchaseBill.generated.ts +6 -0
- package/src/modules/purchase/command/createPurchaseBill.test.ts +277 -0
- package/src/modules/purchase/command/createPurchaseBill.ts +107 -0
- package/src/modules/purchase/command/createPurchaseOrder.generated.ts +6 -0
- package/src/modules/purchase/command/createPurchaseOrder.test.ts +291 -0
- package/src/modules/purchase/command/createPurchaseOrder.ts +131 -0
- package/src/modules/purchase/command/createPurchasePaymentTerm.generated.ts +6 -0
- package/src/modules/purchase/command/createPurchasePaymentTerm.test.ts +140 -0
- package/src/modules/purchase/command/createPurchasePaymentTerm.ts +66 -0
- package/src/modules/purchase/command/createPurchasePriceList.generated.ts +6 -0
- package/src/modules/purchase/command/createPurchasePriceList.test.ts +108 -0
- package/src/modules/purchase/command/createPurchasePriceList.ts +63 -0
- package/src/modules/purchase/command/createPurchasePriceRule.generated.ts +6 -0
- package/src/modules/purchase/command/createPurchasePriceRule.test.ts +139 -0
- package/src/modules/purchase/command/createPurchasePriceRule.ts +95 -0
- package/src/modules/purchase/command/deactivatePurchasePaymentTerm.generated.ts +6 -0
- package/src/modules/purchase/command/deactivatePurchasePaymentTerm.test.ts +49 -0
- package/src/modules/purchase/command/deactivatePurchasePaymentTerm.ts +41 -0
- package/src/modules/purchase/command/deactivatePurchasePriceList.generated.ts +6 -0
- package/src/modules/purchase/command/deactivatePurchasePriceList.test.ts +50 -0
- package/src/modules/purchase/command/deactivatePurchasePriceList.ts +32 -0
- package/src/modules/purchase/command/deactivatePurchasePriceRule.generated.ts +6 -0
- package/src/modules/purchase/command/deactivatePurchasePriceRule.test.ts +50 -0
- package/src/modules/purchase/command/deactivatePurchasePriceRule.ts +32 -0
- package/src/modules/purchase/command/matchPurchaseBill.generated.ts +6 -0
- package/src/modules/purchase/command/matchPurchaseBill.test.ts +188 -0
- package/src/modules/purchase/command/matchPurchaseBill.ts +146 -0
- package/src/modules/purchase/command/postGoodsReceipt.generated.ts +6 -0
- package/src/modules/purchase/command/postGoodsReceipt.test.ts +210 -0
- package/src/modules/purchase/command/postGoodsReceipt.ts +143 -0
- package/src/modules/purchase/command/rejectPurchaseOrder.generated.ts +6 -0
- package/src/modules/purchase/command/rejectPurchaseOrder.test.ts +79 -0
- package/src/modules/purchase/command/rejectPurchaseOrder.ts +41 -0
- package/src/modules/purchase/command/releasePurchaseBill.generated.ts +6 -0
- package/src/modules/purchase/command/releasePurchaseBill.test.ts +94 -0
- package/src/modules/purchase/command/releasePurchaseBill.ts +111 -0
- package/src/modules/purchase/command/setSupplierDefaultPurchasePaymentTerm.generated.ts +6 -0
- package/src/modules/purchase/command/setSupplierDefaultPurchasePaymentTerm.test.ts +171 -0
- package/src/modules/purchase/command/setSupplierDefaultPurchasePaymentTerm.ts +90 -0
- package/src/modules/purchase/command/submitPurchaseOrder.generated.ts +6 -0
- package/src/modules/purchase/command/submitPurchaseOrder.test.ts +98 -0
- package/src/modules/purchase/command/submitPurchaseOrder.ts +73 -0
- package/src/modules/purchase/command/updateGoodsReceipt.generated.ts +6 -0
- package/src/modules/purchase/command/updateGoodsReceipt.test.ts +115 -0
- package/src/modules/purchase/command/updateGoodsReceipt.ts +73 -0
- package/src/modules/purchase/command/updatePurchaseBill.generated.ts +6 -0
- package/src/modules/purchase/command/updatePurchaseBill.test.ts +137 -0
- package/src/modules/purchase/command/updatePurchaseBill.ts +89 -0
- package/src/modules/purchase/command/updatePurchaseOrder.generated.ts +6 -0
- package/src/modules/purchase/command/updatePurchaseOrder.test.ts +195 -0
- package/src/modules/purchase/command/updatePurchaseOrder.ts +121 -0
- package/src/modules/purchase/command/updatePurchasePaymentTerm.generated.ts +6 -0
- package/src/modules/purchase/command/updatePurchasePaymentTerm.test.ts +154 -0
- package/src/modules/purchase/command/updatePurchasePaymentTerm.ts +73 -0
- package/src/modules/purchase/command/updatePurchasePriceList.generated.ts +6 -0
- package/src/modules/purchase/command/updatePurchasePriceList.test.ts +73 -0
- package/src/modules/purchase/command/updatePurchasePriceList.ts +55 -0
- package/src/modules/purchase/command/updatePurchasePriceRule.generated.ts +6 -0
- package/src/modules/purchase/command/updatePurchasePriceRule.test.ts +191 -0
- package/src/modules/purchase/command/updatePurchasePriceRule.ts +104 -0
- package/src/modules/purchase/db/.gitkeep +0 -0
- package/src/modules/purchase/db/goodsReceipt.ts +62 -0
- package/src/modules/purchase/db/purchaseBill.ts +74 -0
- package/src/modules/purchase/db/purchaseOrder.ts +100 -0
- package/src/modules/purchase/db/purchasePaymentTerm.ts +46 -0
- package/src/modules/purchase/db/purchasePriceList.ts +53 -0
- package/src/modules/purchase/db/purchasePriceRule.ts +74 -0
- package/src/modules/purchase/db/supplierProfile.ts +59 -0
- package/src/modules/purchase/docs/commands/ActivatePurchasePaymentTerm.md +39 -0
- package/src/modules/purchase/docs/commands/ActivatePurchasePriceList.md +37 -0
- package/src/modules/purchase/docs/commands/ActivatePurchasePriceRule.md +47 -0
- package/src/modules/purchase/docs/commands/ApprovePurchaseOrder.md +55 -0
- package/src/modules/purchase/docs/commands/CancelGoodsReceipt.md +39 -0
- package/src/modules/purchase/docs/commands/CancelPurchaseBill.md +49 -0
- package/src/modules/purchase/docs/commands/CancelPurchaseOrder.md +47 -0
- package/src/modules/purchase/docs/commands/ClosePurchaseOrder.md +49 -0
- package/src/modules/purchase/docs/commands/CreateGoodsReceipt.md +54 -0
- package/src/modules/purchase/docs/commands/CreatePurchaseBill.md +59 -0
- package/src/modules/purchase/docs/commands/CreatePurchaseOrder.md +66 -0
- package/src/modules/purchase/docs/commands/CreatePurchasePaymentTerm.md +52 -0
- package/src/modules/purchase/docs/commands/CreatePurchasePriceList.md +48 -0
- package/src/modules/purchase/docs/commands/CreatePurchasePriceRule.md +62 -0
- package/src/modules/purchase/docs/commands/DeactivatePurchasePaymentTerm.md +42 -0
- package/src/modules/purchase/docs/commands/DeactivatePurchasePriceList.md +39 -0
- package/src/modules/purchase/docs/commands/DeactivatePurchasePriceRule.md +39 -0
- package/src/modules/purchase/docs/commands/MatchPurchaseBill.md +63 -0
- package/src/modules/purchase/docs/commands/PostGoodsReceipt.md +61 -0
- package/src/modules/purchase/docs/commands/RejectPurchaseOrder.md +44 -0
- package/src/modules/purchase/docs/commands/ReleasePurchaseBill.md +48 -0
- package/src/modules/purchase/docs/commands/SetSupplierDefaultPurchasePaymentTerm.md +50 -0
- package/src/modules/purchase/docs/commands/SubmitPurchaseOrder.md +51 -0
- package/src/modules/purchase/docs/commands/UpdateGoodsReceipt.md +48 -0
- package/src/modules/purchase/docs/commands/UpdatePurchaseBill.md +51 -0
- package/src/modules/purchase/docs/commands/UpdatePurchaseOrder.md +59 -0
- package/src/modules/purchase/docs/commands/UpdatePurchasePaymentTerm.md +51 -0
- package/src/modules/purchase/docs/commands/UpdatePurchasePriceList.md +43 -0
- package/src/modules/purchase/docs/commands/UpdatePurchasePriceRule.md +60 -0
- package/src/modules/purchase/docs/features/goods-receipt-matching.md +71 -0
- package/src/modules/purchase/docs/features/purchase-order-lifecycle.md +87 -0
- package/src/modules/purchase/docs/features/purchase-payment-terms.md +67 -0
- package/src/modules/purchase/docs/features/supplier-bill-matching.md +79 -0
- package/src/modules/purchase/docs/features/supplier-purchase-pricing.md +72 -0
- package/src/modules/purchase/docs/models/GoodsReceipt.md +58 -0
- package/src/modules/purchase/docs/models/PurchaseBill.md +68 -0
- package/src/modules/purchase/docs/models/PurchaseOrder.md +88 -0
- package/src/modules/purchase/docs/models/PurchasePaymentTerm.md +59 -0
- package/src/modules/purchase/docs/models/PurchasePriceList.md +53 -0
- package/src/modules/purchase/docs/models/PurchasePriceRule.md +58 -0
- package/src/modules/purchase/docs/models/SupplierProfile.md +37 -0
- package/src/modules/purchase/docs/queries/CalculatePurchaseBillDueSchedule.md +47 -0
- package/src/modules/purchase/docs/queries/CalculatePurchasePrice.md +53 -0
- package/src/modules/purchase/docs/queries/GetGoodsReceipt.md +36 -0
- package/src/modules/purchase/docs/queries/GetPurchaseBill.md +41 -0
- package/src/modules/purchase/docs/queries/GetPurchaseOrder.md +42 -0
- package/src/modules/purchase/docs/queries/GetPurchasePaymentTerm.md +36 -0
- package/src/modules/purchase/docs/queries/GetPurchasePriceList.md +36 -0
- package/src/modules/purchase/docs/queries/GetSupplierProfile.md +36 -0
- package/src/modules/purchase/executor/.gitkeep +0 -0
- package/src/modules/purchase/generated/.gitkeep +0 -0
- package/src/modules/purchase/generated/enums.ts +63 -0
- package/src/modules/purchase/generated/kysely-tailordb.ts +186 -0
- package/src/modules/purchase/index.ts +2 -0
- package/src/modules/purchase/lib/_db_deps.ts +77 -0
- package/src/modules/purchase/lib/domain.ts +467 -0
- package/src/modules/purchase/lib/errors.generated.ts +367 -0
- package/src/modules/purchase/lib/permissions.generated.ts +34 -0
- package/src/modules/purchase/lib/types.ts +65 -0
- package/src/modules/purchase/module.ts +218 -0
- package/src/modules/purchase/permissions.ts +1 -0
- package/src/modules/purchase/query/.gitkeep +0 -0
- package/src/modules/purchase/query/calculatePurchaseBillDueSchedule.generated.ts +5 -0
- package/src/modules/purchase/query/calculatePurchaseBillDueSchedule.test.ts +183 -0
- package/src/modules/purchase/query/calculatePurchaseBillDueSchedule.ts +41 -0
- package/src/modules/purchase/query/calculatePurchasePrice.generated.ts +5 -0
- package/src/modules/purchase/query/calculatePurchasePrice.test.ts +143 -0
- package/src/modules/purchase/query/calculatePurchasePrice.ts +113 -0
- package/src/modules/purchase/query/getGoodsReceipt.generated.ts +5 -0
- package/src/modules/purchase/query/getGoodsReceipt.test.ts +42 -0
- package/src/modules/purchase/query/getGoodsReceipt.ts +27 -0
- package/src/modules/purchase/query/getPurchaseBill.generated.ts +5 -0
- package/src/modules/purchase/query/getPurchaseBill.test.ts +69 -0
- package/src/modules/purchase/query/getPurchaseBill.ts +35 -0
- package/src/modules/purchase/query/getPurchaseOrder.generated.ts +5 -0
- package/src/modules/purchase/query/getPurchaseOrder.test.ts +65 -0
- package/src/modules/purchase/query/getPurchaseOrder.ts +33 -0
- package/src/modules/purchase/query/getPurchasePaymentTerm.generated.ts +5 -0
- package/src/modules/purchase/query/getPurchasePaymentTerm.test.ts +44 -0
- package/src/modules/purchase/query/getPurchasePaymentTerm.ts +30 -0
- package/src/modules/purchase/query/getPurchasePriceList.generated.ts +5 -0
- package/src/modules/purchase/query/getPurchasePriceList.test.ts +48 -0
- package/src/modules/purchase/query/getPurchasePriceList.ts +30 -0
- package/src/modules/purchase/query/getSupplierProfile.generated.ts +5 -0
- package/src/modules/purchase/query/getSupplierProfile.test.ts +50 -0
- package/src/modules/purchase/query/getSupplierProfile.ts +18 -0
- package/src/modules/purchase/tailor.config.ts +13 -0
- package/src/modules/purchase/tailor.d.ts +13 -0
- package/src/modules/purchase/testing/commandTestUtils.ts +35 -0
- package/src/modules/purchase/testing/fixtures.ts +317 -0
- package/src/modules/sales/README.md +69 -0
- package/src/modules/sales/command/.gitkeep +0 -0
- package/src/modules/sales/command/activateChannel.generated.ts +6 -0
- package/src/modules/sales/command/activateChannel.test.ts +70 -0
- package/src/modules/sales/command/activateChannel.ts +48 -0
- package/src/modules/sales/command/activateListing.generated.ts +6 -0
- package/src/modules/sales/command/activateListing.test.ts +87 -0
- package/src/modules/sales/command/activateListing.ts +49 -0
- package/src/modules/sales/command/activateSalesPaymentTerm.generated.ts +6 -0
- package/src/modules/sales/command/activateSalesPaymentTerm.test.ts +58 -0
- package/src/modules/sales/command/activateSalesPaymentTerm.ts +50 -0
- package/src/modules/sales/command/activateSalesPriceList.generated.ts +6 -0
- package/src/modules/sales/command/activateSalesPriceList.test.ts +55 -0
- package/src/modules/sales/command/activateSalesPriceList.ts +46 -0
- package/src/modules/sales/command/activateSalesPriceRule.generated.ts +6 -0
- package/src/modules/sales/command/activateSalesPriceRule.test.ts +83 -0
- package/src/modules/sales/command/activateSalesPriceRule.ts +58 -0
- package/src/modules/sales/command/cancelChannelOrder.generated.ts +6 -0
- package/src/modules/sales/command/cancelChannelOrder.test.ts +47 -0
- package/src/modules/sales/command/cancelChannelOrder.ts +30 -0
- package/src/modules/sales/command/cancelSalesInvoice.generated.ts +6 -0
- package/src/modules/sales/command/cancelSalesInvoice.test.ts +47 -0
- package/src/modules/sales/command/cancelSalesInvoice.ts +37 -0
- package/src/modules/sales/command/cancelSalesOrder.generated.ts +6 -0
- package/src/modules/sales/command/cancelSalesOrder.test.ts +70 -0
- package/src/modules/sales/command/cancelSalesOrder.ts +48 -0
- package/src/modules/sales/command/cancelSyncJob.generated.ts +6 -0
- package/src/modules/sales/command/cancelSyncJob.test.ts +58 -0
- package/src/modules/sales/command/cancelSyncJob.ts +30 -0
- package/src/modules/sales/command/closeSalesOrder.generated.ts +6 -0
- package/src/modules/sales/command/closeSalesOrder.test.ts +41 -0
- package/src/modules/sales/command/closeSalesOrder.ts +51 -0
- package/src/modules/sales/command/confirmSalesOrder.generated.ts +6 -0
- package/src/modules/sales/command/confirmSalesOrder.test.ts +68 -0
- package/src/modules/sales/command/confirmSalesOrder.ts +67 -0
- package/src/modules/sales/command/convertChannelOrder.generated.ts +6 -0
- package/src/modules/sales/command/convertChannelOrder.test.ts +118 -0
- package/src/modules/sales/command/convertChannelOrder.ts +151 -0
- package/src/modules/sales/command/createChannel.generated.ts +6 -0
- package/src/modules/sales/command/createChannel.test.ts +100 -0
- package/src/modules/sales/command/createChannel.ts +58 -0
- package/src/modules/sales/command/createListing.generated.ts +6 -0
- package/src/modules/sales/command/createListing.test.ts +88 -0
- package/src/modules/sales/command/createListing.ts +76 -0
- package/src/modules/sales/command/createSalesCreditNote.generated.ts +6 -0
- package/src/modules/sales/command/createSalesCreditNote.test.ts +56 -0
- package/src/modules/sales/command/createSalesCreditNote.ts +75 -0
- package/src/modules/sales/command/createSalesInvoice.generated.ts +6 -0
- package/src/modules/sales/command/createSalesInvoice.test.ts +85 -0
- package/src/modules/sales/command/createSalesInvoice.ts +94 -0
- package/src/modules/sales/command/createSalesOrder.generated.ts +6 -0
- package/src/modules/sales/command/createSalesOrder.test.ts +134 -0
- package/src/modules/sales/command/createSalesOrder.ts +140 -0
- package/src/modules/sales/command/createSalesPaymentTerm.generated.ts +6 -0
- package/src/modules/sales/command/createSalesPaymentTerm.test.ts +59 -0
- package/src/modules/sales/command/createSalesPaymentTerm.ts +50 -0
- package/src/modules/sales/command/createSalesPriceList.generated.ts +6 -0
- package/src/modules/sales/command/createSalesPriceList.test.ts +67 -0
- package/src/modules/sales/command/createSalesPriceList.ts +45 -0
- package/src/modules/sales/command/createSalesPriceRule.generated.ts +6 -0
- package/src/modules/sales/command/createSalesPriceRule.test.ts +137 -0
- package/src/modules/sales/command/createSalesPriceRule.ts +66 -0
- package/src/modules/sales/command/createShipment.generated.ts +6 -0
- package/src/modules/sales/command/createShipment.test.ts +75 -0
- package/src/modules/sales/command/createShipment.ts +86 -0
- package/src/modules/sales/command/deactivateChannel.generated.ts +6 -0
- package/src/modules/sales/command/deactivateChannel.test.ts +29 -0
- package/src/modules/sales/command/deactivateChannel.ts +30 -0
- package/src/modules/sales/command/deactivateSalesPaymentTerm.generated.ts +6 -0
- package/src/modules/sales/command/deactivateSalesPaymentTerm.test.ts +29 -0
- package/src/modules/sales/command/deactivateSalesPaymentTerm.ts +37 -0
- package/src/modules/sales/command/deactivateSalesPriceList.generated.ts +6 -0
- package/src/modules/sales/command/deactivateSalesPriceList.test.ts +33 -0
- package/src/modules/sales/command/deactivateSalesPriceList.ts +37 -0
- package/src/modules/sales/command/deactivateSalesPriceRule.generated.ts +6 -0
- package/src/modules/sales/command/deactivateSalesPriceRule.test.ts +33 -0
- package/src/modules/sales/command/deactivateSalesPriceRule.ts +37 -0
- package/src/modules/sales/command/issueSalesCreditNote.generated.ts +6 -0
- package/src/modules/sales/command/issueSalesCreditNote.test.ts +62 -0
- package/src/modules/sales/command/issueSalesCreditNote.ts +71 -0
- package/src/modules/sales/command/issueSalesInvoice.generated.ts +6 -0
- package/src/modules/sales/command/issueSalesInvoice.test.ts +88 -0
- package/src/modules/sales/command/issueSalesInvoice.ts +115 -0
- package/src/modules/sales/command/markChannelOrderException.generated.ts +6 -0
- package/src/modules/sales/command/markChannelOrderException.test.ts +59 -0
- package/src/modules/sales/command/markChannelOrderException.ts +49 -0
- package/src/modules/sales/command/pauseListing.generated.ts +6 -0
- package/src/modules/sales/command/pauseListing.test.ts +40 -0
- package/src/modules/sales/command/pauseListing.ts +30 -0
- package/src/modules/sales/command/placeSalesOrderOnCreditHold.generated.ts +6 -0
- package/src/modules/sales/command/placeSalesOrderOnCreditHold.test.ts +74 -0
- package/src/modules/sales/command/placeSalesOrderOnCreditHold.ts +46 -0
- package/src/modules/sales/command/postShipment.generated.ts +6 -0
- package/src/modules/sales/command/postShipment.test.ts +97 -0
- package/src/modules/sales/command/postShipment.ts +89 -0
- package/src/modules/sales/command/recordChannelOrder.generated.ts +6 -0
- package/src/modules/sales/command/recordChannelOrder.test.ts +124 -0
- package/src/modules/sales/command/recordChannelOrder.ts +93 -0
- package/src/modules/sales/command/rejectSalesOrder.generated.ts +6 -0
- package/src/modules/sales/command/rejectSalesOrder.test.ts +78 -0
- package/src/modules/sales/command/rejectSalesOrder.ts +42 -0
- package/src/modules/sales/command/releaseSalesOrderCreditHold.generated.ts +6 -0
- package/src/modules/sales/command/releaseSalesOrderCreditHold.test.ts +50 -0
- package/src/modules/sales/command/releaseSalesOrderCreditHold.ts +51 -0
- package/src/modules/sales/command/retireListing.generated.ts +6 -0
- package/src/modules/sales/command/retireListing.test.ts +42 -0
- package/src/modules/sales/command/retireListing.ts +30 -0
- package/src/modules/sales/command/retrySyncJob.generated.ts +6 -0
- package/src/modules/sales/command/retrySyncJob.test.ts +54 -0
- package/src/modules/sales/command/retrySyncJob.ts +44 -0
- package/src/modules/sales/command/sendSalesInvoice.generated.ts +6 -0
- package/src/modules/sales/command/sendSalesInvoice.test.ts +50 -0
- package/src/modules/sales/command/sendSalesInvoice.ts +43 -0
- package/src/modules/sales/command/startSyncJob.generated.ts +6 -0
- package/src/modules/sales/command/startSyncJob.test.ts +65 -0
- package/src/modules/sales/command/startSyncJob.ts +54 -0
- package/src/modules/sales/command/submitSalesOrder.generated.ts +6 -0
- package/src/modules/sales/command/submitSalesOrder.test.ts +58 -0
- package/src/modules/sales/command/submitSalesOrder.ts +49 -0
- package/src/modules/sales/command/updateChannel.generated.ts +6 -0
- package/src/modules/sales/command/updateChannel.test.ts +71 -0
- package/src/modules/sales/command/updateChannel.ts +68 -0
- package/src/modules/sales/command/updateListing.generated.ts +6 -0
- package/src/modules/sales/command/updateListing.test.ts +56 -0
- package/src/modules/sales/command/updateListing.ts +60 -0
- package/src/modules/sales/command/updateSalesCreditNote.generated.ts +6 -0
- package/src/modules/sales/command/updateSalesCreditNote.test.ts +68 -0
- package/src/modules/sales/command/updateSalesCreditNote.ts +68 -0
- package/src/modules/sales/command/updateSalesInvoice.generated.ts +6 -0
- package/src/modules/sales/command/updateSalesInvoice.test.ts +73 -0
- package/src/modules/sales/command/updateSalesInvoice.ts +80 -0
- package/src/modules/sales/command/updateSalesOrder.generated.ts +6 -0
- package/src/modules/sales/command/updateSalesOrder.test.ts +93 -0
- package/src/modules/sales/command/updateSalesOrder.ts +121 -0
- package/src/modules/sales/command/updateSalesPaymentTerm.generated.ts +6 -0
- package/src/modules/sales/command/updateSalesPaymentTerm.test.ts +66 -0
- package/src/modules/sales/command/updateSalesPaymentTerm.ts +59 -0
- package/src/modules/sales/command/updateSalesPriceList.generated.ts +6 -0
- package/src/modules/sales/command/updateSalesPriceList.test.ts +71 -0
- package/src/modules/sales/command/updateSalesPriceList.ts +52 -0
- package/src/modules/sales/command/updateSalesPriceRule.generated.ts +6 -0
- package/src/modules/sales/command/updateSalesPriceRule.test.ts +95 -0
- package/src/modules/sales/command/updateSalesPriceRule.ts +81 -0
- package/src/modules/sales/command/updateShipment.generated.ts +6 -0
- package/src/modules/sales/command/updateShipment.test.ts +78 -0
- package/src/modules/sales/command/updateShipment.ts +84 -0
- package/src/modules/sales/db/.gitkeep +0 -0
- package/src/modules/sales/db/channel.ts +43 -0
- package/src/modules/sales/db/channelOrder.ts +109 -0
- package/src/modules/sales/db/channelOrderLine.ts +84 -0
- package/src/modules/sales/db/listing.ts +81 -0
- package/src/modules/sales/db/salesCreditNote.ts +63 -0
- package/src/modules/sales/db/salesCreditNoteLine.ts +49 -0
- package/src/modules/sales/db/salesInvoice.ts +95 -0
- package/src/modules/sales/db/salesInvoiceLine.ts +64 -0
- package/src/modules/sales/db/salesOrder.ts +103 -0
- package/src/modules/sales/db/salesOrderLine.ts +82 -0
- package/src/modules/sales/db/salesPaymentTerm.ts +46 -0
- package/src/modules/sales/db/salesPriceList.ts +61 -0
- package/src/modules/sales/db/salesPriceRule.ts +96 -0
- package/src/modules/sales/db/shipment.ts +78 -0
- package/src/modules/sales/db/shipmentLine.ts +58 -0
- package/src/modules/sales/db/syncJob.ts +70 -0
- package/src/modules/sales/docs/commands/ActivateChannel.md +42 -0
- package/src/modules/sales/docs/commands/ActivateListing.md +46 -0
- package/src/modules/sales/docs/commands/ActivateSalesPaymentTerm.md +41 -0
- package/src/modules/sales/docs/commands/ActivateSalesPriceList.md +39 -0
- package/src/modules/sales/docs/commands/ActivateSalesPriceRule.md +48 -0
- package/src/modules/sales/docs/commands/CancelChannelOrder.md +37 -0
- package/src/modules/sales/docs/commands/CancelSalesInvoice.md +39 -0
- package/src/modules/sales/docs/commands/CancelSalesOrder.md +40 -0
- package/src/modules/sales/docs/commands/CancelSyncJob.md +36 -0
- package/src/modules/sales/docs/commands/CloseSalesOrder.md +39 -0
- package/src/modules/sales/docs/commands/ConfirmSalesOrder.md +43 -0
- package/src/modules/sales/docs/commands/ConvertChannelOrder.md +44 -0
- package/src/modules/sales/docs/commands/CreateChannel.md +40 -0
- package/src/modules/sales/docs/commands/CreateListing.md +40 -0
- package/src/modules/sales/docs/commands/CreateSalesCreditNote.md +37 -0
- package/src/modules/sales/docs/commands/CreateSalesInvoice.md +39 -0
- package/src/modules/sales/docs/commands/CreateSalesOrder.md +51 -0
- package/src/modules/sales/docs/commands/CreateSalesPaymentTerm.md +38 -0
- package/src/modules/sales/docs/commands/CreateSalesPriceList.md +37 -0
- package/src/modules/sales/docs/commands/CreateSalesPriceRule.md +46 -0
- package/src/modules/sales/docs/commands/CreateShipment.md +38 -0
- package/src/modules/sales/docs/commands/DeactivateChannel.md +35 -0
- package/src/modules/sales/docs/commands/DeactivateSalesPaymentTerm.md +35 -0
- package/src/modules/sales/docs/commands/DeactivateSalesPriceList.md +35 -0
- package/src/modules/sales/docs/commands/DeactivateSalesPriceRule.md +35 -0
- package/src/modules/sales/docs/commands/IssueSalesCreditNote.md +38 -0
- package/src/modules/sales/docs/commands/IssueSalesInvoice.md +43 -0
- package/src/modules/sales/docs/commands/MarkChannelOrderException.md +37 -0
- package/src/modules/sales/docs/commands/PauseListing.md +36 -0
- package/src/modules/sales/docs/commands/PlaceSalesOrderOnCreditHold.md +41 -0
- package/src/modules/sales/docs/commands/PostShipment.md +41 -0
- package/src/modules/sales/docs/commands/RecordChannelOrder.md +45 -0
- package/src/modules/sales/docs/commands/RejectSalesOrder.md +41 -0
- package/src/modules/sales/docs/commands/ReleaseSalesOrderCreditHold.md +36 -0
- package/src/modules/sales/docs/commands/RetireListing.md +36 -0
- package/src/modules/sales/docs/commands/RetrySyncJob.md +39 -0
- package/src/modules/sales/docs/commands/SendSalesInvoice.md +38 -0
- package/src/modules/sales/docs/commands/StartSyncJob.md +39 -0
- package/src/modules/sales/docs/commands/SubmitSalesOrder.md +43 -0
- package/src/modules/sales/docs/commands/UpdateChannel.md +43 -0
- package/src/modules/sales/docs/commands/UpdateListing.md +38 -0
- package/src/modules/sales/docs/commands/UpdateSalesCreditNote.md +38 -0
- package/src/modules/sales/docs/commands/UpdateSalesInvoice.md +38 -0
- package/src/modules/sales/docs/commands/UpdateSalesOrder.md +45 -0
- package/src/modules/sales/docs/commands/UpdateSalesPaymentTerm.md +41 -0
- package/src/modules/sales/docs/commands/UpdateSalesPriceList.md +40 -0
- package/src/modules/sales/docs/commands/UpdateSalesPriceRule.md +49 -0
- package/src/modules/sales/docs/commands/UpdateShipment.md +38 -0
- package/src/modules/sales/docs/commands/bin/rm.md +52 -0
- package/src/modules/sales/docs/commands/opt/homebrew/bin/codex.md +52 -0
- package/src/modules/sales/docs/commands/opt/homebrew/bin/ps2ps2.md +52 -0
- package/src/modules/sales/docs/commands/opt/homebrew/bin/rg.md +52 -0
- package/src/modules/sales/docs/commands/opt/homebrew/bin/sha384sum.md +52 -0
- package/src/modules/sales/docs/commands/opt/homebrew/opt/libpq/bin/pg_combinebackup.md +52 -0
- package/src/modules/sales/docs/commands/sbin/mount_msdos.md +52 -0
- package/src/modules/sales/docs/commands/sbin/mount_nfs.md +52 -0
- package/src/modules/sales/docs/commands/usr/bin/cupstestppd.md +52 -0
- package/src/modules/sales/docs/commands/usr/bin/enc2xs.md +52 -0
- package/src/modules/sales/docs/commands/usr/bin/hash.md +52 -0
- package/src/modules/sales/docs/commands/usr/bin/jarsigner.md +52 -0
- package/src/modules/sales/docs/commands/usr/bin/mpsgraphtool.md +52 -0
- package/src/modules/sales/docs/commands/usr/bin/nano.md +52 -0
- package/src/modules/sales/docs/commands/usr/bin/pod2html5.34.md +52 -0
- package/src/modules/sales/docs/commands/usr/bin/ri.md +52 -0
- package/src/modules/sales/docs/commands/usr/bin/rs.md +52 -0
- package/src/modules/sales/docs/commands/usr/bin/trustcachectl.md +52 -0
- package/src/modules/sales/docs/commands/usr/sbin/htpasswd.md +52 -0
- package/src/modules/sales/docs/commands/usr/sbin/lpadmin.md +52 -0
- package/src/modules/sales/docs/commands/usr/sbin/setkey.md +52 -0
- package/src/modules/sales/docs/features/channel-listing-management.md +68 -0
- package/src/modules/sales/docs/features/channel-order-sync.md +78 -0
- package/src/modules/sales/docs/features/customer-invoicing.md +89 -0
- package/src/modules/sales/docs/features/customer-sales-pricing.md +72 -0
- package/src/modules/sales/docs/features/sales-order-lifecycle.md +96 -0
- package/src/modules/sales/docs/features/sales-payment-terms.md +67 -0
- package/src/modules/sales/docs/features/shipment-fulfillment.md +71 -0
- package/src/modules/sales/docs/models/Channel.md +48 -0
- package/src/modules/sales/docs/models/ChannelOrder.md +56 -0
- package/src/modules/sales/docs/models/ChannelOrderLine.md +39 -0
- package/src/modules/sales/docs/models/Listing.md +56 -0
- package/src/modules/sales/docs/models/SalesCreditNote.md +47 -0
- package/src/modules/sales/docs/models/SalesCreditNoteLine.md +37 -0
- package/src/modules/sales/docs/models/SalesInvoice.md +55 -0
- package/src/modules/sales/docs/models/SalesInvoiceLine.md +39 -0
- package/src/modules/sales/docs/models/SalesOrder.md +79 -0
- package/src/modules/sales/docs/models/SalesOrderLine.md +42 -0
- package/src/modules/sales/docs/models/SalesPaymentTerm.md +53 -0
- package/src/modules/sales/docs/models/SalesPriceList.md +50 -0
- package/src/modules/sales/docs/models/SalesPriceRule.md +51 -0
- package/src/modules/sales/docs/models/Shipment.md +49 -0
- package/src/modules/sales/docs/models/ShipmentLine.md +38 -0
- package/src/modules/sales/docs/models/SyncJob.md +53 -0
- package/src/modules/sales/docs/queries/CalculateInvoiceDueSchedule.md +37 -0
- package/src/modules/sales/docs/queries/GetApplicableSalesPrice.md +38 -0
- package/src/modules/sales/docs/queries/GetChannel.md +34 -0
- package/src/modules/sales/docs/queries/GetChannelOrder.md +34 -0
- package/src/modules/sales/docs/queries/GetListing.md +34 -0
- package/src/modules/sales/docs/queries/GetListingByExternalIdentifier.md +35 -0
- package/src/modules/sales/docs/queries/GetSalesCreditNote.md +34 -0
- package/src/modules/sales/docs/queries/GetSalesInvoice.md +34 -0
- package/src/modules/sales/docs/queries/GetSalesOrder.md +36 -0
- package/src/modules/sales/docs/queries/GetSalesPaymentTerm.md +34 -0
- package/src/modules/sales/docs/queries/GetSalesPriceList.md +34 -0
- package/src/modules/sales/docs/queries/GetShipment.md +34 -0
- package/src/modules/sales/docs/queries/GetSyncJob.md +34 -0
- package/src/modules/sales/docs/queries/ListChannelOrdersByStatus.md +34 -0
- package/src/modules/sales/docs/queries/ListChannels.md +33 -0
- package/src/modules/sales/docs/queries/ListListingsByChannel.md +33 -0
- package/src/modules/sales/docs/queries/ListSalesCreditNotesByInvoice.md +33 -0
- package/src/modules/sales/docs/queries/ListSalesInvoicesBySalesOrder.md +33 -0
- package/src/modules/sales/docs/queries/ListSalesOrders.md +36 -0
- package/src/modules/sales/docs/queries/ListSalesPaymentTerms.md +33 -0
- package/src/modules/sales/docs/queries/ListSalesPriceLists.md +33 -0
- package/src/modules/sales/docs/queries/ListSalesPriceRulesByPriceList.md +33 -0
- package/src/modules/sales/docs/queries/ListShipmentsBySalesOrder.md +33 -0
- package/src/modules/sales/docs/queries/ListSyncJobs.md +34 -0
- package/src/modules/sales/executor/.gitkeep +0 -0
- package/src/modules/sales/generated/.gitkeep +0 -0
- package/src/modules/sales/generated/enums.ts +119 -0
- package/src/modules/sales/generated/kysely-tailordb.ts +332 -0
- package/src/modules/sales/index.ts +2 -0
- package/src/modules/sales/lib/_db_deps.ts +67 -0
- package/src/modules/sales/lib/domain.ts +354 -0
- package/src/modules/sales/lib/errors.generated.ts +417 -0
- package/src/modules/sales/lib/permissions.generated.ts +53 -0
- package/src/modules/sales/lib/repository.ts +137 -0
- package/src/modules/sales/lib/types.ts +105 -0
- package/src/modules/sales/module.ts +418 -0
- package/src/modules/sales/permissions.ts +3 -0
- package/src/modules/sales/query/.gitkeep +0 -0
- package/src/modules/sales/query/calculateInvoiceDueSchedule.generated.ts +5 -0
- package/src/modules/sales/query/calculateInvoiceDueSchedule.test.ts +107 -0
- package/src/modules/sales/query/calculateInvoiceDueSchedule.ts +35 -0
- package/src/modules/sales/query/getApplicableSalesPrice.generated.ts +5 -0
- package/src/modules/sales/query/getApplicableSalesPrice.test.ts +110 -0
- package/src/modules/sales/query/getApplicableSalesPrice.ts +81 -0
- package/src/modules/sales/query/getChannel.generated.ts +5 -0
- package/src/modules/sales/query/getChannel.test.ts +39 -0
- package/src/modules/sales/query/getChannel.ts +15 -0
- package/src/modules/sales/query/getChannelOrder.generated.ts +5 -0
- package/src/modules/sales/query/getChannelOrder.test.ts +50 -0
- package/src/modules/sales/query/getChannelOrder.ts +29 -0
- package/src/modules/sales/query/getListing.generated.ts +5 -0
- package/src/modules/sales/query/getListing.test.ts +39 -0
- package/src/modules/sales/query/getListing.ts +15 -0
- package/src/modules/sales/query/getListingByExternalIdentifier.generated.ts +5 -0
- package/src/modules/sales/query/getListingByExternalIdentifier.test.ts +61 -0
- package/src/modules/sales/query/getListingByExternalIdentifier.ts +23 -0
- package/src/modules/sales/query/getSalesCreditNote.generated.ts +5 -0
- package/src/modules/sales/query/getSalesCreditNote.test.ts +44 -0
- package/src/modules/sales/query/getSalesCreditNote.ts +14 -0
- package/src/modules/sales/query/getSalesInvoice.generated.ts +5 -0
- package/src/modules/sales/query/getSalesInvoice.test.ts +44 -0
- package/src/modules/sales/query/getSalesInvoice.ts +14 -0
- package/src/modules/sales/query/getSalesOrder.generated.ts +5 -0
- package/src/modules/sales/query/getSalesOrder.test.ts +57 -0
- package/src/modules/sales/query/getSalesOrder.ts +20 -0
- package/src/modules/sales/query/getSalesPaymentTerm.generated.ts +5 -0
- package/src/modules/sales/query/getSalesPaymentTerm.test.ts +44 -0
- package/src/modules/sales/query/getSalesPaymentTerm.ts +24 -0
- package/src/modules/sales/query/getSalesPriceList.generated.ts +5 -0
- package/src/modules/sales/query/getSalesPriceList.test.ts +39 -0
- package/src/modules/sales/query/getSalesPriceList.ts +15 -0
- package/src/modules/sales/query/getShipment.generated.ts +5 -0
- package/src/modules/sales/query/getShipment.test.ts +44 -0
- package/src/modules/sales/query/getShipment.ts +12 -0
- package/src/modules/sales/query/getSyncJob.generated.ts +5 -0
- package/src/modules/sales/query/getSyncJob.test.ts +43 -0
- package/src/modules/sales/query/getSyncJob.ts +24 -0
- package/src/modules/sales/query/listChannelOrdersByStatus.generated.ts +5 -0
- package/src/modules/sales/query/listChannelOrdersByStatus.test.ts +58 -0
- package/src/modules/sales/query/listChannelOrdersByStatus.ts +53 -0
- package/src/modules/sales/query/listChannels.generated.ts +5 -0
- package/src/modules/sales/query/listChannels.test.ts +36 -0
- package/src/modules/sales/query/listChannels.ts +39 -0
- package/src/modules/sales/query/listListingsByChannel.generated.ts +5 -0
- package/src/modules/sales/query/listListingsByChannel.test.ts +36 -0
- package/src/modules/sales/query/listListingsByChannel.ts +39 -0
- package/src/modules/sales/query/listSalesCreditNotesByInvoice.generated.ts +5 -0
- package/src/modules/sales/query/listSalesCreditNotesByInvoice.test.ts +36 -0
- package/src/modules/sales/query/listSalesCreditNotesByInvoice.ts +42 -0
- package/src/modules/sales/query/listSalesInvoicesBySalesOrder.generated.ts +5 -0
- package/src/modules/sales/query/listSalesInvoicesBySalesOrder.test.ts +36 -0
- package/src/modules/sales/query/listSalesInvoicesBySalesOrder.ts +42 -0
- package/src/modules/sales/query/listSalesOrders.generated.ts +5 -0
- package/src/modules/sales/query/listSalesOrders.test.ts +79 -0
- package/src/modules/sales/query/listSalesOrders.ts +67 -0
- package/src/modules/sales/query/listSalesPaymentTerms.generated.ts +5 -0
- package/src/modules/sales/query/listSalesPaymentTerms.test.ts +36 -0
- package/src/modules/sales/query/listSalesPaymentTerms.ts +42 -0
- package/src/modules/sales/query/listSalesPriceLists.generated.ts +5 -0
- package/src/modules/sales/query/listSalesPriceLists.test.ts +36 -0
- package/src/modules/sales/query/listSalesPriceLists.ts +39 -0
- package/src/modules/sales/query/listSalesPriceRulesByPriceList.generated.ts +5 -0
- package/src/modules/sales/query/listSalesPriceRulesByPriceList.test.ts +39 -0
- package/src/modules/sales/query/listSalesPriceRulesByPriceList.ts +47 -0
- package/src/modules/sales/query/listShipmentsBySalesOrder.generated.ts +5 -0
- package/src/modules/sales/query/listShipmentsBySalesOrder.test.ts +36 -0
- package/src/modules/sales/query/listShipmentsBySalesOrder.ts +36 -0
- package/src/modules/sales/query/listSyncJobs.generated.ts +5 -0
- package/src/modules/sales/query/listSyncJobs.test.ts +50 -0
- package/src/modules/sales/query/listSyncJobs.ts +47 -0
- package/src/modules/sales/tailor.config.ts +13 -0
- package/src/modules/sales/tailor.d.ts +13 -0
- package/src/modules/sales/testing/commandTestUtils.ts +35 -0
- package/src/modules/sales/testing/fixtures.ts +520 -0
- package/src/modules/user-management/command/.gitkeep +0 -0
- package/src/modules/user-management/db/.gitkeep +0 -0
- package/src/modules/user-management/executor/.gitkeep +0 -0
- package/src/modules/user-management/generated/.gitkeep +0 -0
- package/src/modules/user-management/lib/errors.generated.ts +0 -5
- package/src/modules/user-management/lib/recomputeUserPermissions.ts +4 -2
- package/src/modules/user-management/permissions.ts +3 -0
- package/src/modules/user-management/query/.gitkeep +0 -0
- package/src/modules/user-management/query/listRolePermissionsByRole.generated.ts +5 -0
- package/src/modules/user-management/query/listRolePermissionsByRole.test.ts +20 -0
- package/src/modules/user-management/query/listRolePermissionsByRole.ts +28 -0
- package/src/modules/user-management/query/listUserRolesByUser.generated.ts +5 -0
- package/src/modules/user-management/query/listUserRolesByUser.test.ts +20 -0
- package/src/modules/user-management/query/listUserRolesByUser.ts +28 -0
- package/src/schemas.ts +6 -6
- package/src/shared/defineCommand.ts +1 -1
- package/src/shared/entityTypes.ts +1 -1
- package/src/shared/uuidv5.test.ts +18 -0
- package/src/shared/uuidv5.ts +23 -0
- package/src/testing/index.ts +1 -1
- package/templates/scaffold/app/backend/package.json +1 -3
- package/templates/scaffold/app/backend/seed/exec.mjs +7 -5
- package/templates/scaffold/app/backend/src/generated/kysely-tailordb.ts +0 -11
- package/templates/scaffold/module/seed/index.ts +19 -0
- /package/schemas/{app-compose → app}/actors.yml +0 -0
- /package/schemas/{app-compose → app}/business-flow.yml +0 -0
- /package/schemas/{app-compose → app}/requirements.yml +0 -0
- /package/schemas/{app-compose → app}/resolver.yml +0 -0
- /package/schemas/{app-compose → app}/screen.yml +0 -0
- /package/schemas/{app-compose → app}/story.yml +0 -0
- /package/src/modules/{purchase → inventory/command}/.gitkeep +0 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# README
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The Purchase module manages the procurement lifecycle from supplier-facing commercial terms through purchase ordering, receipt confirmation, and supplier bill matching. It owns the transactional records that express what was ordered from which supplier, at what price, under which payment terms, for which receiving site, and how much of that commitment has been received or invoiced.
|
|
6
|
+
|
|
7
|
+
Purchase sits between master-data modules and operational/financial execution modules. It references suppliers from business-partner, items from item-management, organizational scope from organization, and currencies/UoMs from primitives. It also coordinates with inventory for inbound stock receipt execution and with future accounting or accounts-payable modules for financial posting, while keeping commercial procurement rules inside the purchase domain. Role-based access control and auditable state transitions are treated as first-class requirements via user-management and audit integrations.
|
|
8
|
+
|
|
9
|
+
## Key Features
|
|
10
|
+
|
|
11
|
+
- **[Purchase Order Lifecycle](docs/features/purchase-order-lifecycle.md)**: Create and manage PurchaseOrder documents with line items, supplier references, expected delivery dates, lifecycle control, and fulfillment status tracking from draft through receipt and billing completion
|
|
12
|
+
- **[Supplier Purchase Pricing](docs/features/supplier-purchase-pricing.md)**: Maintain supplier-specific purchase price lists and rules with date validity, quantity breaks, currency support, and deterministic defaulting onto purchase order lines
|
|
13
|
+
- **[Purchase Payment Terms](docs/features/purchase-payment-terms.md)**: Define supplier-facing payment schedules, installment structures, and early-payment discount terms that flow from ordering into supplier bill due-date calculation
|
|
14
|
+
- **[Goods Receipt Matching](docs/features/goods-receipt-matching.md)**: Record GoodsReceipt documents against purchase order lines, support partial receipts and quantity tolerances, and provide the matched receipt basis for inventory and bill validation
|
|
15
|
+
- **[Supplier Bill Matching](docs/features/supplier-bill-matching.md)**: Capture supplier invoices as PurchaseBill documents, validate them using 2-way or 3-way matching rules, detect quantity/price variances, and hand matched bills to downstream accounts-payable processing
|
|
16
|
+
|
|
17
|
+
## Module Scope
|
|
18
|
+
|
|
19
|
+
### In Scope
|
|
20
|
+
|
|
21
|
+
- Purchase order creation, revision, approval or ordering, rejection back to draft, cancellation, closure, and fulfillment status tracking
|
|
22
|
+
- Purchase order lines with item, quantity, unit of measure, supplier price, currency, expected delivery date, and receiving or billing progress
|
|
23
|
+
- Supplier-specific purchase pricing via `PurchasePriceList` and `PurchasePriceRule`, including effective dates, quantity breaks, and rule selection precedence
|
|
24
|
+
- Supplier-facing payment term definitions via `PurchasePaymentTerm`, including fixed-day, net-day, installment, and discount-based schedules
|
|
25
|
+
- Goods receipt recording via `GoodsReceipt`, including partial receipts, backorders, quantity tolerances, and received-quantity accumulation against purchase order lines
|
|
26
|
+
- Supplier bill capture and matching via `PurchaseBill`, including duplicate invoice detection, 2-way or 3-way matching, quantity or price variance handling, tax snapshot capture, and pre-AP cancellation controls
|
|
27
|
+
- Integration events or handoff contracts to inventory for inbound stock execution and to downstream accounting/AP modules for payable recognition, including `InboundReceiptHandoff` and a bill-ready payable handoff
|
|
28
|
+
- Company-scoped procurement documents with supplier references restricted to ACTIVE suppliers carrying the SUPPLIER role
|
|
29
|
+
|
|
30
|
+
### Out of Scope
|
|
31
|
+
|
|
32
|
+
- Supplier onboarding, qualification, certification, and performance scoring (business-partner or future supplier-management workflows)
|
|
33
|
+
- Purchase requisitions, approval matrix orchestration, RFQ or tendering, and sourcing auctions (future procurement workflow module or application layer)
|
|
34
|
+
- Blanket orders, call-off contracts, and framework agreements with committed release quantities (future purchasing enhancement)
|
|
35
|
+
- Reorder point planning, MRP-driven replenishment, and demand forecasting (future planning module)
|
|
36
|
+
- Warehouse execution details such as putaway, bin-level receiving tasks, storage assignment, and stock valuation calculation (inventory module)
|
|
37
|
+
- Landed cost allocation, customs or duty accruals, and freight capitalization (future purchasing/accounting capability)
|
|
38
|
+
- Tax determination, journal entry posting, accounts payable payment execution, and bank settlement (future accounting or AP modules)
|
|
39
|
+
- Supplier returns and return-to-vendor logistics (future reverse-logistics or extended purchase capability)
|
|
40
|
+
- Supplier catalog content syndication and punchout integration (future application-layer integration)
|
|
41
|
+
|
|
42
|
+
### Scope Decision Rationale
|
|
43
|
+
|
|
44
|
+
Purchase is scoped to the **commercial procurement document flow**: negotiated supplier price, agreed payment terms, order commitment, receipt confirmation, and supplier invoice matching. Those artifacts change together and depend on the same business rules, so they belong in one module rather than being split prematurely across pricing or AP domains.
|
|
45
|
+
|
|
46
|
+
Inventory is intentionally kept as the owner of **physical stock state and valuation execution**. Purchase records that goods were expected and received against a supplier commitment; inventory owns the resulting stock movement, on-hand balance, lot or serial handling, and cost layer updates. This separation keeps procurement focused on supplier-side matching rather than warehouse internals.
|
|
47
|
+
|
|
48
|
+
Financial settlement is also kept out of scope. Purchase can determine whether a supplier bill is commercially valid and ready to pay, but journal posting, tax treatment, and cash disbursement belong to downstream accounting or AP modules. This preserves a clean contract: purchase validates the obligation; accounting recognizes and settles it.
|
|
49
|
+
|
|
50
|
+
Supplier-specific pricing and payment terms are included here because they directly drive purchase order and bill behavior. Although generic enterprise pricing might later move into a dedicated cross-domain pricing module, the initial supplier-facing rules are tightly coupled to procurement and are needed to make purchase orders and bill matching useful from day one.
|
|
51
|
+
|
|
52
|
+
The purchase module also owns the minimum cross-module contracts needed for execution. `InboundReceiptHandoff` is the named contract from purchase to inventory when a posted receipt must create physical stock movement. Supplier bills remain inside purchase until matching completes; only then may a downstream AP/accounting handoff accept the bill for posting or settlement. Once that downstream handoff is accepted, cancellation or credit processing is no longer a pure purchase concern.
|
|
53
|
+
|
|
54
|
+
## Module Dependencies
|
|
55
|
+
|
|
56
|
+
- [business-partner](../business-partner/README.md) — Supplier reference, contact, address, and role classification; only ACTIVE partners with the SUPPLIER role can be used in purchase transactions
|
|
57
|
+
- [item-management](../item-management/README.md) — Item/SKU references on purchase order, receipt, and bill lines
|
|
58
|
+
- [organization](../organization/README.md) — Company scoping and receiving or delivery site context for purchase documents
|
|
59
|
+
- [primitives](../primitives/README.md) — Currency and unit-of-measure references for pricing, quantities, and payment term calculations
|
|
60
|
+
- [inventory](../inventory/README.md) — Downstream execution of inbound stock movements and warehouse-level receipt consequences
|
|
61
|
+
- [user-management](../user-management/README.md) — Procurement, receiving, and AP-facing permissions for submit, approve, receive, match, release, and cancel actions
|
|
62
|
+
- [audit](../audit/README.md) — Immutable audit trail for order, receipt, and bill state transitions and comparison outcomes
|
|
63
|
+
- [coa-management](../coa-management/README.md) — Future integration target for payable, accrual, and variance account references once accounting posting is introduced
|
|
File without changes
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// @generated — do not edit
|
|
2
|
+
import { permissions } from "../lib/permissions.generated";
|
|
3
|
+
import { run } from "./activatePurchasePaymentTerm";
|
|
4
|
+
import { defineCommand } from "@tailor-platform/erp-kit/module";
|
|
5
|
+
|
|
6
|
+
export const activatePurchasePaymentTerm = defineCommand(permissions.activatePurchasePaymentTerm, run);
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { createMockDb } from "../../../testing/index";
|
|
3
|
+
import type { Transaction } from "../generated/kysely-tailordb";
|
|
4
|
+
import { InvalidTermConfigurationError, PaymentTermNotFoundError } from "../lib/errors.generated";
|
|
5
|
+
import { basePaymentTerm, inactivePaymentTerm } from "../testing/fixtures";
|
|
6
|
+
import { commandCtx, expectErr, expectOk } from "../testing/commandTestUtils";
|
|
7
|
+
import { run } from "./activatePurchasePaymentTerm";
|
|
8
|
+
|
|
9
|
+
describe("activatePurchasePaymentTerm", () => {
|
|
10
|
+
it("activates an inactive payment term", async () => {
|
|
11
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
12
|
+
spies.select.mockReturnValueOnce(inactivePaymentTerm);
|
|
13
|
+
spies.update.mockReturnValueOnce({ ...inactivePaymentTerm, status: "ACTIVE" });
|
|
14
|
+
|
|
15
|
+
const result = await run(db, { id: inactivePaymentTerm.id }, commandCtx);
|
|
16
|
+
const value = expectOk<{ paymentTerm: typeof inactivePaymentTerm }>(result);
|
|
17
|
+
|
|
18
|
+
expect(value.paymentTerm.status).toBe("ACTIVE");
|
|
19
|
+
expect(spies.set).toHaveBeenCalledWith(expect.objectContaining({ status: "ACTIVE" }));
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("returns success when the payment term is already active", async () => {
|
|
23
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
24
|
+
spies.select.mockReturnValueOnce(basePaymentTerm);
|
|
25
|
+
|
|
26
|
+
const result = await run(db, { id: basePaymentTerm.id }, commandCtx);
|
|
27
|
+
const value = expectOk<{ paymentTerm: typeof basePaymentTerm }>(result);
|
|
28
|
+
|
|
29
|
+
expect(value.paymentTerm).toEqual(basePaymentTerm);
|
|
30
|
+
expect(spies.update).not.toHaveBeenCalled();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("returns error when payment term does not exist", async () => {
|
|
34
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
35
|
+
spies.select.mockReturnValueOnce(undefined);
|
|
36
|
+
|
|
37
|
+
const result = await run(db, { id: "missing-term" }, commandCtx);
|
|
38
|
+
|
|
39
|
+
expectErr(result, PaymentTermNotFoundError);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("returns error when the payment term schedule is invalid at activation time", async () => {
|
|
43
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
44
|
+
spies.select.mockReturnValueOnce({
|
|
45
|
+
...inactivePaymentTerm,
|
|
46
|
+
scheduleLines: JSON.stringify([{ kind: "INSTALLMENT", days: 30, percentage: 80 }]),
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const result = await run(db, { id: inactivePaymentTerm.id }, commandCtx);
|
|
50
|
+
|
|
51
|
+
expectErr(result, InvalidTermConfigurationError);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/array-type, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unused-vars */
|
|
2
|
+
import type { Transaction } from "../generated/kysely-tailordb";
|
|
3
|
+
import { InvalidTermConfigurationError, PaymentTermNotFoundError } from "../lib/errors.generated";
|
|
4
|
+
import { decodeJson, selectOne, validateScheduleLines } from "../lib/domain";
|
|
5
|
+
import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/module";
|
|
6
|
+
|
|
7
|
+
export interface ActivatePurchasePaymentTermInput {
|
|
8
|
+
id: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export async function run(
|
|
12
|
+
db: Transaction,
|
|
13
|
+
input: ActivatePurchasePaymentTermInput,
|
|
14
|
+
ctx: CommandContext,
|
|
15
|
+
) {
|
|
16
|
+
const paymentTerm = await selectOne(db, "PurchasePaymentTerm", "id", input.id, true);
|
|
17
|
+
if (!paymentTerm) {
|
|
18
|
+
return err(new PaymentTermNotFoundError(input.id));
|
|
19
|
+
}
|
|
20
|
+
if (paymentTerm.status === "ACTIVE") {
|
|
21
|
+
return ok({ paymentTerm });
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const validation = validateScheduleLines(
|
|
25
|
+
decodeJson(paymentTerm.scheduleLines, [] as Array<Record<string, unknown>>),
|
|
26
|
+
);
|
|
27
|
+
if (validation) {
|
|
28
|
+
return err(new InvalidTermConfigurationError(input.id));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const activated = await db
|
|
32
|
+
.updateTable("PurchasePaymentTerm")
|
|
33
|
+
.set({ status: "ACTIVE", updatedAt: new Date() })
|
|
34
|
+
.where("id", "=", input.id)
|
|
35
|
+
.returningAll()
|
|
36
|
+
.executeTakeFirstOrThrow();
|
|
37
|
+
|
|
38
|
+
return ok({ paymentTerm: activated });
|
|
39
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// @generated — do not edit
|
|
2
|
+
import { permissions } from "../lib/permissions.generated";
|
|
3
|
+
import { run } from "./activatePurchasePriceList";
|
|
4
|
+
import { defineCommand } from "@tailor-platform/erp-kit/module";
|
|
5
|
+
|
|
6
|
+
export const activatePurchasePriceList = defineCommand(permissions.activatePurchasePriceList, run);
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { createMockDb } from "../../../testing/index";
|
|
3
|
+
import type { Transaction } from "../generated/kysely-tailordb";
|
|
4
|
+
import { PriceListNotFoundError } from "../lib/errors.generated";
|
|
5
|
+
import { basePriceList, inactivePriceList } from "../testing/fixtures";
|
|
6
|
+
import { commandCtx, expectErr, expectOk } from "../testing/commandTestUtils";
|
|
7
|
+
import { run } from "./activatePurchasePriceList";
|
|
8
|
+
|
|
9
|
+
describe("activatePurchasePriceList", () => {
|
|
10
|
+
it("activates an inactive price list", async () => {
|
|
11
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
12
|
+
spies.select.mockReturnValueOnce(inactivePriceList);
|
|
13
|
+
spies.update.mockReturnValueOnce({ ...inactivePriceList, status: "ACTIVE" });
|
|
14
|
+
|
|
15
|
+
const result = await run(db, { id: inactivePriceList.id }, commandCtx);
|
|
16
|
+
const value = expectOk<{ purchasePriceList: typeof inactivePriceList }>(result);
|
|
17
|
+
|
|
18
|
+
expect(value.purchasePriceList.status).toBe("ACTIVE");
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it("returns success when the list is already active", async () => {
|
|
22
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
23
|
+
spies.select.mockReturnValueOnce(basePriceList);
|
|
24
|
+
|
|
25
|
+
const result = await run(db, { id: basePriceList.id }, commandCtx);
|
|
26
|
+
const value = expectOk<{ purchasePriceList: typeof basePriceList }>(result);
|
|
27
|
+
|
|
28
|
+
expect(value.purchasePriceList).toEqual(basePriceList);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("returns error when price list does not exist", async () => {
|
|
32
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
33
|
+
spies.select.mockReturnValueOnce(undefined);
|
|
34
|
+
|
|
35
|
+
const result = await run(db, { id: "missing-list" }, commandCtx);
|
|
36
|
+
|
|
37
|
+
expectErr(result, PriceListNotFoundError);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unused-vars */
|
|
2
|
+
import type { Transaction } from "../generated/kysely-tailordb";
|
|
3
|
+
import { PriceListNotFoundError } from "../lib/errors.generated";
|
|
4
|
+
import { selectOne } from "../lib/domain";
|
|
5
|
+
import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/module";
|
|
6
|
+
|
|
7
|
+
export interface ActivatePurchasePriceListInput {
|
|
8
|
+
id: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export async function run(
|
|
12
|
+
db: Transaction,
|
|
13
|
+
input: ActivatePurchasePriceListInput,
|
|
14
|
+
ctx: CommandContext,
|
|
15
|
+
) {
|
|
16
|
+
const purchasePriceList = await selectOne(db, "PurchasePriceList", "id", input.id, true);
|
|
17
|
+
if (!purchasePriceList) {
|
|
18
|
+
return err(new PriceListNotFoundError(input.id));
|
|
19
|
+
}
|
|
20
|
+
if (purchasePriceList.status === "ACTIVE") {
|
|
21
|
+
return ok({ purchasePriceList });
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const activated = await db
|
|
25
|
+
.updateTable("PurchasePriceList")
|
|
26
|
+
.set({ status: "ACTIVE", updatedAt: new Date() })
|
|
27
|
+
.where("id", "=", input.id)
|
|
28
|
+
.returningAll()
|
|
29
|
+
.executeTakeFirstOrThrow();
|
|
30
|
+
|
|
31
|
+
return ok({ purchasePriceList: activated });
|
|
32
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// @generated — do not edit
|
|
2
|
+
import { permissions } from "../lib/permissions.generated";
|
|
3
|
+
import { run } from "./activatePurchasePriceRule";
|
|
4
|
+
import { defineCommand } from "@tailor-platform/erp-kit/module";
|
|
5
|
+
|
|
6
|
+
export const activatePurchasePriceRule = defineCommand(permissions.activatePurchasePriceRule, run);
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { createMockDb } from "../../../testing/index";
|
|
3
|
+
import type { Transaction } from "../generated/kysely-tailordb";
|
|
4
|
+
import {
|
|
5
|
+
CurrencyNotFoundError,
|
|
6
|
+
DuplicateRulePrecedenceError,
|
|
7
|
+
InvalidRuleConfigurationError,
|
|
8
|
+
ItemNotActiveError,
|
|
9
|
+
ItemNotFoundError,
|
|
10
|
+
PriceRuleNotFoundError,
|
|
11
|
+
UnitNotFoundError,
|
|
12
|
+
} from "../lib/errors.generated";
|
|
13
|
+
import {
|
|
14
|
+
baseCurrency,
|
|
15
|
+
baseItem,
|
|
16
|
+
basePriceRule,
|
|
17
|
+
baseUnit,
|
|
18
|
+
inactiveItem,
|
|
19
|
+
inactivePriceRule,
|
|
20
|
+
} from "../testing/fixtures";
|
|
21
|
+
import { commandCtx, expectErr, expectOk } from "../testing/commandTestUtils";
|
|
22
|
+
import { run } from "./activatePurchasePriceRule";
|
|
23
|
+
|
|
24
|
+
describe("activatePurchasePriceRule", () => {
|
|
25
|
+
it("activates an inactive price rule", async () => {
|
|
26
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
27
|
+
spies.select
|
|
28
|
+
.mockReturnValueOnce(inactivePriceRule)
|
|
29
|
+
.mockReturnValueOnce(baseItem)
|
|
30
|
+
.mockReturnValueOnce(baseCurrency)
|
|
31
|
+
.mockReturnValueOnce(baseUnit)
|
|
32
|
+
.mockReturnValueOnce(undefined);
|
|
33
|
+
spies.update.mockReturnValueOnce({ ...inactivePriceRule, status: "ACTIVE" });
|
|
34
|
+
|
|
35
|
+
const result = await run(db, { id: inactivePriceRule.id }, commandCtx);
|
|
36
|
+
const value = expectOk<{ purchasePriceRule: typeof inactivePriceRule }>(result);
|
|
37
|
+
|
|
38
|
+
expect(value.purchasePriceRule.status).toBe("ACTIVE");
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("returns success when the rule is already active", async () => {
|
|
42
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
43
|
+
spies.select.mockReturnValueOnce(basePriceRule);
|
|
44
|
+
|
|
45
|
+
const result = await run(db, { id: basePriceRule.id }, commandCtx);
|
|
46
|
+
const value = expectOk<{ purchasePriceRule: typeof basePriceRule }>(result);
|
|
47
|
+
|
|
48
|
+
expect(value.purchasePriceRule).toEqual(basePriceRule);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("returns error when rule does not exist", async () => {
|
|
52
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
53
|
+
spies.select.mockReturnValueOnce(undefined);
|
|
54
|
+
|
|
55
|
+
const result = await run(db, { id: "missing-rule" }, commandCtx);
|
|
56
|
+
|
|
57
|
+
expectErr(result, PriceRuleNotFoundError);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it("returns error when activation would conflict with another active rule", async () => {
|
|
61
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
62
|
+
spies.select
|
|
63
|
+
.mockReturnValueOnce(inactivePriceRule)
|
|
64
|
+
.mockReturnValueOnce(baseItem)
|
|
65
|
+
.mockReturnValueOnce(baseCurrency)
|
|
66
|
+
.mockReturnValueOnce(baseUnit)
|
|
67
|
+
.mockReturnValueOnce({ ...basePriceRule, id: "other-rule" });
|
|
68
|
+
|
|
69
|
+
const result = await run(db, { id: inactivePriceRule.id }, commandCtx);
|
|
70
|
+
|
|
71
|
+
expectErr(result, DuplicateRulePrecedenceError);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("returns error when rule configuration is invalid at activation time", async () => {
|
|
75
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
76
|
+
spies.select
|
|
77
|
+
.mockReturnValueOnce({
|
|
78
|
+
...inactivePriceRule,
|
|
79
|
+
effectiveFrom: new Date("2024-02-01T00:00:00.000Z"),
|
|
80
|
+
effectiveTo: new Date("2024-01-01T00:00:00.000Z"),
|
|
81
|
+
})
|
|
82
|
+
.mockReturnValueOnce(baseItem)
|
|
83
|
+
.mockReturnValueOnce(baseCurrency)
|
|
84
|
+
.mockReturnValueOnce(baseUnit);
|
|
85
|
+
|
|
86
|
+
const result = await run(db, { id: inactivePriceRule.id }, commandCtx);
|
|
87
|
+
|
|
88
|
+
expectErr(result, InvalidRuleConfigurationError);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("returns error when the referenced item no longer exists", async () => {
|
|
92
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
93
|
+
spies.select.mockReturnValueOnce(inactivePriceRule).mockReturnValueOnce(undefined);
|
|
94
|
+
|
|
95
|
+
const result = await run(db, { id: inactivePriceRule.id }, commandCtx);
|
|
96
|
+
|
|
97
|
+
expectErr(result, ItemNotFoundError);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("returns error when the referenced item is inactive", async () => {
|
|
101
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
102
|
+
spies.select.mockReturnValueOnce(inactivePriceRule).mockReturnValueOnce(inactiveItem);
|
|
103
|
+
|
|
104
|
+
const result = await run(db, { id: inactivePriceRule.id }, commandCtx);
|
|
105
|
+
|
|
106
|
+
expectErr(result, ItemNotActiveError);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it("returns error when the referenced currency no longer exists", async () => {
|
|
110
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
111
|
+
spies.select
|
|
112
|
+
.mockReturnValueOnce(inactivePriceRule)
|
|
113
|
+
.mockReturnValueOnce(baseItem)
|
|
114
|
+
.mockReturnValueOnce(undefined);
|
|
115
|
+
|
|
116
|
+
const result = await run(db, { id: inactivePriceRule.id }, commandCtx);
|
|
117
|
+
|
|
118
|
+
expectErr(result, CurrencyNotFoundError);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("returns error when the referenced unit no longer exists", async () => {
|
|
122
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
123
|
+
spies.select
|
|
124
|
+
.mockReturnValueOnce(inactivePriceRule)
|
|
125
|
+
.mockReturnValueOnce(baseItem)
|
|
126
|
+
.mockReturnValueOnce(baseCurrency)
|
|
127
|
+
.mockReturnValueOnce(undefined);
|
|
128
|
+
|
|
129
|
+
const result = await run(db, { id: inactivePriceRule.id }, commandCtx);
|
|
130
|
+
|
|
131
|
+
expectErr(result, UnitNotFoundError);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unused-vars */
|
|
2
|
+
import type { Transaction } from "../generated/kysely-tailordb";
|
|
3
|
+
import {
|
|
4
|
+
CurrencyNotFoundError,
|
|
5
|
+
DuplicateRulePrecedenceError,
|
|
6
|
+
InvalidRuleConfigurationError,
|
|
7
|
+
ItemNotActiveError,
|
|
8
|
+
ItemNotFoundError,
|
|
9
|
+
PriceRuleNotFoundError,
|
|
10
|
+
UnitNotFoundError,
|
|
11
|
+
} from "../lib/errors.generated";
|
|
12
|
+
import { findRuleConflict, isActiveStatus, selectOne } from "../lib/domain";
|
|
13
|
+
import { err, ok, type CommandContext } from "@tailor-platform/erp-kit/module";
|
|
14
|
+
|
|
15
|
+
export interface ActivatePurchasePriceRuleInput {
|
|
16
|
+
id: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function run(
|
|
20
|
+
db: Transaction,
|
|
21
|
+
input: ActivatePurchasePriceRuleInput,
|
|
22
|
+
ctx: CommandContext,
|
|
23
|
+
) {
|
|
24
|
+
const purchasePriceRule = await selectOne(db, "PurchasePriceRule", "id", input.id, true);
|
|
25
|
+
if (!purchasePriceRule) {
|
|
26
|
+
return err(new PriceRuleNotFoundError(input.id));
|
|
27
|
+
}
|
|
28
|
+
if (purchasePriceRule.status === "ACTIVE") {
|
|
29
|
+
return ok({ purchasePriceRule });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const itemId = purchasePriceRule.itemId as string;
|
|
33
|
+
const currencyId = purchasePriceRule.currencyId as string;
|
|
34
|
+
const unitId = purchasePriceRule.unitId as string;
|
|
35
|
+
const item = await selectOne(db, "Item", "id", itemId);
|
|
36
|
+
if (!item) {
|
|
37
|
+
return err(new ItemNotFoundError(itemId));
|
|
38
|
+
}
|
|
39
|
+
if (!isActiveStatus(item.status as string | null)) {
|
|
40
|
+
return err(new ItemNotActiveError(itemId));
|
|
41
|
+
}
|
|
42
|
+
if (!(await selectOne(db, "Currency", "id", currencyId))) {
|
|
43
|
+
return err(new CurrencyNotFoundError(currencyId));
|
|
44
|
+
}
|
|
45
|
+
if (!(await selectOne(db, "Unit", "id", unitId))) {
|
|
46
|
+
return err(new UnitNotFoundError(unitId));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (
|
|
50
|
+
purchasePriceRule.effectiveTo &&
|
|
51
|
+
(purchasePriceRule.effectiveTo as Date) < (purchasePriceRule.effectiveFrom as Date)
|
|
52
|
+
) {
|
|
53
|
+
return err(new InvalidRuleConfigurationError(input.id));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const conflictingRule = await findRuleConflict(db, {
|
|
57
|
+
itemId,
|
|
58
|
+
currencyId,
|
|
59
|
+
unitId,
|
|
60
|
+
minimumQuantity: purchasePriceRule.minimumQuantity as number,
|
|
61
|
+
effectiveFrom: purchasePriceRule.effectiveFrom as Date,
|
|
62
|
+
});
|
|
63
|
+
if (conflictingRule && conflictingRule.id !== input.id) {
|
|
64
|
+
return err(new DuplicateRulePrecedenceError(input.id));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const activated = await db
|
|
68
|
+
.updateTable("PurchasePriceRule")
|
|
69
|
+
.set({ status: "ACTIVE", updatedAt: new Date() })
|
|
70
|
+
.where("id", "=", input.id)
|
|
71
|
+
.returningAll()
|
|
72
|
+
.executeTakeFirstOrThrow();
|
|
73
|
+
|
|
74
|
+
return ok({ purchasePriceRule: activated });
|
|
75
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// @generated — do not edit
|
|
2
|
+
import { permissions } from "../lib/permissions.generated";
|
|
3
|
+
import { run } from "./approvePurchaseOrder";
|
|
4
|
+
import { defineCommand } from "@tailor-platform/erp-kit/module";
|
|
5
|
+
|
|
6
|
+
export const approvePurchaseOrder = defineCommand(permissions.approvePurchaseOrder, run);
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { createMockDb } from "../../../testing/index";
|
|
3
|
+
import type { Transaction } from "../generated/kysely-tailordb";
|
|
4
|
+
import {
|
|
5
|
+
ItemNotActiveError,
|
|
6
|
+
MissingCommercialSnapshotError,
|
|
7
|
+
PartnerNotSupplierError,
|
|
8
|
+
PurchaseOrderNotFoundError,
|
|
9
|
+
PurchaseOrderNotSubmittedError,
|
|
10
|
+
SupplierNotActiveError,
|
|
11
|
+
} from "../lib/errors.generated";
|
|
12
|
+
import {
|
|
13
|
+
baseItem,
|
|
14
|
+
basePaymentTerm,
|
|
15
|
+
basePurchaseOrder,
|
|
16
|
+
submittedPurchaseOrder,
|
|
17
|
+
} from "../testing/fixtures";
|
|
18
|
+
import { commandCtx, expectErr, expectOk } from "../testing/commandTestUtils";
|
|
19
|
+
import { run } from "./approvePurchaseOrder";
|
|
20
|
+
|
|
21
|
+
describe("approvePurchaseOrder", () => {
|
|
22
|
+
it("approves a valid submitted purchase order", async () => {
|
|
23
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
24
|
+
spies.select
|
|
25
|
+
.mockReturnValueOnce(submittedPurchaseOrder)
|
|
26
|
+
.mockReturnValueOnce({ id: submittedPurchaseOrder.supplierId, status: "ACTIVE" })
|
|
27
|
+
.mockReturnValueOnce({ role: "SUPPLIER" })
|
|
28
|
+
.mockReturnValueOnce(baseItem);
|
|
29
|
+
spies.update.mockReturnValueOnce({ ...submittedPurchaseOrder, status: "ORDERED" });
|
|
30
|
+
|
|
31
|
+
const result = await run(db, { id: submittedPurchaseOrder.id }, commandCtx);
|
|
32
|
+
|
|
33
|
+
expect(expectOk(result).purchaseOrder.status).toBe("ORDERED");
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("freezes payment-term snapshot at approval time", async () => {
|
|
37
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
38
|
+
const orderWithoutSnapshot = {
|
|
39
|
+
...submittedPurchaseOrder,
|
|
40
|
+
paymentTermSnapshot: null,
|
|
41
|
+
paymentTermId: basePaymentTerm.id,
|
|
42
|
+
};
|
|
43
|
+
spies.select
|
|
44
|
+
.mockReturnValueOnce(orderWithoutSnapshot)
|
|
45
|
+
.mockReturnValueOnce({ id: orderWithoutSnapshot.supplierId, status: "ACTIVE" })
|
|
46
|
+
.mockReturnValueOnce({ role: "SUPPLIER" })
|
|
47
|
+
.mockReturnValueOnce(basePaymentTerm)
|
|
48
|
+
.mockReturnValueOnce(baseItem);
|
|
49
|
+
spies.update.mockReturnValueOnce({ ...orderWithoutSnapshot, status: "ORDERED" });
|
|
50
|
+
|
|
51
|
+
await run(db, { id: orderWithoutSnapshot.id }, commandCtx);
|
|
52
|
+
|
|
53
|
+
const setCall = spies.set.mock.calls[0]?.[0] as { paymentTermSnapshot?: string };
|
|
54
|
+
expect(setCall.paymentTermSnapshot).toEqual(expect.any(String));
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("freezes ordered line prices and matched rule references at approval time", async () => {
|
|
58
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
59
|
+
const orderWithoutSnapshots = {
|
|
60
|
+
...submittedPurchaseOrder,
|
|
61
|
+
lines: JSON.stringify([
|
|
62
|
+
{
|
|
63
|
+
id: "po-line-1",
|
|
64
|
+
itemId: baseItem.id,
|
|
65
|
+
quantity: 10,
|
|
66
|
+
unitPrice: 100,
|
|
67
|
+
unitId: "unit-1",
|
|
68
|
+
receivingSiteId: "site-1",
|
|
69
|
+
requiresPhysicalReceipt: true,
|
|
70
|
+
matchedPriceRuleId: "price-rule-1",
|
|
71
|
+
priceSnapshot: null,
|
|
72
|
+
receivedQuantity: 0,
|
|
73
|
+
billedQuantity: 0,
|
|
74
|
+
},
|
|
75
|
+
]),
|
|
76
|
+
};
|
|
77
|
+
spies.select
|
|
78
|
+
.mockReturnValueOnce(orderWithoutSnapshots)
|
|
79
|
+
.mockReturnValueOnce({ id: orderWithoutSnapshots.supplierId, status: "ACTIVE" })
|
|
80
|
+
.mockReturnValueOnce({ role: "SUPPLIER" })
|
|
81
|
+
.mockReturnValueOnce(baseItem);
|
|
82
|
+
spies.update.mockReturnValueOnce({ ...orderWithoutSnapshots, status: "ORDERED" });
|
|
83
|
+
|
|
84
|
+
await run(db, { id: orderWithoutSnapshots.id }, commandCtx);
|
|
85
|
+
|
|
86
|
+
const setCall = spies.set.mock.calls[0]?.[0] as { lines?: string };
|
|
87
|
+
expect(setCall.lines).toContain('"priceSnapshot"');
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it("returns error when purchase order does not exist", async () => {
|
|
91
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
92
|
+
spies.select.mockReturnValueOnce(undefined);
|
|
93
|
+
|
|
94
|
+
const result = await run(db, { id: "missing-order" }, commandCtx);
|
|
95
|
+
|
|
96
|
+
expectErr(result, PurchaseOrderNotFoundError);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("returns error when purchase order is not submitted", async () => {
|
|
100
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
101
|
+
spies.select.mockReturnValueOnce(basePurchaseOrder);
|
|
102
|
+
|
|
103
|
+
const result = await run(db, { id: basePurchaseOrder.id }, commandCtx);
|
|
104
|
+
|
|
105
|
+
expectErr(result, PurchaseOrderNotSubmittedError);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("returns error when supplier is inactive", async () => {
|
|
109
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
110
|
+
spies.select
|
|
111
|
+
.mockReturnValueOnce(submittedPurchaseOrder)
|
|
112
|
+
.mockReturnValueOnce({ id: submittedPurchaseOrder.supplierId, status: "INACTIVE" });
|
|
113
|
+
|
|
114
|
+
const result = await run(db, { id: submittedPurchaseOrder.id }, commandCtx);
|
|
115
|
+
|
|
116
|
+
expectErr(result, SupplierNotActiveError);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it("returns error when an item is inactive", async () => {
|
|
120
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
121
|
+
spies.select
|
|
122
|
+
.mockReturnValueOnce(submittedPurchaseOrder)
|
|
123
|
+
.mockReturnValueOnce({ id: submittedPurchaseOrder.supplierId, status: "ACTIVE" })
|
|
124
|
+
.mockReturnValueOnce({ role: "SUPPLIER" })
|
|
125
|
+
.mockReturnValueOnce({ ...baseItem, status: "INACTIVE" });
|
|
126
|
+
|
|
127
|
+
const result = await run(db, { id: submittedPurchaseOrder.id }, commandCtx);
|
|
128
|
+
|
|
129
|
+
expectErr(result, ItemNotActiveError);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it("returns error when supplier is no longer classified as a supplier", async () => {
|
|
133
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
134
|
+
spies.select
|
|
135
|
+
.mockReturnValueOnce(submittedPurchaseOrder)
|
|
136
|
+
.mockReturnValueOnce({ id: submittedPurchaseOrder.supplierId, status: "ACTIVE" })
|
|
137
|
+
.mockReturnValueOnce(undefined);
|
|
138
|
+
|
|
139
|
+
const result = await run(db, { id: submittedPurchaseOrder.id }, commandCtx);
|
|
140
|
+
|
|
141
|
+
expectErr(result, PartnerNotSupplierError);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it("returns error when approval cannot reconstruct the commercial snapshot", async () => {
|
|
145
|
+
const { db, spies } = createMockDb<Transaction>();
|
|
146
|
+
const orderWithoutSnapshot = {
|
|
147
|
+
...submittedPurchaseOrder,
|
|
148
|
+
paymentTermSnapshot: null,
|
|
149
|
+
paymentTermId: basePaymentTerm.id,
|
|
150
|
+
};
|
|
151
|
+
spies.select
|
|
152
|
+
.mockReturnValueOnce(orderWithoutSnapshot)
|
|
153
|
+
.mockReturnValueOnce({ id: orderWithoutSnapshot.supplierId, status: "ACTIVE" })
|
|
154
|
+
.mockReturnValueOnce({ role: "SUPPLIER" })
|
|
155
|
+
.mockReturnValueOnce(undefined);
|
|
156
|
+
|
|
157
|
+
const result = await run(db, { id: orderWithoutSnapshot.id }, commandCtx);
|
|
158
|
+
|
|
159
|
+
expectErr(result, MissingCommercialSnapshotError);
|
|
160
|
+
});
|
|
161
|
+
});
|