@tailor-platform/erp-kit 0.6.0 → 0.7.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.
Files changed (290) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +10 -10
  3. package/dist/cli.mjs +407 -69
  4. package/package.json +1 -1
  5. package/skills/erp-kit-app-1-requirements/SKILL.md +33 -17
  6. package/skills/erp-kit-app-2-requirements-review/SKILL.md +12 -0
  7. package/skills/erp-kit-app-3-plan/SKILL.md +18 -4
  8. package/skills/erp-kit-app-3-plan/references/resolver-extraction.md +1 -1
  9. package/skills/erp-kit-app-3-plan/references/screen-extraction.md +1 -1
  10. package/skills/erp-kit-app-4-plan-review/SKILL.md +12 -0
  11. package/skills/erp-kit-app-5-impl-backend/SKILL.md +12 -0
  12. package/skills/erp-kit-app-6-impl-frontend/SKILL.md +12 -0
  13. package/skills/erp-kit-app-7-impl-review/SKILL.md +13 -1
  14. package/skills/erp-kit-app-shared/references/progress-protocol.md +77 -0
  15. package/skills/erp-kit-mock-scenario/SKILL.md +1 -1
  16. package/skills/erp-kit-module-1-requirements/SKILL.md +1 -1
  17. package/skills/erp-kit-module-3-plan/SKILL.md +3 -3
  18. package/skills/erp-kit-module-3-update-plan/SKILL.md +3 -3
  19. package/skills/erp-kit-module-5-impl/SKILL.md +1 -1
  20. package/src/commands/app/index.ts +2 -0
  21. package/src/commands/app/progress/git-context.ts +16 -0
  22. package/src/commands/app/progress/index.ts +45 -0
  23. package/src/commands/app/progress/log.ts +49 -0
  24. package/src/commands/app/progress/progress.test.ts +128 -0
  25. package/src/commands/app/progress/schema-cmd.ts +10 -0
  26. package/src/commands/check.test.ts +4 -4
  27. package/src/commands/lib/discovery.test.ts +5 -7
  28. package/src/commands/lib/discovery.ts +8 -8
  29. package/src/commands/lib/sync-check-source.test.ts +1 -1
  30. package/src/commands/lib/sync-check-source.ts +6 -1
  31. package/src/commands/lib/sync-check-tests.test.ts +43 -0
  32. package/src/commands/lib/sync-check-tests.ts +20 -2
  33. package/src/commands/sync-check.ts +3 -0
  34. package/src/generator/generate-app-code.test.ts +0 -6
  35. package/src/generator/generate-app-code.ts +3 -13
  36. package/src/generator/generate-code.test.ts +10 -40
  37. package/src/generator/generate-code.ts +6 -12
  38. package/src/generator/stub-templates.test.ts +0 -7
  39. package/src/generator/stub-templates.ts +0 -14
  40. package/src/modules/finance-ledger/README.md +50 -0
  41. package/src/modules/finance-ledger/command/.gitkeep +0 -0
  42. package/src/modules/finance-ledger/command/addJournalLine.generated.ts +6 -0
  43. package/src/modules/finance-ledger/command/addJournalLine.test.ts +438 -0
  44. package/src/modules/finance-ledger/command/addJournalLine.ts +122 -0
  45. package/src/modules/finance-ledger/command/approveAndLockPeriod.generated.ts +6 -0
  46. package/src/modules/finance-ledger/command/approveAndLockPeriod.test.ts +107 -0
  47. package/src/modules/finance-ledger/command/approveAndLockPeriod.ts +72 -0
  48. package/src/modules/finance-ledger/command/beginClose.generated.ts +6 -0
  49. package/src/modules/finance-ledger/command/beginClose.test.ts +106 -0
  50. package/src/modules/finance-ledger/command/beginClose.ts +58 -0
  51. package/src/modules/finance-ledger/command/closePeriod.generated.ts +6 -0
  52. package/src/modules/finance-ledger/command/closePeriod.test.ts +87 -0
  53. package/src/modules/finance-ledger/command/closePeriod.ts +44 -0
  54. package/src/modules/finance-ledger/command/createAccountingPeriod.generated.ts +6 -0
  55. package/src/modules/finance-ledger/command/createAccountingPeriod.test.ts +425 -0
  56. package/src/modules/finance-ledger/command/createAccountingPeriod.ts +133 -0
  57. package/src/modules/finance-ledger/command/createFiscalYear.generated.ts +6 -0
  58. package/src/modules/finance-ledger/command/createFiscalYear.test.ts +197 -0
  59. package/src/modules/finance-ledger/command/createFiscalYear.ts +70 -0
  60. package/src/modules/finance-ledger/command/createJournalEntry.generated.ts +6 -0
  61. package/src/modules/finance-ledger/command/createJournalEntry.test.ts +261 -0
  62. package/src/modules/finance-ledger/command/createJournalEntry.ts +121 -0
  63. package/src/modules/finance-ledger/command/deleteAccountingPeriod.generated.ts +6 -0
  64. package/src/modules/finance-ledger/command/deleteAccountingPeriod.test.ts +71 -0
  65. package/src/modules/finance-ledger/command/deleteAccountingPeriod.ts +55 -0
  66. package/src/modules/finance-ledger/command/deleteFiscalYear.generated.ts +6 -0
  67. package/src/modules/finance-ledger/command/deleteFiscalYear.test.ts +38 -0
  68. package/src/modules/finance-ledger/command/deleteFiscalYear.ts +34 -0
  69. package/src/modules/finance-ledger/command/deleteJournalEntry.generated.ts +6 -0
  70. package/src/modules/finance-ledger/command/deleteJournalEntry.test.ts +58 -0
  71. package/src/modules/finance-ledger/command/deleteJournalEntry.ts +43 -0
  72. package/src/modules/finance-ledger/command/executeYearEndClose.generated.ts +6 -0
  73. package/src/modules/finance-ledger/command/executeYearEndClose.test.ts +239 -0
  74. package/src/modules/finance-ledger/command/executeYearEndClose.ts +415 -0
  75. package/src/modules/finance-ledger/command/finalCloseAndLockPeriod.generated.ts +6 -0
  76. package/src/modules/finance-ledger/command/finalCloseAndLockPeriod.test.ts +102 -0
  77. package/src/modules/finance-ledger/command/finalCloseAndLockPeriod.ts +76 -0
  78. package/src/modules/finance-ledger/command/finalizeFinancialStatement.generated.ts +6 -0
  79. package/src/modules/finance-ledger/command/finalizeFinancialStatement.test.ts +73 -0
  80. package/src/modules/finance-ledger/command/finalizeFinancialStatement.ts +73 -0
  81. package/src/modules/finance-ledger/command/generateFinancialStatement.generated.ts +6 -0
  82. package/src/modules/finance-ledger/command/generateFinancialStatement.test.ts +311 -0
  83. package/src/modules/finance-ledger/command/generateFinancialStatement.ts +275 -0
  84. package/src/modules/finance-ledger/command/generatePreliminaryStatements.generated.ts +6 -0
  85. package/src/modules/finance-ledger/command/generatePreliminaryStatements.test.ts +152 -0
  86. package/src/modules/finance-ledger/command/generatePreliminaryStatements.ts +140 -0
  87. package/src/modules/finance-ledger/command/generateTrialBalance.generated.ts +6 -0
  88. package/src/modules/finance-ledger/command/generateTrialBalance.test.ts +439 -0
  89. package/src/modules/finance-ledger/command/generateTrialBalance.ts +268 -0
  90. package/src/modules/finance-ledger/command/initiatePeriodClose.generated.ts +6 -0
  91. package/src/modules/finance-ledger/command/initiatePeriodClose.test.ts +153 -0
  92. package/src/modules/finance-ledger/command/initiatePeriodClose.ts +84 -0
  93. package/src/modules/finance-ledger/command/openForAdvanceEntry.generated.ts +6 -0
  94. package/src/modules/finance-ledger/command/openForAdvanceEntry.test.ts +87 -0
  95. package/src/modules/finance-ledger/command/openForAdvanceEntry.ts +44 -0
  96. package/src/modules/finance-ledger/command/openPeriod.generated.ts +6 -0
  97. package/src/modules/finance-ledger/command/openPeriod.test.ts +90 -0
  98. package/src/modules/finance-ledger/command/openPeriod.ts +44 -0
  99. package/src/modules/finance-ledger/command/permanentlyClosePeriod.generated.ts +6 -0
  100. package/src/modules/finance-ledger/command/permanentlyClosePeriod.test.ts +87 -0
  101. package/src/modules/finance-ledger/command/permanentlyClosePeriod.ts +48 -0
  102. package/src/modules/finance-ledger/command/postAdjustingEntries.generated.ts +6 -0
  103. package/src/modules/finance-ledger/command/postAdjustingEntries.test.ts +392 -0
  104. package/src/modules/finance-ledger/command/postAdjustingEntries.ts +156 -0
  105. package/src/modules/finance-ledger/command/postJournalEntry.generated.ts +6 -0
  106. package/src/modules/finance-ledger/command/postJournalEntry.test.ts +346 -0
  107. package/src/modules/finance-ledger/command/postJournalEntry.ts +160 -0
  108. package/src/modules/finance-ledger/command/processInventoryHandoff.generated.ts +6 -0
  109. package/src/modules/finance-ledger/command/processInventoryHandoff.test.ts +211 -0
  110. package/src/modules/finance-ledger/command/processInventoryHandoff.ts +133 -0
  111. package/src/modules/finance-ledger/command/processManufacturingHandoff.generated.ts +6 -0
  112. package/src/modules/finance-ledger/command/processManufacturingHandoff.test.ts +221 -0
  113. package/src/modules/finance-ledger/command/processManufacturingHandoff.ts +133 -0
  114. package/src/modules/finance-ledger/command/processPurchaseHandoff.generated.ts +6 -0
  115. package/src/modules/finance-ledger/command/processPurchaseHandoff.test.ts +222 -0
  116. package/src/modules/finance-ledger/command/processPurchaseHandoff.ts +133 -0
  117. package/src/modules/finance-ledger/command/processSalesHandoff.generated.ts +6 -0
  118. package/src/modules/finance-ledger/command/processSalesHandoff.test.ts +257 -0
  119. package/src/modules/finance-ledger/command/processSalesHandoff.ts +135 -0
  120. package/src/modules/finance-ledger/command/regenerateFinancialStatement.generated.ts +6 -0
  121. package/src/modules/finance-ledger/command/regenerateFinancialStatement.test.ts +129 -0
  122. package/src/modules/finance-ledger/command/regenerateFinancialStatement.ts +186 -0
  123. package/src/modules/finance-ledger/command/removeJournalLine.generated.ts +6 -0
  124. package/src/modules/finance-ledger/command/removeJournalLine.test.ts +65 -0
  125. package/src/modules/finance-ledger/command/removeJournalLine.ts +39 -0
  126. package/src/modules/finance-ledger/command/reopenPeriod.generated.ts +6 -0
  127. package/src/modules/finance-ledger/command/reopenPeriod.test.ts +87 -0
  128. package/src/modules/finance-ledger/command/reopenPeriod.ts +44 -0
  129. package/src/modules/finance-ledger/command/reverseJournalEntry.generated.ts +6 -0
  130. package/src/modules/finance-ledger/command/reverseJournalEntry.test.ts +337 -0
  131. package/src/modules/finance-ledger/command/reverseJournalEntry.ts +140 -0
  132. package/src/modules/finance-ledger/command/revertSoftLock.generated.ts +6 -0
  133. package/src/modules/finance-ledger/command/revertSoftLock.test.ts +96 -0
  134. package/src/modules/finance-ledger/command/revertSoftLock.ts +67 -0
  135. package/src/modules/finance-ledger/command/updateFiscalYear.generated.ts +6 -0
  136. package/src/modules/finance-ledger/command/updateFiscalYear.test.ts +138 -0
  137. package/src/modules/finance-ledger/command/updateFiscalYear.ts +85 -0
  138. package/src/modules/finance-ledger/command/updateJournalEntry.generated.ts +6 -0
  139. package/src/modules/finance-ledger/command/updateJournalEntry.test.ts +195 -0
  140. package/src/modules/finance-ledger/command/updateJournalEntry.ts +86 -0
  141. package/src/modules/finance-ledger/command/updateJournalLine.generated.ts +6 -0
  142. package/src/modules/finance-ledger/command/updateJournalLine.test.ts +385 -0
  143. package/src/modules/finance-ledger/command/updateJournalLine.ts +155 -0
  144. package/src/modules/finance-ledger/command/verifySubledgerTransfers.generated.ts +6 -0
  145. package/src/modules/finance-ledger/command/verifySubledgerTransfers.test.ts +201 -0
  146. package/src/modules/finance-ledger/command/verifySubledgerTransfers.ts +113 -0
  147. package/src/modules/finance-ledger/command/verifyTrialBalance.generated.ts +6 -0
  148. package/src/modules/finance-ledger/command/verifyTrialBalance.test.ts +136 -0
  149. package/src/modules/finance-ledger/command/verifyTrialBalance.ts +97 -0
  150. package/src/modules/finance-ledger/db/.gitkeep +0 -0
  151. package/src/modules/finance-ledger/db/accountingPeriod.ts +58 -0
  152. package/src/modules/finance-ledger/db/financialStatement.ts +92 -0
  153. package/src/modules/finance-ledger/db/financialStatementLineItem.ts +76 -0
  154. package/src/modules/finance-ledger/db/fiscalYear.ts +41 -0
  155. package/src/modules/finance-ledger/db/journalEntry.ts +101 -0
  156. package/src/modules/finance-ledger/db/journalLine.ts +64 -0
  157. package/src/modules/finance-ledger/db/periodClose.ts +97 -0
  158. package/src/modules/finance-ledger/db/trialBalance.ts +63 -0
  159. package/src/modules/finance-ledger/db/trialBalanceLine.ts +63 -0
  160. package/src/modules/finance-ledger/docs/commands/AddJournalLine.md +74 -0
  161. package/src/modules/finance-ledger/docs/commands/ApproveAndLockPeriod.md +53 -0
  162. package/src/modules/finance-ledger/docs/commands/BeginClose.md +47 -0
  163. package/src/modules/finance-ledger/docs/commands/ClosePeriod.md +45 -0
  164. package/src/modules/finance-ledger/docs/commands/CreateAccountingPeriod.md +69 -0
  165. package/src/modules/finance-ledger/docs/commands/CreateFiscalYear.md +56 -0
  166. package/src/modules/finance-ledger/docs/commands/CreateJournalEntry.md +63 -0
  167. package/src/modules/finance-ledger/docs/commands/DeleteAccountingPeriod.md +46 -0
  168. package/src/modules/finance-ledger/docs/commands/DeleteFiscalYear.md +40 -0
  169. package/src/modules/finance-ledger/docs/commands/DeleteJournalEntry.md +44 -0
  170. package/src/modules/finance-ledger/docs/commands/ExecuteYearEndClose.md +81 -0
  171. package/src/modules/finance-ledger/docs/commands/FinalCloseAndLockPeriod.md +49 -0
  172. package/src/modules/finance-ledger/docs/commands/FinalizeFinancialStatement.md +43 -0
  173. package/src/modules/finance-ledger/docs/commands/GenerateFinancialStatement.md +86 -0
  174. package/src/modules/finance-ledger/docs/commands/GeneratePreliminaryStatements.md +53 -0
  175. package/src/modules/finance-ledger/docs/commands/GenerateTrialBalance.md +75 -0
  176. package/src/modules/finance-ledger/docs/commands/InitiatePeriodClose.md +58 -0
  177. package/src/modules/finance-ledger/docs/commands/OpenForAdvanceEntry.md +44 -0
  178. package/src/modules/finance-ledger/docs/commands/OpenPeriod.md +45 -0
  179. package/src/modules/finance-ledger/docs/commands/PermanentlyClosePeriod.md +45 -0
  180. package/src/modules/finance-ledger/docs/commands/PostAdjustingEntries.md +61 -0
  181. package/src/modules/finance-ledger/docs/commands/PostJournalEntry.md +81 -0
  182. package/src/modules/finance-ledger/docs/commands/ProcessInventoryHandoff.md +72 -0
  183. package/src/modules/finance-ledger/docs/commands/ProcessManufacturingHandoff.md +68 -0
  184. package/src/modules/finance-ledger/docs/commands/ProcessPurchaseHandoff.md +68 -0
  185. package/src/modules/finance-ledger/docs/commands/ProcessSalesHandoff.md +71 -0
  186. package/src/modules/finance-ledger/docs/commands/RegenerateFinancialStatement.md +60 -0
  187. package/src/modules/finance-ledger/docs/commands/RemoveJournalLine.md +42 -0
  188. package/src/modules/finance-ledger/docs/commands/ReopenPeriod.md +45 -0
  189. package/src/modules/finance-ledger/docs/commands/ReverseJournalEntry.md +62 -0
  190. package/src/modules/finance-ledger/docs/commands/RevertSoftLock.md +49 -0
  191. package/src/modules/finance-ledger/docs/commands/UpdateFiscalYear.md +60 -0
  192. package/src/modules/finance-ledger/docs/commands/UpdateJournalEntry.md +50 -0
  193. package/src/modules/finance-ledger/docs/commands/UpdateJournalLine.md +61 -0
  194. package/src/modules/finance-ledger/docs/commands/VerifySubledgerTransfers.md +59 -0
  195. package/src/modules/finance-ledger/docs/commands/VerifyTrialBalance.md +53 -0
  196. package/src/modules/finance-ledger/docs/features/accounting-period-management.md +110 -0
  197. package/src/modules/finance-ledger/docs/features/financial-statement-generation.md +115 -0
  198. package/src/modules/finance-ledger/docs/features/journal-entry-management.md +138 -0
  199. package/src/modules/finance-ledger/docs/features/period-end-close.md +102 -0
  200. package/src/modules/finance-ledger/docs/features/subledger-integration.md +141 -0
  201. package/src/modules/finance-ledger/docs/features/trial-balance.md +99 -0
  202. package/src/modules/finance-ledger/docs/features/year-end-close.md +84 -0
  203. package/src/modules/finance-ledger/docs/models/AccountingPeriod.md +71 -0
  204. package/src/modules/finance-ledger/docs/models/FinancialStatement.md +76 -0
  205. package/src/modules/finance-ledger/docs/models/FinancialStatementLineItem.md +41 -0
  206. package/src/modules/finance-ledger/docs/models/FiscalYear.md +41 -0
  207. package/src/modules/finance-ledger/docs/models/JournalEntry.md +80 -0
  208. package/src/modules/finance-ledger/docs/models/JournalLine.md +47 -0
  209. package/src/modules/finance-ledger/docs/models/PeriodClose.md +83 -0
  210. package/src/modules/finance-ledger/docs/models/TrialBalance.md +56 -0
  211. package/src/modules/finance-ledger/docs/models/TrialBalanceLine.md +37 -0
  212. package/src/modules/finance-ledger/docs/queries/GetAccountingPeriod.md +35 -0
  213. package/src/modules/finance-ledger/docs/queries/GetFinancialStatement.md +38 -0
  214. package/src/modules/finance-ledger/docs/queries/GetFiscalYear.md +35 -0
  215. package/src/modules/finance-ledger/docs/queries/GetJournalEntry.md +37 -0
  216. package/src/modules/finance-ledger/docs/queries/GetPeriodByDate.md +38 -0
  217. package/src/modules/finance-ledger/docs/queries/GetPeriodClose.md +36 -0
  218. package/src/modules/finance-ledger/docs/queries/GetSubledgerTransferStatus.md +45 -0
  219. package/src/modules/finance-ledger/docs/queries/GetTrialBalance.md +38 -0
  220. package/src/modules/finance-ledger/docs/queries/ListAccountingPeriods.md +46 -0
  221. package/src/modules/finance-ledger/docs/queries/ListFinancialStatements.md +46 -0
  222. package/src/modules/finance-ledger/docs/queries/ListFiscalYears.md +42 -0
  223. package/src/modules/finance-ledger/docs/queries/ListJournalEntries.md +48 -0
  224. package/src/modules/finance-ledger/docs/queries/ListPeriodCloses.md +46 -0
  225. package/src/modules/finance-ledger/docs/queries/ListTrialBalances.md +51 -0
  226. package/src/modules/finance-ledger/executor/.gitkeep +0 -0
  227. package/src/modules/finance-ledger/generated/enums.ts +109 -0
  228. package/src/modules/finance-ledger/generated/kysely-tailordb.ts +202 -0
  229. package/src/modules/finance-ledger/index.ts +2 -0
  230. package/src/modules/finance-ledger/lib/_db_deps.ts +56 -0
  231. package/src/modules/finance-ledger/lib/errors.generated.ts +332 -0
  232. package/src/modules/finance-ledger/lib/permissions.generated.ts +41 -0
  233. package/src/modules/finance-ledger/lib/types.ts +66 -0
  234. package/src/modules/finance-ledger/module.ts +262 -0
  235. package/src/modules/finance-ledger/package.json +26 -0
  236. package/src/modules/finance-ledger/permissions.ts +3 -0
  237. package/src/modules/finance-ledger/query/.gitkeep +0 -0
  238. package/src/modules/finance-ledger/query/getAccountingPeriod.generated.ts +5 -0
  239. package/src/modules/finance-ledger/query/getAccountingPeriod.test.ts +31 -0
  240. package/src/modules/finance-ledger/query/getAccountingPeriod.ts +21 -0
  241. package/src/modules/finance-ledger/query/getFinancialStatement.generated.ts +5 -0
  242. package/src/modules/finance-ledger/query/getFinancialStatement.test.ts +35 -0
  243. package/src/modules/finance-ledger/query/getFinancialStatement.ts +29 -0
  244. package/src/modules/finance-ledger/query/getFiscalYear.generated.ts +5 -0
  245. package/src/modules/finance-ledger/query/getFiscalYear.test.ts +31 -0
  246. package/src/modules/finance-ledger/query/getFiscalYear.ts +21 -0
  247. package/src/modules/finance-ledger/query/getJournalEntry.generated.ts +5 -0
  248. package/src/modules/finance-ledger/query/getJournalEntry.test.ts +35 -0
  249. package/src/modules/finance-ledger/query/getJournalEntry.ts +29 -0
  250. package/src/modules/finance-ledger/query/getPeriodByDate.generated.ts +5 -0
  251. package/src/modules/finance-ledger/query/getPeriodByDate.test.ts +53 -0
  252. package/src/modules/finance-ledger/query/getPeriodByDate.ts +27 -0
  253. package/src/modules/finance-ledger/query/getPeriodClose.generated.ts +5 -0
  254. package/src/modules/finance-ledger/query/getPeriodClose.test.ts +31 -0
  255. package/src/modules/finance-ledger/query/getPeriodClose.ts +21 -0
  256. package/src/modules/finance-ledger/query/getSubledgerTransferStatus.generated.ts +5 -0
  257. package/src/modules/finance-ledger/query/getSubledgerTransferStatus.test.ts +101 -0
  258. package/src/modules/finance-ledger/query/getSubledgerTransferStatus.ts +68 -0
  259. package/src/modules/finance-ledger/query/getTrialBalance.generated.ts +5 -0
  260. package/src/modules/finance-ledger/query/getTrialBalance.test.ts +33 -0
  261. package/src/modules/finance-ledger/query/getTrialBalance.ts +30 -0
  262. package/src/modules/finance-ledger/query/listAccountingPeriods.generated.ts +5 -0
  263. package/src/modules/finance-ledger/query/listAccountingPeriods.test.ts +81 -0
  264. package/src/modules/finance-ledger/query/listAccountingPeriods.ts +61 -0
  265. package/src/modules/finance-ledger/query/listFinancialStatements.generated.ts +5 -0
  266. package/src/modules/finance-ledger/query/listFinancialStatements.test.ts +76 -0
  267. package/src/modules/finance-ledger/query/listFinancialStatements.ts +62 -0
  268. package/src/modules/finance-ledger/query/listFiscalYears.generated.ts +5 -0
  269. package/src/modules/finance-ledger/query/listFiscalYears.test.ts +63 -0
  270. package/src/modules/finance-ledger/query/listFiscalYears.ts +45 -0
  271. package/src/modules/finance-ledger/query/listJournalEntries.generated.ts +5 -0
  272. package/src/modules/finance-ledger/query/listJournalEntries.test.ts +91 -0
  273. package/src/modules/finance-ledger/query/listJournalEntries.ts +64 -0
  274. package/src/modules/finance-ledger/query/listPeriodCloses.generated.ts +5 -0
  275. package/src/modules/finance-ledger/query/listPeriodCloses.test.ts +63 -0
  276. package/src/modules/finance-ledger/query/listPeriodCloses.ts +64 -0
  277. package/src/modules/finance-ledger/query/listTrialBalances.generated.ts +5 -0
  278. package/src/modules/finance-ledger/query/listTrialBalances.test.ts +78 -0
  279. package/src/modules/finance-ledger/query/listTrialBalances.ts +56 -0
  280. package/src/modules/finance-ledger/seed/index.ts +19 -0
  281. package/src/modules/finance-ledger/tailor.config.ts +13 -0
  282. package/src/modules/finance-ledger/tailor.d.ts +13 -0
  283. package/src/modules/finance-ledger/testing/commandTestUtils.ts +35 -0
  284. package/src/modules/finance-ledger/testing/fixtures.ts +382 -0
  285. package/src/modules/finance-ledger/tsconfig.json +16 -0
  286. package/src/progress/schema.test.ts +161 -0
  287. package/src/progress/schema.ts +316 -0
  288. package/templates/scaffold/app/backend/package.json +1 -3
  289. package/templates/scaffold/app/backend/vitest.config.ts +4 -21
  290. package/src/generator/generate-stubs.ts +0 -35
