@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.
- package/client/pages/bank/bank-importer.ts +90 -0
- package/client/pages/bank/bank-list-page.ts +398 -0
- package/client/pages/bank-account/bank-account-importer.ts +90 -0
- package/client/pages/bank-account/bank-account-list-page.ts +398 -0
- package/client/pages/financial-institution/financial-institution-importer.ts +90 -0
- package/client/pages/financial-institution/financial-institution-list-page.ts +398 -0
- package/dist-client/pages/bank/bank-importer.d.ts +23 -0
- package/dist-client/pages/bank/bank-importer.js +93 -0
- package/dist-client/pages/bank/bank-importer.js.map +1 -0
- package/dist-client/pages/bank/bank-list-page.d.ts +66 -0
- package/dist-client/pages/bank/bank-list-page.js +370 -0
- package/dist-client/pages/bank/bank-list-page.js.map +1 -0
- package/dist-client/pages/bank-account/bank-account-importer.d.ts +23 -0
- package/dist-client/pages/bank-account/bank-account-importer.js +93 -0
- package/dist-client/pages/bank-account/bank-account-importer.js.map +1 -0
- package/dist-client/pages/bank-account/bank-account-list-page.d.ts +66 -0
- package/dist-client/pages/bank-account/bank-account-list-page.js +370 -0
- package/dist-client/pages/bank-account/bank-account-list-page.js.map +1 -0
- package/dist-client/pages/financial-institution/financial-institution-importer.d.ts +23 -0
- package/dist-client/pages/financial-institution/financial-institution-importer.js +93 -0
- package/dist-client/pages/financial-institution/financial-institution-importer.js.map +1 -0
- package/dist-client/pages/financial-institution/financial-institution-list-page.d.ts +66 -0
- package/dist-client/pages/financial-institution/financial-institution-list-page.js +370 -0
- package/dist-client/pages/financial-institution/financial-institution-list-page.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/migrations/1725201567284-seed-country-codes.d.ts +5 -0
- package/dist-server/migrations/1725201567284-seed-country-codes.js +248 -0
- package/dist-server/migrations/1725201567284-seed-country-codes.js.map +1 -0
- package/dist-server/migrations/1725201667385-seed-financial-institutions.d.ts +5 -0
- package/dist-server/migrations/1725201667385-seed-financial-institutions.js +348 -0
- package/dist-server/migrations/1725201667385-seed-financial-institutions.js.map +1 -0
- package/dist-server/service/bank-account/bank-account-history.d.ts +34 -0
- package/dist-server/service/bank-account/bank-account-history.js +172 -0
- package/dist-server/service/bank-account/bank-account-history.js.map +1 -0
- package/dist-server/service/bank-account/bank-account-mutation.d.ts +10 -0
- package/dist-server/service/bank-account/bank-account-mutation.js +128 -0
- package/dist-server/service/bank-account/bank-account-mutation.js.map +1 -0
- package/dist-server/service/bank-account/bank-account-query.d.ts +11 -0
- package/dist-server/service/bank-account/bank-account-query.js +79 -0
- package/dist-server/service/bank-account/bank-account-query.js.map +1 -0
- package/dist-server/service/bank-account/bank-account-type.d.ts +39 -0
- package/dist-server/service/bank-account/bank-account-type.js +153 -0
- package/dist-server/service/bank-account/bank-account-type.js.map +1 -0
- package/dist-server/service/bank-account/bank-account.d.ts +38 -0
- package/dist-server/service/bank-account/bank-account.js +164 -0
- package/dist-server/service/bank-account/bank-account.js.map +1 -0
- package/dist-server/service/bank-account/event-subscriber.d.ts +7 -0
- package/dist-server/service/bank-account/event-subscriber.js +21 -0
- package/dist-server/service/bank-account/event-subscriber.js.map +1 -0
- package/dist-server/service/bank-account/index.d.ts +7 -0
- package/dist-server/service/bank-account/index.js +12 -0
- package/dist-server/service/bank-account/index.js.map +1 -0
- package/dist-server/service/financial-institution/financial-institution-mutation.d.ts +10 -0
- package/dist-server/service/financial-institution/financial-institution-mutation.js +169 -0
- package/dist-server/service/financial-institution/financial-institution-mutation.js.map +1 -0
- package/dist-server/service/financial-institution/financial-institution-query.d.ts +12 -0
- package/dist-server/service/financial-institution/financial-institution-query.js +97 -0
- package/dist-server/service/financial-institution/financial-institution-query.js.map +1 -0
- package/dist-server/service/financial-institution/financial-institution-type.d.ts +32 -0
- package/dist-server/service/financial-institution/financial-institution-type.js +126 -0
- package/dist-server/service/financial-institution/financial-institution-type.js.map +1 -0
- package/dist-server/service/financial-institution/financial-institution.d.ts +34 -0
- package/dist-server/service/financial-institution/financial-institution.js +137 -0
- package/dist-server/service/financial-institution/financial-institution.js.map +1 -0
- package/dist-server/service/financial-institution/index.d.ts +6 -0
- package/dist-server/service/financial-institution/index.js +10 -0
- package/dist-server/service/financial-institution/index.js.map +1 -0
- package/dist-server/service/index.d.ts +1 -1
- package/dist-server/service/payment/index.d.ts +1 -2
- package/dist-server/service/payment/payment-history.d.ts +8 -1
- package/dist-server/service/payment/payment-history.js +41 -10
- package/dist-server/service/payment/payment-history.js.map +1 -1
- package/dist-server/service/payment/payment-type.d.ts +7 -1
- package/dist-server/service/payment/payment-type.js +24 -0
- package/dist-server/service/payment/payment-type.js.map +1 -1
- package/dist-server/service/payment/payment.d.ts +12 -0
- package/dist-server/service/payment/payment.js +36 -1
- package/dist-server/service/payment/payment.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/helps/accounting/bank-account.md +160 -0
- package/helps/accounting/bank.md +160 -0
- package/helps/accounting/financial-institution.md +160 -0
- package/package.json +7 -7
- package/server/migrations/1725201567284-seed-country-codes.ts +261 -0
- package/server/migrations/1725201667385-seed-financial-institutions.ts +348 -0
- package/server/service/bank-account/bank-account-history.ts +149 -0
- package/server/service/bank-account/bank-account-mutation.ts +137 -0
- package/server/service/bank-account/bank-account-query.ts +48 -0
- package/server/service/bank-account/bank-account-type.ts +112 -0
- package/server/service/bank-account/bank-account.ts +142 -0
- package/server/service/bank-account/event-subscriber.ts +17 -0
- package/server/service/bank-account/index.ts +9 -0
- package/server/service/financial-institution/financial-institution-mutation.ts +198 -0
- package/server/service/financial-institution/financial-institution-query.ts +62 -0
- package/server/service/financial-institution/financial-institution-type.ts +91 -0
- package/server/service/financial-institution/financial-institution.ts +122 -0
- package/server/service/financial-institution/index.ts +7 -0
- package/server/service/payment/payment-history.ts +41 -18
- package/server/service/payment/payment-type.ts +19 -1
- 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]
|