@things-factory/accounting 7.1.13 → 8.0.0-alpha.11

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 (100) hide show
  1. package/client/pages/bank/bank-importer.ts +90 -0
  2. package/client/pages/bank/bank-list-page.ts +398 -0
  3. package/client/pages/bank-account/bank-account-importer.ts +90 -0
  4. package/client/pages/bank-account/bank-account-list-page.ts +398 -0
  5. package/client/pages/financial-institution/financial-institution-importer.ts +90 -0
  6. package/client/pages/financial-institution/financial-institution-list-page.ts +398 -0
  7. package/dist-client/pages/bank/bank-importer.d.ts +23 -0
  8. package/dist-client/pages/bank/bank-importer.js +93 -0
  9. package/dist-client/pages/bank/bank-importer.js.map +1 -0
  10. package/dist-client/pages/bank/bank-list-page.d.ts +66 -0
  11. package/dist-client/pages/bank/bank-list-page.js +370 -0
  12. package/dist-client/pages/bank/bank-list-page.js.map +1 -0
  13. package/dist-client/pages/bank-account/bank-account-importer.d.ts +23 -0
  14. package/dist-client/pages/bank-account/bank-account-importer.js +93 -0
  15. package/dist-client/pages/bank-account/bank-account-importer.js.map +1 -0
  16. package/dist-client/pages/bank-account/bank-account-list-page.d.ts +66 -0
  17. package/dist-client/pages/bank-account/bank-account-list-page.js +370 -0
  18. package/dist-client/pages/bank-account/bank-account-list-page.js.map +1 -0
  19. package/dist-client/pages/financial-institution/financial-institution-importer.d.ts +23 -0
  20. package/dist-client/pages/financial-institution/financial-institution-importer.js +93 -0
  21. package/dist-client/pages/financial-institution/financial-institution-importer.js.map +1 -0
  22. package/dist-client/pages/financial-institution/financial-institution-list-page.d.ts +66 -0
  23. package/dist-client/pages/financial-institution/financial-institution-list-page.js +370 -0
  24. package/dist-client/pages/financial-institution/financial-institution-list-page.js.map +1 -0
  25. package/dist-client/tsconfig.tsbuildinfo +1 -1
  26. package/dist-server/migrations/1725201567284-seed-country-codes.d.ts +5 -0
  27. package/dist-server/migrations/1725201567284-seed-country-codes.js +248 -0
  28. package/dist-server/migrations/1725201567284-seed-country-codes.js.map +1 -0
  29. package/dist-server/migrations/1725201667385-seed-financial-institutions.d.ts +5 -0
  30. package/dist-server/migrations/1725201667385-seed-financial-institutions.js +348 -0
  31. package/dist-server/migrations/1725201667385-seed-financial-institutions.js.map +1 -0
  32. package/dist-server/service/bank-account/bank-account-history.d.ts +34 -0
  33. package/dist-server/service/bank-account/bank-account-history.js +172 -0
  34. package/dist-server/service/bank-account/bank-account-history.js.map +1 -0
  35. package/dist-server/service/bank-account/bank-account-mutation.d.ts +10 -0
  36. package/dist-server/service/bank-account/bank-account-mutation.js +128 -0
  37. package/dist-server/service/bank-account/bank-account-mutation.js.map +1 -0
  38. package/dist-server/service/bank-account/bank-account-query.d.ts +11 -0
  39. package/dist-server/service/bank-account/bank-account-query.js +79 -0
  40. package/dist-server/service/bank-account/bank-account-query.js.map +1 -0
  41. package/dist-server/service/bank-account/bank-account-type.d.ts +39 -0
  42. package/dist-server/service/bank-account/bank-account-type.js +153 -0
  43. package/dist-server/service/bank-account/bank-account-type.js.map +1 -0
  44. package/dist-server/service/bank-account/bank-account.d.ts +38 -0
  45. package/dist-server/service/bank-account/bank-account.js +164 -0
  46. package/dist-server/service/bank-account/bank-account.js.map +1 -0
  47. package/dist-server/service/bank-account/event-subscriber.d.ts +7 -0
  48. package/dist-server/service/bank-account/event-subscriber.js +21 -0
  49. package/dist-server/service/bank-account/event-subscriber.js.map +1 -0
  50. package/dist-server/service/bank-account/index.d.ts +7 -0
  51. package/dist-server/service/bank-account/index.js +12 -0
  52. package/dist-server/service/bank-account/index.js.map +1 -0
  53. package/dist-server/service/financial-institution/financial-institution-mutation.d.ts +10 -0
  54. package/dist-server/service/financial-institution/financial-institution-mutation.js +169 -0
  55. package/dist-server/service/financial-institution/financial-institution-mutation.js.map +1 -0
  56. package/dist-server/service/financial-institution/financial-institution-query.d.ts +12 -0
  57. package/dist-server/service/financial-institution/financial-institution-query.js +97 -0
  58. package/dist-server/service/financial-institution/financial-institution-query.js.map +1 -0
  59. package/dist-server/service/financial-institution/financial-institution-type.d.ts +32 -0
  60. package/dist-server/service/financial-institution/financial-institution-type.js +126 -0
  61. package/dist-server/service/financial-institution/financial-institution-type.js.map +1 -0
  62. package/dist-server/service/financial-institution/financial-institution.d.ts +34 -0
  63. package/dist-server/service/financial-institution/financial-institution.js +137 -0
  64. package/dist-server/service/financial-institution/financial-institution.js.map +1 -0
  65. package/dist-server/service/financial-institution/index.d.ts +6 -0
  66. package/dist-server/service/financial-institution/index.js +10 -0
  67. package/dist-server/service/financial-institution/index.js.map +1 -0
  68. package/dist-server/service/index.d.ts +1 -1
  69. package/dist-server/service/payment/index.d.ts +1 -2
  70. package/dist-server/service/payment/payment-history.d.ts +8 -1
  71. package/dist-server/service/payment/payment-history.js +41 -10
  72. package/dist-server/service/payment/payment-history.js.map +1 -1
  73. package/dist-server/service/payment/payment-type.d.ts +7 -1
  74. package/dist-server/service/payment/payment-type.js +24 -0
  75. package/dist-server/service/payment/payment-type.js.map +1 -1
  76. package/dist-server/service/payment/payment.d.ts +12 -0
  77. package/dist-server/service/payment/payment.js +36 -1
  78. package/dist-server/service/payment/payment.js.map +1 -1
  79. package/dist-server/tsconfig.tsbuildinfo +1 -1
  80. package/helps/accounting/bank-account.md +160 -0
  81. package/helps/accounting/bank.md +160 -0
  82. package/helps/accounting/financial-institution.md +160 -0
  83. package/package.json +7 -7
  84. package/server/migrations/1725201567284-seed-country-codes.ts +261 -0
  85. package/server/migrations/1725201667385-seed-financial-institutions.ts +348 -0
  86. package/server/service/bank-account/bank-account-history.ts +149 -0
  87. package/server/service/bank-account/bank-account-mutation.ts +137 -0
  88. package/server/service/bank-account/bank-account-query.ts +48 -0
  89. package/server/service/bank-account/bank-account-type.ts +112 -0
  90. package/server/service/bank-account/bank-account.ts +142 -0
  91. package/server/service/bank-account/event-subscriber.ts +17 -0
  92. package/server/service/bank-account/index.ts +9 -0
  93. package/server/service/financial-institution/financial-institution-mutation.ts +198 -0
  94. package/server/service/financial-institution/financial-institution-query.ts +62 -0
  95. package/server/service/financial-institution/financial-institution-type.ts +91 -0
  96. package/server/service/financial-institution/financial-institution.ts +122 -0
  97. package/server/service/financial-institution/index.ts +7 -0
  98. package/server/service/payment/payment-history.ts +41 -18
  99. package/server/service/payment/payment-type.ts +19 -1
  100. package/server/service/payment/payment.ts +31 -0
