@tailor-platform/erp-kit 0.5.1 → 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 (525) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +10 -10
  3. package/dist/cli.mjs +499 -81
  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 +19 -4
  12. package/skills/erp-kit-app-6-impl-frontend/SKILL.md +12 -0
  13. package/skills/erp-kit-app-7-impl-review/SKILL.md +14 -2
  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/skills/erp-kit-module-6-impl-review/SKILL.md +39 -17
  21. package/src/commands/app/index.ts +2 -0
  22. package/src/commands/app/progress/git-context.ts +16 -0
  23. package/src/commands/app/progress/index.ts +45 -0
  24. package/src/commands/app/progress/log.ts +49 -0
  25. package/src/commands/app/progress/progress.test.ts +128 -0
  26. package/src/commands/app/progress/schema-cmd.ts +10 -0
  27. package/src/commands/check.test.ts +4 -4
  28. package/src/commands/generate-doc.ts +1 -1
  29. package/src/commands/lib/discovery.test.ts +18 -10
  30. package/src/commands/lib/discovery.ts +17 -9
  31. package/src/commands/lib/paths.ts +4 -2
  32. package/src/commands/lib/sync-check-source.test.ts +1 -1
  33. package/src/commands/lib/sync-check-source.ts +6 -1
  34. package/src/commands/lib/sync-check-tests.test.ts +127 -6
  35. package/src/commands/lib/sync-check-tests.ts +82 -4
  36. package/src/commands/sync-check.ts +10 -3
  37. package/src/generator/generate-app-code.test.ts +0 -6
  38. package/src/generator/generate-app-code.ts +47 -22
  39. package/src/generator/generate-code.test.ts +10 -40
  40. package/src/generator/generate-code.ts +6 -12
  41. package/src/generator/stub-templates.test.ts +9 -5
  42. package/src/generator/stub-templates.ts +16 -9
  43. package/src/modules/finance-ledger/README.md +50 -0
  44. package/src/modules/finance-ledger/command/.gitkeep +0 -0
  45. package/src/modules/finance-ledger/command/addJournalLine.generated.ts +6 -0
  46. package/src/modules/finance-ledger/command/addJournalLine.test.ts +438 -0
  47. package/src/modules/finance-ledger/command/addJournalLine.ts +122 -0
  48. package/src/modules/finance-ledger/command/approveAndLockPeriod.generated.ts +6 -0
  49. package/src/modules/finance-ledger/command/approveAndLockPeriod.test.ts +107 -0
  50. package/src/modules/finance-ledger/command/approveAndLockPeriod.ts +72 -0
  51. package/src/modules/finance-ledger/command/beginClose.generated.ts +6 -0
  52. package/src/modules/finance-ledger/command/beginClose.test.ts +106 -0
  53. package/src/modules/finance-ledger/command/beginClose.ts +58 -0
  54. package/src/modules/finance-ledger/command/closePeriod.generated.ts +6 -0
  55. package/src/modules/finance-ledger/command/closePeriod.test.ts +87 -0
  56. package/src/modules/finance-ledger/command/closePeriod.ts +44 -0
  57. package/src/modules/finance-ledger/command/createAccountingPeriod.generated.ts +6 -0
  58. package/src/modules/finance-ledger/command/createAccountingPeriod.test.ts +425 -0
  59. package/src/modules/finance-ledger/command/createAccountingPeriod.ts +133 -0
  60. package/src/modules/finance-ledger/command/createFiscalYear.generated.ts +6 -0
  61. package/src/modules/finance-ledger/command/createFiscalYear.test.ts +197 -0
  62. package/src/modules/finance-ledger/command/createFiscalYear.ts +70 -0
  63. package/src/modules/finance-ledger/command/createJournalEntry.generated.ts +6 -0
  64. package/src/modules/finance-ledger/command/createJournalEntry.test.ts +261 -0
  65. package/src/modules/finance-ledger/command/createJournalEntry.ts +121 -0
  66. package/src/modules/finance-ledger/command/deleteAccountingPeriod.generated.ts +6 -0
  67. package/src/modules/finance-ledger/command/deleteAccountingPeriod.test.ts +71 -0
  68. package/src/modules/finance-ledger/command/deleteAccountingPeriod.ts +55 -0
  69. package/src/modules/finance-ledger/command/deleteFiscalYear.generated.ts +6 -0
  70. package/src/modules/finance-ledger/command/deleteFiscalYear.test.ts +38 -0
  71. package/src/modules/finance-ledger/command/deleteFiscalYear.ts +34 -0
  72. package/src/modules/finance-ledger/command/deleteJournalEntry.generated.ts +6 -0
  73. package/src/modules/finance-ledger/command/deleteJournalEntry.test.ts +58 -0
  74. package/src/modules/finance-ledger/command/deleteJournalEntry.ts +43 -0
  75. package/src/modules/finance-ledger/command/executeYearEndClose.generated.ts +6 -0
  76. package/src/modules/finance-ledger/command/executeYearEndClose.test.ts +239 -0
  77. package/src/modules/finance-ledger/command/executeYearEndClose.ts +415 -0
  78. package/src/modules/finance-ledger/command/finalCloseAndLockPeriod.generated.ts +6 -0
  79. package/src/modules/finance-ledger/command/finalCloseAndLockPeriod.test.ts +102 -0
  80. package/src/modules/finance-ledger/command/finalCloseAndLockPeriod.ts +76 -0
  81. package/src/modules/finance-ledger/command/finalizeFinancialStatement.generated.ts +6 -0
  82. package/src/modules/finance-ledger/command/finalizeFinancialStatement.test.ts +73 -0
  83. package/src/modules/finance-ledger/command/finalizeFinancialStatement.ts +73 -0
  84. package/src/modules/finance-ledger/command/generateFinancialStatement.generated.ts +6 -0
  85. package/src/modules/finance-ledger/command/generateFinancialStatement.test.ts +311 -0
  86. package/src/modules/finance-ledger/command/generateFinancialStatement.ts +275 -0
  87. package/src/modules/finance-ledger/command/generatePreliminaryStatements.generated.ts +6 -0
  88. package/src/modules/finance-ledger/command/generatePreliminaryStatements.test.ts +152 -0
  89. package/src/modules/finance-ledger/command/generatePreliminaryStatements.ts +140 -0
  90. package/src/modules/finance-ledger/command/generateTrialBalance.generated.ts +6 -0
  91. package/src/modules/finance-ledger/command/generateTrialBalance.test.ts +439 -0
  92. package/src/modules/finance-ledger/command/generateTrialBalance.ts +268 -0
  93. package/src/modules/finance-ledger/command/initiatePeriodClose.generated.ts +6 -0
  94. package/src/modules/finance-ledger/command/initiatePeriodClose.test.ts +153 -0
  95. package/src/modules/finance-ledger/command/initiatePeriodClose.ts +84 -0
  96. package/src/modules/finance-ledger/command/openForAdvanceEntry.generated.ts +6 -0
  97. package/src/modules/finance-ledger/command/openForAdvanceEntry.test.ts +87 -0
  98. package/src/modules/finance-ledger/command/openForAdvanceEntry.ts +44 -0
  99. package/src/modules/finance-ledger/command/openPeriod.generated.ts +6 -0
  100. package/src/modules/finance-ledger/command/openPeriod.test.ts +90 -0
  101. package/src/modules/finance-ledger/command/openPeriod.ts +44 -0
  102. package/src/modules/finance-ledger/command/permanentlyClosePeriod.generated.ts +6 -0
  103. package/src/modules/finance-ledger/command/permanentlyClosePeriod.test.ts +87 -0
  104. package/src/modules/finance-ledger/command/permanentlyClosePeriod.ts +48 -0
  105. package/src/modules/finance-ledger/command/postAdjustingEntries.generated.ts +6 -0
  106. package/src/modules/finance-ledger/command/postAdjustingEntries.test.ts +392 -0
  107. package/src/modules/finance-ledger/command/postAdjustingEntries.ts +156 -0
  108. package/src/modules/finance-ledger/command/postJournalEntry.generated.ts +6 -0
  109. package/src/modules/finance-ledger/command/postJournalEntry.test.ts +346 -0
  110. package/src/modules/finance-ledger/command/postJournalEntry.ts +160 -0
  111. package/src/modules/finance-ledger/command/processInventoryHandoff.generated.ts +6 -0
  112. package/src/modules/finance-ledger/command/processInventoryHandoff.test.ts +211 -0
  113. package/src/modules/finance-ledger/command/processInventoryHandoff.ts +133 -0
  114. package/src/modules/finance-ledger/command/processManufacturingHandoff.generated.ts +6 -0
  115. package/src/modules/finance-ledger/command/processManufacturingHandoff.test.ts +221 -0
  116. package/src/modules/finance-ledger/command/processManufacturingHandoff.ts +133 -0
  117. package/src/modules/finance-ledger/command/processPurchaseHandoff.generated.ts +6 -0
  118. package/src/modules/finance-ledger/command/processPurchaseHandoff.test.ts +222 -0
  119. package/src/modules/finance-ledger/command/processPurchaseHandoff.ts +133 -0
  120. package/src/modules/finance-ledger/command/processSalesHandoff.generated.ts +6 -0
  121. package/src/modules/finance-ledger/command/processSalesHandoff.test.ts +257 -0
  122. package/src/modules/finance-ledger/command/processSalesHandoff.ts +135 -0
  123. package/src/modules/finance-ledger/command/regenerateFinancialStatement.generated.ts +6 -0
  124. package/src/modules/finance-ledger/command/regenerateFinancialStatement.test.ts +129 -0
  125. package/src/modules/finance-ledger/command/regenerateFinancialStatement.ts +186 -0
  126. package/src/modules/finance-ledger/command/removeJournalLine.generated.ts +6 -0
  127. package/src/modules/finance-ledger/command/removeJournalLine.test.ts +65 -0
  128. package/src/modules/finance-ledger/command/removeJournalLine.ts +39 -0
  129. package/src/modules/finance-ledger/command/reopenPeriod.generated.ts +6 -0
  130. package/src/modules/finance-ledger/command/reopenPeriod.test.ts +87 -0
  131. package/src/modules/finance-ledger/command/reopenPeriod.ts +44 -0
  132. package/src/modules/finance-ledger/command/reverseJournalEntry.generated.ts +6 -0
  133. package/src/modules/finance-ledger/command/reverseJournalEntry.test.ts +337 -0
  134. package/src/modules/finance-ledger/command/reverseJournalEntry.ts +140 -0
  135. package/src/modules/finance-ledger/command/revertSoftLock.generated.ts +6 -0
  136. package/src/modules/finance-ledger/command/revertSoftLock.test.ts +96 -0
  137. package/src/modules/finance-ledger/command/revertSoftLock.ts +67 -0
  138. package/src/modules/finance-ledger/command/updateFiscalYear.generated.ts +6 -0
  139. package/src/modules/finance-ledger/command/updateFiscalYear.test.ts +138 -0
  140. package/src/modules/finance-ledger/command/updateFiscalYear.ts +85 -0
  141. package/src/modules/finance-ledger/command/updateJournalEntry.generated.ts +6 -0
  142. package/src/modules/finance-ledger/command/updateJournalEntry.test.ts +195 -0
  143. package/src/modules/finance-ledger/command/updateJournalEntry.ts +86 -0
  144. package/src/modules/finance-ledger/command/updateJournalLine.generated.ts +6 -0
  145. package/src/modules/finance-ledger/command/updateJournalLine.test.ts +385 -0
  146. package/src/modules/finance-ledger/command/updateJournalLine.ts +155 -0
  147. package/src/modules/finance-ledger/command/verifySubledgerTransfers.generated.ts +6 -0
  148. package/src/modules/finance-ledger/command/verifySubledgerTransfers.test.ts +201 -0
  149. package/src/modules/finance-ledger/command/verifySubledgerTransfers.ts +113 -0
  150. package/src/modules/finance-ledger/command/verifyTrialBalance.generated.ts +6 -0
  151. package/src/modules/finance-ledger/command/verifyTrialBalance.test.ts +136 -0
  152. package/src/modules/finance-ledger/command/verifyTrialBalance.ts +97 -0
  153. package/src/modules/finance-ledger/db/.gitkeep +0 -0
  154. package/src/modules/finance-ledger/db/accountingPeriod.ts +58 -0
  155. package/src/modules/finance-ledger/db/financialStatement.ts +92 -0
  156. package/src/modules/finance-ledger/db/financialStatementLineItem.ts +76 -0
  157. package/src/modules/finance-ledger/db/fiscalYear.ts +41 -0
  158. package/src/modules/finance-ledger/db/journalEntry.ts +101 -0
  159. package/src/modules/finance-ledger/db/journalLine.ts +64 -0
  160. package/src/modules/finance-ledger/db/periodClose.ts +97 -0
  161. package/src/modules/finance-ledger/db/trialBalance.ts +63 -0
  162. package/src/modules/finance-ledger/db/trialBalanceLine.ts +63 -0
  163. package/src/modules/finance-ledger/docs/commands/AddJournalLine.md +74 -0
  164. package/src/modules/finance-ledger/docs/commands/ApproveAndLockPeriod.md +53 -0
  165. package/src/modules/finance-ledger/docs/commands/BeginClose.md +47 -0
  166. package/src/modules/finance-ledger/docs/commands/ClosePeriod.md +45 -0
  167. package/src/modules/finance-ledger/docs/commands/CreateAccountingPeriod.md +69 -0
  168. package/src/modules/finance-ledger/docs/commands/CreateFiscalYear.md +56 -0
  169. package/src/modules/finance-ledger/docs/commands/CreateJournalEntry.md +63 -0
  170. package/src/modules/finance-ledger/docs/commands/DeleteAccountingPeriod.md +46 -0
  171. package/src/modules/finance-ledger/docs/commands/DeleteFiscalYear.md +40 -0
  172. package/src/modules/finance-ledger/docs/commands/DeleteJournalEntry.md +44 -0
  173. package/src/modules/finance-ledger/docs/commands/ExecuteYearEndClose.md +81 -0
  174. package/src/modules/finance-ledger/docs/commands/FinalCloseAndLockPeriod.md +49 -0
  175. package/src/modules/finance-ledger/docs/commands/FinalizeFinancialStatement.md +43 -0
  176. package/src/modules/finance-ledger/docs/commands/GenerateFinancialStatement.md +86 -0
  177. package/src/modules/finance-ledger/docs/commands/GeneratePreliminaryStatements.md +53 -0
  178. package/src/modules/finance-ledger/docs/commands/GenerateTrialBalance.md +75 -0
  179. package/src/modules/finance-ledger/docs/commands/InitiatePeriodClose.md +58 -0
  180. package/src/modules/finance-ledger/docs/commands/OpenForAdvanceEntry.md +44 -0
  181. package/src/modules/finance-ledger/docs/commands/OpenPeriod.md +45 -0
  182. package/src/modules/finance-ledger/docs/commands/PermanentlyClosePeriod.md +45 -0
  183. package/src/modules/finance-ledger/docs/commands/PostAdjustingEntries.md +61 -0
  184. package/src/modules/finance-ledger/docs/commands/PostJournalEntry.md +81 -0
  185. package/src/modules/finance-ledger/docs/commands/ProcessInventoryHandoff.md +72 -0
  186. package/src/modules/finance-ledger/docs/commands/ProcessManufacturingHandoff.md +68 -0
  187. package/src/modules/finance-ledger/docs/commands/ProcessPurchaseHandoff.md +68 -0
  188. package/src/modules/finance-ledger/docs/commands/ProcessSalesHandoff.md +71 -0
  189. package/src/modules/finance-ledger/docs/commands/RegenerateFinancialStatement.md +60 -0
  190. package/src/modules/finance-ledger/docs/commands/RemoveJournalLine.md +42 -0
  191. package/src/modules/finance-ledger/docs/commands/ReopenPeriod.md +45 -0
  192. package/src/modules/finance-ledger/docs/commands/ReverseJournalEntry.md +62 -0
  193. package/src/modules/finance-ledger/docs/commands/RevertSoftLock.md +49 -0
  194. package/src/modules/finance-ledger/docs/commands/UpdateFiscalYear.md +60 -0
  195. package/src/modules/finance-ledger/docs/commands/UpdateJournalEntry.md +50 -0
  196. package/src/modules/finance-ledger/docs/commands/UpdateJournalLine.md +61 -0
  197. package/src/modules/finance-ledger/docs/commands/VerifySubledgerTransfers.md +59 -0
  198. package/src/modules/finance-ledger/docs/commands/VerifyTrialBalance.md +53 -0
  199. package/src/modules/finance-ledger/docs/features/accounting-period-management.md +110 -0
  200. package/src/modules/finance-ledger/docs/features/financial-statement-generation.md +115 -0
  201. package/src/modules/finance-ledger/docs/features/journal-entry-management.md +138 -0
  202. package/src/modules/finance-ledger/docs/features/period-end-close.md +102 -0
  203. package/src/modules/finance-ledger/docs/features/subledger-integration.md +141 -0
  204. package/src/modules/finance-ledger/docs/features/trial-balance.md +99 -0
  205. package/src/modules/finance-ledger/docs/features/year-end-close.md +84 -0
  206. package/src/modules/finance-ledger/docs/models/AccountingPeriod.md +71 -0
  207. package/src/modules/finance-ledger/docs/models/FinancialStatement.md +76 -0
  208. package/src/modules/finance-ledger/docs/models/FinancialStatementLineItem.md +41 -0
  209. package/src/modules/finance-ledger/docs/models/FiscalYear.md +41 -0
  210. package/src/modules/finance-ledger/docs/models/JournalEntry.md +80 -0
  211. package/src/modules/finance-ledger/docs/models/JournalLine.md +47 -0
  212. package/src/modules/finance-ledger/docs/models/PeriodClose.md +83 -0
  213. package/src/modules/finance-ledger/docs/models/TrialBalance.md +56 -0
  214. package/src/modules/finance-ledger/docs/models/TrialBalanceLine.md +37 -0
  215. package/src/modules/finance-ledger/docs/queries/GetAccountingPeriod.md +35 -0
  216. package/src/modules/finance-ledger/docs/queries/GetFinancialStatement.md +38 -0
  217. package/src/modules/finance-ledger/docs/queries/GetFiscalYear.md +35 -0
  218. package/src/modules/finance-ledger/docs/queries/GetJournalEntry.md +37 -0
  219. package/src/modules/finance-ledger/docs/queries/GetPeriodByDate.md +38 -0
  220. package/src/modules/finance-ledger/docs/queries/GetPeriodClose.md +36 -0
  221. package/src/modules/finance-ledger/docs/queries/GetSubledgerTransferStatus.md +45 -0
  222. package/src/modules/finance-ledger/docs/queries/GetTrialBalance.md +38 -0
  223. package/src/modules/finance-ledger/docs/queries/ListAccountingPeriods.md +46 -0
  224. package/src/modules/finance-ledger/docs/queries/ListFinancialStatements.md +46 -0
  225. package/src/modules/finance-ledger/docs/queries/ListFiscalYears.md +42 -0
  226. package/src/modules/finance-ledger/docs/queries/ListJournalEntries.md +48 -0
  227. package/src/modules/finance-ledger/docs/queries/ListPeriodCloses.md +46 -0
  228. package/src/modules/finance-ledger/docs/queries/ListTrialBalances.md +51 -0
  229. package/src/modules/finance-ledger/executor/.gitkeep +0 -0
  230. package/src/modules/finance-ledger/generated/enums.ts +109 -0
  231. package/src/modules/finance-ledger/generated/kysely-tailordb.ts +202 -0
  232. package/src/modules/finance-ledger/index.ts +2 -0
  233. package/src/modules/finance-ledger/lib/_db_deps.ts +56 -0
  234. package/src/modules/finance-ledger/lib/errors.generated.ts +332 -0
  235. package/src/modules/finance-ledger/lib/permissions.generated.ts +41 -0
  236. package/src/modules/finance-ledger/lib/types.ts +66 -0
  237. package/src/modules/finance-ledger/module.ts +262 -0
  238. package/src/modules/finance-ledger/package.json +26 -0
  239. package/src/modules/finance-ledger/permissions.ts +3 -0
  240. package/src/modules/finance-ledger/query/.gitkeep +0 -0
  241. package/src/modules/finance-ledger/query/getAccountingPeriod.generated.ts +5 -0
  242. package/src/modules/finance-ledger/query/getAccountingPeriod.test.ts +31 -0
  243. package/src/modules/finance-ledger/query/getAccountingPeriod.ts +21 -0
  244. package/src/modules/finance-ledger/query/getFinancialStatement.generated.ts +5 -0
  245. package/src/modules/finance-ledger/query/getFinancialStatement.test.ts +35 -0
  246. package/src/modules/finance-ledger/query/getFinancialStatement.ts +29 -0
  247. package/src/modules/finance-ledger/query/getFiscalYear.generated.ts +5 -0
  248. package/src/modules/finance-ledger/query/getFiscalYear.test.ts +31 -0
  249. package/src/modules/finance-ledger/query/getFiscalYear.ts +21 -0
  250. package/src/modules/finance-ledger/query/getJournalEntry.generated.ts +5 -0
  251. package/src/modules/finance-ledger/query/getJournalEntry.test.ts +35 -0
  252. package/src/modules/finance-ledger/query/getJournalEntry.ts +29 -0
  253. package/src/modules/finance-ledger/query/getPeriodByDate.generated.ts +5 -0
  254. package/src/modules/finance-ledger/query/getPeriodByDate.test.ts +53 -0
  255. package/src/modules/finance-ledger/query/getPeriodByDate.ts +27 -0
  256. package/src/modules/finance-ledger/query/getPeriodClose.generated.ts +5 -0
  257. package/src/modules/finance-ledger/query/getPeriodClose.test.ts +31 -0
  258. package/src/modules/finance-ledger/query/getPeriodClose.ts +21 -0
  259. package/src/modules/finance-ledger/query/getSubledgerTransferStatus.generated.ts +5 -0
  260. package/src/modules/finance-ledger/query/getSubledgerTransferStatus.test.ts +101 -0
  261. package/src/modules/finance-ledger/query/getSubledgerTransferStatus.ts +68 -0
  262. package/src/modules/finance-ledger/query/getTrialBalance.generated.ts +5 -0
  263. package/src/modules/finance-ledger/query/getTrialBalance.test.ts +33 -0
  264. package/src/modules/finance-ledger/query/getTrialBalance.ts +30 -0
  265. package/src/modules/finance-ledger/query/listAccountingPeriods.generated.ts +5 -0
  266. package/src/modules/finance-ledger/query/listAccountingPeriods.test.ts +81 -0
  267. package/src/modules/finance-ledger/query/listAccountingPeriods.ts +61 -0
  268. package/src/modules/finance-ledger/query/listFinancialStatements.generated.ts +5 -0
  269. package/src/modules/finance-ledger/query/listFinancialStatements.test.ts +76 -0
  270. package/src/modules/finance-ledger/query/listFinancialStatements.ts +62 -0
  271. package/src/modules/finance-ledger/query/listFiscalYears.generated.ts +5 -0
  272. package/src/modules/finance-ledger/query/listFiscalYears.test.ts +63 -0
  273. package/src/modules/finance-ledger/query/listFiscalYears.ts +45 -0
  274. package/src/modules/finance-ledger/query/listJournalEntries.generated.ts +5 -0
  275. package/src/modules/finance-ledger/query/listJournalEntries.test.ts +91 -0
  276. package/src/modules/finance-ledger/query/listJournalEntries.ts +64 -0
  277. package/src/modules/finance-ledger/query/listPeriodCloses.generated.ts +5 -0
  278. package/src/modules/finance-ledger/query/listPeriodCloses.test.ts +63 -0
  279. package/src/modules/finance-ledger/query/listPeriodCloses.ts +64 -0
  280. package/src/modules/finance-ledger/query/listTrialBalances.generated.ts +5 -0
  281. package/src/modules/finance-ledger/query/listTrialBalances.test.ts +78 -0
  282. package/src/modules/finance-ledger/query/listTrialBalances.ts +56 -0
  283. package/src/modules/finance-ledger/seed/index.ts +19 -0
  284. package/src/modules/finance-ledger/tailor.config.ts +13 -0
  285. package/src/modules/finance-ledger/tailor.d.ts +13 -0
  286. package/src/modules/finance-ledger/testing/commandTestUtils.ts +35 -0
  287. package/src/modules/finance-ledger/testing/fixtures.ts +382 -0
  288. package/src/modules/finance-ledger/tsconfig.json +16 -0
  289. package/src/modules/inventory/docs/features/inventory-adjustment.md +2 -1
  290. package/src/modules/inventory/docs/features/scrap-management.md +39 -1
  291. package/src/modules/manufacturing/README.md +63 -0
  292. package/src/modules/manufacturing/command/.gitkeep +0 -0
  293. package/src/modules/manufacturing/command/activateBillOfMaterial.generated.ts +6 -0
  294. package/src/modules/manufacturing/command/activateBillOfMaterial.test.ts +166 -0
  295. package/src/modules/manufacturing/command/activateBillOfMaterial.ts +173 -0
  296. package/src/modules/manufacturing/command/activateRouting.generated.ts +6 -0
  297. package/src/modules/manufacturing/command/activateRouting.test.ts +152 -0
  298. package/src/modules/manufacturing/command/activateRouting.ts +92 -0
  299. package/src/modules/manufacturing/command/activateWorkCenter.generated.ts +6 -0
  300. package/src/modules/manufacturing/command/activateWorkCenter.test.ts +135 -0
  301. package/src/modules/manufacturing/command/activateWorkCenter.ts +91 -0
  302. package/src/modules/manufacturing/command/cancelProductionOrder.generated.ts +6 -0
  303. package/src/modules/manufacturing/command/cancelProductionOrder.test.ts +151 -0
  304. package/src/modules/manufacturing/command/cancelProductionOrder.ts +114 -0
  305. package/src/modules/manufacturing/command/closeProductionOrder.generated.ts +6 -0
  306. package/src/modules/manufacturing/command/closeProductionOrder.test.ts +126 -0
  307. package/src/modules/manufacturing/command/closeProductionOrder.ts +87 -0
  308. package/src/modules/manufacturing/command/completeProductionOrder.generated.ts +6 -0
  309. package/src/modules/manufacturing/command/completeProductionOrder.test.ts +132 -0
  310. package/src/modules/manufacturing/command/completeProductionOrder.ts +97 -0
  311. package/src/modules/manufacturing/command/completeWorkOrder.generated.ts +6 -0
  312. package/src/modules/manufacturing/command/completeWorkOrder.test.ts +369 -0
  313. package/src/modules/manufacturing/command/completeWorkOrder.ts +212 -0
  314. package/src/modules/manufacturing/command/createBillOfMaterial.generated.ts +6 -0
  315. package/src/modules/manufacturing/command/createBillOfMaterial.test.ts +210 -0
  316. package/src/modules/manufacturing/command/createBillOfMaterial.ts +176 -0
  317. package/src/modules/manufacturing/command/createProductionOrder.generated.ts +6 -0
  318. package/src/modules/manufacturing/command/createProductionOrder.test.ts +160 -0
  319. package/src/modules/manufacturing/command/createProductionOrder.ts +129 -0
  320. package/src/modules/manufacturing/command/createRouting.generated.ts +6 -0
  321. package/src/modules/manufacturing/command/createRouting.test.ts +168 -0
  322. package/src/modules/manufacturing/command/createRouting.ts +128 -0
  323. package/src/modules/manufacturing/command/createWorkCenter.generated.ts +6 -0
  324. package/src/modules/manufacturing/command/createWorkCenter.test.ts +148 -0
  325. package/src/modules/manufacturing/command/createWorkCenter.ts +131 -0
  326. package/src/modules/manufacturing/command/deactivateBillOfMaterial.generated.ts +6 -0
  327. package/src/modules/manufacturing/command/deactivateBillOfMaterial.test.ts +103 -0
  328. package/src/modules/manufacturing/command/deactivateBillOfMaterial.ts +78 -0
  329. package/src/modules/manufacturing/command/deactivateRouting.generated.ts +6 -0
  330. package/src/modules/manufacturing/command/deactivateRouting.test.ts +112 -0
  331. package/src/modules/manufacturing/command/deactivateRouting.ts +76 -0
  332. package/src/modules/manufacturing/command/deactivateWorkCenter.generated.ts +6 -0
  333. package/src/modules/manufacturing/command/deactivateWorkCenter.test.ts +113 -0
  334. package/src/modules/manufacturing/command/deactivateWorkCenter.ts +85 -0
  335. package/src/modules/manufacturing/command/pauseWorkOrder.generated.ts +6 -0
  336. package/src/modules/manufacturing/command/pauseWorkOrder.test.ts +118 -0
  337. package/src/modules/manufacturing/command/pauseWorkOrder.ts +82 -0
  338. package/src/modules/manufacturing/command/recordInventoryIssueOutcome.generated.ts +6 -0
  339. package/src/modules/manufacturing/command/recordInventoryIssueOutcome.test.ts +183 -0
  340. package/src/modules/manufacturing/command/recordInventoryIssueOutcome.ts +139 -0
  341. package/src/modules/manufacturing/command/recordManufacturingCostSettlementAcknowledgment.generated.ts +6 -0
  342. package/src/modules/manufacturing/command/recordManufacturingCostSettlementAcknowledgment.test.ts +120 -0
  343. package/src/modules/manufacturing/command/recordManufacturingCostSettlementAcknowledgment.ts +110 -0
  344. package/src/modules/manufacturing/command/releaseProductionOrder.generated.ts +6 -0
  345. package/src/modules/manufacturing/command/releaseProductionOrder.test.ts +220 -0
  346. package/src/modules/manufacturing/command/releaseProductionOrder.ts +450 -0
  347. package/src/modules/manufacturing/command/reopenProductionOrder.generated.ts +6 -0
  348. package/src/modules/manufacturing/command/reopenProductionOrder.test.ts +196 -0
  349. package/src/modules/manufacturing/command/reopenProductionOrder.ts +98 -0
  350. package/src/modules/manufacturing/command/reportWorkOrderProgress.generated.ts +6 -0
  351. package/src/modules/manufacturing/command/reportWorkOrderProgress.test.ts +204 -0
  352. package/src/modules/manufacturing/command/reportWorkOrderProgress.ts +129 -0
  353. package/src/modules/manufacturing/command/rescheduleProductionOrder.generated.ts +6 -0
  354. package/src/modules/manufacturing/command/rescheduleProductionOrder.test.ts +185 -0
  355. package/src/modules/manufacturing/command/rescheduleProductionOrder.ts +95 -0
  356. package/src/modules/manufacturing/command/resumeWorkOrder.generated.ts +6 -0
  357. package/src/modules/manufacturing/command/resumeWorkOrder.test.ts +122 -0
  358. package/src/modules/manufacturing/command/resumeWorkOrder.ts +94 -0
  359. package/src/modules/manufacturing/command/reviewManufacturingCostSummary.generated.ts +6 -0
  360. package/src/modules/manufacturing/command/reviewManufacturingCostSummary.test.ts +231 -0
  361. package/src/modules/manufacturing/command/reviewManufacturingCostSummary.ts +137 -0
  362. package/src/modules/manufacturing/command/startWorkOrder.generated.ts +6 -0
  363. package/src/modules/manufacturing/command/startWorkOrder.test.ts +118 -0
  364. package/src/modules/manufacturing/command/startWorkOrder.ts +126 -0
  365. package/src/modules/manufacturing/command/technicallyCompleteProductionOrder.generated.ts +6 -0
  366. package/src/modules/manufacturing/command/technicallyCompleteProductionOrder.test.ts +153 -0
  367. package/src/modules/manufacturing/command/technicallyCompleteProductionOrder.ts +106 -0
  368. package/src/modules/manufacturing/command/unreleaseProductionOrder.generated.ts +6 -0
  369. package/src/modules/manufacturing/command/unreleaseProductionOrder.test.ts +140 -0
  370. package/src/modules/manufacturing/command/unreleaseProductionOrder.ts +131 -0
  371. package/src/modules/manufacturing/command/updateBillOfMaterial.generated.ts +6 -0
  372. package/src/modules/manufacturing/command/updateBillOfMaterial.test.ts +149 -0
  373. package/src/modules/manufacturing/command/updateBillOfMaterial.ts +174 -0
  374. package/src/modules/manufacturing/command/updateProductionOrder.generated.ts +6 -0
  375. package/src/modules/manufacturing/command/updateProductionOrder.test.ts +112 -0
  376. package/src/modules/manufacturing/command/updateProductionOrder.ts +145 -0
  377. package/src/modules/manufacturing/command/updateRouting.generated.ts +6 -0
  378. package/src/modules/manufacturing/command/updateRouting.test.ts +211 -0
  379. package/src/modules/manufacturing/command/updateRouting.ts +124 -0
  380. package/src/modules/manufacturing/command/updateWorkCenter.generated.ts +6 -0
  381. package/src/modules/manufacturing/command/updateWorkCenter.test.ts +152 -0
  382. package/src/modules/manufacturing/command/updateWorkCenter.ts +137 -0
  383. package/src/modules/manufacturing/db/.gitkeep +0 -0
  384. package/src/modules/manufacturing/db/billOfMaterial.ts +70 -0
  385. package/src/modules/manufacturing/db/billOfMaterialLine.ts +49 -0
  386. package/src/modules/manufacturing/db/costVarianceLine.ts +53 -0
  387. package/src/modules/manufacturing/db/manufacturingCostLine.ts +35 -0
  388. package/src/modules/manufacturing/db/manufacturingCostSettlementRecord.ts +39 -0
  389. package/src/modules/manufacturing/db/manufacturingCostSummary.ts +59 -0
  390. package/src/modules/manufacturing/db/productionOrder.ts +83 -0
  391. package/src/modules/manufacturing/db/productionOrderBomSnapshot.ts +44 -0
  392. package/src/modules/manufacturing/db/productionOrderCostBaseline.ts +44 -0
  393. package/src/modules/manufacturing/db/productionOrderMaterialRequirement.ts +57 -0
  394. package/src/modules/manufacturing/db/productionOrderRoutingSnapshot.ts +43 -0
  395. package/src/modules/manufacturing/db/routing.ts +63 -0
  396. package/src/modules/manufacturing/db/routingOperation.ts +57 -0
  397. package/src/modules/manufacturing/db/workCenter.ts +87 -0
  398. package/src/modules/manufacturing/db/workOrder.ts +65 -0
  399. package/src/modules/manufacturing/db/workOrderExecutionEvent.ts +54 -0
  400. package/src/modules/manufacturing/docs/commands/ActivateBillOfMaterial.md +50 -0
  401. package/src/modules/manufacturing/docs/commands/ActivateRouting.md +48 -0
  402. package/src/modules/manufacturing/docs/commands/ActivateWorkCenter.md +49 -0
  403. package/src/modules/manufacturing/docs/commands/CancelProductionOrder.md +48 -0
  404. package/src/modules/manufacturing/docs/commands/CloseProductionOrder.md +46 -0
  405. package/src/modules/manufacturing/docs/commands/CompleteProductionOrder.md +48 -0
  406. package/src/modules/manufacturing/docs/commands/CompleteWorkOrder.md +66 -0
  407. package/src/modules/manufacturing/docs/commands/CreateBillOfMaterial.md +54 -0
  408. package/src/modules/manufacturing/docs/commands/CreateProductionOrder.md +49 -0
  409. package/src/modules/manufacturing/docs/commands/CreateRouting.md +50 -0
  410. package/src/modules/manufacturing/docs/commands/CreateWorkCenter.md +51 -0
  411. package/src/modules/manufacturing/docs/commands/DeactivateBillOfMaterial.md +45 -0
  412. package/src/modules/manufacturing/docs/commands/DeactivateRouting.md +45 -0
  413. package/src/modules/manufacturing/docs/commands/DeactivateWorkCenter.md +45 -0
  414. package/src/modules/manufacturing/docs/commands/PauseWorkOrder.md +44 -0
  415. package/src/modules/manufacturing/docs/commands/RecordInventoryIssueOutcome.md +59 -0
  416. package/src/modules/manufacturing/docs/commands/RecordManufacturingCostSettlementAcknowledgment.md +49 -0
  417. package/src/modules/manufacturing/docs/commands/ReleaseProductionOrder.md +57 -0
  418. package/src/modules/manufacturing/docs/commands/ReopenProductionOrder.md +54 -0
  419. package/src/modules/manufacturing/docs/commands/ReportWorkOrderProgress.md +53 -0
  420. package/src/modules/manufacturing/docs/commands/RescheduleProductionOrder.md +45 -0
  421. package/src/modules/manufacturing/docs/commands/ResumeWorkOrder.md +44 -0
  422. package/src/modules/manufacturing/docs/commands/ReviewManufacturingCostSummary.md +52 -0
  423. package/src/modules/manufacturing/docs/commands/StartWorkOrder.md +46 -0
  424. package/src/modules/manufacturing/docs/commands/TechnicallyCompleteProductionOrder.md +51 -0
  425. package/src/modules/manufacturing/docs/commands/UnreleaseProductionOrder.md +46 -0
  426. package/src/modules/manufacturing/docs/commands/UpdateBillOfMaterial.md +48 -0
  427. package/src/modules/manufacturing/docs/commands/UpdateProductionOrder.md +48 -0
  428. package/src/modules/manufacturing/docs/commands/UpdateRouting.md +52 -0
  429. package/src/modules/manufacturing/docs/commands/UpdateWorkCenter.md +48 -0
  430. package/src/modules/manufacturing/docs/features/bill-of-material-management.md +83 -0
  431. package/src/modules/manufacturing/docs/features/manufacturing-cost-and-variance.md +191 -0
  432. package/src/modules/manufacturing/docs/features/production-order-lifecycle.md +103 -0
  433. package/src/modules/manufacturing/docs/features/routing-and-work-center-definition.md +63 -0
  434. package/src/modules/manufacturing/docs/features/work-order-execution.md +115 -0
  435. package/src/modules/manufacturing/docs/models/BillOfMaterial.md +60 -0
  436. package/src/modules/manufacturing/docs/models/ManufacturingCostSummary.md +66 -0
  437. package/src/modules/manufacturing/docs/models/ProductionOrder.md +76 -0
  438. package/src/modules/manufacturing/docs/models/Routing.md +58 -0
  439. package/src/modules/manufacturing/docs/models/WorkCenter.md +56 -0
  440. package/src/modules/manufacturing/docs/models/WorkOrder.md +63 -0
  441. package/src/modules/manufacturing/docs/queries/DetectBillOfMaterialCircularReference.md +39 -0
  442. package/src/modules/manufacturing/docs/queries/ExplodeBillOfMaterial.md +56 -0
  443. package/src/modules/manufacturing/docs/queries/GetBillOfMaterial.md +37 -0
  444. package/src/modules/manufacturing/docs/queries/GetManufacturingCostSummary.md +39 -0
  445. package/src/modules/manufacturing/docs/queries/GetProductionOrder.md +37 -0
  446. package/src/modules/manufacturing/docs/queries/GetRouting.md +39 -0
  447. package/src/modules/manufacturing/docs/queries/GetWorkCenter.md +35 -0
  448. package/src/modules/manufacturing/docs/queries/GetWorkOrder.md +38 -0
  449. package/src/modules/manufacturing/docs/queries/ListBillOfMaterialsByItem.md +42 -0
  450. package/src/modules/manufacturing/docs/queries/ListManufacturingCostSummariesByStatus.md +41 -0
  451. package/src/modules/manufacturing/docs/queries/ListProductionOrdersByStatus.md +41 -0
  452. package/src/modules/manufacturing/docs/queries/ListRoutingsByItem.md +42 -0
  453. package/src/modules/manufacturing/docs/queries/ListWorkCentersBySite.md +38 -0
  454. package/src/modules/manufacturing/docs/queries/ListWorkOrdersByProductionOrder.md +39 -0
  455. package/src/modules/manufacturing/docs/queries/ListWorkOrdersByWorkCenter.md +43 -0
  456. package/src/modules/manufacturing/executor/.gitkeep +0 -0
  457. package/src/modules/manufacturing/generated/enums.ts +113 -0
  458. package/src/modules/manufacturing/generated/kysely-tailordb.ts +247 -0
  459. package/src/modules/manufacturing/index.ts +2 -0
  460. package/src/modules/manufacturing/lib/_db_deps.ts +22 -0
  461. package/src/modules/manufacturing/lib/errors.generated.ts +592 -0
  462. package/src/modules/manufacturing/lib/permissions.generated.ts +35 -0
  463. package/src/modules/manufacturing/lib/types.ts +111 -0
  464. package/src/modules/manufacturing/module.ts +226 -0
  465. package/src/modules/manufacturing/permissions.ts +3 -0
  466. package/src/modules/manufacturing/query/.gitkeep +0 -0
  467. package/src/modules/manufacturing/query/detectBillOfMaterialCircularReference.generated.ts +5 -0
  468. package/src/modules/manufacturing/query/detectBillOfMaterialCircularReference.test.ts +115 -0
  469. package/src/modules/manufacturing/query/detectBillOfMaterialCircularReference.ts +79 -0
  470. package/src/modules/manufacturing/query/explodeBillOfMaterial.generated.ts +5 -0
  471. package/src/modules/manufacturing/query/explodeBillOfMaterial.test.ts +445 -0
  472. package/src/modules/manufacturing/query/explodeBillOfMaterial.ts +306 -0
  473. package/src/modules/manufacturing/query/getBillOfMaterial.generated.ts +5 -0
  474. package/src/modules/manufacturing/query/getBillOfMaterial.test.ts +64 -0
  475. package/src/modules/manufacturing/query/getBillOfMaterial.ts +27 -0
  476. package/src/modules/manufacturing/query/getManufacturingCostSummary.generated.ts +5 -0
  477. package/src/modules/manufacturing/query/getManufacturingCostSummary.test.ts +147 -0
  478. package/src/modules/manufacturing/query/getManufacturingCostSummary.ts +46 -0
  479. package/src/modules/manufacturing/query/getProductionOrder.generated.ts +5 -0
  480. package/src/modules/manufacturing/query/getProductionOrder.test.ts +139 -0
  481. package/src/modules/manufacturing/query/getProductionOrder.ts +84 -0
  482. package/src/modules/manufacturing/query/getRouting.generated.ts +5 -0
  483. package/src/modules/manufacturing/query/getRouting.test.ts +71 -0
  484. package/src/modules/manufacturing/query/getRouting.ts +34 -0
  485. package/src/modules/manufacturing/query/getWorkCenter.generated.ts +5 -0
  486. package/src/modules/manufacturing/query/getWorkCenter.test.ts +37 -0
  487. package/src/modules/manufacturing/query/getWorkCenter.ts +21 -0
  488. package/src/modules/manufacturing/query/getWorkOrder.generated.ts +5 -0
  489. package/src/modules/manufacturing/query/getWorkOrder.test.ts +73 -0
  490. package/src/modules/manufacturing/query/getWorkOrder.ts +28 -0
  491. package/src/modules/manufacturing/query/listBillOfMaterialsByItem.generated.ts +5 -0
  492. package/src/modules/manufacturing/query/listBillOfMaterialsByItem.test.ts +107 -0
  493. package/src/modules/manufacturing/query/listBillOfMaterialsByItem.ts +58 -0
  494. package/src/modules/manufacturing/query/listManufacturingCostSummariesByStatus.generated.ts +5 -0
  495. package/src/modules/manufacturing/query/listManufacturingCostSummariesByStatus.test.ts +96 -0
  496. package/src/modules/manufacturing/query/listManufacturingCostSummariesByStatus.ts +77 -0
  497. package/src/modules/manufacturing/query/listProductionOrdersByStatus.generated.ts +5 -0
  498. package/src/modules/manufacturing/query/listProductionOrdersByStatus.test.ts +121 -0
  499. package/src/modules/manufacturing/query/listProductionOrdersByStatus.ts +83 -0
  500. package/src/modules/manufacturing/query/listRoutingsByItem.generated.ts +5 -0
  501. package/src/modules/manufacturing/query/listRoutingsByItem.test.ts +110 -0
  502. package/src/modules/manufacturing/query/listRoutingsByItem.ts +54 -0
  503. package/src/modules/manufacturing/query/listWorkCentersBySite.generated.ts +5 -0
  504. package/src/modules/manufacturing/query/listWorkCentersBySite.test.ts +81 -0
  505. package/src/modules/manufacturing/query/listWorkCentersBySite.ts +70 -0
  506. package/src/modules/manufacturing/query/listWorkOrdersByProductionOrder.generated.ts +5 -0
  507. package/src/modules/manufacturing/query/listWorkOrdersByProductionOrder.test.ts +102 -0
  508. package/src/modules/manufacturing/query/listWorkOrdersByProductionOrder.ts +53 -0
  509. package/src/modules/manufacturing/query/listWorkOrdersByWorkCenter.generated.ts +5 -0
  510. package/src/modules/manufacturing/query/listWorkOrdersByWorkCenter.test.ts +143 -0
  511. package/src/modules/manufacturing/query/listWorkOrdersByWorkCenter.ts +56 -0
  512. package/src/modules/manufacturing/seed/index.ts +19 -0
  513. package/src/modules/manufacturing/tailor.config.ts +13 -0
  514. package/src/modules/manufacturing/tailor.d.ts +13 -0
  515. package/src/modules/manufacturing/testing/commandTestUtils.ts +29 -0
  516. package/src/modules/manufacturing/testing/fixtures.ts +402 -0
  517. package/src/progress/schema.test.ts +161 -0
  518. package/src/progress/schema.ts +316 -0
  519. package/templates/scaffold/app/backend/package.json +7 -2
  520. package/templates/scaffold/app/backend/src/tests/utils/graphql-client.ts +66 -0
  521. package/templates/scaffold/app/backend/src/tests/utils/setup.ts +21 -0
  522. package/templates/scaffold/app/backend/tsconfig.json +9 -2
  523. package/templates/scaffold/app/backend/vitest.config.ts +18 -0
  524. package/templates/scaffold/app/frontend/package.json +2 -2
  525. package/src/generator/generate-stubs.ts +0 -31
