@things-factory/accounting 7.0.6 → 8.0.0-alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (231) hide show
  1. package/client/activities/activity-book-edit.ts +1 -1
  2. package/client/activities/activity-book-view.ts +1 -1
  3. package/client/activities/activity-expense-edit.ts +1 -1
  4. package/client/activities/activity-expense-view.ts +1 -1
  5. package/client/pages/account/account-importer.ts +19 -8
  6. package/client/pages/account/account-list-page.ts +5 -6
  7. package/client/pages/accounting-category/accounting-category-importer.ts +19 -8
  8. package/client/pages/accounting-category/accounting-category-list-page.ts +5 -5
  9. package/client/pages/financial-statement/financial-statement-importer.ts +19 -8
  10. package/client/pages/financial-statement/financial-statement-list-page.ts +5 -6
  11. package/client/pages/fiscal-month/fiscal-month-importer.ts +90 -0
  12. package/client/pages/fiscal-month/fiscal-month-list-page.ts +398 -0
  13. package/client/pages/fiscal-quarter/fiscal-quarter-importer.ts +90 -0
  14. package/client/pages/fiscal-quarter/fiscal-quarter-list-page.ts +398 -0
  15. package/client/pages/fiscal-year/fiscal-year-importer.ts +90 -0
  16. package/client/pages/fiscal-year/fiscal-year-list-page.ts +398 -0
  17. package/client/pages/income-statement/income-statement-importer.ts +19 -8
  18. package/client/pages/income-statement/income-statement-list-page.ts +5 -6
  19. package/client/pages/ledger/ledger-importer.ts +19 -8
  20. package/client/pages/ledger/ledger-list-page.ts +5 -6
  21. package/client/pages/transaction/transaction-importer.ts +19 -8
  22. package/client/pages/transaction/transaction-list-page.ts +5 -6
  23. package/client/route.ts +17 -5
  24. package/dist-client/activities/activity-book-edit.js +1 -1
  25. package/dist-client/activities/activity-book-edit.js.map +1 -1
  26. package/dist-client/activities/activity-book-view.js +1 -1
  27. package/dist-client/activities/activity-book-view.js.map +1 -1
  28. package/dist-client/activities/activity-expense-edit.js +1 -1
  29. package/dist-client/activities/activity-expense-edit.js.map +1 -1
  30. package/dist-client/activities/activity-expense-view.js +1 -1
  31. package/dist-client/activities/activity-expense-view.js.map +1 -1
  32. package/dist-client/pages/account/account-importer.d.ts +0 -1
  33. package/dist-client/pages/account/account-importer.js +12 -5
  34. package/dist-client/pages/account/account-importer.js.map +1 -1
  35. package/dist-client/pages/account/account-list-page.js +5 -6
  36. package/dist-client/pages/account/account-list-page.js.map +1 -1
  37. package/dist-client/pages/accounting-category/accounting-category-importer.d.ts +0 -1
  38. package/dist-client/pages/accounting-category/accounting-category-importer.js +12 -5
  39. package/dist-client/pages/accounting-category/accounting-category-importer.js.map +1 -1
  40. package/dist-client/pages/accounting-category/accounting-category-list-page.js +5 -5
  41. package/dist-client/pages/accounting-category/accounting-category-list-page.js.map +1 -1
  42. package/dist-client/pages/financial-statement/financial-statement-importer.d.ts +0 -1
  43. package/dist-client/pages/financial-statement/financial-statement-importer.js +12 -5
  44. package/dist-client/pages/financial-statement/financial-statement-importer.js.map +1 -1
  45. package/dist-client/pages/financial-statement/financial-statement-list-page.js +5 -6
  46. package/dist-client/pages/financial-statement/financial-statement-list-page.js.map +1 -1
  47. package/dist-client/pages/fiscal-month/fiscal-month-importer.d.ts +23 -0
  48. package/dist-client/pages/fiscal-month/fiscal-month-importer.js +93 -0
  49. package/dist-client/pages/fiscal-month/fiscal-month-importer.js.map +1 -0
  50. package/dist-client/pages/fiscal-month/fiscal-month-list-page.d.ts +66 -0
  51. package/dist-client/pages/fiscal-month/fiscal-month-list-page.js +370 -0
  52. package/dist-client/pages/fiscal-month/fiscal-month-list-page.js.map +1 -0
  53. package/dist-client/pages/fiscal-quarter/fiscal-quarter-importer.d.ts +23 -0
  54. package/dist-client/pages/fiscal-quarter/fiscal-quarter-importer.js +93 -0
  55. package/dist-client/pages/fiscal-quarter/fiscal-quarter-importer.js.map +1 -0
  56. package/dist-client/pages/fiscal-quarter/fiscal-quarter-list-page.d.ts +66 -0
  57. package/dist-client/pages/fiscal-quarter/fiscal-quarter-list-page.js +370 -0
  58. package/dist-client/pages/fiscal-quarter/fiscal-quarter-list-page.js.map +1 -0
  59. package/dist-client/pages/fiscal-year/fiscal-year-importer.d.ts +23 -0
  60. package/dist-client/pages/fiscal-year/fiscal-year-importer.js +93 -0
  61. package/dist-client/pages/fiscal-year/fiscal-year-importer.js.map +1 -0
  62. package/dist-client/pages/fiscal-year/fiscal-year-list-page.d.ts +66 -0
  63. package/dist-client/pages/fiscal-year/fiscal-year-list-page.js +370 -0
  64. package/dist-client/pages/fiscal-year/fiscal-year-list-page.js.map +1 -0
  65. package/dist-client/pages/income-statement/income-statement-importer.d.ts +0 -1
  66. package/dist-client/pages/income-statement/income-statement-importer.js +12 -5
  67. package/dist-client/pages/income-statement/income-statement-importer.js.map +1 -1
  68. package/dist-client/pages/income-statement/income-statement-list-page.js +5 -6
  69. package/dist-client/pages/income-statement/income-statement-list-page.js.map +1 -1
  70. package/dist-client/pages/ledger/ledger-importer.d.ts +0 -1
  71. package/dist-client/pages/ledger/ledger-importer.js +12 -5
  72. package/dist-client/pages/ledger/ledger-importer.js.map +1 -1
  73. package/dist-client/pages/ledger/ledger-list-page.js +5 -6
  74. package/dist-client/pages/ledger/ledger-list-page.js.map +1 -1
  75. package/dist-client/pages/transaction/transaction-importer.d.ts +0 -1
  76. package/dist-client/pages/transaction/transaction-importer.js +12 -5
  77. package/dist-client/pages/transaction/transaction-importer.js.map +1 -1
  78. package/dist-client/pages/transaction/transaction-list-page.js +5 -6
  79. package/dist-client/pages/transaction/transaction-list-page.js.map +1 -1
  80. package/dist-client/route.d.ts +1 -1
  81. package/dist-client/route.js +9 -0
  82. package/dist-client/route.js.map +1 -1
  83. package/dist-client/tsconfig.tsbuildinfo +1 -1
  84. package/dist-server/controllers/index.d.ts +1 -0
  85. package/dist-server/controllers/index.js +4 -0
  86. package/dist-server/controllers/index.js.map +1 -1
  87. package/dist-server/controllers/summary-statements.d.ts +4 -0
  88. package/dist-server/controllers/summary-statements.js +143 -0
  89. package/dist-server/controllers/summary-statements.js.map +1 -0
  90. package/dist-server/index.d.ts +1 -0
  91. package/dist-server/index.js +1 -0
  92. package/dist-server/index.js.map +1 -1
  93. package/dist-server/migrations/1725200507196-seed-fiscal-entities.d.ts +5 -0
  94. package/dist-server/migrations/1725200507196-seed-fiscal-entities.js +95 -0
  95. package/dist-server/migrations/1725200507196-seed-fiscal-entities.js.map +1 -0
  96. package/dist-server/migrations/1725201467183-seed-accounts.d.ts +5 -0
  97. package/dist-server/migrations/1725201467183-seed-accounts.js +318 -0
  98. package/dist-server/migrations/1725201467183-seed-accounts.js.map +1 -0
  99. package/dist-server/routes.d.ts +1 -0
  100. package/dist-server/routes.js +1 -0
  101. package/dist-server/routes.js.map +1 -1
  102. package/dist-server/service/account/account-history.js +3 -3
  103. package/dist-server/service/account/account-history.js.map +1 -1
  104. package/dist-server/service/account/account-query.js +1 -1
  105. package/dist-server/service/account/account-query.js.map +1 -1
  106. package/dist-server/service/account/account.js +1 -1
  107. package/dist-server/service/account/account.js.map +1 -1
  108. package/dist-server/service/accounting-category/accounting-category-query.js +1 -1
  109. package/dist-server/service/accounting-category/accounting-category-query.js.map +1 -1
  110. package/dist-server/service/accounting-category/accounting-category-type.d.ts +2 -0
  111. package/dist-server/service/accounting-category/accounting-category-type.js +8 -0
  112. package/dist-server/service/accounting-category/accounting-category-type.js.map +1 -1
  113. package/dist-server/service/accounting-category/accounting-category.d.ts +1 -0
  114. package/dist-server/service/accounting-category/accounting-category.js +7 -1
  115. package/dist-server/service/accounting-category/accounting-category.js.map +1 -1
  116. package/dist-server/service/common-type.d.ts +5 -0
  117. package/dist-server/service/common-type.js +15 -0
  118. package/dist-server/service/common-type.js.map +1 -0
  119. package/dist-server/service/financial-statement/financial-statement-history.js +3 -3
  120. package/dist-server/service/financial-statement/financial-statement-history.js.map +1 -1
  121. package/dist-server/service/financial-statement/financial-statement-query.js +1 -1
  122. package/dist-server/service/financial-statement/financial-statement-query.js.map +1 -1
  123. package/dist-server/service/financial-statement/financial-statement.js +1 -1
  124. package/dist-server/service/financial-statement/financial-statement.js.map +1 -1
  125. package/dist-server/service/fiscal-month/fiscal-month-mutation.d.ts +10 -0
  126. package/dist-server/service/fiscal-month/fiscal-month-mutation.js +128 -0
  127. package/dist-server/service/fiscal-month/fiscal-month-mutation.js.map +1 -0
  128. package/dist-server/service/fiscal-month/fiscal-month-query.d.ts +11 -0
  129. package/dist-server/service/fiscal-month/fiscal-month-query.js +81 -0
  130. package/dist-server/service/fiscal-month/fiscal-month-query.js.map +1 -0
  131. package/dist-server/service/fiscal-month/fiscal-month-type.d.ts +26 -0
  132. package/dist-server/service/fiscal-month/fiscal-month-type.js +98 -0
  133. package/dist-server/service/fiscal-month/fiscal-month-type.js.map +1 -0
  134. package/dist-server/service/fiscal-month/fiscal-month.d.ts +22 -0
  135. package/dist-server/service/fiscal-month/fiscal-month.js +99 -0
  136. package/dist-server/service/fiscal-month/fiscal-month.js.map +1 -0
  137. package/dist-server/service/fiscal-month/index.d.ts +6 -0
  138. package/dist-server/service/fiscal-month/index.js +10 -0
  139. package/dist-server/service/fiscal-month/index.js.map +1 -0
  140. package/dist-server/service/fiscal-quarter/fiscal-quarter-mutation.d.ts +10 -0
  141. package/dist-server/service/fiscal-quarter/fiscal-quarter-mutation.js +128 -0
  142. package/dist-server/service/fiscal-quarter/fiscal-quarter-mutation.js.map +1 -0
  143. package/dist-server/service/fiscal-quarter/fiscal-quarter-query.d.ts +11 -0
  144. package/dist-server/service/fiscal-quarter/fiscal-quarter-query.js +83 -0
  145. package/dist-server/service/fiscal-quarter/fiscal-quarter-query.js.map +1 -0
  146. package/dist-server/service/fiscal-quarter/fiscal-quarter-type.d.ts +24 -0
  147. package/dist-server/service/fiscal-quarter/fiscal-quarter-type.js +90 -0
  148. package/dist-server/service/fiscal-quarter/fiscal-quarter-type.js.map +1 -0
  149. package/dist-server/service/fiscal-quarter/fiscal-quarter.d.ts +21 -0
  150. package/dist-server/service/fiscal-quarter/fiscal-quarter.js +94 -0
  151. package/dist-server/service/fiscal-quarter/fiscal-quarter.js.map +1 -0
  152. package/dist-server/service/fiscal-quarter/index.d.ts +6 -0
  153. package/dist-server/service/fiscal-quarter/index.js +10 -0
  154. package/dist-server/service/fiscal-quarter/index.js.map +1 -0
  155. package/dist-server/service/fiscal-year/fiscal-year-mutation.d.ts +10 -0
  156. package/dist-server/service/fiscal-year/fiscal-year-mutation.js +128 -0
  157. package/dist-server/service/fiscal-year/fiscal-year-mutation.js.map +1 -0
  158. package/dist-server/service/fiscal-year/fiscal-year-query.d.ts +11 -0
  159. package/dist-server/service/fiscal-year/fiscal-year-query.js +79 -0
  160. package/dist-server/service/fiscal-year/fiscal-year-query.js.map +1 -0
  161. package/dist-server/service/fiscal-year/fiscal-year-type.d.ts +22 -0
  162. package/dist-server/service/fiscal-year/fiscal-year-type.js +82 -0
  163. package/dist-server/service/fiscal-year/fiscal-year-type.js.map +1 -0
  164. package/dist-server/service/fiscal-year/fiscal-year.d.ts +20 -0
  165. package/dist-server/service/fiscal-year/fiscal-year.js +89 -0
  166. package/dist-server/service/fiscal-year/fiscal-year.js.map +1 -0
  167. package/dist-server/service/fiscal-year/index.d.ts +6 -0
  168. package/dist-server/service/fiscal-year/index.js +10 -0
  169. package/dist-server/service/fiscal-year/index.js.map +1 -0
  170. package/dist-server/service/income-statement/income-statement-history.js +3 -3
  171. package/dist-server/service/income-statement/income-statement-history.js.map +1 -1
  172. package/dist-server/service/income-statement/income-statement-query.js +1 -1
  173. package/dist-server/service/income-statement/income-statement-query.js.map +1 -1
  174. package/dist-server/service/income-statement/income-statement.js +3 -3
  175. package/dist-server/service/income-statement/income-statement.js.map +1 -1
  176. package/dist-server/service/index.d.ts +5 -2
  177. package/dist-server/service/index.js +19 -3
  178. package/dist-server/service/index.js.map +1 -1
  179. package/dist-server/service/transaction/index.d.ts +1 -2
  180. package/dist-server/service/transaction/transaction-history.d.ts +10 -2
  181. package/dist-server/service/transaction/transaction-history.js +43 -6
  182. package/dist-server/service/transaction/transaction-history.js.map +1 -1
  183. package/dist-server/service/transaction/transaction-query.js +1 -1
  184. package/dist-server/service/transaction/transaction-query.js.map +1 -1
  185. package/dist-server/service/transaction/transaction.d.ts +8 -5
  186. package/dist-server/service/transaction/transaction.js +33 -10
  187. package/dist-server/service/transaction/transaction.js.map +1 -1
  188. package/dist-server/tsconfig.tsbuildinfo +1 -1
  189. package/helps/accounting/fiscal-month.md +160 -0
  190. package/helps/accounting/fiscal-quarter.md +160 -0
  191. package/helps/accounting/fiscal-year.md +160 -0
  192. package/package.json +9 -8
  193. package/server/controllers/index.ts +1 -0
  194. package/server/controllers/summary-statements.ts +160 -0
  195. package/server/index.ts +1 -0
  196. package/server/migrations/1725200507196-seed-fiscal-entities.ts +106 -0
  197. package/server/migrations/1725201467183-seed-accounts.ts +339 -0
  198. package/server/routes.ts +2 -0
  199. package/server/service/account/account-history.ts +5 -5
  200. package/server/service/account/account-query.ts +1 -1
  201. package/server/service/account/account.ts +1 -1
  202. package/server/service/accounting-category/accounting-category-query.ts +1 -1
  203. package/server/service/accounting-category/accounting-category-type.ts +6 -0
  204. package/server/service/accounting-category/accounting-category.ts +10 -1
  205. package/server/service/common-type.ts +12 -0
  206. package/server/service/financial-statement/financial-statement-history.ts +5 -5
  207. package/server/service/financial-statement/financial-statement-query.ts +1 -1
  208. package/server/service/financial-statement/financial-statement.ts +1 -1
  209. package/server/service/fiscal-month/fiscal-month-mutation.ts +137 -0
  210. package/server/service/fiscal-month/fiscal-month-query.ts +56 -0
  211. package/server/service/fiscal-month/fiscal-month-type.ts +66 -0
  212. package/server/service/fiscal-month/fiscal-month.ts +84 -0
  213. package/server/service/fiscal-month/index.ts +7 -0
  214. package/server/service/fiscal-quarter/fiscal-quarter-mutation.ts +137 -0
  215. package/server/service/fiscal-quarter/fiscal-quarter-query.ts +58 -0
  216. package/server/service/fiscal-quarter/fiscal-quarter-type.ts +60 -0
  217. package/server/service/fiscal-quarter/fiscal-quarter.ts +80 -0
  218. package/server/service/fiscal-quarter/index.ts +7 -0
  219. package/server/service/fiscal-year/fiscal-year-mutation.ts +137 -0
  220. package/server/service/fiscal-year/fiscal-year-query.ts +51 -0
  221. package/server/service/fiscal-year/fiscal-year-type.ts +54 -0
  222. package/server/service/fiscal-year/fiscal-year.ts +76 -0
  223. package/server/service/fiscal-year/index.ts +7 -0
  224. package/server/service/income-statement/income-statement-history.ts +5 -5
  225. package/server/service/income-statement/income-statement-query.ts +1 -4
  226. package/server/service/income-statement/income-statement.ts +3 -3
  227. package/server/service/index.ts +31 -3
  228. package/server/service/transaction/transaction-history.ts +35 -7
  229. package/server/service/transaction/transaction-query.ts +1 -4
  230. package/server/service/transaction/transaction.ts +34 -15
  231. package/things-factory.config.js +3 -1