@@ -0,0 +1,149 @@
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 { AccountType, BankAccount, OwnerType } from './bank-account'
15
+
16
+ const ORMCONFIG = config.get('ormconfig', {})
17
+ const DATABASE_TYPE = ORMCONFIG.type
18
+
19
+ @Entity()
20
+ @Index(
21
+ 'ix_bank-account_history_0',
22
+ (bankAccountHistory: BankAccountHistory) => [bankAccountHistory.originalId, bankAccountHistory.version],
23
+ { unique: true }
24
+ )
25
+ @Index(
26
+ 'ix_bank-account_history_1',
27
+ (bankAccountHistory: BankAccountHistory) => [
28
+ bankAccountHistory.domain,
29
+ bankAccountHistory.originalId,
30
+ bankAccountHistory.version
31
+ ],
32
+ { unique: true }
33
+ )
34
+ @ObjectType({ description: 'History Entity of BankAccount' })
35
+ export class BankAccountHistory implements HistoryEntityInterface<BankAccount> {
36
+ @PrimaryGeneratedColumn('uuid')
37
+ @Field(type => ID)
38
+ readonly id: string
39
+
40
+ @Column({ nullable: true, default: 1 })
41
+ @Field({ nullable: true })
42
+ version?: number = 1
43
+
44
+ @ManyToOne(type => Domain)
45
+ @Field({ nullable: true })
46
+ domain?: Domain
47
+
48
+ @RelationId((bankAccount: BankAccount) => bankAccount.domain)
49
+ domainId?: string
50
+
51
+ @Column()
52
+ @Field()
53
+ name: string
54
+
55
+ @Column({ nullable: true })
56
+ @Field({ nullable: true })
57
+ description?: string
58
+
59
+ @Column({ nullable: true })
60
+ @Field({ nullable: true, description: 'Name of the account holder' })
61
+ accountHolderName?: string // 계좌 소유자의 이름
62
+
63
+ @Column()
64
+ @Field({ nullable: true, description: 'Bank account number' })
65
+ accountNumber?: string
66
+
67
+ @Column()
68
+ @Field({ nullable: true, description: 'Bank name' })
69
+ bankName?: string
70
+
71
+ @Column({ type: 'enum', enum: AccountType })
72
+ @Field(type => AccountType, { description: 'Type of the account (Bank or Card)' })
73
+ accountType: AccountType
74
+
75
+ @Column({ nullable: true })
76
+ @Field({ nullable: true, description: 'Currency of the account' })
77
+ currency?: string
78
+
79
+ @Column({ nullable: false, default: false })
80
+ @Field({ nullable: true })
81
+ active?: boolean
82
+
83
+ @Column({ type: 'enum', enum: OwnerType })
84
+ @Field(type => OwnerType, { description: 'Type of the owner of the bank account' })
85
+ ownerType: OwnerType
86
+
87
+ @Column()
88
+ @Field({ description: 'ID of the owner of the bank account' })
89
+ ownerId: string
90
+
91
+ @Column({ nullable: true })
92
+ @Field({ nullable: true, description: 'IBAN of the bank account' })
93
+ iban?: string // 은행 계좌의 IBAN
94
+
95
+ @Column({ nullable: true })
96
+ @Field({ nullable: true, description: 'BIC of the bank account' })
97
+ bic?: string // 은행 계좌의 BIC
98
+
99
+ @Column({ nullable: true })
100
+ @Field({ nullable: true, description: 'Country of the bank account' })
101
+ country?: string // 은행 계좌의 국적
102
+
103
+ @Column({ nullable: true })
104
+ @Field({ nullable: true, description: 'Cover image of the bank account' })
105
+ image?: string // 은행 계좌의 커버이미지
106
+ @Column({ nullable: true })
107
+ @Field({ nullable: true })
108
+ createdAt?: Date
109
+
110
+ @Column({ nullable: true })
111
+ @Field({ nullable: true })
112
+ updatedAt?: Date
113
+
114
+ @Column({ nullable: true })
115
+ @Field({ nullable: true })
116
+ deletedAt?: Date
117
+
118
+ @ManyToOne(type => User, { nullable: true })
119
+ @Field(type => User, { nullable: true })
120
+ creator?: User
121
+
122
+ @RelationId((bankAccount: BankAccount) => bankAccount.creator)
123
+ creatorId?: string
124
+
125
+ @ManyToOne(type => User, { nullable: true })
126
+ @Field(type => User, { nullable: true })
127
+ updater?: User
128
+
129
+ @RelationId((bankAccount: BankAccount) => bankAccount.updater)
130
+ updaterId?: string
131
+
132
+ @Field(type => String, { nullable: true })
133
+ thumbnail?: string
134
+
135
+ @HistoryOriginalIdColumn()
136
+ public originalId!: string
137
+
138
+ @HistoryActionColumn({
139
+ nullable: false,
140
+ type:
141
+ DATABASE_TYPE == 'postgres' || DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
142
+ ? 'enum'
143
+ : DATABASE_TYPE == 'oracle'
144
+ ? 'varchar2'
145
+ : 'smallint',
146
+ enum: HistoryActionType
147
+ })
148
+ public action!: HistoryActionType
149
+ }
@@ -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 { BankAccount } from './bank-account'
6
+ import { NewBankAccount, BankAccountPatch } from './bank-account-type'
7
+
8
+ @Resolver(BankAccount)
9
+ export class BankAccountMutation {
10
+ @Directive('@transaction')
11
+ @Mutation(returns => BankAccount, { description: 'To create new BankAccount' })
12
+ async createBankAccount(@Arg('bankAccount') bankAccount: NewBankAccount, @Ctx() context: ResolverContext): Promise<BankAccount> {
13
+ const { domain, user, tx } = context.state
14
+
15
+ const result = await getRepository(BankAccount, tx).save({
16
+ ...bankAccount,
17
+ domain,
18
+ creator: user,
19
+ updater: user
20
+ })
21
+
22
+ return result
23
+ }
24
+
25
+ @Directive('@transaction')
26
+ @Mutation(returns => BankAccount, { description: 'To modify BankAccount information' })
27
+ async updateBankAccount(
28
+ @Arg('id') id: string,
29
+ @Arg('patch') patch: BankAccountPatch,
30
+ @Ctx() context: ResolverContext
31
+ ): Promise<BankAccount> {
32
+ const { domain, user, tx } = context.state
33
+
34
+ const repository = getRepository(BankAccount, tx)
35
+ const bankAccount = await repository.findOne({
36
+ where: { domain: { id: domain.id }, id }
37
+ })
38
+
39
+ const result = await repository.save({
40
+ ...bankAccount,
41
+ ...patch,
42
+ updater: user
43
+ })
44
+
45
+ return result
46
+ }
47
+
48
+ @Directive('@transaction')
49
+ @Mutation(returns => [BankAccount], { description: "To modify multiple BankAccounts' information" })
50
+ async updateMultipleBankAccount(
51
+ @Arg('patches', type => [BankAccountPatch]) patches: BankAccountPatch[],
52
+ @Ctx() context: ResolverContext
53
+ ): Promise<BankAccount[]> {
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 bankAccountRepo = getRepository(BankAccount, 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 bankAccountRepo.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 bankAccount = await bankAccountRepo.findOneBy({ id: updateRecord.id })
80
+
81
+ const result = await bankAccountRepo.save({
82
+ ...bankAccount,
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 BankAccount' })
96
+ async deleteBankAccount(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
97
+ const { domain, tx } = context.state
98
+
99
+ await getRepository(BankAccount, tx).delete({ domain: { id: domain.id }, id })
100
+
101
+ return true
102
+ }
103
+
104
+ @Directive('@transaction')
105
+ @Mutation(returns => Boolean, { description: 'To delete multiple BankAccounts' })
106
+ async deleteBankAccounts(
107
+ @Arg('ids', type => [String]) ids: string[],
108
+ @Ctx() context: ResolverContext
109
+ ): Promise<boolean> {
110
+ const { domain, tx } = context.state
111
+
112
+ await getRepository(BankAccount, 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 BankAccounts' })
123
+ async importBankAccounts(
124
+ @Arg('bankAccounts', type => [BankAccountPatch]) bankAccounts: BankAccountPatch[],
125
+ @Ctx() context: ResolverContext
126
+ ): Promise<boolean> {
127
+ const { domain, tx } = context.state
128
+
129
+ await Promise.all(
130
+ bankAccounts.map(async (bankAccount: BankAccountPatch) => {
131
+ const createdBankAccount: BankAccount = await getRepository(BankAccount, tx).save({ domain, ...bankAccount })
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 { BankAccount } from './bank-account'
5
+ import { BankAccountList } from './bank-account-type'
6
+
7
+ @Resolver(BankAccount)
8
+ export class BankAccountQuery {
9
+ @Query(returns => BankAccount!, { nullable: true, description: 'To fetch a BankAccount' })
10
+ async bankAccount(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<BankAccount> {
11
+ const { domain } = context.state
12
+
13
+ return await getRepository(BankAccount).findOne({
14
+ where: { domain: { id: domain.id }, id }
15
+ })
16
+ }
17
+
18
+ @Query(returns => BankAccountList, { description: 'To fetch multiple BankAccounts' })
19
+ async bankAccounts(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<BankAccountList> {
20
+ const { domain } = context.state
21
+
22
+ const queryBuilder = getQueryBuilderFromListParams({
23
+ domain,
24
+ params,
25
+ repository: await getRepository(BankAccount),
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() bankAccount: BankAccount): Promise<Domain> {
36
+ return bankAccount.domainId && (await getRepository(Domain).findOneBy({ id: bankAccount.domainId }))
37
+ }
38
+
39
+ @FieldResolver(type => User)
40
+ async updater(@Root() bankAccount: BankAccount): Promise<User> {
41
+ return bankAccount.updaterId && (await getRepository(User).findOneBy({ id: bankAccount.updaterId }))
42
+ }
43
+
44
+ @FieldResolver(type => User)
45
+ async creator(@Root() bankAccount: BankAccount): Promise<User> {
46
+ return bankAccount.creatorId && (await getRepository(User).findOneBy({ id: bankAccount.creatorId }))
47
+ }
48
+ }
@@ -0,0 +1,112 @@
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 { AccountType, BankAccount, OwnerType } from './bank-account'
8
+
9
+ @InputType()
10
+ export class NewBankAccount {
11
+ @Field()
12
+ name: string
13
+
14
+ @Field({ nullable: true })
15
+ description?: string
16
+
17
+ @Field({ nullable: true, description: 'Name of the account holder' })
18
+ accountHolderName?: string // 계좌 소유자의 이름
19
+
20
+ @Field({ nullable: true, description: 'Bank account number' })
21
+ accountNumber?: string
22
+
23
+ @Field({ nullable: true, description: 'Bank name' })
24
+ bankName?: string
25
+
26
+ @Field(type => AccountType, { description: 'Type of the account (Bank or Card)' })
27
+ accountType: AccountType
28
+
29
+ @Field({ nullable: true, description: 'Currency of the account' })
30
+ currency?: string
31
+
32
+ @Field({ nullable: true })
33
+ active?: boolean
34
+
35
+ @Field(type => OwnerType, { description: 'Type of the owner of the bank account' })
36
+ ownerType: OwnerType
37
+
38
+ @Field({ description: 'ID of the owner of the bank account' })
39
+ ownerId: string
40
+
41
+ @Field({ nullable: true, description: 'IBAN of the bank account' })
42
+ iban?: string // 은행 계좌의 IBAN
43
+
44
+ @Field({ nullable: true, description: 'BIC of the bank account' })
45
+ bic?: string // 은행 계좌의 BIC
46
+
47
+ @Field({ nullable: true, description: 'Country of the bank account' })
48
+ country?: string // 은행 계좌의 국적
49
+
50
+ @Field({ nullable: true, description: 'Cover image of the bank account' })
51
+ image?: string // 은행 계좌의 커버이미지
52
+ }
53
+
54
+ @InputType()
55
+ export class BankAccountPatch {
56
+ @Field(type => ID, { nullable: true })
57
+ id?: string
58
+
59
+ @Field({ nullable: true })
60
+ name?: string
61
+
62
+ @Field({ nullable: true })
63
+ description?: string
64
+
65
+ @Field({ nullable: true, description: 'Name of the account holder' })
66
+ accountHolderName?: string // 계좌 소유자의 이름
67
+
68
+ @Field({ nullable: true, description: 'Bank account number' })
69
+ accountNumber?: string
70
+
71
+ @Field({ nullable: true, description: 'Bank name' })
72
+ bankName?: string
73
+
74
+ @Field(type => AccountType, { description: 'Type of the account (Bank or Card)' })
75
+ accountType: AccountType
76
+
77
+ @Field({ nullable: true, description: 'Currency of the account' })
78
+ currency?: string
79
+
80
+ @Field({ nullable: true })
81
+ active?: boolean
82
+
83
+ @Field(type => OwnerType, { description: 'Type of the owner of the bank account' })
84
+ ownerType: OwnerType
85
+
86
+ @Field({ description: 'ID of the owner of the bank account' })
87
+ ownerId: string
88
+
89
+ @Field({ nullable: true, description: 'IBAN of the bank account' })
90
+ iban?: string // 은행 계좌의 IBAN
91
+
92
+ @Field({ nullable: true, description: 'BIC of the bank account' })
93
+ bic?: string // 은행 계좌의 BIC
94
+
95
+ @Field({ nullable: true, description: 'Country of the bank account' })
96
+ country?: string // 은행 계좌의 국적
97
+
98
+ @Field({ nullable: true, description: 'Cover image of the bank account' })
99
+ image?: string // 은행 계좌의 커버이미지
100
+
101
+ @Field({ nullable: true })
102
+ cuFlag?: string
103
+ }
104
+
105
+ @ObjectType()
106
+ export class BankAccountList {
107
+ @Field(type => [BankAccount])
108
+ items: BankAccount[]
109
+
110
+ @Field(type => Int)
111
+ total: number
112
+ }
@@ -0,0 +1,142 @@
1
+ import {
2
+ CreateDateColumn,
3
+ UpdateDateColumn,
4
+ DeleteDateColumn,
5
+ Entity,
6
+ Index,
7
+ Column,
8
+ RelationId,
9
+ ManyToOne,
10
+ VersionColumn,
11
+ PrimaryGeneratedColumn
12
+ } from 'typeorm'
13
+ import { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'
14
+
15
+ import { Domain } from '@things-factory/shell'
16
+ import { User } from '@things-factory/auth-base'
17
+
18
+ export enum AccountType {
19
+ Bank = 'Bank',
20
+ Card = 'Card'
21
+ }
22
+
23
+ registerEnumType(AccountType, {
24
+ name: 'AccountType',
25
+ description: 'Type of the account (Bank or Card)'
26
+ })
27
+
28
+ export enum OwnerType {
29
+ Company = 'Company',
30
+ Vendor = 'Vendor',
31
+ Employee = 'Employee'
32
+ }
33
+
34
+ registerEnumType(OwnerType, {
35
+ name: 'OwnerType',
36
+ description: 'Type of the owner of the bank account'
37
+ })
38
+
39
+ @Entity()
40
+ @Index('ix_bank_account_0', (bankAccount: BankAccount) => [bankAccount.domain, bankAccount.name], {
41
+ where: '"deleted_at" IS NULL',
42
+ unique: true
43
+ })
44
+ @ObjectType({ description: 'Entity for BankAccount' })
45
+ export class BankAccount {
46
+ @PrimaryGeneratedColumn('uuid')
47
+ @Field(type => ID)
48
+ readonly id: string
49
+
50
+ @VersionColumn()
51
+ @Field({ nullable: true })
52
+ version?: number = 1
53
+
54
+ @ManyToOne(type => Domain)
55
+ @Field({ nullable: true })
56
+ domain?: Domain
57
+
58
+ @RelationId((bankAccount: BankAccount) => bankAccount.domain)
59
+ domainId?: string
60
+
61
+ @Column()
62
+ @Field({ nullable: true })
63
+ name?: string
64
+
65
+ @Column({ nullable: true })
66
+ @Field({ nullable: true })
67
+ description?: string
68
+
69
+ @Column({ nullable: true })
70
+ @Field({ nullable: true, description: 'Name of the account holder' })
71
+ accountHolderName?: string // 계좌 소유자의 이름
72
+
73
+ @Column()
74
+ @Field({ nullable: true, description: 'Bank account number' })
75
+ accountNumber?: string
76
+
77
+ @Column()
78
+ @Field({ nullable: true, description: 'Bank name' })
79
+ bankName?: string
80
+
81
+ @Column({ type: 'enum', enum: AccountType })
82
+ @Field(type => AccountType, { description: 'Type of the account (Bank or Card)' })
83
+ accountType: AccountType
84
+
85
+ @Column({ nullable: true })
86
+ @Field({ nullable: true, description: 'Currency of the account' })
87
+ currency?: string
88
+
89
+ @Column({ nullable: false, default: false })
90
+ @Field({ nullable: true })
91
+ active?: boolean
92
+
93
+ @Column({ type: 'enum', enum: OwnerType })
94
+ @Field(type => OwnerType, { description: 'Type of the owner of the bank account' })
95
+ ownerType: OwnerType
96
+
97
+ @Column()
98
+ @Field({ description: 'ID of the owner of the bank account' })
99
+ ownerId: string
100
+
101
+ @Column({ nullable: true })
102
+ @Field({ nullable: true, description: 'IBAN of the bank account' })
103
+ iban?: string // 은행 계좌의 IBAN
104
+
105
+ @Column({ nullable: true })
106
+ @Field({ nullable: true, description: 'BIC of the bank account' })
107
+ bic?: string // 은행 계좌의 BIC
108
+
109
+ @Column({ nullable: true })
110
+ @Field({ nullable: true, description: 'Country of the bank account' })
111
+ country?: string // 은행 계좌의 국적
112
+
113
+ @Column({ nullable: true })
114
+ @Field({ nullable: true, description: 'Cover image of the bank account' })
115
+ image?: string // 은행 계좌의 커버이미지
116
+
117
+ @CreateDateColumn()
118
+ @Field({ nullable: true })
119
+ createdAt?: Date
120
+
121
+ @UpdateDateColumn()
122
+ @Field({ nullable: true })
123
+ updatedAt?: Date
124
+
125
+ @DeleteDateColumn()
126
+ @Field({ nullable: true })
127
+ deletedAt?: Date
128
+
129
+ @ManyToOne(type => User, { nullable: true })
130
+ @Field(type => User, { nullable: true })
131
+ creator?: User
132
+
133
+ @RelationId((bankAccount: BankAccount) => bankAccount.creator)
134
+ creatorId?: string
135
+
136
+ @ManyToOne(type => User, { nullable: true })
137
+ @Field(type => User, { nullable: true })
138
+ updater?: User
139
+
140
+ @RelationId((bankAccount: BankAccount) => bankAccount.updater)
141
+ updaterId?: string
142
+ }
@@ -0,0 +1,17 @@
1
+ import { EventSubscriber } from 'typeorm'
2
+
3
+ import { HistoryEntitySubscriber } from '@operato/typeorm-history'
4
+
5
+ import { BankAccount } from './bank-account'
6
+ import { BankAccountHistory } from './bank-account-history'
7
+
8
+ @EventSubscriber()
9
+ export class BankAccountHistoryEntitySubscriber extends HistoryEntitySubscriber<BankAccount, BankAccountHistory> {
10
+ public get entity() {
11
+ return BankAccount
12
+ }
13
+
14
+ public get historyEntity() {
15
+ return BankAccountHistory
16
+ }
17
+ }
@@ -0,0 +1,9 @@
1
+ import { BankAccount } from './bank-account'
2
+ import { BankAccountHistory } from './bank-account-history'
3
+ import { BankAccountHistoryEntitySubscriber } from './event-subscriber'
4
+ import { BankAccountQuery } from './bank-account-query'
5
+ import { BankAccountMutation } from './bank-account-mutation'
6
+
7
+ export const entities = [BankAccount, BankAccountHistory]
8
+ export const resolvers = [BankAccountQuery, BankAccountMutation]
9
+ export const subscribers = [BankAccountHistoryEntitySubscriber]