@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,45 @@
1
+ import {
2
+ ok,
3
+ type ReadonlyDB,
4
+ type PaginationInput,
5
+ buildPaginatedResult,
6
+ DEFAULT_PAGE_SIZE,
7
+ } from "@tailor-platform/erp-kit/module";
8
+ import type { DB } from "../generated/kysely-tailordb";
9
+
10
+ type FiscalYearOrderByField = "startDate" | "endDate" | "name" | "createdAt";
11
+
12
+ export interface ListFiscalYearsInput extends PaginationInput<FiscalYearOrderByField> {
13
+ companyId: string;
14
+ startDate?: Date;
15
+ endDate?: Date;
16
+ }
17
+
18
+ /**
19
+ * Function: listFiscalYears
20
+ *
21
+ * Lists fiscal years for a company with optional date range filters.
22
+ */
23
+ export async function run(db: ReadonlyDB<DB>, input: ListFiscalYearsInput) {
24
+ const limit = input.limit ?? DEFAULT_PAGE_SIZE;
25
+ const offset = input.offset ?? 0;
26
+ const orderBy = input.orderBy ?? "startDate";
27
+ const orderDirection = input.orderDirection ?? "asc";
28
+
29
+ let query = db.selectFrom("FiscalYear").selectAll().where("companyId", "=", input.companyId);
30
+
31
+ if (input.startDate) {
32
+ query = query.where("endDate", ">=", input.startDate);
33
+ }
34
+ if (input.endDate) {
35
+ query = query.where("startDate", "<=", input.endDate);
36
+ }
37
+
38
+ const results = await query
39
+ .orderBy(orderBy, orderDirection)
40
+ .limit(limit + 1)
41
+ .offset(offset)
42
+ .execute();
43
+
44
+ return ok(buildPaginatedResult(results, limit));
45
+ }
@@ -0,0 +1,5 @@
1
+ // @generated — do not edit
2
+ import { defineQuery } from "@tailor-platform/erp-kit/module";
3
+ import { run } from "./listJournalEntries";
4
+
5
+ export const listJournalEntries = defineQuery(run);
@@ -0,0 +1,91 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createMockDb } from "../../../testing/index";
3
+ import type { DB } from "../generated/kysely-tailordb";
4
+ import { baseJournalEntry, postedJournalEntry } from "../testing/fixtures";
5
+ import { run } from "./listJournalEntries";
6
+
7
+ describe("listJournalEntries", () => {
8
+ it("returns all journal entries for a company", async () => {
9
+ const { db, spies } = createMockDb<DB>();
10
+ spies.select.mockReturnValue([baseJournalEntry, postedJournalEntry]);
11
+
12
+ const result = await run(db, { companyId: "company-1" });
13
+
14
+ expect(result.ok).toBe(true);
15
+ if (result.ok) {
16
+ expect(result.value.items).toEqual([baseJournalEntry, postedJournalEntry]);
17
+ expect(result.value.hasNextPage).toBe(false);
18
+ }
19
+ });
20
+
21
+ it("returns journal entries filtered by accounting period", async () => {
22
+ const { db, spies } = createMockDb<DB>();
23
+ spies.select.mockReturnValue([baseJournalEntry]);
24
+
25
+ const result = await run(db, {
26
+ companyId: "company-1",
27
+ accountingPeriodId: "period-1",
28
+ });
29
+
30
+ expect(result.ok).toBe(true);
31
+ if (result.ok) {
32
+ expect(result.value.items).toEqual([baseJournalEntry]);
33
+ }
34
+ });
35
+
36
+ it("returns journal entries filtered by journal type", async () => {
37
+ const { db, spies } = createMockDb<DB>();
38
+ spies.select.mockReturnValue([baseJournalEntry]);
39
+
40
+ const result = await run(db, {
41
+ companyId: "company-1",
42
+ journalType: "MISCELLANEOUS",
43
+ });
44
+
45
+ expect(result.ok).toBe(true);
46
+ if (result.ok) {
47
+ expect(result.value.items).toEqual([baseJournalEntry]);
48
+ }
49
+ });
50
+
51
+ it("returns journal entries filtered by status", async () => {
52
+ const { db, spies } = createMockDb<DB>();
53
+ spies.select.mockReturnValue([postedJournalEntry]);
54
+
55
+ const result = await run(db, { companyId: "company-1", status: "POSTED" });
56
+
57
+ expect(result.ok).toBe(true);
58
+ if (result.ok) {
59
+ expect(result.value.items).toEqual([postedJournalEntry]);
60
+ }
61
+ });
62
+
63
+ it("returns journal entries filtered by date range", async () => {
64
+ const { db, spies } = createMockDb<DB>();
65
+ spies.select.mockReturnValue([baseJournalEntry]);
66
+
67
+ const result = await run(db, {
68
+ companyId: "company-1",
69
+ startDate: new Date("2024-01-01"),
70
+ endDate: new Date("2024-01-31"),
71
+ });
72
+
73
+ expect(result.ok).toBe(true);
74
+ if (result.ok) {
75
+ expect(result.value.items).toEqual([baseJournalEntry]);
76
+ }
77
+ });
78
+
79
+ it("returns empty list when no journal entries match", async () => {
80
+ const { db, spies } = createMockDb<DB>();
81
+ spies.select.mockReturnValue([]);
82
+
83
+ const result = await run(db, { companyId: "nonexistent" });
84
+
85
+ expect(result.ok).toBe(true);
86
+ if (result.ok) {
87
+ expect(result.value.items).toEqual([]);
88
+ expect(result.value.hasNextPage).toBe(false);
89
+ }
90
+ });
91
+ });
@@ -0,0 +1,64 @@
1
+ import {
2
+ ok,
3
+ type ReadonlyDB,
4
+ type PaginationInput,
5
+ buildPaginatedResult,
6
+ DEFAULT_PAGE_SIZE,
7
+ } from "@tailor-platform/erp-kit/module";
8
+ import type { JournalEntryJournalType, JournalEntryStatus } from "../generated/enums";
9
+ import type { DB } from "../generated/kysely-tailordb";
10
+
11
+ type JournalEntryOrderByField =
12
+ | "entryDate"
13
+ | "referenceNumber"
14
+ | "journalType"
15
+ | "status"
16
+ | "createdAt";
17
+
18
+ export interface ListJournalEntriesInput extends PaginationInput<JournalEntryOrderByField> {
19
+ companyId: string;
20
+ accountingPeriodId?: string;
21
+ journalType?: string;
22
+ status?: string;
23
+ startDate?: Date;
24
+ endDate?: Date;
25
+ }
26
+
27
+ /**
28
+ * Function: listJournalEntries
29
+ *
30
+ * Lists journal entry headers for a company with optional filters for
31
+ * accounting period, journal type, status, and date range.
32
+ */
33
+ export async function run(db: ReadonlyDB<DB>, input: ListJournalEntriesInput) {
34
+ const limit = input.limit ?? DEFAULT_PAGE_SIZE;
35
+ const offset = input.offset ?? 0;
36
+ const orderBy = input.orderBy ?? "entryDate";
37
+ const orderDirection = input.orderDirection ?? "desc";
38
+
39
+ let query = db.selectFrom("JournalEntry").selectAll().where("companyId", "=", input.companyId);
40
+
41
+ if (input.accountingPeriodId) {
42
+ query = query.where("accountingPeriodId", "=", input.accountingPeriodId);
43
+ }
44
+ if (input.journalType) {
45
+ query = query.where("journalType", "=", input.journalType as JournalEntryJournalType);
46
+ }
47
+ if (input.status) {
48
+ query = query.where("status", "=", input.status as JournalEntryStatus);
49
+ }
50
+ if (input.startDate) {
51
+ query = query.where("entryDate", ">=", input.startDate);
52
+ }
53
+ if (input.endDate) {
54
+ query = query.where("entryDate", "<=", input.endDate);
55
+ }
56
+
57
+ const results = await query
58
+ .orderBy(orderBy, orderDirection)
59
+ .limit(limit + 1)
60
+ .offset(offset)
61
+ .execute();
62
+
63
+ return ok(buildPaginatedResult(results, limit));
64
+ }
@@ -0,0 +1,5 @@
1
+ // @generated — do not edit
2
+ import { defineQuery } from "@tailor-platform/erp-kit/module";
3
+ import { run } from "./listPeriodCloses";
4
+
5
+ export const listPeriodCloses = defineQuery(run);
@@ -0,0 +1,63 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createMockDb } from "../../../testing/index";
3
+ import type { DB } from "../generated/kysely-tailordb";
4
+ import { basePeriodClose, inProgressPeriodClose } from "../testing/fixtures";
5
+ import { run } from "./listPeriodCloses";
6
+
7
+ describe("listPeriodCloses", () => {
8
+ it("returns all period closes for a company", async () => {
9
+ const { db, spies } = createMockDb<DB>();
10
+ spies.select.mockReturnValue([basePeriodClose, inProgressPeriodClose]);
11
+
12
+ const result = await run(db, { companyId: "company-1" });
13
+
14
+ expect(result.ok).toBe(true);
15
+ if (result.ok) {
16
+ expect(result.value.items).toEqual([basePeriodClose, inProgressPeriodClose]);
17
+ expect(result.value.hasNextPage).toBe(false);
18
+ }
19
+ });
20
+
21
+ it("returns period closes filtered by fiscal year", async () => {
22
+ const { db, spies } = createMockDb<DB>();
23
+ spies.select.mockReturnValue([basePeriodClose]);
24
+
25
+ const result = await run(db, {
26
+ companyId: "company-1",
27
+ fiscalYearId: "fiscal-year-1",
28
+ });
29
+
30
+ expect(result.ok).toBe(true);
31
+ if (result.ok) {
32
+ expect(result.value.items).toEqual([basePeriodClose]);
33
+ }
34
+ });
35
+
36
+ it("returns period closes filtered by status", async () => {
37
+ const { db, spies } = createMockDb<DB>();
38
+ spies.select.mockReturnValue([inProgressPeriodClose]);
39
+
40
+ const result = await run(db, {
41
+ companyId: "company-1",
42
+ status: "IN_PROGRESS",
43
+ });
44
+
45
+ expect(result.ok).toBe(true);
46
+ if (result.ok) {
47
+ expect(result.value.items).toEqual([inProgressPeriodClose]);
48
+ }
49
+ });
50
+
51
+ it("returns empty list when no period closes match", async () => {
52
+ const { db, spies } = createMockDb<DB>();
53
+ spies.select.mockReturnValue([]);
54
+
55
+ const result = await run(db, { companyId: "nonexistent" });
56
+
57
+ expect(result.ok).toBe(true);
58
+ if (result.ok) {
59
+ expect(result.value.items).toEqual([]);
60
+ expect(result.value.hasNextPage).toBe(false);
61
+ }
62
+ });
63
+ });
@@ -0,0 +1,64 @@
1
+ import {
2
+ ok,
3
+ type ReadonlyDB,
4
+ type PaginationInput,
5
+ buildPaginatedResult,
6
+ DEFAULT_PAGE_SIZE,
7
+ } from "@tailor-platform/erp-kit/module";
8
+ import type { PeriodCloseStatus } from "../generated/enums";
9
+ import type { DB } from "../generated/kysely-tailordb";
10
+
11
+ type PeriodCloseOrderByField = "status" | "completionPercentage";
12
+
13
+ export interface ListPeriodClosesInput extends PaginationInput<PeriodCloseOrderByField> {
14
+ companyId: string;
15
+ fiscalYearId?: string;
16
+ status?: string;
17
+ }
18
+
19
+ /**
20
+ * Function: listPeriodCloses
21
+ *
22
+ * Lists period close records for a company. Since PeriodClose doesn't have a
23
+ * direct companyId, a subquery through AccountingPeriod is used to filter by
24
+ * company and optionally by fiscal year. Results are sorted by the associated
25
+ * accounting period's startDate ascending by default.
26
+ */
27
+ export async function run(db: ReadonlyDB<DB>, input: ListPeriodClosesInput) {
28
+ const limit = input.limit ?? DEFAULT_PAGE_SIZE;
29
+ const offset = input.offset ?? 0;
30
+ const orderDirection = input.orderDirection ?? "asc";
31
+
32
+ let periodSubquery = db
33
+ .selectFrom("AccountingPeriod")
34
+ .select("id")
35
+ .where("companyId", "=", input.companyId);
36
+
37
+ if (input.fiscalYearId) {
38
+ periodSubquery = periodSubquery.where("fiscalYearId", "=", input.fiscalYearId);
39
+ }
40
+
41
+ let query = db
42
+ .selectFrom("PeriodClose")
43
+ .innerJoin("AccountingPeriod", "AccountingPeriod.id", "PeriodClose.accountingPeriodId")
44
+ .selectAll("PeriodClose")
45
+ .where("PeriodClose.accountingPeriodId", "in", periodSubquery);
46
+
47
+ if (input.status) {
48
+ query = query.where("PeriodClose.status", "=", input.status as PeriodCloseStatus);
49
+ }
50
+
51
+ // Default sort is by AccountingPeriod.startDate ascending per spec
52
+ if (input.orderBy) {
53
+ query = query.orderBy(`PeriodClose.${input.orderBy}` as never, orderDirection);
54
+ } else {
55
+ query = query.orderBy("AccountingPeriod.startDate", orderDirection);
56
+ }
57
+
58
+ const results = await query
59
+ .limit(limit + 1)
60
+ .offset(offset)
61
+ .execute();
62
+
63
+ return ok(buildPaginatedResult(results, limit));
64
+ }
@@ -0,0 +1,5 @@
1
+ // @generated — do not edit
2
+ import { defineQuery } from "@tailor-platform/erp-kit/module";
3
+ import { run } from "./listTrialBalances";
4
+
5
+ export const listTrialBalances = defineQuery(run);
@@ -0,0 +1,78 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createMockDb } from "../../../testing/index";
3
+ import type { DB } from "../generated/kysely-tailordb";
4
+ import { baseTrialBalance } from "../testing/fixtures";
5
+ import { run } from "./listTrialBalances";
6
+
7
+ describe("listTrialBalances", () => {
8
+ it("returns all trial balances for a company", async () => {
9
+ const { db, spies } = createMockDb<DB>();
10
+ spies.select.mockReturnValue([baseTrialBalance]);
11
+
12
+ const result = await run(db, { companyId: "company-1" });
13
+
14
+ expect(result.ok).toBe(true);
15
+ if (result.ok) {
16
+ expect(result.value.items).toEqual([baseTrialBalance]);
17
+ expect(result.value.hasNextPage).toBe(false);
18
+ }
19
+ });
20
+
21
+ it("returns trial balances filtered by accounting period", async () => {
22
+ const { db, spies } = createMockDb<DB>();
23
+ spies.select.mockReturnValue([baseTrialBalance]);
24
+
25
+ const result = await run(db, {
26
+ companyId: "company-1",
27
+ accountingPeriodId: "period-1",
28
+ });
29
+
30
+ expect(result.ok).toBe(true);
31
+ if (result.ok) {
32
+ expect(result.value.items).toEqual([baseTrialBalance]);
33
+ }
34
+ });
35
+
36
+ it("returns trial balances filtered by variant", async () => {
37
+ const { db, spies } = createMockDb<DB>();
38
+ spies.select.mockReturnValue([baseTrialBalance]);
39
+
40
+ const result = await run(db, {
41
+ companyId: "company-1",
42
+ variant: "PRE_CLOSE",
43
+ });
44
+
45
+ expect(result.ok).toBe(true);
46
+ if (result.ok) {
47
+ expect(result.value.items).toEqual([baseTrialBalance]);
48
+ }
49
+ });
50
+
51
+ it("returns trial balances filtered by fiscal year via subquery", async () => {
52
+ const { db, spies } = createMockDb<DB>();
53
+ spies.select.mockReturnValue([baseTrialBalance]);
54
+
55
+ const result = await run(db, {
56
+ companyId: "company-1",
57
+ fiscalYearId: "fiscal-year-1",
58
+ });
59
+
60
+ expect(result.ok).toBe(true);
61
+ if (result.ok) {
62
+ expect(result.value.items).toEqual([baseTrialBalance]);
63
+ }
64
+ });
65
+
66
+ it("returns empty list when no trial balances match", async () => {
67
+ const { db, spies } = createMockDb<DB>();
68
+ spies.select.mockReturnValue([]);
69
+
70
+ const result = await run(db, { companyId: "nonexistent" });
71
+
72
+ expect(result.ok).toBe(true);
73
+ if (result.ok) {
74
+ expect(result.value.items).toEqual([]);
75
+ expect(result.value.hasNextPage).toBe(false);
76
+ }
77
+ });
78
+ });
@@ -0,0 +1,56 @@
1
+ import {
2
+ ok,
3
+ type ReadonlyDB,
4
+ type PaginationInput,
5
+ buildPaginatedResult,
6
+ DEFAULT_PAGE_SIZE,
7
+ } from "@tailor-platform/erp-kit/module";
8
+ import type { TrialBalanceVariant } from "../generated/enums";
9
+ import type { DB } from "../generated/kysely-tailordb";
10
+
11
+ type TrialBalanceOrderByField = "generatedAt" | "variant" | "createdAt";
12
+
13
+ export interface ListTrialBalancesInput extends PaginationInput<TrialBalanceOrderByField> {
14
+ companyId: string;
15
+ accountingPeriodId?: string;
16
+ variant?: string;
17
+ fiscalYearId?: string;
18
+ }
19
+
20
+ /**
21
+ * Function: listTrialBalances
22
+ *
23
+ * Lists trial balance headers for a company with optional filters for
24
+ * accounting period, variant, and fiscal year. When fiscalYearId is provided,
25
+ * a subquery finds accounting period IDs belonging to that fiscal year.
26
+ */
27
+ export async function run(db: ReadonlyDB<DB>, input: ListTrialBalancesInput) {
28
+ const limit = input.limit ?? DEFAULT_PAGE_SIZE;
29
+ const offset = input.offset ?? 0;
30
+ const orderBy = input.orderBy ?? "generatedAt";
31
+ const orderDirection = input.orderDirection ?? "desc";
32
+
33
+ let query = db.selectFrom("TrialBalance").selectAll().where("companyId", "=", input.companyId);
34
+
35
+ if (input.accountingPeriodId) {
36
+ query = query.where("accountingPeriodId", "=", input.accountingPeriodId);
37
+ }
38
+ if (input.variant) {
39
+ query = query.where("variant", "=", input.variant as TrialBalanceVariant);
40
+ }
41
+ if (input.fiscalYearId) {
42
+ query = query.where(
43
+ "accountingPeriodId",
44
+ "in",
45
+ db.selectFrom("AccountingPeriod").select("id").where("fiscalYearId", "=", input.fiscalYearId),
46
+ );
47
+ }
48
+
49
+ const results = await query
50
+ .orderBy(orderBy, orderDirection)
51
+ .limit(limit + 1)
52
+ .offset(offset)
53
+ .execute();
54
+
55
+ return ok(buildPaginatedResult(results, limit));
56
+ }
@@ -0,0 +1,19 @@
1
+ // Export seed data maps here.
2
+ // Use PascalCase names matching entity types — `erp-kit app generate seed`
3
+ // discovers exports automatically and writes <ExportName>.jsonl files.
4
+ //
5
+ // Example:
6
+ //
7
+ // import { uuidv5 } from "../../../shared/uuidv5";
8
+ // const NS = "erp-kit:<module-name>";
9
+ //
10
+ // export const entityIds = {
11
+ // foo: uuidv5(NS, "entity:foo"),
12
+ // } as const;
13
+ //
14
+ // const entities: Record<string, SeedRow> = {
15
+ // [entityIds.foo]: { name: "Foo", ... },
16
+ // };
17
+ //
18
+ // // Re-export with PascalCase entity name
19
+ // export { entities as Entity };
@@ -0,0 +1,13 @@
1
+ import { defineConfig, definePlugins } from "@tailor-platform/sdk";
2
+ import { kyselyTypePlugin } from "@tailor-platform/sdk/plugin/kysely-type";
3
+ import { enumConstantsPlugin } from "@tailor-platform/sdk/plugin/enum-constants";
4
+
5
+ export default defineConfig({
6
+ name: "finance-ledger",
7
+ db: { "main-db": { files: [`./db/*.ts`, `./lib/_db_deps.ts`] } },
8
+ });
9
+
10
+ export const plugins = definePlugins(
11
+ kyselyTypePlugin({ distPath: `./generated/kysely-tailordb.ts` }),
12
+ enumConstantsPlugin({ distPath: "./generated/enums.ts" }),
13
+ );
@@ -0,0 +1,13 @@
1
+ // This file is auto-generated by @tailor-platform/sdk
2
+ // Do not edit this file manually
3
+ // Regenerated automatically when running 'tailor-sdk apply' or 'tailor-sdk generate'
4
+
5
+ declare module "@tailor-platform/sdk" {
6
+ interface AttributeMap {}
7
+ interface AttributeList {
8
+ __tuple?: [];
9
+ }
10
+ interface Env {}
11
+ }
12
+
13
+ export {};
@@ -0,0 +1,35 @@
1
+ import { expect } from "vitest";
2
+ import { type CommandContext } from "@tailor-platform/erp-kit/module";
3
+
4
+ export const commandCtx: CommandContext = {
5
+ actorId: "test-actor",
6
+ permissions: ["finance-ledger:*"],
7
+ };
8
+
9
+ interface OkResult<T> {
10
+ ok: true;
11
+ value: T;
12
+ }
13
+
14
+ interface ErrResult {
15
+ ok: false;
16
+ error: unknown;
17
+ }
18
+
19
+ export function expectErr(
20
+ result: OkResult<unknown> | ErrResult,
21
+ errorClass: abstract new (...args: never[]) => Error,
22
+ ) {
23
+ expect(result.ok).toBe(false);
24
+ if (!result.ok) {
25
+ expect(result.error).toBeInstanceOf(errorClass);
26
+ }
27
+ }
28
+
29
+ export function expectOk<T>(result: OkResult<T> | ErrResult) {
30
+ expect(result.ok).toBe(true);
31
+ if (!result.ok) {
32
+ throw result.error;
33
+ }
34
+ return result.value;
35
+ }