@@ -0,0 +1,106 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm'
2
+ import { Domain, getRepository } from '@things-factory/shell'
3
+ import { User } from '@things-factory/auth-base'
4
+ import { FiscalYear } from '../service/fiscal-year/fiscal-year'
5
+ import { FiscalQuarter } from '../service/fiscal-quarter/fiscal-quarter'
6
+ import { FiscalMonth } from '../service/fiscal-month/fiscal-month'
7
+ import { FiscalStatus } from '../service/common-type'
8
+
9
+ export class SeedFiscalEntities1725200507196 implements MigrationInterface {
10
+ public async up(queryRunner: QueryRunner): Promise<void> {
11
+ const domainRepository = getRepository(Domain)
12
+ const userRepository = getRepository(User)
13
+ const fiscalYearRepository = getRepository(FiscalYear)
14
+ const fiscalQuarterRepository = getRepository(FiscalQuarter)
15
+ const fiscalMonthRepository = getRepository(FiscalMonth)
16
+
17
+ const domain: Domain | null = await domainRepository.findOne({
18
+ where: { name: 'SYSTEM' }
19
+ })
20
+
21
+ if (!domain) {
22
+ throw new Error('SYSTEM domain not found')
23
+ }
24
+
25
+ const user = await userRepository.findOne({ where: { id: domain.owner } })
26
+
27
+ if (!user) {
28
+ throw new Error('Domain owner not found')
29
+ }
30
+
31
+ const currentYear = new Date().getFullYear()
32
+
33
+ try {
34
+ // Fiscal Year 생성
35
+ const fiscalYear = await fiscalYearRepository.save({
36
+ domain,
37
+ year: currentYear,
38
+ startDate: `${currentYear}-01-01`, // 문자열로 저장
39
+ endDate: `${currentYear}-12-31`, // 문자열로 저장
40
+ status: FiscalStatus.OPEN,
41
+ creator: user,
42
+ updater: user
43
+ })
44
+
45
+ // Fiscal Quarters 생성
46
+ for (let quarter = 1; quarter <= 4; quarter++) {
47
+ const startMonth = (quarter - 1) * 3 + 1
48
+ const endMonth = quarter * 3
49
+
50
+ const fiscalQuarter = await fiscalQuarterRepository.save({
51
+ domain,
52
+ year: currentYear,
53
+ quarter,
54
+ startDate: `${currentYear}-${String(startMonth).padStart(2, '0')}-01`, // 문자열로 저장
55
+ endDate: `${currentYear}-${String(endMonth).padStart(2, '0')}-31`, // 임시로 월의 마지막 날을 31일로 설정
56
+ status: FiscalStatus.OPEN,
57
+ creator: user,
58
+ updater: user
59
+ })
60
+
61
+ // Fiscal Months 생성
62
+ for (let month = startMonth; month <= endMonth; month++) {
63
+ const startDate = `${currentYear}-${String(month).padStart(2, '0')}-01`
64
+ const endDate = `${currentYear}-${String(month).padStart(2, '0')}-${new Date(currentYear, month, 0).getDate()}`
65
+
66
+ await fiscalMonthRepository.save({
67
+ domain,
68
+ year: currentYear,
69
+ quarter,
70
+ month,
71
+ startDate,
72
+ endDate,
73
+ status: FiscalStatus.OPEN,
74
+ creator: user,
75
+ updater: user
76
+ })
77
+ }
78
+ }
79
+ } catch (error) {
80
+ console.error('Failed to seed fiscal entities:', error)
81
+ throw error
82
+ }
83
+ }
84
+
85
+ public async down(queryRunner: QueryRunner): Promise<void> {
86
+ const domainRepository = getRepository(Domain)
87
+ const fiscalYearRepository = getRepository(FiscalYear)
88
+ const fiscalQuarterRepository = getRepository(FiscalQuarter)
89
+ const fiscalMonthRepository = getRepository(FiscalMonth)
90
+
91
+ const domain: Domain | null = await domainRepository.findOne({
92
+ where: { name: 'SYSTEM' }
93
+ })
94
+
95
+ if (!domain) {
96
+ throw new Error('SYSTEM domain not found')
97
+ }
98
+
99
+ const currentYear = new Date().getFullYear()
100
+
101
+ // FiscalMonth, FiscalQuarter, FiscalYear 삭제
102
+ await fiscalMonthRepository.delete({ domain, year: currentYear })
103
+ await fiscalQuarterRepository.delete({ domain, year: currentYear })
104
+ await fiscalYearRepository.delete({ domain, year: currentYear })
105
+ }
106
+ }
@@ -0,0 +1,339 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm'
2
+ import { Domain, getRepository } from '@things-factory/shell'
3
+ import { User } from '@things-factory/auth-base'
4
+ import { Account } from '../service/account/account'
5
+ import { AccountingCategory } from '../service/accounting-category/accounting-category'
6
+
7
+ export class SeedAccounts1725201467183 implements MigrationInterface {
8
+ public async up(queryRunner: QueryRunner): Promise<void> {
9
+ const domainRepository = getRepository(Domain)
10
+ const userRepository = getRepository(User)
11
+ const accountingCategoryRepository = getRepository(AccountingCategory)
12
+ const accountRepository = getRepository(Account)
13
+
14
+ const domain: Domain | null = await domainRepository.findOne({
15
+ where: { name: 'SYSTEM' }
16
+ })
17
+
18
+ if (!domain) {
19
+ throw new Error('SYSTEM domain not found')
20
+ }
21
+
22
+ const user = await userRepository.findOne({ where: { id: domain.owner } })
23
+
24
+ if (!user) {
25
+ throw new Error('Domain owner not found')
26
+ }
27
+
28
+ try {
29
+ // 최상위 카테고리 생성
30
+ const topLevelCategories = {
31
+ 자산: await accountingCategoryRepository.save({
32
+ domain,
33
+ code: 'ASSET',
34
+ name: '자산',
35
+ description: '기업이 소유하고 있는 자산',
36
+ creator: user,
37
+ updater: user
38
+ }),
39
+ 부채: await accountingCategoryRepository.save({
40
+ domain,
41
+ code: 'LIABILITY',
42
+ name: '부채',
43
+ description: '기업이 갚아야 할 빚',
44
+ creator: user,
45
+ updater: user
46
+ }),
47
+ 자본: await accountingCategoryRepository.save({
48
+ domain,
49
+ code: 'EQUITY',
50
+ name: '자본',
51
+ description: '기업 소유주의 자산',
52
+ creator: user,
53
+ updater: user
54
+ }),
55
+ 수익: await accountingCategoryRepository.save({
56
+ domain,
57
+ code: 'REVENUE',
58
+ name: '수익',
59
+ description: '기업이 벌어들인 돈',
60
+ creator: user,
61
+ updater: user
62
+ }),
63
+ 비용: await accountingCategoryRepository.save({
64
+ domain,
65
+ code: 'EXPENSE',
66
+ name: '비용',
67
+ description: '기업 운영에 사용된 돈',
68
+ creator: user,
69
+ updater: user
70
+ })
71
+ }
72
+
73
+ // 유동자산 및 비유동자산과 같은 하위 카테고리 생성
74
+ const subCategories = {
75
+ 유동자산: await accountingCategoryRepository.save({
76
+ domain,
77
+ code: 'CURRENT_ASSET',
78
+ name: '유동자산',
79
+ description: '쉽게 현금화할 수 있는 자산',
80
+ parent: topLevelCategories.자산,
81
+ creator: user,
82
+ updater: user
83
+ }),
84
+ 비유동자산: await accountingCategoryRepository.save({
85
+ domain,
86
+ code: 'NON_CURRENT_ASSET',
87
+ name: '비유동자산',
88
+ description: '장기 보유 자산',
89
+ parent: topLevelCategories.자산,
90
+ creator: user,
91
+ updater: user
92
+ }),
93
+ 유동부채: await accountingCategoryRepository.save({
94
+ domain,
95
+ code: 'CURRENT_LIABILITY',
96
+ name: '유동부채',
97
+ description: '단기간에 상환해야 하는 부채',
98
+ parent: topLevelCategories.부채,
99
+ creator: user,
100
+ updater: user
101
+ }),
102
+ 비유동부채: await accountingCategoryRepository.save({
103
+ domain,
104
+ code: 'NON_CURRENT_LIABILITY',
105
+ name: '비유동부채',
106
+ description: '장기 부채',
107
+ parent: topLevelCategories.부채,
108
+ creator: user,
109
+ updater: user
110
+ })
111
+ }
112
+
113
+ // 이제 유형자산, 무형자산, 단기금융부채 같은 하위 카테고리를 subCategories 객체를 사용하여 생성합니다.
114
+ const furtherSubCategories = {
115
+ 유형자산: await accountingCategoryRepository.save({
116
+ domain,
117
+ code: 'TANGIBLE_ASSET',
118
+ name: '유형자산',
119
+ description: '물리적 형태가 있는 자산',
120
+ parent: subCategories.비유동자산,
121
+ creator: user,
122
+ updater: user
123
+ }),
124
+ 무형자산: await accountingCategoryRepository.save({
125
+ domain,
126
+ code: 'INTANGIBLE_ASSET',
127
+ name: '무형자산',
128
+ description: '물리적 형태가 없는 자산',
129
+ parent: subCategories.비유동자산,
130
+ creator: user,
131
+ updater: user
132
+ }),
133
+ 단기금융부채: await accountingCategoryRepository.save({
134
+ domain,
135
+ code: 'SHORT_TERM_FINANCIAL_LIABILITY',
136
+ name: '단기금융부채',
137
+ description: '단기적으로 갚아야 할 금융부채',
138
+ parent: subCategories.유동부채,
139
+ creator: user,
140
+ updater: user
141
+ })
142
+ }
143
+
144
+ // 계정 생성 및 하위 카테고리 연결
145
+ const accounts = [
146
+ // 유동자산 계정
147
+ {
148
+ controlNumber: '101',
149
+ name: '현금 및 현금성 자산',
150
+ description: '현금, 예금 및 기타 현금성 자산',
151
+ category: subCategories.유동자산
152
+ },
153
+ {
154
+ controlNumber: '102',
155
+ name: '매출채권',
156
+ description: '상품 또는 서비스의 판매로 인해 발생한 채권',
157
+ category: subCategories.유동자산
158
+ },
159
+ {
160
+ controlNumber: '103',
161
+ name: '재고자산',
162
+ description: '판매를 목적으로 보유한 상품, 제품, 원재료 등',
163
+ category: subCategories.유동자산
164
+ },
165
+ {
166
+ controlNumber: '104',
167
+ name: '단기금융상품',
168
+ description: '단기투자 목적으로 보유한 금융상품',
169
+ category: subCategories.유동자산
170
+ },
171
+ {
172
+ controlNumber: '105',
173
+ name: '선급금',
174
+ description: '상품, 서비스 제공을 위해 미리 지급한 금액',
175
+ category: subCategories.유동자산
176
+ },
177
+
178
+ // 비유동자산 계정
179
+ {
180
+ controlNumber: '201',
181
+ name: '건물',
182
+ description: '기업이 소유한 건물',
183
+ category: furtherSubCategories.유형자산
184
+ },
185
+ {
186
+ controlNumber: '202',
187
+ name: '토지',
188
+ description: '기업이 소유한 토지',
189
+ category: furtherSubCategories.유형자산
190
+ },
191
+ {
192
+ controlNumber: '203',
193
+ name: '기계장치',
194
+ description: '생산을 위해 사용되는 기계 및 장치',
195
+ category: furtherSubCategories.유형자산
196
+ },
197
+ {
198
+ controlNumber: '204',
199
+ name: '무형자산',
200
+ description: '특허권, 상표권 등의 무형자산',
201
+ category: furtherSubCategories.무형자산
202
+ },
203
+
204
+ // 유동부채 계정
205
+ {
206
+ controlNumber: '301',
207
+ name: '매입채무',
208
+ description: '상품 또는 서비스의 구매로 인해 발생한 채무',
209
+ category: subCategories.유동부채
210
+ },
211
+ {
212
+ controlNumber: '302',
213
+ name: '단기차입금',
214
+ description: '단기 대출금',
215
+ category: furtherSubCategories.단기금융부채
216
+ },
217
+ {
218
+ controlNumber: '303',
219
+ name: '미지급금',
220
+ description: '이미 발생한 비용에 대한 지급할 금액',
221
+ category: subCategories.유동부채
222
+ },
223
+ {
224
+ controlNumber: '304',
225
+ name: '선수금',
226
+ description: '고객으로부터 미리 받은 금액',
227
+ category: subCategories.유동부채
228
+ },
229
+
230
+ // 비유동부채 계정
231
+ { controlNumber: '401', name: '장기차입금', description: '장기 대출금', category: subCategories.비유동부채 },
232
+ {
233
+ controlNumber: '402',
234
+ name: '퇴직급여충당부채',
235
+ description: '퇴직급여 지급을 위해 설정한 부채',
236
+ category: subCategories.비유동부채
237
+ },
238
+
239
+ // 자본 계정
240
+ { controlNumber: '501', name: '자본금', description: '주주가 납입한 자본', category: topLevelCategories.자본 },
241
+ { controlNumber: '502', name: '이익잉여금', description: '이익의 축적', category: topLevelCategories.자본 },
242
+
243
+ // 수익 계정
244
+ {
245
+ controlNumber: '601',
246
+ name: '제품매출',
247
+ description: '제품의 판매로 인한 수익',
248
+ category: topLevelCategories.수익
249
+ },
250
+ {
251
+ controlNumber: '602',
252
+ name: '상품매출',
253
+ description: '상품의 판매로 인한 수익',
254
+ category: topLevelCategories.수익
255
+ },
256
+ {
257
+ controlNumber: '603',
258
+ name: '용역매출',
259
+ description: '용역 제공으로 인한 수익',
260
+ category: topLevelCategories.수익
261
+ },
262
+ {
263
+ controlNumber: '604',
264
+ name: '이자수익',
265
+ description: '금융 자산에서 발생한 이자수익',
266
+ category: topLevelCategories.수익
267
+ },
268
+ {
269
+ controlNumber: '605',
270
+ name: '배당금수익',
271
+ description: '주식 투자로 인한 배당금 수익',
272
+ category: topLevelCategories.수익
273
+ },
274
+
275
+ // 비용 계정
276
+ {
277
+ controlNumber: '701',
278
+ name: '매출원가',
279
+ description: '제품, 상품, 용역 제공에 대한 원가',
280
+ category: topLevelCategories.비용
281
+ },
282
+ { controlNumber: '702', name: '급여', description: '직원 급여 비용', category: topLevelCategories.비용 },
283
+ { controlNumber: '703', name: '임대료', description: '건물 및 설비 임차료', category: topLevelCategories.비용 },
284
+ {
285
+ controlNumber: '704',
286
+ name: '감가상각비',
287
+ description: '유형자산의 감가상각비용',
288
+ category: topLevelCategories.비용
289
+ },
290
+ {
291
+ controlNumber: '705',
292
+ name: '이자비용',
293
+ description: '차입금에 대한 이자비용',
294
+ category: topLevelCategories.비용
295
+ },
296
+ {
297
+ controlNumber: '706',
298
+ name: '판매비 및 관리비',
299
+ description: '기업 운영에 필요한 비용',
300
+ category: topLevelCategories.비용
301
+ },
302
+ { controlNumber: '707', name: '법인세비용', description: '법인세 납부 비용', category: topLevelCategories.비용 }
303
+ ]
304
+
305
+ // 계정 저장
306
+ for (const account of accounts) {
307
+ await accountRepository.save({
308
+ domain,
309
+ ...account,
310
+ creator: user,
311
+ updater: user
312
+ })
313
+ }
314
+ } catch (error) {
315
+ console.error('Failed to seed accounting categories and accounts:', error)
316
+ throw error
317
+ }
318
+ }
319
+
320
+ public async down(queryRunner: QueryRunner): Promise<void> {
321
+ const domainRepository = getRepository(Domain)
322
+ const accountingCategoryRepository = getRepository(AccountingCategory)
323
+ const accountRepository = getRepository(Account)
324
+
325
+ const domain: Domain | null = await domainRepository.findOne({
326
+ where: { name: 'SYSTEM' }
327
+ })
328
+
329
+ if (!domain) {
330
+ throw new Error('SYSTEM domain not found')
331
+ }
332
+
333
+ // Accounts 삭제
334
+ await accountRepository.delete({ domain })
335
+
336
+ // AccountingCategories 삭제
337
+ await accountingCategoryRepository.delete({ domain })
338
+ }
339
+ }
package/server/routes.ts CHANGED
@@ -1,3 +1,5 @@
1
+ const debug = require('debug')('things-factory:accounting:routes')
2
+
1
3
  process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRouter) => {
2
4
  /*
3
5
  * can add global public routes to application (auth not required, tenancy not required)
@@ -38,7 +38,7 @@ export class AccountHistory implements HistoryEntityInterface<Account> {
38
38
  version?: number = 1
39
39
 
40
40
  @ManyToOne(type => Domain)
41
- @Field(type => Domain)
41
+ @Field({ nullable: true })
42
42
  domain?: Domain
43
43
 
44
44
  @RelationId((account: Account) => account.domain)
@@ -73,14 +73,14 @@ export class AccountHistory implements HistoryEntityInterface<Account> {
73
73
  deletedAt?: Date
74
74
 
75
75
  @ManyToOne(type => User, { nullable: true })
76
- @Field(type => User, { nullable: true })
76
+ @Field({ nullable: true })
77
77
  creator?: User
78
78
 
79
79
  @RelationId((account: Account) => account.creator)
80
80
  creatorId?: string
81
81
 
82
82
  @ManyToOne(type => User, { nullable: true })
83
- @Field(type => User, { nullable: true })
83
+ @Field({ nullable: true })
84
84
  updater?: User
85
85
 
86
86
  @RelationId((account: Account) => account.updater)
@@ -95,8 +95,8 @@ export class AccountHistory implements HistoryEntityInterface<Account> {
95
95
  DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
96
96
  ? 'enum'
97
97
  : DATABASE_TYPE == 'oracle'
98
- ? 'varchar2'
99
- : 'smallint',
98
+ ? 'varchar2'
99
+ : 'smallint',
100
100
  enum: HistoryActionType
101
101
  })
102
102
  public action!: HistoryActionType
@@ -17,7 +17,7 @@ export class AccountQuery {
17
17
  }
18
18
 
19
19
  @Query(returns => AccountList, { description: 'To fetch multiple Accounts' })
20
- async accounts(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<AccountList> {
20
+ async accounts(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<AccountList> {
21
21
  const { domain } = context.state
22
22
 
23
23
  const queryBuilder = getQueryBuilderFromListParams({
@@ -29,7 +29,7 @@ export class Account {
29
29
  version?: number = 1
30
30
 
31
31
  @ManyToOne(type => Domain)
32
- @Field(type => Domain)
32
+ @Field({ nullable: true })
33
33
  domain?: Domain
34
34
 
35
35
  @RelationId((account: Account) => account.domain)
@@ -17,7 +17,7 @@ export class AccountingCategoryQuery {
17
17
 
18
18
  @Query(returns => AccountingCategoryList, { description: 'To fetch multiple AccountingCategories' })
19
19
  async accountingCategories(
20
- @Args(type => ListParam) params: ListParam,
20
+ @Args() params: ListParam,
21
21
  @Ctx() context: ResolverContext
22
22
  ): Promise<AccountingCategoryList> {
23
23
  const { domain } = context.state
@@ -4,6 +4,9 @@ import { AccountingCategory } from './accounting-category'
4
4
 
5
5
  @InputType()
6
6
  export class NewAccountingCategory {
7
+ @Field({ nullable: true, description: 'Account category code' })
8
+ code: string
9
+
7
10
  @Field()
8
11
  name: string
9
12
 
@@ -19,6 +22,9 @@ export class AccountingCategoryPatch {
19
22
  @Field(type => ID, { nullable: true })
20
23
  id?: string
21
24
 
25
+ @Field({ nullable: true, description: 'Account category code' })
26
+ code?: string
27
+
22
28
  @Field({ nullable: true })
23
29
  name?: string
24
30
 
@@ -20,6 +20,11 @@ import { User } from '@things-factory/auth-base'
20
20
  (accountingCategory: AccountingCategory) => [accountingCategory.domain, accountingCategory.name],
21
21
  { unique: true }
22
22
  )
23
+ @Index(
24
+ 'ix_accounting_category_1',
25
+ (accountingCategory: AccountingCategory) => [accountingCategory.domain, accountingCategory.code],
26
+ { unique: true }
27
+ )
23
28
  @ObjectType({ description: 'Entity for AccountingCategory' })
24
29
  export class AccountingCategory {
25
30
  @PrimaryGeneratedColumn('uuid')
@@ -27,12 +32,16 @@ export class AccountingCategory {
27
32
  readonly id: string
28
33
 
29
34
  @ManyToOne(type => Domain)
30
- @Field(type => Domain)
35
+ @Field({ nullable: true })
31
36
  domain?: Domain
32
37
 
33
38
  @RelationId((accountingCategory: AccountingCategory) => accountingCategory.domain)
34
39
  domainId?: string
35
40
 
41
+ @Column()
42
+ @Field({ nullable: true, description: 'Account category code' })
43
+ code?: string
44
+
36
45
  @Column()
37
46
  @Field({ nullable: true })
38
47
  name?: string
@@ -0,0 +1,12 @@
1
+ import { registerEnumType } from 'type-graphql'
2
+
3
+ export enum FiscalStatus {
4
+ OPEN = 'OPEN',
5
+ CLOSED = 'CLOSED',
6
+ FINALIZED = 'FINALIZED'
7
+ }
8
+
9
+ registerEnumType(FiscalStatus, {
10
+ name: 'FiscalStatus',
11
+ description: 'The status of a fiscal period (OPEN, CLOSED, FINALIZED)'
12
+ })
@@ -45,7 +45,7 @@ export class FinancialStatementHistory implements HistoryEntityInterface<Financi
45
45
  version?: number = 1
46
46
 
47
47
  @ManyToOne(type => Domain)
48
- @Field(type => Domain)
48
+ @Field({ nullable: true })
49
49
  domain?: Domain
50
50
 
51
51
  @RelationId((financialStatement: FinancialStatement) => financialStatement.domain)
@@ -84,14 +84,14 @@ export class FinancialStatementHistory implements HistoryEntityInterface<Financi
84
84
  deletedAt?: Date
85
85
 
86
86
  @ManyToOne(type => User, { nullable: true })
87
- @Field(type => User, { nullable: true })
87
+ @Field({ nullable: true })
88
88
  creator?: User
89
89
 
90
90
  @RelationId((financialStatement: FinancialStatement) => financialStatement.creator)
91
91
  creatorId?: string
92
92
 
93
93
  @ManyToOne(type => User, { nullable: true })
94
- @Field(type => User, { nullable: true })
94
+ @Field({ nullable: true })
95
95
  updater?: User
96
96
 
97
97
  @RelationId((financialStatement: FinancialStatement) => financialStatement.updater)
@@ -106,8 +106,8 @@ export class FinancialStatementHistory implements HistoryEntityInterface<Financi
106
106
  DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
107
107
  ? 'enum'
108
108
  : DATABASE_TYPE == 'oracle'
109
- ? 'varchar2'
110
- : 'smallint',
109
+ ? 'varchar2'
110
+ : 'smallint',
111
111
  enum: HistoryActionType
112
112
  })
113
113
  public action!: HistoryActionType
@@ -17,7 +17,7 @@ export class FinancialStatementQuery {
17
17
 
18
18
  @Query(returns => FinancialStatementList, { description: 'To fetch multiple FinancialStatements' })
19
19
  async financialStatements(
20
- @Args(type => ListParam) params: ListParam,
20
+ @Args() params: ListParam,
21
21
  @Ctx() context: ResolverContext
22
22
  ): Promise<FinancialStatementList> {
23
23
  const { domain } = context.state
@@ -42,7 +42,7 @@ export class FinancialStatement {
42
42
  version?: number = 1
43
43
 
44
44
  @ManyToOne(type => Domain)
45
- @Field(type => Domain)
45
+ @Field({ nullable: true })
46
46
  domain?: Domain
47
47
 
48
48
  @RelationId((financialStatement: FinancialStatement) => financialStatement.domain)