@@ -0,0 +1,68 @@
1
+ # ProcessManufacturingHandoff
2
+
3
+ ## Overview
4
+
5
+ processManufacturingHandoff receives cost settlement events from the manufacturing module and creates corresponding Miscellaneous-type journal entries in the general ledger. The entry debits finished goods and variance accounts (material price variance, labor efficiency variance, overhead variance) and credits the WIP (work-in-progress) account. The command enforces idempotency and returns a ManufacturingCostSettlementAcknowledgment upon successful posting.
6
+
7
+ ## Business Rules
8
+
9
+ - Receives a handoff event containing cost settlement data with WIP, finished goods, and variance account references
10
+ - Creates a journal entry classified as Miscellaneous journal type
11
+ - Debits finished goods account and applicable variance accounts (material price, labor efficiency, overhead)
12
+ - Credits the WIP account
13
+ - Variance entries are separately recorded for each applicable variance type
14
+ - The journal entry must be balanced (total debits equal total credits in functional currency)
15
+ - The journal entry carries a source document reference linking to the originating manufacturing settlement
16
+ - Idempotent processing: duplicate events with the same source document reference return the original acknowledgment without re-posting
17
+ - Validates that the target accounting period is in OPEN or FUTURE_ENTERABLE status
18
+ - Validates that all referenced GL accounts are active in the Chart of Accounts
19
+ - Handles deprecated GL accounts with successor mappings by redirecting to the successor
20
+ - Supports multi-currency: foreign currency amounts are converted to base currency using the provided exchange rate
21
+ - Rejects events with zero or negative amounts
22
+ - Events are scoped to a company
23
+ - Returns a ManufacturingCostSettlementAcknowledgment with journal entry ID and settlement reference
24
+ - Emits an audit event recording the source module, document reference, and journal entry created
25
+
26
+ ## Process Flow
27
+
28
+ ```mermaid
29
+ flowchart TD
30
+ A[Receive manufacturing handoff event] --> B{Idempotency check: already posted?}
31
+ B -->|Yes| C[Return existing acknowledgment]
32
+ B -->|No| D{Accounting period OPEN or FUTURE_ENTERABLE?}
33
+ D -->|No| E[Return error: invalid period status]
34
+ D -->|Yes| F{GL accounts valid and active?}
35
+ F -->|No| G[Return error: account validation failed]
36
+ F -->|Yes| H[Create entry: debit finished goods + variances, credit WIP]
37
+ H --> I[Post journal entry]
38
+ I --> J[Emit audit event]
39
+ J --> K[Return ManufacturingCostSettlementAcknowledgment]
40
+ ```
41
+
42
+ ## External Dependencies
43
+
44
+ - [coa-management::getAccount](../../../coa-management/docs/queries/GetAccount.md) - Validates that WIP, finished goods, and variance GL accounts are active
45
+ - [primitives::getCurrency](../../../primitives/docs/queries/GetCurrency.md) - Validates currency for multi-currency transactions
46
+
47
+ ## Error Scenarios
48
+
49
+ - **INVALID_PERIOD_STATUS**: Target accounting period is not in OPEN or FUTURE_ENTERABLE status
50
+ - **ACCOUNT_NOT_FOUND**: Referenced GL account does not exist
51
+ - **ACCOUNT_NOT_ACTIVE**: Referenced GL account is not in active status
52
+ - **INVALID_AMOUNT**: Handoff event contains zero or negative amounts
53
+ - **COMPANY_MISMATCH**: Handoff event company does not match the GL account company scope
54
+
55
+ ## Test Cases
56
+
57
+ - returns existing entry for idempotent duplicate
58
+ - returns error when amount is zero or negative
59
+ - returns error when amount is negative
60
+ - returns error when period is not OPEN or FUTURE_ENTERABLE
61
+ - returns error when period is CLOSED
62
+ - returns error when company does not match period company
63
+ - returns error when debit account is not found
64
+ - returns error when credit account is not found
65
+ - returns error when debit account is not active
66
+ - returns error when credit account is not active
67
+ - creates journal entry with correct type and amounts
68
+ - handles multi-currency with exchange rate
@@ -0,0 +1,68 @@
1
+ # ProcessPurchaseHandoff
2
+
3
+ ## Overview
4
+
5
+ processPurchaseHandoff receives a purchase bill handoff event from the purchase module and creates a corresponding Purchase-type journal entry in the general ledger. The entry debits the expense or asset account and credits the accounts payable account, reflecting the payable recognition for a validated purchase bill. The command enforces idempotency via source document reference to prevent duplicate postings from retry scenarios. Upon successful posting, it returns a PurchaseBillPostingAcknowledgment to the purchase module.
6
+
7
+ ## Business Rules
8
+
9
+ - Receives a handoff event containing the purchase bill amount, expense/asset account reference, and accounts payable account reference
10
+ - Creates a journal entry classified as Purchase journal type
11
+ - Debits the expense or asset account and credits the accounts payable account
12
+ - The journal entry must be balanced (total debits equal total credits in functional currency)
13
+ - The journal entry carries a source document reference linking to the originating purchase bill
14
+ - Idempotent processing: duplicate events with the same source document reference return the original acknowledgment without re-posting
15
+ - Validates that the target accounting period is in OPEN or FUTURE_ENTERABLE status
16
+ - Validates that all referenced GL accounts are active in the Chart of Accounts
17
+ - Handles deprecated GL accounts with successor mappings by redirecting to the successor
18
+ - Supports multi-currency: foreign currency amounts are converted to base currency using the provided exchange rate
19
+ - Rejects events with zero or negative amounts
20
+ - Events are scoped to a company; events from one company cannot post to another company's GL
21
+ - Returns a PurchaseBillPostingAcknowledgment with the generated journal entry ID and posting timestamp
22
+ - Emits an audit event recording the source module, document reference, and journal entry created
23
+
24
+ ## Process Flow
25
+
26
+ ```mermaid
27
+ flowchart TD
28
+ A[Receive purchase handoff event] --> B{Idempotency check: already posted?}
29
+ B -->|Yes| C[Return existing acknowledgment]
30
+ B -->|No| D{Accounting period OPEN or FUTURE_ENTERABLE?}
31
+ D -->|No| E[Return error: invalid period status]
32
+ D -->|Yes| F{GL accounts valid and active?}
33
+ F -->|No| G[Return error: account validation failed]
34
+ F -->|Yes| H{Amounts valid and positive?}
35
+ H -->|No| I[Return error: invalid amounts]
36
+ H -->|Yes| J[Create Purchase journal entry with debit expense/asset, credit AP]
37
+ J --> K[Post journal entry]
38
+ K --> L[Emit audit event]
39
+ L --> M[Return PurchaseBillPostingAcknowledgment]
40
+ ```
41
+
42
+ ## External Dependencies
43
+
44
+ - [coa-management::getAccount](../../../coa-management/docs/queries/GetAccount.md) - Validates that expense/asset and AP GL accounts are active
45
+ - [primitives::getCurrency](../../../primitives/docs/queries/GetCurrency.md) - Validates currency for multi-currency transactions
46
+
47
+ ## Error Scenarios
48
+
49
+ - **INVALID_PERIOD_STATUS**: Target accounting period is not in OPEN or FUTURE_ENTERABLE status
50
+ - **ACCOUNT_NOT_FOUND**: Referenced GL account does not exist
51
+ - **ACCOUNT_NOT_ACTIVE**: Referenced GL account is not in active status
52
+ - **INVALID_AMOUNT**: Handoff event contains zero or negative amounts
53
+ - **COMPANY_MISMATCH**: Handoff event company does not match the GL account company scope
54
+
55
+ ## Test Cases
56
+
57
+ - returns existing entry for idempotent duplicate
58
+ - returns error when amount is zero or negative
59
+ - returns error when amount is negative
60
+ - returns error when period is not OPEN or FUTURE_ENTERABLE
61
+ - returns error when period is CLOSED
62
+ - returns error when company does not match period company
63
+ - returns error when debit account does not exist
64
+ - returns error when credit account does not exist
65
+ - returns error when debit account is not active
66
+ - returns error when credit account is not active
67
+ - creates journal entry with correct type and amounts
68
+ - handles multi-currency with exchange rate
@@ -0,0 +1,71 @@
1
+ # ProcessSalesHandoff
2
+
3
+ ## Overview
4
+
5
+ processSalesHandoff receives a sales invoice or credit note handoff event from the sales module and creates a corresponding Sales-type journal entry in the general ledger. For invoices, the entry debits accounts receivable and credits the revenue account. For credit notes, the entry reverses these (debit revenue, credit accounts receivable). The command enforces idempotency via source document reference and returns an acknowledgment upon successful posting.
6
+
7
+ ## Business Rules
8
+
9
+ - Receives a handoff event containing the sales invoice or credit note data, accounts receivable reference, and revenue account reference
10
+ - Creates a journal entry classified as Sales journal type
11
+ - For sales invoices: debits accounts receivable and credits the revenue account
12
+ - For credit notes: creates a reversing entry with debit to revenue and credit to accounts receivable
13
+ - The journal entry must be balanced (total debits equal total credits in functional currency)
14
+ - The journal entry carries a source document reference linking to the originating sales invoice or credit note
15
+ - Idempotent processing: duplicate events with the same source document reference return the original acknowledgment without re-posting
16
+ - Validates that the target accounting period is in OPEN or FUTURE_ENTERABLE status
17
+ - Validates that all referenced GL accounts are active in the Chart of Accounts
18
+ - Handles deprecated GL accounts with successor mappings by redirecting to the successor
19
+ - Supports multi-currency: foreign currency amounts are converted to base currency using the provided exchange rate
20
+ - Rejects events with zero or negative amounts
21
+ - Events are scoped to a company
22
+ - Returns an acknowledgment with the generated journal entry ID and posting timestamp
23
+ - Emits an audit event recording the source module, document reference, and journal entry created
24
+
25
+ ## Process Flow
26
+
27
+ ```mermaid
28
+ flowchart TD
29
+ A[Receive sales handoff event] --> B{Idempotency check: already posted?}
30
+ B -->|Yes| C[Return existing acknowledgment]
31
+ B -->|No| D{Accounting period OPEN or FUTURE_ENTERABLE?}
32
+ D -->|No| E[Return error: invalid period status]
33
+ D -->|Yes| F{GL accounts valid and active?}
34
+ F -->|No| G[Return error: account validation failed]
35
+ F -->|Yes| H{Invoice or credit note?}
36
+ H -->|Invoice| I[Create entry: debit AR, credit revenue]
37
+ H -->|Credit note| J[Create entry: debit revenue, credit AR]
38
+ I --> K[Post journal entry]
39
+ J --> K
40
+ K --> L[Emit audit event]
41
+ L --> M[Return acknowledgment]
42
+ ```
43
+
44
+ ## External Dependencies
45
+
46
+ - [coa-management::getAccount](../../../coa-management/docs/queries/GetAccount.md) - Validates that AR and revenue GL accounts are active
47
+ - [primitives::getCurrency](../../../primitives/docs/queries/GetCurrency.md) - Validates currency for multi-currency transactions
48
+
49
+ ## Error Scenarios
50
+
51
+ - **INVALID_PERIOD_STATUS**: Target accounting period is not in OPEN or FUTURE_ENTERABLE status
52
+ - **ACCOUNT_NOT_FOUND**: Referenced GL account does not exist
53
+ - **ACCOUNT_NOT_ACTIVE**: Referenced GL account is not in active status
54
+ - **INVALID_AMOUNT**: Handoff event contains zero or negative amounts
55
+ - **COMPANY_MISMATCH**: Handoff event company does not match the GL account company scope
56
+
57
+ ## Test Cases
58
+
59
+ - returns existing entry for idempotent duplicate
60
+ - returns error when amount is zero or negative
61
+ - returns error when amount is negative
62
+ - returns error when period is not OPEN or FUTURE_ENTERABLE
63
+ - returns error when period is CLOSED
64
+ - returns error when company does not match period company
65
+ - returns error when debit account is not active
66
+ - returns error when credit account is not active
67
+ - returns error when debit account does not exist
68
+ - returns error when credit account does not exist
69
+ - creates journal entry with correct type and amounts
70
+ - handles multi-currency with exchange rate
71
+ - swaps debit and credit accounts for credit note document type
@@ -0,0 +1,60 @@
1
+ # RegenerateFinancialStatement
2
+
3
+ ## Overview
4
+
5
+ regenerateFinancialStatement replaces the content of an existing DRAFT financial statement with fresh data from the current trial balance. This allows controllers to re-run statement generation after posting correcting journal entries or adjusting entries without creating a new statement entity. Only DRAFT statements can be regenerated — FINALIZED statements are immutable.
6
+
7
+ ## Business Rules
8
+
9
+ - Financial statement must exist and be identified by `id`
10
+ - Financial statement must be in DRAFT status; FINALIZED statements cannot be regenerated
11
+ - The referenced trial balance must still exist and be valid
12
+ - The system re-fetches the trial balance data and re-maps accounts to statement sections
13
+ - All existing line items are replaced with the regenerated output
14
+ - The generation timestamp is updated to reflect the regeneration time
15
+ - If comparative period data was included, it is also refreshed from the comparative trial balance
16
+ - Regeneration follows the same validation rules as initial generation (balanced trial balance, valid account mappings)
17
+ - Emits an audit event via the audit module recording the acting user, timestamp, and regeneration parameters
18
+
19
+ ## Process Flow
20
+
21
+ ```mermaid
22
+ flowchart TD
23
+ A[Receive regenerate request] --> B{Financial statement exists?}
24
+ B -->|No| C[Return error: statement not found]
25
+ B -->|Yes| D{Statement in DRAFT status?}
26
+ D -->|No| E[Return error: statement is finalized]
27
+ D -->|Yes| F[Fetch current trial balance data]
28
+ F --> G[Load account group hierarchy from coa-management]
29
+ G --> H[Re-map accounts to statement sections by account type]
30
+ H --> I[Aggregate balances per account group]
31
+ I --> J{Comparative period included?}
32
+ J -->|Yes| K[Refresh comparative period data]
33
+ K --> L[Replace all line items with regenerated output]
34
+ J -->|No| L
35
+ L --> M[Update generation timestamp]
36
+ M --> N[Emit audit event]
37
+ N --> O[Return regenerated statement]
38
+ ```
39
+
40
+ ## External Dependencies
41
+
42
+ - [coa-management::listAccountGroups](../../../coa-management/docs/queries/ListAccountGroups.md) - Retrieves account group hierarchy for structuring statement sections
43
+
44
+ ## Error Scenarios
45
+
46
+ - **FINANCIAL_STATEMENT_NOT_FOUND**: No financial statement matches the given id
47
+ - **STATEMENT_ALREADY_FINALIZED**: Financial statement is in FINALIZED status and cannot be regenerated
48
+ - **TRIAL_BALANCE_NOT_FOUND**: The referenced trial balance no longer exists
49
+ - **TRIAL_BALANCE_IMBALANCED**: The trial balance has a non-zero debit-credit discrepancy
50
+ - **COMPARATIVE_TRIAL_BALANCE_NOT_FOUND**: Comparative period trial balance is unavailable when requested
51
+
52
+ ## Test Cases
53
+
54
+ - returns error when financial statement does not exist
55
+ - returns error when financial statement is already FINALIZED
56
+ - returns error when trial balance is not found
57
+ - returns error when trial balance is imbalanced
58
+ - returns error when comparative trial balance is not found
59
+ - regenerates statement with fresh data and updates generatedAt
60
+ - emits audit event recording statement regeneration
@@ -0,0 +1,42 @@
1
+ # RemoveJournalLine
2
+
3
+ ## Overview
4
+
5
+ removeJournalLine removes an existing line item from a DRAFT journal entry. Lines can only be removed while the parent entry is in DRAFT status. Lines on posted or reversed entries are immutable and cannot be removed, as this would compromise the audit trail.
6
+
7
+ ## Business Rules
8
+
9
+ - Journal line must exist and its parent journal entry must be in DRAFT status
10
+ - Lines on POSTED or REVERSED entries cannot be removed
11
+ - Removing a line does not automatically delete the parent entry even if no lines remain
12
+ - Emits an audit event recording the line removal, acting user, and timestamp
13
+
14
+ ## Process Flow
15
+
16
+ ```mermaid
17
+ flowchart TD
18
+ A[Receive remove journal line request] --> B{Journal line exists?}
19
+ B -->|No| C[Return error: journal line not found]
20
+ B -->|Yes| D{Parent entry status is DRAFT?}
21
+ D -->|No| E[Return error: cannot remove lines from non-draft entry]
22
+ D -->|Yes| F[Remove journal line]
23
+ F --> G[Emit audit event]
24
+ G --> H[Return success]
25
+ ```
26
+
27
+ ## External Dependencies
28
+
29
+ - None
30
+
31
+ ## Error Scenarios
32
+
33
+ - **JOURNAL_LINE_NOT_FOUND**: Referenced journal line does not exist
34
+ - **INVALID_STATUS_FOR_LINE_REMOVE**: Parent journal entry is not in DRAFT status
35
+
36
+ ## Test Cases
37
+
38
+ - returns error when journal line does not exist
39
+ - returns error when parent journal entry is in POSTED status
40
+ - returns error when parent journal entry is in REVERSED status
41
+ - removes journal line from DRAFT entry
42
+ - emits audit event recording line removal and acting user
@@ -0,0 +1,45 @@
1
+ # ReopenPeriod
2
+
3
+ ## Overview
4
+
5
+ reopenPeriod transitions an accounting period from CLOSED back to OPEN status, allowing journal entry postings to resume. This supports scenarios where late-arriving transactions or corrections need to be recorded after initial close. The reopen operation emits an audit event for compliance tracking, as reopening a closed period is a sensitive action that auditors monitor.
6
+
7
+ ## Business Rules
8
+
9
+ - Period must exist and be in CLOSED status
10
+ - Only CLOSED periods can be reopened; PERMANENTLY_CLOSED periods cannot be reopened
11
+ - After transition, the period resumes accepting journal entry postings
12
+ - Reopening a period emits an audit event recording the status transition, acting user, and timestamp
13
+ - The audit event is critical for compliance as reopening is a monitored action
14
+
15
+ ## Process Flow
16
+
17
+ ```mermaid
18
+ flowchart TD
19
+ A[Receive reopenPeriod request] --> B{Period exists?}
20
+ B -->|No| C[Return error: period not found]
21
+ B -->|Yes| D{Period status is CLOSED?}
22
+ D -->|No| E[Return error: invalid status transition]
23
+ D -->|Yes| F[Transition period to OPEN]
24
+ F --> G[Emit audit event]
25
+ G --> H[Return updated period]
26
+ ```
27
+
28
+ ## External Dependencies
29
+
30
+ - None
31
+
32
+ ## Error Scenarios
33
+
34
+ - **ACCOUNTING_PERIOD_NOT_FOUND**: Referenced accounting period does not exist
35
+ - **INVALID_STATUS_TRANSITION**: Period is not in CLOSED status; only CLOSED periods can be reopened
36
+
37
+ ## Test Cases
38
+
39
+ - returns error when accounting period does not exist
40
+ - returns error when period is in NEVER_OPENED status
41
+ - returns error when period is in OPEN status
42
+ - returns error when period is in FUTURE_ENTERABLE status
43
+ - returns error when period is in PERMANENTLY_CLOSED status
44
+ - transitions CLOSED period back to OPEN
45
+ - emits audit event recording status transition from CLOSED to OPEN and acting user
@@ -0,0 +1,62 @@
1
+ # ReverseJournalEntry
2
+
3
+ ## Overview
4
+
5
+ reverseJournalEntry creates a mirror journal entry with all debit and credit amounts inverted from the original posted entry, and automatically posts the reversal entry. The original entry transitions from POSTED to REVERSED status. This is the only way to correct a posted journal entry, as posted entries cannot be modified or deleted. The reversal entry must target a period that is in OPEN or FUTURE_ENTERABLE status.
6
+
7
+ ## Business Rules
8
+
9
+ - Original journal entry must exist and be in POSTED status
10
+ - DRAFT entries cannot be reversed (they should be deleted instead)
11
+ - Already REVERSED entries cannot be reversed again
12
+ - A new mirror journal entry is created with all debit amounts swapped to credits and vice versa
13
+ - The reversal entry references the original entry
14
+ - The reversal entry is automatically posted upon creation
15
+ - The original entry status transitions from POSTED to REVERSED
16
+ - The reversal entry must target an accounting period in OPEN or FUTURE_ENTERABLE status
17
+ - Multi-currency lines are reversed with the same currency and exchange rate as the original
18
+ - Emits an audit event recording the status transition from POSTED to REVERSED, the reversal entry reference, and the acting user
19
+
20
+ ## Process Flow
21
+
22
+ ```mermaid
23
+ flowchart TD
24
+ A[Receive reverse journal entry request] --> B{Original entry exists?}
25
+ B -->|No| C[Return error: journal entry not found]
26
+ B -->|Yes| D{Original entry status is POSTED?}
27
+ D -->|No| E[Return error: invalid status for reversal]
28
+ D -->|Yes| F{Reversal period OPEN or FUTURE_ENTERABLE?}
29
+ F -->|No| G[Return error: invalid period status]
30
+ F -->|Yes| H[Create mirror entry with inverted debits/credits]
31
+ H --> I[Auto-post reversal entry]
32
+ I --> J[Transition original entry to REVERSED]
33
+ J --> K[Emit audit event]
34
+ K --> L[Return reversal entry]
35
+ ```
36
+
37
+ ## External Dependencies
38
+
39
+ - None
40
+
41
+ ## Error Scenarios
42
+
43
+ - **JOURNAL_ENTRY_NOT_FOUND**: Referenced journal entry does not exist
44
+ - **INVALID_STATUS_FOR_REVERSAL**: Journal entry is not in POSTED status; only POSTED entries can be reversed
45
+ - **ALREADY_REVERSED**: Journal entry has already been reversed
46
+ - **INVALID_PERIOD_STATUS**: The reversal target period is not in OPEN or FUTURE_ENTERABLE status
47
+
48
+ ## Test Cases
49
+
50
+ - returns error when journal entry does not exist
51
+ - returns error when journal entry is in DRAFT status
52
+ - returns error when journal entry is already REVERSED
53
+ - returns error when reversal period is in NEVER_OPENED status
54
+ - returns error when reversal period is in CLOSED status
55
+ - returns error when reversal period is in PERMANENTLY_CLOSED status
56
+ - creates mirror entry with all debit/credit amounts inverted
57
+ - reversal entry references the original entry
58
+ - reversal entry is automatically posted
59
+ - original entry transitions from POSTED to REVERSED
60
+ - reversal entry targets the specified accounting period
61
+ - multi-currency lines are reversed with same currency and exchange rate
62
+ - emits audit event recording status transition, reversal entry reference, and acting user
@@ -0,0 +1,49 @@
1
+ # RevertSoftLock
2
+
3
+ ## Overview
4
+
5
+ revertSoftLock transitions a PeriodClose from SOFT_LOCKED back to IN_PROGRESS status, allowing the close workflow to be revisited. This is used when errors are discovered after the period was soft-locked but before permanent close. After reverting, the accounting team can post corrections and re-run the close checklist steps. This operation is only permitted before permanent close.
6
+
7
+ ## Business Rules
8
+
9
+ - PeriodClose record must exist and be in SOFT_LOCKED status
10
+ - Only SOFT_LOCKED records can be reverted
11
+ - Reverting a permanently closed period is not permitted
12
+ - After revert, the PeriodClose returns to IN_PROGRESS status, allowing the full checklist to be re-executed
13
+ - Updates completionPercentage to reflect the rollback
14
+ - Records the userId of the operator who reverted the soft lock
15
+ - Emits an audit event recording the acting user, timestamp, and status transition from SOFT_LOCKED to IN_PROGRESS
16
+
17
+ ## Process Flow
18
+
19
+ ```mermaid
20
+ flowchart TD
21
+ A[Receive revert soft lock request] --> B{PeriodClose record exists?}
22
+ B -->|No| C[Return error: period close not found]
23
+ B -->|Yes| D{PeriodClose in SOFT_LOCKED status?}
24
+ D -->|No| E[Return error: invalid status transition]
25
+ D -->|Yes| F[Transition PeriodClose to IN_PROGRESS]
26
+ F --> G[Update completionPercentage]
27
+ G --> H[Emit audit event]
28
+ H --> I[Return updated PeriodClose]
29
+ ```
30
+
31
+ ## External Dependencies
32
+
33
+ - None (same-module read for period close lookup)
34
+
35
+ ## Error Scenarios
36
+
37
+ - **PERIOD_CLOSE_NOT_FOUND**: No PeriodClose record matches the given id
38
+ - **INVALID_STATUS_TRANSITION**: PeriodClose is not in SOFT_LOCKED status; only SOFT_LOCKED can be reverted to IN_PROGRESS
39
+ - **PERIOD_PERMANENTLY_CLOSED**: Cannot revert a period close that has already been permanently closed
40
+
41
+ ## Test Cases
42
+
43
+ - returns error when PeriodClose record does not exist
44
+ - returns error when PeriodClose is in NOT_STARTED status
45
+ - returns error when PeriodClose is in IN_PROGRESS status
46
+ - returns error when PeriodClose is in UNDER_REVIEW status
47
+ - returns error when PeriodClose is PERMANENTLY_CLOSED
48
+ - transitions SOFT_LOCKED period close to IN_PROGRESS
49
+ - emits audit event recording status transition and acting user
@@ -0,0 +1,60 @@
1
+ # UpdateFiscalYear
2
+
3
+ ## Overview
4
+
5
+ updateFiscalYear modifies mutable fields of an existing fiscal year. The fiscal year name can always be updated. Start and end dates can be updated only if no accounting periods have been created for the fiscal year; once periods exist, dates become immutable to prevent date boundary changes that would invalidate existing period definitions.
6
+
7
+ ## Business Rules
8
+
9
+ - Fiscal year must exist and be identified by `id`
10
+ - The `yearName` field can be updated at any time
11
+ - yearName is required and must be non-empty
12
+ - Start date and end date can be updated only if no accounting periods exist for the fiscal year
13
+ - Start date and end date are immutable once accounting periods have been created
14
+ - If dates are updated, start date must be strictly before end date
15
+ - If dates are updated, the new date range must not overlap with any other fiscal year for the same company
16
+ - Emits an audit event via the audit module recording the acting user, timestamp, and changed fields
17
+
18
+ ## Process Flow
19
+
20
+ ```mermaid
21
+ flowchart TD
22
+ A[Receive update fiscal year request] --> B{Fiscal year exists?}
23
+ B -->|No| C[Return error: fiscal year not found]
24
+ B -->|Yes| D{Name non-empty?}
25
+ D -->|No| E[Return error: name required]
26
+ D -->|Yes| F{Date changes requested?}
27
+ F -->|Yes| G{Accounting periods exist?}
28
+ G -->|Yes| H[Return error: dates immutable]
29
+ G -->|No| I{Start date before end date?}
30
+ I -->|No| J[Return error: invalid date range]
31
+ I -->|Yes| K{Overlaps with existing fiscal year?}
32
+ K -->|Yes| L[Return error: overlapping fiscal year]
33
+ K -->|No| M[Update fiscal year record]
34
+ F -->|No| M
35
+ M --> N[Emit audit event]
36
+ N --> O[Return updated fiscal year]
37
+ ```
38
+
39
+ ## External Dependencies
40
+
41
+ - None (same-module read for fiscal year lookup)
42
+
43
+ ## Error Scenarios
44
+
45
+ - **FISCAL_YEAR_NOT_FOUND**: No fiscal year matches the given id
46
+ - **NAME_REQUIRED**: Fiscal year name is empty or not provided
47
+ - **DATES_IMMUTABLE**: Attempting to change start/end dates after accounting periods exist
48
+ - **INVALID_DATE_RANGE**: Start date is not strictly before end date
49
+ - **OVERLAPPING_FISCAL_YEAR**: The updated date range overlaps with an existing fiscal year for the same company
50
+
51
+ ## Test Cases
52
+
53
+ - returns error when fiscal year does not exist
54
+ - returns error when name is empty
55
+ - returns error when attempting to change dates after accounting periods exist
56
+ - returns error when updated start date is not before end date
57
+ - returns error when updated date range overlaps with another fiscal year
58
+ - updates fiscal year name successfully
59
+ - updates fiscal year dates when no accounting periods exist
60
+ - emits audit event recording acting user, timestamp, and changed fields
@@ -0,0 +1,50 @@
1
+ # UpdateJournalEntry
2
+
3
+ ## Overview
4
+
5
+ updateJournalEntry modifies the header fields of an existing journal entry that is in DRAFT status. Updatable fields include description, source document reference, and other header-level attributes. Posted and reversed entries are immutable and cannot be updated. This command does not affect journal lines, which are managed via addJournalLine, updateJournalLine, and removeJournalLine.
6
+
7
+ ## Business Rules
8
+
9
+ - Journal entry must exist and be in DRAFT status
10
+ - Only DRAFT entries can be updated; POSTED and REVERSED entries are immutable
11
+ - Journal type cannot be changed after the entry is created
12
+ - Entry date can be updated while in DRAFT status
13
+ - Description and source document reference can be updated while in DRAFT status
14
+ - Emits an audit event recording previous and new field values, acting user, and timestamp
15
+
16
+ ## Process Flow
17
+
18
+ ```mermaid
19
+ flowchart TD
20
+ A[Receive update journal entry request] --> B{Journal entry exists?}
21
+ B -->|No| C[Return error: journal entry not found]
22
+ B -->|Yes| D{Entry status is DRAFT?}
23
+ D -->|No| E[Return error: cannot modify non-draft entry]
24
+ D -->|Yes| F[Update header fields]
25
+ F --> G[Emit audit event]
26
+ G --> H[Return updated journal entry]
27
+ ```
28
+
29
+ ## External Dependencies
30
+
31
+ - None
32
+
33
+ ## Error Scenarios
34
+
35
+ - **JOURNAL_ENTRY_NOT_FOUND**: Referenced journal entry does not exist
36
+ - **INVALID_STATUS_FOR_UPDATE**: Journal entry is not in DRAFT status; POSTED and REVERSED entries cannot be modified
37
+ - **JOURNAL_TYPE_IMMUTABLE**: Attempted to change the journal type after creation; journal type is immutable once created
38
+
39
+ ## Test Cases
40
+
41
+ - returns error when journal entry does not exist
42
+ - returns error when journal entry is in POSTED status
43
+ - returns error when journal entry is in REVERSED status
44
+ - updates description on a DRAFT journal entry
45
+ - updates source document reference on a DRAFT journal entry
46
+ - updates entry date on a DRAFT journal entry
47
+ - updates reference number on a DRAFT journal entry with uniqueness check
48
+ - returns error when updated reference number already exists
49
+ - returns error when attempting to change journal type
50
+ - emits audit event recording previous and new field values and acting user
@@ -0,0 +1,61 @@
1
+ # UpdateJournalLine
2
+
3
+ ## Overview
4
+
5
+ updateJournalLine modifies an existing line item on a DRAFT journal entry. Updatable fields include the GL account reference, debit or credit amount, currency, exchange rate, and line-level description. Lines on posted or reversed entries are immutable and cannot be updated.
6
+
7
+ ## Business Rules
8
+
9
+ - Journal line must exist and its parent journal entry must be in DRAFT status
10
+ - Lines on POSTED or REVERSED entries cannot be updated
11
+ - Updated account reference must be a valid GL account from coa-management
12
+ - Updated debit/credit must follow the same rules as creation (one or the other, positive values)
13
+ - Multi-currency updates must include valid currency and exchange rate
14
+ - Functional currency amount is recomputed when amount or exchange rate changes
15
+ - Emits an audit event recording previous and new field values, acting user, and timestamp
16
+
17
+ ## Process Flow
18
+
19
+ ```mermaid
20
+ flowchart TD
21
+ A[Receive update journal line request] --> B{Journal line exists?}
22
+ B -->|No| C[Return error: journal line not found]
23
+ B -->|Yes| D{Parent entry status is DRAFT?}
24
+ D -->|No| E[Return error: cannot modify lines on non-draft entry]
25
+ D -->|Yes| F{Updated fields valid?}
26
+ F -->|No| G[Return error: validation failed]
27
+ F -->|Yes| H[Update journal line fields]
28
+ H --> I[Recompute functional currency amount if needed]
29
+ I --> J[Emit audit event]
30
+ J --> K[Return updated journal line]
31
+ ```
32
+
33
+ ## External Dependencies
34
+
35
+ - [coa-management::getAccount](../../../coa-management/docs/queries/GetAccount.md) - Validates that the updated GL account reference exists
36
+ - [primitives::getCurrency](../../../primitives/docs/queries/GetCurrency.md) - Validates that the updated currency exists and is active
37
+
38
+ ## Error Scenarios
39
+
40
+ - **JOURNAL_LINE_NOT_FOUND**: Referenced journal line does not exist
41
+ - **INVALID_STATUS_FOR_LINE_UPDATE**: Parent journal entry is not in DRAFT status
42
+ - **ACCOUNT_NOT_FOUND**: Updated GL account reference does not exist
43
+ - **INVALID_DEBIT_CREDIT**: Updated debit/credit values violate constraints (both specified, both zero, or negative)
44
+ - **CURRENCY_NOT_FOUND**: Updated currency does not exist or is not active
45
+
46
+ ## Test Cases
47
+
48
+ - returns error when journal line does not exist
49
+ - returns error when parent journal entry is in POSTED status
50
+ - returns error when parent journal entry is in REVERSED status
51
+ - returns error when updated GL account does not exist
52
+ - returns error when updated GL account is not active
53
+ - returns error when updated debit/credit values are invalid
54
+ - returns error when updated currency does not exist
55
+ - updates GL account reference on a journal line
56
+ - updates debit amount on a journal line
57
+ - updates credit amount on a journal line
58
+ - updates currency and exchange rate on a journal line
59
+ - recomputes functional currency amount after update
60
+ - updates line-level description
61
+ - emits audit event recording previous and new field values and acting user