@things-factory/accounting 8.0.0-beta.9 → 8.0.2

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 (196) hide show
  1. package/client/activities/activity-book-edit.ts +88 -0
  2. package/client/activities/activity-book-view.ts +88 -0
  3. package/client/activities/activity-expense-edit.ts +88 -0
  4. package/client/activities/activity-expense-view.ts +88 -0
  5. package/client/bootstrap.ts +10 -0
  6. package/client/components/accounting-category-selector.ts +136 -0
  7. package/client/components/accounting-category-view.ts +75 -0
  8. package/client/grist-editors/grist-editor-accounting-category-object.ts +83 -0
  9. package/client/grist-editors/grist-renderer-accounting-category-object.ts +13 -0
  10. package/client/index.ts +0 -0
  11. package/client/pages/account/account-importer.ts +97 -0
  12. package/client/pages/account/account-list-page.ts +364 -0
  13. package/client/pages/accounting-category/accounting-category-importer.ts +97 -0
  14. package/client/pages/accounting-category/accounting-category-list-page.ts +368 -0
  15. package/client/pages/accounting-category/accounting-category-tree-page.ts +338 -0
  16. package/client/pages/accounting-document/accounting-document-importer.ts +90 -0
  17. package/client/pages/accounting-document/accounting-document-list-page.ts +398 -0
  18. package/client/pages/financial-statement/financial-statement-importer.ts +97 -0
  19. package/client/pages/financial-statement/financial-statement-list-page.ts +338 -0
  20. package/client/pages/fiscal-month/fiscal-month-importer.ts +90 -0
  21. package/client/pages/fiscal-month/fiscal-month-list-page.ts +398 -0
  22. package/client/pages/fiscal-quarter/fiscal-quarter-importer.ts +90 -0
  23. package/client/pages/fiscal-quarter/fiscal-quarter-list-page.ts +398 -0
  24. package/client/pages/fiscal-year/fiscal-year-importer.ts +90 -0
  25. package/client/pages/fiscal-year/fiscal-year-list-page.ts +398 -0
  26. package/client/pages/income-statement/income-statement-importer.ts +97 -0
  27. package/client/pages/income-statement/income-statement-list-page.ts +338 -0
  28. package/client/pages/payment/payment-importer.ts +90 -0
  29. package/client/pages/payment/payment-list-page.ts +398 -0
  30. package/client/pages/transaction/transaction-importer.ts +97 -0
  31. package/client/pages/transaction/transaction-list-page.ts +338 -0
  32. package/client/route.ts +35 -0
  33. package/client/tsconfig.json +13 -0
  34. package/client/types/accounting-category.ts +23 -0
  35. package/client/types/index.ts +1 -0
  36. package/dist-client/pages/accounting-category/accounting-category-tree-page.js +1 -1
  37. package/dist-client/pages/accounting-category/accounting-category-tree-page.js.map +1 -1
  38. package/dist-client/tsconfig.tsbuildinfo +1 -1
  39. package/dist-server/service/index.d.ts +2 -3
  40. package/dist-server/service/index.js +0 -5
  41. package/dist-server/service/index.js.map +1 -1
  42. package/dist-server/service/payment/index.d.ts +2 -1
  43. package/dist-server/service/payment/payment-history.d.ts +1 -8
  44. package/dist-server/service/payment/payment-history.js +10 -41
  45. package/dist-server/service/payment/payment-history.js.map +1 -1
  46. package/dist-server/service/payment/payment-type.d.ts +1 -7
  47. package/dist-server/service/payment/payment-type.js +0 -24
  48. package/dist-server/service/payment/payment-type.js.map +1 -1
  49. package/dist-server/service/payment/payment.d.ts +0 -12
  50. package/dist-server/service/payment/payment.js +1 -36
  51. package/dist-server/service/payment/payment.js.map +1 -1
  52. package/dist-server/tsconfig.tsbuildinfo +1 -1
  53. package/package.json +7 -7
  54. package/server/activities/activity-book.ts +172 -0
  55. package/server/activities/activity-expense.ts +149 -0
  56. package/server/activities/index.ts +18 -0
  57. package/server/controllers/index.ts +1 -0
  58. package/server/controllers/summary-statements.ts +166 -0
  59. package/server/index.ts +6 -0
  60. package/server/middlewares/index.ts +3 -0
  61. package/server/migrations/1725200507196-seed-fiscal-entities.ts +106 -0
  62. package/server/migrations/1725201467183-seed-accounts.ts +339 -0
  63. package/server/migrations/index.ts +9 -0
  64. package/server/routes.ts +26 -0
  65. package/server/service/account/account-history.ts +117 -0
  66. package/server/service/account/account-mutation.ts +140 -0
  67. package/server/service/account/account-query.ts +51 -0
  68. package/server/service/account/account-type.ts +44 -0
  69. package/server/service/account/account.ts +97 -0
  70. package/server/service/account/event-subscriber.ts +17 -0
  71. package/server/service/account/index.ts +9 -0
  72. package/server/service/accounting-category/accounting-category-history.ts +129 -0
  73. package/server/service/accounting-category/accounting-category-mutation.ts +148 -0
  74. package/server/service/accounting-category/accounting-category-query.ts +74 -0
  75. package/server/service/accounting-category/accounting-category-type.ts +48 -0
  76. package/server/service/accounting-category/accounting-category.ts +100 -0
  77. package/server/service/accounting-category/event-subscriber.ts +20 -0
  78. package/server/service/accounting-category/index.ts +9 -0
  79. package/server/service/accounting-document/accounting-document-history.ts +123 -0
  80. package/server/service/accounting-document/accounting-document-mutation.ts +137 -0
  81. package/server/service/accounting-document/accounting-document-query.ts +48 -0
  82. package/server/service/accounting-document/accounting-document-type.ts +52 -0
  83. package/server/service/accounting-document/accounting-document.ts +93 -0
  84. package/server/service/accounting-document/event-subscriber.ts +17 -0
  85. package/server/service/accounting-document/index.ts +9 -0
  86. package/server/service/common-type.ts +12 -0
  87. package/server/service/financial-statement/event-subscriber.ts +17 -0
  88. package/server/service/financial-statement/financial-statement-history.ts +129 -0
  89. package/server/service/financial-statement/financial-statement-line-item.ts +82 -0
  90. package/server/service/financial-statement/financial-statement-mutation.ts +148 -0
  91. package/server/service/financial-statement/financial-statement-query.ts +53 -0
  92. package/server/service/financial-statement/financial-statement-type.ts +51 -0
  93. package/server/service/financial-statement/financial-statement.ts +116 -0
  94. package/server/service/financial-statement/index.ts +10 -0
  95. package/server/service/fiscal-month/fiscal-month-mutation.ts +145 -0
  96. package/server/service/fiscal-month/fiscal-month-query.ts +58 -0
  97. package/server/service/fiscal-month/fiscal-month-type.ts +66 -0
  98. package/server/service/fiscal-month/fiscal-month.ts +84 -0
  99. package/server/service/fiscal-month/index.ts +7 -0
  100. package/server/service/fiscal-quarter/fiscal-quarter-mutation.ts +148 -0
  101. package/server/service/fiscal-quarter/fiscal-quarter-query.ts +60 -0
  102. package/server/service/fiscal-quarter/fiscal-quarter-type.ts +60 -0
  103. package/server/service/fiscal-quarter/fiscal-quarter.ts +80 -0
  104. package/server/service/fiscal-quarter/index.ts +7 -0
  105. package/server/service/fiscal-year/fiscal-year-mutation.ts +145 -0
  106. package/server/service/fiscal-year/fiscal-year-query.ts +53 -0
  107. package/server/service/fiscal-year/fiscal-year-type.ts +54 -0
  108. package/server/service/fiscal-year/fiscal-year.ts +76 -0
  109. package/server/service/fiscal-year/index.ts +7 -0
  110. package/server/service/income-statement/event-subscriber.ts +17 -0
  111. package/server/service/income-statement/income-statement-history.ts +133 -0
  112. package/server/service/income-statement/income-statement-line-item.ts +84 -0
  113. package/server/service/income-statement/income-statement-mutation.ts +147 -0
  114. package/server/service/income-statement/income-statement-query.ts +50 -0
  115. package/server/service/income-statement/income-statement-type.ts +51 -0
  116. package/server/service/income-statement/income-statement.ts +120 -0
  117. package/server/service/income-statement/index.ts +10 -0
  118. package/server/service/index.ts +108 -0
  119. package/server/service/payment/event-subscriber.ts +17 -0
  120. package/server/service/payment/index.ts +9 -0
  121. package/server/service/payment/payment-history.ts +132 -0
  122. package/server/service/payment/payment-mutation.ts +139 -0
  123. package/server/service/payment/payment-query.ts +50 -0
  124. package/server/service/payment/payment-type.ts +64 -0
  125. package/server/service/payment/payment.ts +123 -0
  126. package/server/service/transaction/event-subscriber.ts +17 -0
  127. package/server/service/transaction/index.ts +9 -0
  128. package/server/service/transaction/transaction-history.ts +161 -0
  129. package/server/service/transaction/transaction-mutation.ts +146 -0
  130. package/server/service/transaction/transaction-query.ts +50 -0
  131. package/server/service/transaction/transaction-type.ts +48 -0
  132. package/server/service/transaction/transaction.ts +230 -0
  133. package/server/tsconfig.json +10 -0
  134. package/dist-client/pages/bank/bank-importer.d.ts +0 -23
  135. package/dist-client/pages/bank/bank-importer.js +0 -93
  136. package/dist-client/pages/bank/bank-importer.js.map +0 -1
  137. package/dist-client/pages/bank/bank-list-page.d.ts +0 -66
  138. package/dist-client/pages/bank/bank-list-page.js +0 -370
  139. package/dist-client/pages/bank/bank-list-page.js.map +0 -1
  140. package/dist-client/pages/bank-account/bank-account-importer.d.ts +0 -23
  141. package/dist-client/pages/bank-account/bank-account-importer.js +0 -93
  142. package/dist-client/pages/bank-account/bank-account-importer.js.map +0 -1
  143. package/dist-client/pages/bank-account/bank-account-list-page.d.ts +0 -66
  144. package/dist-client/pages/bank-account/bank-account-list-page.js +0 -370
  145. package/dist-client/pages/bank-account/bank-account-list-page.js.map +0 -1
  146. package/dist-client/pages/financial-institution/financial-institution-importer.d.ts +0 -23
  147. package/dist-client/pages/financial-institution/financial-institution-importer.js +0 -93
  148. package/dist-client/pages/financial-institution/financial-institution-importer.js.map +0 -1
  149. package/dist-client/pages/financial-institution/financial-institution-list-page.d.ts +0 -66
  150. package/dist-client/pages/financial-institution/financial-institution-list-page.js +0 -370
  151. package/dist-client/pages/financial-institution/financial-institution-list-page.js.map +0 -1
  152. package/dist-server/migrations/1725201567284-seed-country-codes.d.ts +0 -5
  153. package/dist-server/migrations/1725201567284-seed-country-codes.js +0 -248
  154. package/dist-server/migrations/1725201567284-seed-country-codes.js.map +0 -1
  155. package/dist-server/migrations/1725201667385-seed-financial-institutions.d.ts +0 -5
  156. package/dist-server/migrations/1725201667385-seed-financial-institutions.js +0 -348
  157. package/dist-server/migrations/1725201667385-seed-financial-institutions.js.map +0 -1
  158. package/dist-server/service/bank-account/bank-account-history.d.ts +0 -34
  159. package/dist-server/service/bank-account/bank-account-history.js +0 -172
  160. package/dist-server/service/bank-account/bank-account-history.js.map +0 -1
  161. package/dist-server/service/bank-account/bank-account-mutation.d.ts +0 -10
  162. package/dist-server/service/bank-account/bank-account-mutation.js +0 -128
  163. package/dist-server/service/bank-account/bank-account-mutation.js.map +0 -1
  164. package/dist-server/service/bank-account/bank-account-query.d.ts +0 -11
  165. package/dist-server/service/bank-account/bank-account-query.js +0 -79
  166. package/dist-server/service/bank-account/bank-account-query.js.map +0 -1
  167. package/dist-server/service/bank-account/bank-account-type.d.ts +0 -39
  168. package/dist-server/service/bank-account/bank-account-type.js +0 -153
  169. package/dist-server/service/bank-account/bank-account-type.js.map +0 -1
  170. package/dist-server/service/bank-account/bank-account.d.ts +0 -38
  171. package/dist-server/service/bank-account/bank-account.js +0 -164
  172. package/dist-server/service/bank-account/bank-account.js.map +0 -1
  173. package/dist-server/service/bank-account/event-subscriber.d.ts +0 -7
  174. package/dist-server/service/bank-account/event-subscriber.js +0 -21
  175. package/dist-server/service/bank-account/event-subscriber.js.map +0 -1
  176. package/dist-server/service/bank-account/index.d.ts +0 -7
  177. package/dist-server/service/bank-account/index.js +0 -12
  178. package/dist-server/service/bank-account/index.js.map +0 -1
  179. package/dist-server/service/financial-institution/financial-institution-mutation.d.ts +0 -10
  180. package/dist-server/service/financial-institution/financial-institution-mutation.js +0 -169
  181. package/dist-server/service/financial-institution/financial-institution-mutation.js.map +0 -1
  182. package/dist-server/service/financial-institution/financial-institution-query.d.ts +0 -12
  183. package/dist-server/service/financial-institution/financial-institution-query.js +0 -97
  184. package/dist-server/service/financial-institution/financial-institution-query.js.map +0 -1
  185. package/dist-server/service/financial-institution/financial-institution-type.d.ts +0 -32
  186. package/dist-server/service/financial-institution/financial-institution-type.js +0 -126
  187. package/dist-server/service/financial-institution/financial-institution-type.js.map +0 -1
  188. package/dist-server/service/financial-institution/financial-institution.d.ts +0 -34
  189. package/dist-server/service/financial-institution/financial-institution.js +0 -137
  190. package/dist-server/service/financial-institution/financial-institution.js.map +0 -1
  191. package/dist-server/service/financial-institution/index.d.ts +0 -6
  192. package/dist-server/service/financial-institution/index.js +0 -10
  193. package/dist-server/service/financial-institution/index.js.map +0 -1
  194. package/helps/accounting/bank-account.md +0 -160
  195. package/helps/accounting/bank.md +0 -160
  196. package/helps/accounting/financial-institution.md +0 -160