@@ -0,0 +1,92 @@
1
+ import {
2
+ db,
3
+ type TailorAnyDBField,
4
+ type TailorAnyDBType,
5
+ unsafeAllowAllGqlPermission,
6
+ unsafeAllowAllTypePermission,
7
+ } from "@tailor-platform/sdk";
8
+ import { chartOfAccounts as chartOfAccountsStub, company as companyStub } from "../lib/_db_deps";
9
+ import { trialBalance } from "./trialBalance";
10
+
11
+ export const FINANCIAL_STATEMENT_STATUSES: [string, string] = ["DRAFT", "FINALIZED"];
12
+
13
+ export const STATEMENT_TYPES: [string, string, string] = [
14
+ "BALANCE_SHEET",
15
+ "PROFIT_AND_LOSS",
16
+ "CASH_FLOW",
17
+ ];
18
+
19
+ export interface CreateFinancialStatementTypeParams<F extends Record<string, TailorAnyDBField>> {
20
+ fields?: F;
21
+ companyType?: TailorAnyDBType;
22
+ chartOfAccountsType?: TailorAnyDBType;
23
+ trialBalanceType?: TailorAnyDBType;
24
+ }
25
+
26
+ export function createFinancialStatementType<const F extends Record<string, TailorAnyDBField>>(
27
+ params: CreateFinancialStatementTypeParams<F>,
28
+ ) {
29
+ return db
30
+ .type("FinancialStatement", {
31
+ companyId: db
32
+ .uuid()
33
+ .relation({
34
+ type: "n-1",
35
+ toward: { type: params.companyType ?? companyStub },
36
+ backward: "financialStatements",
37
+ })
38
+ .description("Foreign key to Company"),
39
+ chartOfAccountsId: db
40
+ .uuid()
41
+ .relation({
42
+ type: "n-1",
43
+ toward: { type: params.chartOfAccountsType ?? chartOfAccountsStub },
44
+ backward: "financialStatements",
45
+ })
46
+ .description("Foreign key to ChartOfAccounts"),
47
+ trialBalanceId: db
48
+ .uuid()
49
+ .relation({
50
+ type: "n-1",
51
+ toward: { type: params.trialBalanceType ?? trialBalance },
52
+ backward: "financialStatements",
53
+ })
54
+ .description("Foreign key to the TrialBalance this statement was generated from"),
55
+ comparativePeriodTrialBalanceId: db
56
+ .uuid({ optional: true })
57
+ .relation({
58
+ type: "n-1",
59
+ toward: { type: params.trialBalanceType ?? trialBalance },
60
+ backward: "comparativeFinancialStatements",
61
+ })
62
+ .description("Optional foreign key to a prior-period TrialBalance for comparative data"),
63
+ statementType: db.enum(STATEMENT_TYPES).description("Type of financial statement"),
64
+ status: db
65
+ .enum(FINANCIAL_STATEMENT_STATUSES)
66
+ .description("Financial statement lifecycle status"),
67
+ reportingDate: db
68
+ .date({ optional: true })
69
+ .description("As-of date for Balance Sheet statements"),
70
+ startDate: db
71
+ .date({ optional: true })
72
+ .description("Start date of the reporting period for P&L and Cash Flow statements"),
73
+ endDate: db
74
+ .date({ optional: true })
75
+ .description("End date of the reporting period for P&L and Cash Flow statements"),
76
+ cashFlowMethod: db
77
+ .string({ optional: true })
78
+ .description(
79
+ "Cash flow method — DIRECT or INDIRECT — applicable only to Cash Flow statements",
80
+ ),
81
+ generatedAt: db.datetime().description("Timestamp when the statement was generated"),
82
+ finalizedAt: db
83
+ .datetime({ optional: true })
84
+ .description("Timestamp when the statement was finalized"),
85
+ ...((params.fields ?? {}) as F),
86
+ ...db.fields.timestamps(),
87
+ })
88
+ .permission(unsafeAllowAllTypePermission)
89
+ .gqlPermission(unsafeAllowAllGqlPermission);
90
+ }
91
+
92
+ export const financialStatement = createFinancialStatementType({});
@@ -0,0 +1,76 @@
1
+ import {
2
+ db,
3
+ type TailorAnyDBField,
4
+ type TailorAnyDBType,
5
+ unsafeAllowAllGqlPermission,
6
+ unsafeAllowAllTypePermission,
7
+ } from "@tailor-platform/sdk";
8
+ import { account as accountStub, accountGroup as accountGroupStub } from "../lib/_db_deps";
9
+ import { financialStatement } from "./financialStatement";
10
+
11
+ export const FINANCIAL_STATEMENT_LINE_ITEM_LINE_TYPES: [string, string, string] = [
12
+ "DETAIL",
13
+ "SUBTOTAL",
14
+ "TOTAL",
15
+ ];
16
+
17
+ export interface CreateFinancialStatementLineItemTypeParams<
18
+ F extends Record<string, TailorAnyDBField>,
19
+ > {
20
+ fields?: F;
21
+ financialStatementType?: TailorAnyDBType;
22
+ accountType?: TailorAnyDBType;
23
+ accountGroupType?: TailorAnyDBType;
24
+ }
25
+
26
+ export function createFinancialStatementLineItemType<
27
+ const F extends Record<string, TailorAnyDBField>,
28
+ >(params: CreateFinancialStatementLineItemTypeParams<F>) {
29
+ return db
30
+ .type("FinancialStatementLineItem", {
31
+ financialStatementId: db
32
+ .uuid()
33
+ .relation({
34
+ type: "n-1",
35
+ toward: { type: params.financialStatementType ?? financialStatement },
36
+ backward: "lineItems",
37
+ })
38
+ .description("Foreign key to FinancialStatement"),
39
+ accountId: db
40
+ .uuid({ optional: true })
41
+ .relation({
42
+ type: "n-1",
43
+ toward: { type: params.accountType ?? accountStub },
44
+ backward: "financialStatementLineItems",
45
+ })
46
+ .description("Foreign key to Account for DETAIL line items (coa-management)"),
47
+ accountGroupId: db
48
+ .uuid({ optional: true })
49
+ .relation({
50
+ type: "n-1",
51
+ toward: { type: params.accountGroupType ?? accountGroupStub },
52
+ backward: "financialStatementLineItems",
53
+ })
54
+ .description("Foreign key to AccountGroup (coa-management)"),
55
+ label: db.string().description("Display label for the line item"),
56
+ amount: db.float().description("Current period amount in base currency"),
57
+ comparativeAmount: db
58
+ .float({ optional: true })
59
+ .description("Comparative period amount, present when comparative data was requested"),
60
+ lineType: db
61
+ .enum(FINANCIAL_STATEMENT_LINE_ITEM_LINE_TYPES)
62
+ .description("Line type: DETAIL, SUBTOTAL, or TOTAL"),
63
+ sectionType: db
64
+ .string()
65
+ .description(
66
+ "Report section where this line item appears (e.g., Current Assets, Revenue, Operating Expenses)",
67
+ ),
68
+ sortOrder: db.int().description("Display positioning order within the statement"),
69
+ ...((params.fields ?? {}) as F),
70
+ ...db.fields.timestamps(),
71
+ })
72
+ .permission(unsafeAllowAllTypePermission)
73
+ .gqlPermission(unsafeAllowAllGqlPermission);
74
+ }
75
+
76
+ export const financialStatementLineItem = createFinancialStatementLineItemType({});
@@ -0,0 +1,41 @@
1
+ import {
2
+ db,
3
+ type TailorAnyDBField,
4
+ type TailorAnyDBType,
5
+ unsafeAllowAllGqlPermission,
6
+ unsafeAllowAllTypePermission,
7
+ } from "@tailor-platform/sdk";
8
+ import { company as companyStub } from "../lib/_db_deps";
9
+
10
+ export interface CreateFiscalYearTypeParams<F extends Record<string, TailorAnyDBField>> {
11
+ fields?: F;
12
+ companyType?: TailorAnyDBType;
13
+ }
14
+
15
+ export function createFiscalYearType<const F extends Record<string, TailorAnyDBField>>(
16
+ params: CreateFiscalYearTypeParams<F>,
17
+ ) {
18
+ return db
19
+ .type("FiscalYear", {
20
+ companyId: db
21
+ .uuid()
22
+ .relation({
23
+ type: "n-1",
24
+ toward: { type: params.companyType ?? companyStub },
25
+ backward: "fiscalYears",
26
+ })
27
+ .description("Foreign key to Company"),
28
+ name: db.string().description("Display name of the fiscal year"),
29
+ startDate: db.date().description("Start date of the fiscal year"),
30
+ endDate: db.date().description("End date of the fiscal year"),
31
+ yearEndCloseExecuted: db
32
+ .bool()
33
+ .description("Tracks whether year-end close has been run for this fiscal year"),
34
+ ...((params.fields ?? {}) as F),
35
+ ...db.fields.timestamps(),
36
+ })
37
+ .permission(unsafeAllowAllTypePermission)
38
+ .gqlPermission(unsafeAllowAllGqlPermission);
39
+ }
40
+
41
+ export const fiscalYear = createFiscalYearType({});
@@ -0,0 +1,101 @@
1
+ import {
2
+ db,
3
+ type TailorAnyDBField,
4
+ type TailorAnyDBType,
5
+ unsafeAllowAllGqlPermission,
6
+ unsafeAllowAllTypePermission,
7
+ } from "@tailor-platform/sdk";
8
+ import { company as companyStub } from "../lib/_db_deps";
9
+ import { accountingPeriod } from "./accountingPeriod";
10
+
11
+ export const JOURNAL_ENTRY_STATUSES: [string, string, string] = ["DRAFT", "POSTED", "REVERSED"];
12
+
13
+ export const JOURNAL_TYPES: [
14
+ string,
15
+ string,
16
+ string,
17
+ string,
18
+ string,
19
+ string,
20
+ string,
21
+ string,
22
+ string,
23
+ ] = [
24
+ "SALES",
25
+ "PURCHASE",
26
+ "CASH",
27
+ "BANK",
28
+ "MISCELLANEOUS",
29
+ "OPENING",
30
+ "CLOSING",
31
+ "INVENTORY",
32
+ "MANUFACTURING",
33
+ ];
34
+
35
+ const ADJUSTING_ENTRY_TYPES = ["ACCRUAL", "DEFERRAL", "RECLASSIFICATION"] as const;
36
+
37
+ export interface CreateJournalEntryTypeParams<F extends Record<string, TailorAnyDBField>> {
38
+ fields?: F;
39
+ companyType?: TailorAnyDBType;
40
+ accountingPeriodType?: TailorAnyDBType;
41
+ }
42
+
43
+ export function createJournalEntryType<const F extends Record<string, TailorAnyDBField>>(
44
+ params: CreateJournalEntryTypeParams<F>,
45
+ ) {
46
+ return db
47
+ .type("JournalEntry", {
48
+ companyId: db
49
+ .uuid()
50
+ .relation({
51
+ type: "n-1",
52
+ toward: { type: params.companyType ?? companyStub },
53
+ backward: "journalEntries",
54
+ })
55
+ .description("Foreign key to Company"),
56
+ accountingPeriodId: db
57
+ .uuid()
58
+ .relation({
59
+ type: "n-1",
60
+ toward: { type: params.accountingPeriodType ?? accountingPeriod },
61
+ backward: "journalEntries",
62
+ })
63
+ .description("Foreign key to AccountingPeriod"),
64
+ entryDate: db.date().description("Journal entry document date"),
65
+ journalType: db
66
+ .enum(JOURNAL_TYPES)
67
+ .description(
68
+ "Journal type categorizing the business origin (SALES, PURCHASE, CASH, BANK, MISCELLANEOUS, OPENING, CLOSING, INVENTORY, MANUFACTURING)",
69
+ ),
70
+ referenceNumber: db.string().description("Reference number unique within the company scope"),
71
+ status: db
72
+ .enum(JOURNAL_ENTRY_STATUSES)
73
+ .description("Journal entry lifecycle status (DRAFT, POSTED, REVERSED)"),
74
+ description: db
75
+ .string({ optional: true })
76
+ .description("Optional description of the journal entry"),
77
+ sourceDocumentReference: db
78
+ .string({ optional: true })
79
+ .description("Optional source document reference (e.g. PurchaseBill:purchase-bill-1)"),
80
+ adjustingEntryType: db
81
+ .enum([...ADJUSTING_ENTRY_TYPES], { optional: true })
82
+ .description(
83
+ "Optional adjusting entry type for period-end adjustments (ACCRUAL, DEFERRAL, RECLASSIFICATION)",
84
+ ),
85
+ reversalOfId: db
86
+ .uuid({ optional: true })
87
+ .relation({
88
+ type: "n-1",
89
+ toward: { type: "self" },
90
+ backward: "reversals",
91
+ })
92
+ .description("Optional self-referencing FK to the original JournalEntry being reversed"),
93
+ postedAt: db.datetime({ optional: true }).description("Timestamp when the entry was posted"),
94
+ ...((params.fields ?? {}) as F),
95
+ ...db.fields.timestamps(),
96
+ })
97
+ .permission(unsafeAllowAllTypePermission)
98
+ .gqlPermission(unsafeAllowAllGqlPermission);
99
+ }
100
+
101
+ export const journalEntry = createJournalEntryType({});
@@ -0,0 +1,64 @@
1
+ import {
2
+ db,
3
+ type TailorAnyDBField,
4
+ type TailorAnyDBType,
5
+ unsafeAllowAllGqlPermission,
6
+ unsafeAllowAllTypePermission,
7
+ } from "@tailor-platform/sdk";
8
+ import { account as accountStub } from "../lib/_db_deps";
9
+ import { journalEntry } from "./journalEntry";
10
+
11
+ export interface CreateJournalLineTypeParams<F extends Record<string, TailorAnyDBField>> {
12
+ fields?: F;
13
+ journalEntryType?: TailorAnyDBType;
14
+ accountType?: TailorAnyDBType;
15
+ }
16
+
17
+ export function createJournalLineType<const F extends Record<string, TailorAnyDBField>>(
18
+ params: CreateJournalLineTypeParams<F>,
19
+ ) {
20
+ return db
21
+ .type("JournalLine", {
22
+ journalEntryId: db
23
+ .uuid()
24
+ .relation({
25
+ type: "n-1",
26
+ toward: { type: params.journalEntryType ?? journalEntry },
27
+ backward: "lines",
28
+ })
29
+ .description("Foreign key to JournalEntry"),
30
+ accountId: db
31
+ .uuid()
32
+ .relation({
33
+ type: "n-1",
34
+ toward: { type: params.accountType ?? accountStub },
35
+ backward: "journalLines",
36
+ })
37
+ .description("Foreign key to Account (coa-management)"),
38
+ debitAmount: db
39
+ .float({ optional: true })
40
+ .description("Debit amount (mutually exclusive with creditAmount)"),
41
+ creditAmount: db
42
+ .float({ optional: true })
43
+ .description("Credit amount (mutually exclusive with debitAmount)"),
44
+ description: db.string({ optional: true }).description("Optional line-level description"),
45
+ currencyCode: db
46
+ .string({ optional: true })
47
+ .description("Optional foreign currency code referencing Currency in primitives module"),
48
+ exchangeRate: db
49
+ .float({ optional: true })
50
+ .description("Exchange rate to functional currency (defaults to 1.0)"),
51
+ functionalDebitAmount: db
52
+ .float({ optional: true })
53
+ .description("Computed: debitAmount * exchangeRate"),
54
+ functionalCreditAmount: db
55
+ .float({ optional: true })
56
+ .description("Computed: creditAmount * exchangeRate"),
57
+ ...((params.fields ?? {}) as F),
58
+ ...db.fields.timestamps(),
59
+ })
60
+ .permission(unsafeAllowAllTypePermission)
61
+ .gqlPermission(unsafeAllowAllGqlPermission);
62
+ }
63
+
64
+ export const journalLine = createJournalLineType({});
@@ -0,0 +1,97 @@
1
+ import {
2
+ db,
3
+ type TailorAnyDBField,
4
+ type TailorAnyDBType,
5
+ unsafeAllowAllGqlPermission,
6
+ unsafeAllowAllTypePermission,
7
+ } from "@tailor-platform/sdk";
8
+ import { user as userStub } from "../lib/_db_deps";
9
+ import { accountingPeriod } from "./accountingPeriod";
10
+
11
+ export const PERIOD_CLOSE_STATUSES: [
12
+ string,
13
+ string,
14
+ string,
15
+ string,
16
+ string,
17
+ string,
18
+ string,
19
+ string,
20
+ ] = [
21
+ "NOT_STARTED",
22
+ "IN_PROGRESS",
23
+ "SUBLEDGERS_VERIFIED",
24
+ "ADJUSTMENTS_POSTED",
25
+ "TRIAL_BALANCE_VERIFIED",
26
+ "UNDER_REVIEW",
27
+ "SOFT_LOCKED",
28
+ "PERMANENTLY_CLOSED",
29
+ ];
30
+
31
+ export interface CreatePeriodCloseTypeParams<F extends Record<string, TailorAnyDBField>> {
32
+ fields?: F;
33
+ accountingPeriodType?: TailorAnyDBType;
34
+ initiatedByUserType?: TailorAnyDBType;
35
+ approvedByUserType?: TailorAnyDBType;
36
+ finalizedByUserType?: TailorAnyDBType;
37
+ }
38
+
39
+ export function createPeriodCloseType<const F extends Record<string, TailorAnyDBField>>(
40
+ params: CreatePeriodCloseTypeParams<F>,
41
+ ) {
42
+ return db
43
+ .type("PeriodClose", {
44
+ accountingPeriodId: db
45
+ .uuid()
46
+ .relation({
47
+ type: "n-1",
48
+ toward: { type: params.accountingPeriodType ?? accountingPeriod },
49
+ backward: "periodCloses",
50
+ })
51
+ .description("Foreign key to AccountingPeriod"),
52
+ status: db.enum(PERIOD_CLOSE_STATUSES).description("Period close lifecycle status"),
53
+ initiatedByUserId: db
54
+ .uuid()
55
+ .relation({
56
+ type: "n-1",
57
+ toward: { type: params.initiatedByUserType ?? userStub },
58
+ backward: "initiatedPeriodCloses",
59
+ })
60
+ .description("Foreign key to User who initiated the close"),
61
+ completionPercentage: db
62
+ .int()
63
+ .description("Completion percentage incremented per checklist step"),
64
+ subledgerVerificationDetails: db
65
+ .string({ optional: true })
66
+ .description("Serialized JSON details of subledger verification"),
67
+ trialBalanceId: db
68
+ .uuid({ optional: true })
69
+ .description("Reference to generated trial balance after verification"),
70
+ preliminaryStatementIds: db
71
+ .string({ optional: true })
72
+ .description("Serialized JSON array of preliminary statement IDs"),
73
+ approvedByUserId: db
74
+ .uuid({ optional: true })
75
+ .relation({
76
+ type: "n-1",
77
+ toward: { type: params.approvedByUserType ?? userStub },
78
+ backward: "approvedPeriodCloses",
79
+ })
80
+ .description("Foreign key to User who approved the close"),
81
+ finalizedByUserId: db
82
+ .uuid({ optional: true })
83
+ .relation({
84
+ type: "n-1",
85
+ toward: { type: params.finalizedByUserType ?? userStub },
86
+ backward: "finalizedPeriodCloses",
87
+ })
88
+ .description("Foreign key to User who finalized the permanent close"),
89
+ yearEndCloseExecuted: db.bool().description("Whether year-end close has been executed"),
90
+ ...((params.fields ?? {}) as F),
91
+ ...db.fields.timestamps(),
92
+ })
93
+ .permission(unsafeAllowAllTypePermission)
94
+ .gqlPermission(unsafeAllowAllGqlPermission);
95
+ }
96
+
97
+ export const periodClose = createPeriodCloseType({});
@@ -0,0 +1,63 @@
1
+ import {
2
+ db,
3
+ type TailorAnyDBField,
4
+ type TailorAnyDBType,
5
+ unsafeAllowAllGqlPermission,
6
+ unsafeAllowAllTypePermission,
7
+ } from "@tailor-platform/sdk";
8
+ import { chartOfAccounts as chartOfAccountsStub, company as companyStub } from "../lib/_db_deps";
9
+ import { accountingPeriod } from "./accountingPeriod";
10
+
11
+ export const TRIAL_BALANCE_VARIANTS: [string, string] = ["PRE_CLOSE", "POST_CLOSE"];
12
+
13
+ export interface CreateTrialBalanceTypeParams<F extends Record<string, TailorAnyDBField>> {
14
+ fields?: F;
15
+ companyType?: TailorAnyDBType;
16
+ accountingPeriodType?: TailorAnyDBType;
17
+ chartOfAccountsType?: TailorAnyDBType;
18
+ }
19
+
20
+ export function createTrialBalanceType<const F extends Record<string, TailorAnyDBField>>(
21
+ params: CreateTrialBalanceTypeParams<F>,
22
+ ) {
23
+ return db
24
+ .type("TrialBalance", {
25
+ companyId: db
26
+ .uuid()
27
+ .relation({
28
+ type: "n-1",
29
+ toward: { type: params.companyType ?? companyStub },
30
+ backward: "trialBalances",
31
+ })
32
+ .description("Foreign key to Company"),
33
+ accountingPeriodId: db
34
+ .uuid()
35
+ .relation({
36
+ type: "n-1",
37
+ toward: { type: params.accountingPeriodType ?? accountingPeriod },
38
+ backward: "trialBalances",
39
+ })
40
+ .description("Foreign key to AccountingPeriod"),
41
+ chartOfAccountsId: db
42
+ .uuid()
43
+ .relation({
44
+ type: "n-1",
45
+ toward: { type: params.chartOfAccountsType ?? chartOfAccountsStub },
46
+ backward: "trialBalances",
47
+ })
48
+ .description("Foreign key to ChartOfAccounts"),
49
+ variant: db
50
+ .enum(TRIAL_BALANCE_VARIANTS)
51
+ .description("Trial balance variant (PRE_CLOSE or POST_CLOSE)"),
52
+ generatedAt: db.datetime().description("Timestamp when the trial balance was generated"),
53
+ totalDebits: db.float().description("Sum of all debit balances across accounts"),
54
+ totalCredits: db.float().description("Sum of all credit balances across accounts"),
55
+ isBalanced: db.bool().description("Whether totalDebits equals totalCredits"),
56
+ ...((params.fields ?? {}) as F),
57
+ ...db.fields.timestamps(),
58
+ })
59
+ .permission(unsafeAllowAllTypePermission)
60
+ .gqlPermission(unsafeAllowAllGqlPermission);
61
+ }
62
+
63
+ export const trialBalance = createTrialBalanceType({});
@@ -0,0 +1,63 @@
1
+ import {
2
+ db,
3
+ type TailorAnyDBField,
4
+ type TailorAnyDBType,
5
+ unsafeAllowAllGqlPermission,
6
+ unsafeAllowAllTypePermission,
7
+ } from "@tailor-platform/sdk";
8
+ import { account as accountStub, accountGroup as accountGroupStub } from "../lib/_db_deps";
9
+ import { trialBalance } from "./trialBalance";
10
+
11
+ export interface CreateTrialBalanceLineTypeParams<F extends Record<string, TailorAnyDBField>> {
12
+ fields?: F;
13
+ trialBalanceType?: TailorAnyDBType;
14
+ accountType?: TailorAnyDBType;
15
+ accountGroupType?: TailorAnyDBType;
16
+ }
17
+
18
+ export function createTrialBalanceLineType<const F extends Record<string, TailorAnyDBField>>(
19
+ params: CreateTrialBalanceLineTypeParams<F>,
20
+ ) {
21
+ return db
22
+ .type("TrialBalanceLine", {
23
+ trialBalanceId: db
24
+ .uuid()
25
+ .relation({
26
+ type: "n-1",
27
+ toward: { type: params.trialBalanceType ?? trialBalance },
28
+ backward: "trialBalanceLines",
29
+ })
30
+ .description("Foreign key to TrialBalance"),
31
+ accountId: db
32
+ .uuid()
33
+ .relation({
34
+ type: "n-1",
35
+ toward: { type: params.accountType ?? accountStub },
36
+ backward: "trialBalanceLines",
37
+ })
38
+ .description("Foreign key to Account"),
39
+ accountGroupId: db
40
+ .uuid({ optional: true })
41
+ .relation({
42
+ type: "n-1",
43
+ toward: { type: params.accountGroupType ?? accountGroupStub },
44
+ backward: "trialBalanceLines",
45
+ })
46
+ .description("Optional foreign key to AccountGroup for hierarchical aggregation"),
47
+ accountCode: db.string().description("Denormalized account code for display and ordering"),
48
+ accountName: db.string().description("Denormalized account name for display"),
49
+ openingBalance: db.float().description("Opening balance for the period"),
50
+ periodDebits: db.float().description("Total debits for the period"),
51
+ periodCredits: db.float().description("Total credits for the period"),
52
+ closingBalance: db
53
+ .float()
54
+ .description("Closing balance (computed: openingBalance + periodDebits - periodCredits)"),
55
+ sortOrder: db.int().description("Sort order within the trial balance"),
56
+ ...((params.fields ?? {}) as F),
57
+ ...db.fields.timestamps(),
58
+ })
59
+ .permission(unsafeAllowAllTypePermission)
60
+ .gqlPermission(unsafeAllowAllGqlPermission);
61
+ }
62
+
63
+ export const trialBalanceLine = createTrialBalanceLineType({});
@@ -0,0 +1,74 @@
1
+ # AddJournalLine
2
+
3
+ ## Overview
4
+
5
+ addJournalLine adds a new line item to a DRAFT journal entry. Each journal line references a GL account (from coa-management) and specifies either a debit amount or a credit amount. For multi-currency transactions, the line can include a currency code and exchange rate; otherwise it defaults to the company's functional currency with an exchange rate of 1.0. An optional line-level description can be provided for additional detail.
6
+
7
+ ## Business Rules
8
+
9
+ - Journal entry must exist and be in DRAFT status
10
+ - Lines cannot be added to POSTED or REVERSED entries
11
+ - Each line must reference a valid GL account ID from coa-management
12
+ - Each line must specify either a debit amount or a credit amount (not both, and not zero for both)
13
+ - Debit and credit amounts must be positive values
14
+ - For multi-currency lines, a currency code and exchange rate must be specified
15
+ - Lines without an explicit currency default to the company's functional currency with exchange rate 1.0
16
+ - The functional currency amount is computed as the foreign amount multiplied by the exchange rate
17
+ - Line-level description is optional
18
+ - Emits an audit event recording the line addition, acting user, and timestamp
19
+
20
+ ## Process Flow
21
+
22
+ ```mermaid
23
+ flowchart TD
24
+ A[Receive add journal line request] --> B{Journal entry exists?}
25
+ B -->|No| C[Return error: journal entry not found]
26
+ B -->|Yes| D{Entry status is DRAFT?}
27
+ D -->|No| E[Return error: cannot add lines to non-draft entry]
28
+ D -->|Yes| F{Valid GL account reference?}
29
+ F -->|No| G[Return error: invalid account]
30
+ F -->|Yes| H{Debit or credit specified correctly?}
31
+ H -->|No| I[Return error: invalid debit/credit]
32
+ H -->|Yes| J{Multi-currency?}
33
+ J -->|Yes| K[Validate currency and exchange rate]
34
+ K --> L{Currency valid?}
35
+ L -->|No| M[Return error: invalid currency]
36
+ L -->|Yes| N[Compute functional currency amount]
37
+ J -->|No| N[Use functional currency defaults]
38
+ N --> O[Create journal line]
39
+ O --> P[Emit audit event]
40
+ P --> Q[Return created journal line]
41
+ ```
42
+
43
+ ## External Dependencies
44
+
45
+ - [coa-management::getAccount](../../../coa-management/docs/queries/GetAccount.md) - Validates that the referenced GL account exists
46
+ - [primitives::getCurrency](../../../primitives/docs/queries/GetCurrency.md) - Validates that the referenced currency exists and is active (for multi-currency lines)
47
+
48
+ ## Error Scenarios
49
+
50
+ - **JOURNAL_ENTRY_NOT_FOUND**: Referenced journal entry does not exist
51
+ - **INVALID_STATUS_FOR_LINE_ADD**: Journal entry is not in DRAFT status
52
+ - **ACCOUNT_NOT_FOUND**: Referenced GL account does not exist
53
+ - **INVALID_DEBIT_CREDIT**: Both debit and credit specified, or both are zero, or amounts are negative
54
+ - **CURRENCY_NOT_FOUND**: Referenced currency does not exist or is not active
55
+
56
+ ## Test Cases
57
+
58
+ - returns error when journal entry does not exist
59
+ - returns error when journal entry is in POSTED status
60
+ - returns error when journal entry is in REVERSED status
61
+ - returns error when GL account does not exist
62
+ - returns error when GL account is not active
63
+ - returns error when both debit and credit amounts are specified
64
+ - returns error when both debit and credit amounts are zero
65
+ - returns error when debit amount is negative
66
+ - returns error when credit amount is negative
67
+ - returns error when currency does not exist for multi-currency line
68
+ - adds journal line with debit amount to DRAFT entry
69
+ - adds journal line with credit amount to DRAFT entry
70
+ - adds multi-currency journal line with currency and exchange rate
71
+ - defaults to functional currency with exchange rate 1.0 when currency not specified
72
+ - computes functional currency amount as foreign amount multiplied by exchange rate
73
+ - adds journal line with optional description
74
+ - emits audit event recording line addition and acting user