@@ -0,0 +1,9 @@
1
+ import { AccountingCategory } from './accounting-category'
2
+ import { AccountingCategoryQuery } from './accounting-category-query'
3
+ import { AccountingCategoryMutation } from './accounting-category-mutation'
4
+ import { AccountingCategoryHistory } from './accounting-category-history'
5
+ import { AccountingCategoryHistoryEntitySubscriber } from './event-subscriber'
6
+
7
+ export const entities = [AccountingCategory, AccountingCategoryHistory]
8
+ export const resolvers = [AccountingCategoryQuery, AccountingCategoryMutation]
9
+ export const subscribers = [AccountingCategoryHistoryEntitySubscriber]
@@ -0,0 +1,123 @@
1
+ import { Field, ID, ObjectType } from 'type-graphql'
2
+ import { Column, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId } from 'typeorm'
3
+
4
+ import {
5
+ HistoryActionColumn,
6
+ HistoryActionType,
7
+ HistoryEntityInterface,
8
+ HistoryOriginalIdColumn
9
+ } from '@operato/typeorm-history'
10
+ import { Role, User } from '@things-factory/auth-base'
11
+ import { config } from '@things-factory/env'
12
+ import { Domain } from '@things-factory/shell'
13
+
14
+ import { Transaction } from '../transaction/transaction'
15
+ import { AccountingDocument } from './accounting-document'
16
+
17
+ const ORMCONFIG = config.get('ormconfig', {})
18
+ const DATABASE_TYPE = ORMCONFIG.type
19
+
20
+ @Entity()
21
+ @Index(
22
+ 'ix_accounting-document_history_0',
23
+ (accountingDocumentHistory: AccountingDocumentHistory) => [
24
+ accountingDocumentHistory.originalId,
25
+ accountingDocumentHistory.version
26
+ ],
27
+ { unique: true }
28
+ )
29
+ @Index(
30
+ 'ix_accounting-document_history_1',
31
+ (accountingDocumentHistory: AccountingDocumentHistory) => [
32
+ accountingDocumentHistory.domain,
33
+ accountingDocumentHistory.originalId,
34
+ accountingDocumentHistory.version
35
+ ],
36
+ { unique: true }
37
+ )
38
+ @ObjectType({ description: 'History Entity of AccountingDocument' })
39
+ export class AccountingDocumentHistory implements HistoryEntityInterface<AccountingDocument> {
40
+ @PrimaryGeneratedColumn('uuid')
41
+ @Field(type => ID)
42
+ readonly id: string
43
+
44
+ @Column({ nullable: true, default: 1 })
45
+ @Field({ nullable: true })
46
+ version?: number = 1
47
+
48
+ @ManyToOne(type => Domain)
49
+ @Field({ nullable: true })
50
+ domain?: Domain
51
+
52
+ @RelationId((accountingDocument: AccountingDocument) => accountingDocument.domain)
53
+ domainId?: string
54
+
55
+ @ManyToOne(type => Transaction, transaction => transaction.documents)
56
+ @Field(type => Transaction)
57
+ transaction: Transaction
58
+
59
+ @RelationId((accountingDocument: AccountingDocument) => accountingDocument.transaction)
60
+ transactionId: string
61
+
62
+ @Column()
63
+ @Field({ nullable: false })
64
+ documentType: string // 문서의 유형 (예: 계약서, 인보이스 등)
65
+
66
+ @Column()
67
+ @Field({ nullable: false })
68
+ documentUrl: string // 문서의 URL 또는 파일 경로
69
+
70
+ @Column({ nullable: true })
71
+ @Field({ nullable: true })
72
+ description?: string // 문서에 대한 설명
73
+
74
+ @Column({ nullable: true })
75
+ @Field({ nullable: true })
76
+ createdAt?: Date
77
+
78
+ @Column({ nullable: true })
79
+ @Field({ nullable: true })
80
+ updatedAt?: Date
81
+
82
+ @Column({ nullable: true })
83
+ @Field({ nullable: true })
84
+ deletedAt?: Date
85
+
86
+ @ManyToOne(type => User, { nullable: true })
87
+ @Field(type => User, { nullable: true })
88
+ creator?: User
89
+
90
+ @RelationId((accountingDocument: AccountingDocument) => accountingDocument.creator)
91
+ creatorId?: string
92
+
93
+ @ManyToOne(type => User, { nullable: true })
94
+ @Field(type => User, { nullable: true })
95
+ updater?: User
96
+
97
+ @RelationId((accountingDocument: AccountingDocument) => accountingDocument.updater)
98
+ updaterId?: string
99
+
100
+ @Field(type => String, { nullable: true })
101
+ thumbnail?: string
102
+
103
+ @HistoryOriginalIdColumn()
104
+ public originalId!: string
105
+
106
+ @HistoryActionColumn({
107
+ nullable: false,
108
+ type:
109
+ DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
110
+ ? 'enum'
111
+ : DATABASE_TYPE == 'oracle'
112
+ ? 'varchar2'
113
+ : DATABASE_TYPE == 'mssql'
114
+ ? 'nvarchar'
115
+ : 'varchar',
116
+ enum:
117
+ DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
118
+ ? HistoryActionType
119
+ : undefined,
120
+ length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined : 10
121
+ })
122
+ public action!: HistoryActionType
123
+ }
@@ -0,0 +1,137 @@
1
+ import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'
2
+ import { In } from 'typeorm'
3
+ import { getRepository } from '@things-factory/shell'
4
+
5
+ import { AccountingDocument } from './accounting-document'
6
+ import { NewAccountingDocument, AccountingDocumentPatch } from './accounting-document-type'
7
+
8
+ @Resolver(AccountingDocument)
9
+ export class AccountingDocumentMutation {
10
+ @Directive('@transaction')
11
+ @Mutation(returns => AccountingDocument, { description: 'To create new AccountingDocument' })
12
+ async createAccountingDocument(@Arg('accountingDocument') accountingDocument: NewAccountingDocument, @Ctx() context: ResolverContext): Promise<AccountingDocument> {
13
+ const { domain, user, tx } = context.state
14
+
15
+ const result = await getRepository(AccountingDocument, tx).save({
16
+ ...accountingDocument,
17
+ domain,
18
+ creator: user,
19
+ updater: user
20
+ })
21
+
22
+ return result
23
+ }
24
+
25
+ @Directive('@transaction')
26
+ @Mutation(returns => AccountingDocument, { description: 'To modify AccountingDocument information' })
27
+ async updateAccountingDocument(
28
+ @Arg('id') id: string,
29
+ @Arg('patch') patch: AccountingDocumentPatch,
30
+ @Ctx() context: ResolverContext
31
+ ): Promise<AccountingDocument> {
32
+ const { domain, user, tx } = context.state
33
+
34
+ const repository = getRepository(AccountingDocument, tx)
35
+ const accountingDocument = await repository.findOne({
36
+ where: { domain: { id: domain.id }, id }
37
+ })
38
+
39
+ const result = await repository.save({
40
+ ...accountingDocument,
41
+ ...patch,
42
+ updater: user
43
+ })
44
+
45
+ return result
46
+ }
47
+
48
+ @Directive('@transaction')
49
+ @Mutation(returns => [AccountingDocument], { description: "To modify multiple AccountingDocuments' information" })
50
+ async updateMultipleAccountingDocument(
51
+ @Arg('patches', type => [AccountingDocumentPatch]) patches: AccountingDocumentPatch[],
52
+ @Ctx() context: ResolverContext
53
+ ): Promise<AccountingDocument[]> {
54
+ const { domain, user, tx } = context.state
55
+
56
+ let results = []
57
+ const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
58
+ const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
59
+ const accountingDocumentRepo = getRepository(AccountingDocument, tx)
60
+
61
+ if (_createRecords.length > 0) {
62
+ for (let i = 0; i < _createRecords.length; i++) {
63
+ const newRecord = _createRecords[i]
64
+
65
+ const result = await accountingDocumentRepo.save({
66
+ ...newRecord,
67
+ domain,
68
+ creator: user,
69
+ updater: user
70
+ })
71
+
72
+ results.push({ ...result, cuFlag: '+' })
73
+ }
74
+ }
75
+
76
+ if (_updateRecords.length > 0) {
77
+ for (let i = 0; i < _updateRecords.length; i++) {
78
+ const updateRecord = _updateRecords[i]
79
+ const accountingDocument = await accountingDocumentRepo.findOneBy({ id: updateRecord.id })
80
+
81
+ const result = await accountingDocumentRepo.save({
82
+ ...accountingDocument,
83
+ ...updateRecord,
84
+ updater: user
85
+ })
86
+
87
+ results.push({ ...result, cuFlag: 'M' })
88
+ }
89
+ }
90
+
91
+ return results
92
+ }
93
+
94
+ @Directive('@transaction')
95
+ @Mutation(returns => Boolean, { description: 'To delete AccountingDocument' })
96
+ async deleteAccountingDocument(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
97
+ const { domain, tx } = context.state
98
+
99
+ await getRepository(AccountingDocument, tx).delete({ domain: { id: domain.id }, id })
100
+
101
+ return true
102
+ }
103
+
104
+ @Directive('@transaction')
105
+ @Mutation(returns => Boolean, { description: 'To delete multiple AccountingDocuments' })
106
+ async deleteAccountingDocuments(
107
+ @Arg('ids', type => [String]) ids: string[],
108
+ @Ctx() context: ResolverContext
109
+ ): Promise<boolean> {
110
+ const { domain, tx } = context.state
111
+
112
+ await getRepository(AccountingDocument, tx).delete({
113
+ domain: { id: domain.id },
114
+ id: In(ids)
115
+ })
116
+
117
+
118
+ return true
119
+ }
120
+
121
+ @Directive('@transaction')
122
+ @Mutation(returns => Boolean, { description: 'To import multiple AccountingDocuments' })
123
+ async importAccountingDocuments(
124
+ @Arg('accountingDocuments', type => [AccountingDocumentPatch]) accountingDocuments: AccountingDocumentPatch[],
125
+ @Ctx() context: ResolverContext
126
+ ): Promise<boolean> {
127
+ const { domain, tx } = context.state
128
+
129
+ await Promise.all(
130
+ accountingDocuments.map(async (accountingDocument: AccountingDocumentPatch) => {
131
+ const createdAccountingDocument: AccountingDocument = await getRepository(AccountingDocument, tx).save({ domain, ...accountingDocument })
132
+ })
133
+ )
134
+
135
+ return true
136
+ }
137
+ }
@@ -0,0 +1,48 @@
1
+ import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'
2
+ import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
3
+ import { User } from '@things-factory/auth-base'
4
+ import { AccountingDocument } from './accounting-document'
5
+ import { AccountingDocumentList } from './accounting-document-type'
6
+
7
+ @Resolver(AccountingDocument)
8
+ export class AccountingDocumentQuery {
9
+ @Query(returns => AccountingDocument!, { nullable: true, description: 'To fetch a AccountingDocument' })
10
+ async accountingDocument(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<AccountingDocument> {
11
+ const { domain } = context.state
12
+
13
+ return await getRepository(AccountingDocument).findOne({
14
+ where: { domain: { id: domain.id }, id }
15
+ })
16
+ }
17
+
18
+ @Query(returns => AccountingDocumentList, { description: 'To fetch multiple AccountingDocuments' })
19
+ async accountingDocuments(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<AccountingDocumentList> {
20
+ const { domain } = context.state
21
+
22
+ const queryBuilder = getQueryBuilderFromListParams({
23
+ domain,
24
+ params,
25
+ repository: await getRepository(AccountingDocument),
26
+ searchables: ['name', 'description']
27
+ })
28
+
29
+ const [items, total] = await queryBuilder.getManyAndCount()
30
+
31
+ return { items, total }
32
+ }
33
+
34
+ @FieldResolver(type => Domain)
35
+ async domain(@Root() accountingDocument: AccountingDocument): Promise<Domain> {
36
+ return accountingDocument.domainId && (await getRepository(Domain).findOneBy({ id: accountingDocument.domainId }))
37
+ }
38
+
39
+ @FieldResolver(type => User)
40
+ async updater(@Root() accountingDocument: AccountingDocument): Promise<User> {
41
+ return accountingDocument.updaterId && (await getRepository(User).findOneBy({ id: accountingDocument.updaterId }))
42
+ }
43
+
44
+ @FieldResolver(type => User)
45
+ async creator(@Root() accountingDocument: AccountingDocument): Promise<User> {
46
+ return accountingDocument.creatorId && (await getRepository(User).findOneBy({ id: accountingDocument.creatorId }))
47
+ }
48
+ }
@@ -0,0 +1,52 @@
1
+ import type { FileUpload } from 'graphql-upload/GraphQLUpload.js'
2
+ import GraphQLUpload from 'graphql-upload/GraphQLUpload.js'
3
+ import { ObjectType, Field, InputType, Int, ID, registerEnumType } from 'type-graphql'
4
+
5
+ import { ObjectRef, ScalarObject } from '@things-factory/shell'
6
+
7
+ import { AccountingDocument } from './accounting-document'
8
+
9
+ @InputType()
10
+ export class NewAccountingDocument {
11
+ @Field(type => ObjectRef)
12
+ transaction: ObjectRef
13
+
14
+ @Field({ nullable: false })
15
+ documentType: string // 문서의 유형 (예: 계약서, 인보이스 등)
16
+
17
+ @Field({ nullable: false })
18
+ documentUrl: string // 문서의 URL 또는 파일 경로
19
+
20
+ @Field({ nullable: true })
21
+ description?: string // 문서에 대한 설명
22
+ }
23
+
24
+ @InputType()
25
+ export class AccountingDocumentPatch {
26
+ @Field(type => ID, { nullable: true })
27
+ id?: string
28
+
29
+ @Field(type => ObjectRef)
30
+ transaction: ObjectRef
31
+
32
+ @Field({ nullable: false })
33
+ documentType: string // 문서의 유형 (예: 계약서, 인보이스 등)
34
+
35
+ @Field({ nullable: false })
36
+ documentUrl: string // 문서의 URL 또는 파일 경로
37
+
38
+ @Field({ nullable: true })
39
+ description?: string // 문서에 대한 설명
40
+
41
+ @Field({ nullable: true })
42
+ cuFlag?: string
43
+ }
44
+
45
+ @ObjectType()
46
+ export class AccountingDocumentList {
47
+ @Field(type => [AccountingDocument])
48
+ items: AccountingDocument[]
49
+
50
+ @Field(type => Int)
51
+ total: number
52
+ }
@@ -0,0 +1,93 @@
1
+ import {
2
+ CreateDateColumn,
3
+ UpdateDateColumn,
4
+ DeleteDateColumn,
5
+ Entity,
6
+ Index,
7
+ Column,
8
+ ManyToOne,
9
+ PrimaryGeneratedColumn,
10
+ RelationId,
11
+ VersionColumn
12
+ } from 'typeorm'
13
+ import { ObjectType, Field, ID } from 'type-graphql'
14
+
15
+ import { Domain } from '@things-factory/shell'
16
+ import { User } from '@things-factory/auth-base'
17
+ import { Transaction } from '../transaction/transaction'
18
+
19
+ @ObjectType({ description: 'Entity for AccountingDocument' })
20
+ @Entity()
21
+ @Index(
22
+ 'ix_accounting_document_0',
23
+ (accountingDocument: AccountingDocument) => [
24
+ accountingDocument.domain,
25
+ accountingDocument.transaction,
26
+ accountingDocument.createdAt
27
+ ],
28
+ {
29
+ unique: false,
30
+ where: '"deleted_at" IS NULL'
31
+ }
32
+ )
33
+ export class AccountingDocument {
34
+ @PrimaryGeneratedColumn('uuid')
35
+ @Field(type => ID)
36
+ readonly id: string
37
+
38
+ @VersionColumn()
39
+ @Field({ nullable: true })
40
+ version?: number = 1
41
+
42
+ @ManyToOne(type => Domain)
43
+ @Field({ nullable: true })
44
+ domain?: Domain
45
+
46
+ @RelationId((accountingDocument: AccountingDocument) => accountingDocument.domain)
47
+ domainId?: string
48
+
49
+ @ManyToOne(type => Transaction, transaction => transaction.documents)
50
+ @Field(type => Transaction)
51
+ transaction: Transaction
52
+
53
+ @RelationId((accountingDocument: AccountingDocument) => accountingDocument.transaction)
54
+ transactionId: string
55
+
56
+ @Column()
57
+ @Field({ nullable: false })
58
+ documentType: string // 문서의 유형 (예: 계약서, 인보이스 등)
59
+
60
+ @Column()
61
+ @Field({ nullable: false })
62
+ documentUrl: string // 문서의 URL 또는 파일 경로
63
+
64
+ @Column({ nullable: true })
65
+ @Field({ nullable: true })
66
+ description?: string // 문서에 대한 설명
67
+
68
+ @CreateDateColumn()
69
+ @Field({ nullable: true })
70
+ createdAt?: Date
71
+
72
+ @UpdateDateColumn()
73
+ @Field({ nullable: true })
74
+ updatedAt?: Date
75
+
76
+ @DeleteDateColumn()
77
+ @Field({ nullable: true })
78
+ deletedAt?: Date
79
+
80
+ @ManyToOne(type => User, { nullable: true })
81
+ @Field(type => User, { nullable: true })
82
+ creator?: User
83
+
84
+ @RelationId((accountingDocument: AccountingDocument) => accountingDocument.creator)
85
+ creatorId?: string
86
+
87
+ @ManyToOne(type => User, { nullable: true })
88
+ @Field(type => User, { nullable: true })
89
+ updater?: User
90
+
91
+ @RelationId((accountingDocument: AccountingDocument) => accountingDocument.updater)
92
+ updaterId?: string
93
+ }
@@ -0,0 +1,17 @@
1
+ import { EventSubscriber } from 'typeorm'
2
+
3
+ import { HistoryEntitySubscriber } from '@operato/typeorm-history'
4
+
5
+ import { AccountingDocument } from './accounting-document'
6
+ import { AccountingDocumentHistory } from './accounting-document-history'
7
+
8
+ @EventSubscriber()
9
+ export class AccountingDocumentHistoryEntitySubscriber extends HistoryEntitySubscriber<AccountingDocument, AccountingDocumentHistory> {
10
+ public get entity() {
11
+ return AccountingDocument
12
+ }
13
+
14
+ public get historyEntity() {
15
+ return AccountingDocumentHistory
16
+ }
17
+ }
@@ -0,0 +1,9 @@
1
+ import { AccountingDocument } from './accounting-document'
2
+ import { AccountingDocumentHistory } from './accounting-document-history'
3
+ import { AccountingDocumentHistoryEntitySubscriber } from './event-subscriber'
4
+ import { AccountingDocumentQuery } from './accounting-document-query'
5
+ import { AccountingDocumentMutation } from './accounting-document-mutation'
6
+
7
+ export const entities = [AccountingDocument, AccountingDocumentHistory]
8
+ export const resolvers = [AccountingDocumentQuery, AccountingDocumentMutation]
9
+ export const subscribers = [AccountingDocumentHistoryEntitySubscriber]
@@ -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
+ })
@@ -0,0 +1,17 @@
1
+ import { EventSubscriber } from 'typeorm'
2
+
3
+ import { HistoryEntitySubscriber } from '@operato/typeorm-history'
4
+
5
+ import { FinancialStatement } from './financial-statement'
6
+ import { FinancialStatementHistory } from './financial-statement-history'
7
+
8
+ @EventSubscriber()
9
+ export class FinancialStatementHistoryEntitySubscriber extends HistoryEntitySubscriber<FinancialStatement, FinancialStatementHistory> {
10
+ public get entity() {
11
+ return FinancialStatement
12
+ }
13
+
14
+ public get historyEntity() {
15
+ return FinancialStatementHistory
16
+ }
17
+ }
@@ -0,0 +1,129 @@
1
+ import { Field, ID, ObjectType } from 'type-graphql'
2
+ import { Column, Entity, Index, ManyToOne, OneToMany, PrimaryGeneratedColumn, RelationId } from 'typeorm'
3
+
4
+ import {
5
+ HistoryActionColumn,
6
+ HistoryActionType,
7
+ HistoryEntityInterface,
8
+ HistoryOriginalIdColumn
9
+ } from '@operato/typeorm-history'
10
+ import { Role, User } from '@things-factory/auth-base'
11
+ import { config } from '@things-factory/env'
12
+ import { Domain } from '@things-factory/shell'
13
+
14
+ import { FinancialStatement } from './financial-statement'
15
+ import { FinancialStatementLineItem } from './financial-statement-line-item'
16
+
17
+ const ORMCONFIG = config.get('ormconfig', {})
18
+ const DATABASE_TYPE = ORMCONFIG.type
19
+
20
+ @Entity()
21
+ @Index(
22
+ 'ix_financial-statement_history_0',
23
+ (financialStatementHistory: FinancialStatementHistory) => [
24
+ financialStatementHistory.originalId,
25
+ financialStatementHistory.version
26
+ ],
27
+ { unique: true }
28
+ )
29
+ @Index(
30
+ 'ix_financial-statement_history_1',
31
+ (financialStatementHistory: FinancialStatementHistory) => [
32
+ financialStatementHistory.domain,
33
+ financialStatementHistory.originalId,
34
+ financialStatementHistory.version
35
+ ],
36
+ { unique: true }
37
+ )
38
+ @ObjectType({ description: 'History Entity of FinancialStatement' })
39
+ export class FinancialStatementHistory implements HistoryEntityInterface<FinancialStatement> {
40
+ @PrimaryGeneratedColumn('uuid')
41
+ @Field(type => ID)
42
+ readonly id: string
43
+
44
+ @Column({ nullable: true, default: 1 })
45
+ @Field({ nullable: true })
46
+ version?: number = 1
47
+
48
+ @ManyToOne(type => Domain)
49
+ @Field({ nullable: true })
50
+ domain?: Domain
51
+
52
+ @RelationId((financialStatementHistory: FinancialStatementHistory) => financialStatementHistory.domain)
53
+ domainId?: string
54
+
55
+ @Column({ nullable: true })
56
+ @Field({ nullable: true, description: 'Fiscal year of the financial statement' })
57
+ year?: number // 회계 연도
58
+
59
+ @Column({ nullable: true })
60
+ @Field({ nullable: true, description: 'Fiscal quarter of the financial statement' })
61
+ quarter?: number // 회계 분기
62
+
63
+ @Column({ nullable: true })
64
+ @Field({ nullable: true, description: 'Fiscal month of the financial statement' })
65
+ month?: number // 회계 월
66
+
67
+ @Column({ nullable: true })
68
+ @Field({ nullable: true, description: 'Total assets recorded in the financial statement' })
69
+ asset?: number // 재무제표에 기록된 총자산
70
+
71
+ @Column({ nullable: true })
72
+ @Field({ nullable: true, description: 'Total liabilities recorded in the financial statement' })
73
+ liability?: number // 재무제표에 기록된 총부채
74
+
75
+ @Column({ nullable: true })
76
+ @Field({ nullable: true, description: 'Total equity recorded in the financial statement' })
77
+ equity?: number // 재무제표에 기록된 총자본
78
+
79
+ @OneToMany(type => FinancialStatementLineItem, lineItem => lineItem.statement)
80
+ @Field(type => [FinancialStatementLineItem], { nullable: true })
81
+ lineItems?: FinancialStatementLineItem[] // 계정별 브레이크다운
82
+
83
+ @Column({ nullable: true })
84
+ @Field({ nullable: true })
85
+ createdAt?: Date
86
+
87
+ @Column({ nullable: true })
88
+ @Field({ nullable: true })
89
+ updatedAt?: Date
90
+
91
+ @Column({ nullable: true })
92
+ @Field({ nullable: true })
93
+ deletedAt?: Date
94
+
95
+ @ManyToOne(type => User, { nullable: true })
96
+ @Field({ nullable: true })
97
+ creator?: User
98
+
99
+ @RelationId((financialStatementHistory: FinancialStatementHistory) => financialStatementHistory.creator)
100
+ creatorId?: string
101
+
102
+ @ManyToOne(type => User, { nullable: true })
103
+ @Field({ nullable: true })
104
+ updater?: User
105
+
106
+ @RelationId((financialStatementHistory: FinancialStatementHistory) => financialStatementHistory.updater)
107
+ updaterId?: string
108
+
109
+ @HistoryOriginalIdColumn()
110
+ public originalId!: string
111
+
112
+ @HistoryActionColumn({
113
+ nullable: false,
114
+ type:
115
+ DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
116
+ ? 'enum'
117
+ : DATABASE_TYPE == 'oracle'
118
+ ? 'varchar2'
119
+ : DATABASE_TYPE == 'mssql'
120
+ ? 'nvarchar'
121
+ : 'varchar',
122
+ enum:
123
+ DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
124
+ ? HistoryActionType
125
+ : undefined,
126
+ length: DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? undefined : 10
127
+ })
128
+ public action!: HistoryActionType
129
+ }