@things-factory/accounting 10.1.187 → 10.1.188
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/dist-server/service/account/account-choice.d.ts +51 -0
- package/dist-server/service/account/account-choice.js +81 -0
- package/dist-server/service/account/account-choice.js.map +1 -0
- package/dist-server/service/account/account-query.d.ts +2 -0
- package/dist-server/service/account/account-query.js +15 -9
- package/dist-server/service/account/account-query.js.map +1 -1
- package/dist-server/service/expenditure-request/expenditure-request-query.d.ts +2 -0
- package/dist-server/service/expenditure-request/expenditure-request-query.js +11 -0
- package/dist-server/service/expenditure-request/expenditure-request-query.js.map +1 -1
- package/dist-server/service/expenditure-request/expenditure-request.js +2 -0
- package/dist-server/service/expenditure-request/expenditure-request.js.map +1 -1
- package/dist-server/service/index.d.ts +1 -0
- package/dist-server/service/index.js +1 -0
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Repository } from 'typeorm';
|
|
2
|
+
import { ListParam } from '@things-factory/shell';
|
|
3
|
+
import { CashFlowType } from '../cash-flow-type';
|
|
4
|
+
import { Account } from './account';
|
|
5
|
+
/** What the chart's list door searches - the chart keeper's door. */
|
|
6
|
+
export declare const ACCOUNT_SEARCHABLES: string[];
|
|
7
|
+
/** What a choice is searched, filtered and sorted by - the fields it shows. */
|
|
8
|
+
export declare const ACCOUNT_CHOICE_SEARCHABLES: string[];
|
|
9
|
+
export declare const ACCOUNT_CHOICE_FILTERABLES: string[];
|
|
10
|
+
/** A choice door is no way to read the whole chart at once. */
|
|
11
|
+
export declare const ACCOUNT_CHOICE_LIMIT = 50;
|
|
12
|
+
export declare class AccountChoice {
|
|
13
|
+
id: string;
|
|
14
|
+
code: string;
|
|
15
|
+
name: string;
|
|
16
|
+
type: CashFlowType;
|
|
17
|
+
}
|
|
18
|
+
export declare class AccountChoiceList {
|
|
19
|
+
items: AccountChoice[];
|
|
20
|
+
total: number;
|
|
21
|
+
}
|
|
22
|
+
/** What a door lets a list be read by. */
|
|
23
|
+
export interface AccountListRules {
|
|
24
|
+
searchables: string[];
|
|
25
|
+
filterables?: string[];
|
|
26
|
+
sortables?: string[];
|
|
27
|
+
defaultLimit?: number;
|
|
28
|
+
maxLimit?: number;
|
|
29
|
+
}
|
|
30
|
+
/** One page of a domain's account subjects - the list door and the choice door read through this one function. */
|
|
31
|
+
export declare function accountPage(repository: Repository<Account>, domain: {
|
|
32
|
+
id: string;
|
|
33
|
+
}, params: ListParam, rules: AccountListRules): Promise<{
|
|
34
|
+
items: Account[];
|
|
35
|
+
total: number;
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Subjects to pick from - asked as any list is, answered only by what a choice shows: active ones, searched, filtered
|
|
39
|
+
* and sorted by the shown fields (by code when no order is asked), a capped page at a time.
|
|
40
|
+
*/
|
|
41
|
+
export declare function accountChoicesOf(repository: Repository<Account>, domain: {
|
|
42
|
+
id: string;
|
|
43
|
+
}, params: ListParam | undefined): Promise<{
|
|
44
|
+
items: {
|
|
45
|
+
id: string;
|
|
46
|
+
code: string;
|
|
47
|
+
name: string;
|
|
48
|
+
type: CashFlowType;
|
|
49
|
+
}[];
|
|
50
|
+
total: number;
|
|
51
|
+
}>;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AccountChoiceList = exports.AccountChoice = exports.ACCOUNT_CHOICE_LIMIT = exports.ACCOUNT_CHOICE_FILTERABLES = exports.ACCOUNT_CHOICE_SEARCHABLES = exports.ACCOUNT_SEARCHABLES = void 0;
|
|
4
|
+
exports.accountPage = accountPage;
|
|
5
|
+
exports.accountChoicesOf = accountChoicesOf;
|
|
6
|
+
const tslib_1 = require("tslib");
|
|
7
|
+
const type_graphql_1 = require("type-graphql");
|
|
8
|
+
const shell_1 = require("@things-factory/shell");
|
|
9
|
+
const cash_flow_type_1 = require("../cash-flow-type");
|
|
10
|
+
/*
|
|
11
|
+
* Choosing an account subject without reading the chart (ADR-0139, design/published-read-privilege):
|
|
12
|
+
* `accounting-published` opens a subject's code, name and direction, in its own type - nothing to follow.
|
|
13
|
+
*/
|
|
14
|
+
/** What the chart's list door searches - the chart keeper's door. */
|
|
15
|
+
exports.ACCOUNT_SEARCHABLES = ['code', 'name', 'aliases', 'description'];
|
|
16
|
+
/** What a choice is searched, filtered and sorted by - the fields it shows. */
|
|
17
|
+
exports.ACCOUNT_CHOICE_SEARCHABLES = ['code', 'name'];
|
|
18
|
+
/* `active` is the door's own filter; `type` is shown, so one may pick among income or expense subjects. */
|
|
19
|
+
exports.ACCOUNT_CHOICE_FILTERABLES = [...exports.ACCOUNT_CHOICE_SEARCHABLES, 'type', 'active'];
|
|
20
|
+
/** A choice door is no way to read the whole chart at once. */
|
|
21
|
+
exports.ACCOUNT_CHOICE_LIMIT = 50;
|
|
22
|
+
let AccountChoice = class AccountChoice {
|
|
23
|
+
};
|
|
24
|
+
exports.AccountChoice = AccountChoice;
|
|
25
|
+
tslib_1.__decorate([
|
|
26
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.ID),
|
|
27
|
+
tslib_1.__metadata("design:type", String)
|
|
28
|
+
], AccountChoice.prototype, "id", void 0);
|
|
29
|
+
tslib_1.__decorate([
|
|
30
|
+
(0, type_graphql_1.Field)(),
|
|
31
|
+
tslib_1.__metadata("design:type", String)
|
|
32
|
+
], AccountChoice.prototype, "code", void 0);
|
|
33
|
+
tslib_1.__decorate([
|
|
34
|
+
(0, type_graphql_1.Field)(),
|
|
35
|
+
tslib_1.__metadata("design:type", String)
|
|
36
|
+
], AccountChoice.prototype, "name", void 0);
|
|
37
|
+
tslib_1.__decorate([
|
|
38
|
+
(0, type_graphql_1.Field)(type => cash_flow_type_1.CashFlowType, { description: 'Whether money booked to it comes in or goes out' }),
|
|
39
|
+
tslib_1.__metadata("design:type", String)
|
|
40
|
+
], AccountChoice.prototype, "type", void 0);
|
|
41
|
+
exports.AccountChoice = AccountChoice = tslib_1.__decorate([
|
|
42
|
+
(0, type_graphql_1.ObjectType)({ description: 'An account subject as one picks it: its code, name and whether money booked to it comes in or goes out' })
|
|
43
|
+
], AccountChoice);
|
|
44
|
+
let AccountChoiceList = class AccountChoiceList {
|
|
45
|
+
};
|
|
46
|
+
exports.AccountChoiceList = AccountChoiceList;
|
|
47
|
+
tslib_1.__decorate([
|
|
48
|
+
(0, type_graphql_1.Field)(type => [AccountChoice]),
|
|
49
|
+
tslib_1.__metadata("design:type", Array)
|
|
50
|
+
], AccountChoiceList.prototype, "items", void 0);
|
|
51
|
+
tslib_1.__decorate([
|
|
52
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.Int),
|
|
53
|
+
tslib_1.__metadata("design:type", Number)
|
|
54
|
+
], AccountChoiceList.prototype, "total", void 0);
|
|
55
|
+
exports.AccountChoiceList = AccountChoiceList = tslib_1.__decorate([
|
|
56
|
+
(0, type_graphql_1.ObjectType)({ description: 'A page of account subjects to pick from' })
|
|
57
|
+
], AccountChoiceList);
|
|
58
|
+
/** One page of a domain's account subjects - the list door and the choice door read through this one function. */
|
|
59
|
+
async function accountPage(repository, domain, params, rules) {
|
|
60
|
+
const queryBuilder = (0, shell_1.getQueryBuilderFromListParams)({ domain: domain, params, repository, ...rules });
|
|
61
|
+
const [items, total] = await queryBuilder.getManyAndCount();
|
|
62
|
+
return { items, total };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Subjects to pick from - asked as any list is, answered only by what a choice shows: active ones, searched, filtered
|
|
66
|
+
* and sorted by the shown fields (by code when no order is asked), a capped page at a time.
|
|
67
|
+
*/
|
|
68
|
+
async function accountChoicesOf(repository, domain, params) {
|
|
69
|
+
const asked = (params ?? {});
|
|
70
|
+
const filters = [...(asked.filters ?? []), { name: 'active', operator: 'eq', value: true }];
|
|
71
|
+
const sortings = asked.sortings?.length ? asked.sortings : [{ name: 'code' }];
|
|
72
|
+
const { items, total } = await accountPage(repository, domain, { ...asked, filters, sortings }, {
|
|
73
|
+
searchables: exports.ACCOUNT_CHOICE_SEARCHABLES,
|
|
74
|
+
filterables: exports.ACCOUNT_CHOICE_FILTERABLES,
|
|
75
|
+
sortables: exports.ACCOUNT_CHOICE_SEARCHABLES,
|
|
76
|
+
defaultLimit: exports.ACCOUNT_CHOICE_LIMIT,
|
|
77
|
+
maxLimit: exports.ACCOUNT_CHOICE_LIMIT
|
|
78
|
+
});
|
|
79
|
+
return { items: items.map(one => ({ id: one.id, code: one.code, name: one.name, type: one.type })), total };
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=account-choice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-choice.js","sourceRoot":"","sources":["../../../server/service/account/account-choice.ts"],"names":[],"mappings":"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","sourcesContent":["import { Field, ID, Int, ObjectType } from 'type-graphql'\nimport { Repository } from 'typeorm'\n\nimport { getQueryBuilderFromListParams, ListParam } from '@things-factory/shell'\n\nimport { CashFlowType } from '../cash-flow-type'\nimport { Account } from './account'\n\n/*\n * Choosing an account subject without reading the chart (ADR-0139, design/published-read-privilege):\n * `accounting-published` opens a subject's code, name and direction, in its own type - nothing to follow.\n */\n\n/** What the chart's list door searches - the chart keeper's door. */\nexport const ACCOUNT_SEARCHABLES = ['code', 'name', 'aliases', 'description']\n/** What a choice is searched, filtered and sorted by - the fields it shows. */\nexport const ACCOUNT_CHOICE_SEARCHABLES = ['code', 'name']\n/* `active` is the door's own filter; `type` is shown, so one may pick among income or expense subjects. */\nexport const ACCOUNT_CHOICE_FILTERABLES = [...ACCOUNT_CHOICE_SEARCHABLES, 'type', 'active']\n/** A choice door is no way to read the whole chart at once. */\nexport const ACCOUNT_CHOICE_LIMIT = 50\n\n@ObjectType({ description: 'An account subject as one picks it: its code, name and whether money booked to it comes in or goes out' })\nexport class AccountChoice {\n @Field(type => ID) id: string\n @Field() code: string\n @Field() name: string\n @Field(type => CashFlowType, { description: 'Whether money booked to it comes in or goes out' }) type: CashFlowType\n}\n\n@ObjectType({ description: 'A page of account subjects to pick from' })\nexport class AccountChoiceList {\n @Field(type => [AccountChoice]) items: AccountChoice[]\n @Field(type => Int) total: number\n}\n\n/** What a door lets a list be read by. */\nexport interface AccountListRules {\n searchables: string[]\n filterables?: string[]\n sortables?: string[]\n defaultLimit?: number\n maxLimit?: number\n}\n\n/** One page of a domain's account subjects - the list door and the choice door read through this one function. */\nexport async function accountPage(repository: Repository<Account>, domain: { id: string }, params: ListParam, rules: AccountListRules) {\n const queryBuilder = getQueryBuilderFromListParams({ domain: domain as any, params, repository, ...rules })\n const [items, total] = await queryBuilder.getManyAndCount()\n return { items, total }\n}\n\n/**\n * Subjects to pick from - asked as any list is, answered only by what a choice shows: active ones, searched, filtered\n * and sorted by the shown fields (by code when no order is asked), a capped page at a time.\n */\nexport async function accountChoicesOf(repository: Repository<Account>, domain: { id: string }, params: ListParam | undefined) {\n const asked = (params ?? {}) as ListParam\n const filters = [...(asked.filters ?? []), { name: 'active', operator: 'eq', value: true }]\n const sortings = asked.sortings?.length ? asked.sortings : [{ name: 'code' }]\n const { items, total } = await accountPage(repository, domain, { ...asked, filters, sortings } as ListParam, {\n searchables: ACCOUNT_CHOICE_SEARCHABLES,\n filterables: ACCOUNT_CHOICE_FILTERABLES,\n sortables: ACCOUNT_CHOICE_SEARCHABLES,\n defaultLimit: ACCOUNT_CHOICE_LIMIT,\n maxLimit: ACCOUNT_CHOICE_LIMIT\n })\n return { items: items.map(one => ({ id: one.id, code: one.code, name: one.name, type: one.type })), total }\n}\n"]}
|
|
@@ -3,9 +3,11 @@ import { User } from '@things-factory/auth-base';
|
|
|
3
3
|
import { AccountingCategory } from '../accounting-category/accounting-category';
|
|
4
4
|
import { Account } from './account';
|
|
5
5
|
import { AccountList } from './account-type';
|
|
6
|
+
import { AccountChoiceList } from './account-choice';
|
|
6
7
|
export declare class AccountQuery {
|
|
7
8
|
account(id: string, context: ResolverContext): Promise<Account>;
|
|
8
9
|
accounts(params: ListParam, context: ResolverContext): Promise<AccountList>;
|
|
10
|
+
accountChoices(params: ListParam, context: ResolverContext): Promise<AccountChoiceList>;
|
|
9
11
|
category(account: Account): Promise<AccountingCategory | null>;
|
|
10
12
|
domain(account: Account): Promise<Domain>;
|
|
11
13
|
updater(account: Account): Promise<User>;
|
|
@@ -8,6 +8,7 @@ const auth_base_1 = require("@things-factory/auth-base");
|
|
|
8
8
|
const accounting_category_1 = require("../accounting-category/accounting-category");
|
|
9
9
|
const account_1 = require("./account");
|
|
10
10
|
const account_type_1 = require("./account-type");
|
|
11
|
+
const account_choice_1 = require("./account-choice");
|
|
11
12
|
let AccountQuery = class AccountQuery {
|
|
12
13
|
async account(id, context) {
|
|
13
14
|
const { domain } = context.state;
|
|
@@ -16,15 +17,11 @@ let AccountQuery = class AccountQuery {
|
|
|
16
17
|
});
|
|
17
18
|
}
|
|
18
19
|
async accounts(params, context) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
searchables: ['code', 'name', 'aliases', 'description']
|
|
25
|
-
});
|
|
26
|
-
const [items, total] = await queryBuilder.getManyAndCount();
|
|
27
|
-
return { items, total };
|
|
20
|
+
return await (0, account_choice_1.accountPage)((0, shell_1.getRepository)(account_1.Account), context.state.domain, params, { searchables: account_choice_1.ACCOUNT_SEARCHABLES });
|
|
21
|
+
}
|
|
22
|
+
/* Picking a subject without reading the chart - every seat may (ADR-0139). */
|
|
23
|
+
async accountChoices(params, context) {
|
|
24
|
+
return (await (0, account_choice_1.accountChoicesOf)((0, shell_1.getRepository)(account_1.Account), context.state.domain, params));
|
|
28
25
|
}
|
|
29
26
|
async category(account) {
|
|
30
27
|
return account.categoryId ? await (0, shell_1.getRepository)(accounting_category_1.AccountingCategory).findOneBy({ id: account.categoryId }) : null;
|
|
@@ -58,6 +55,15 @@ tslib_1.__decorate([
|
|
|
58
55
|
tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
|
|
59
56
|
tslib_1.__metadata("design:returntype", Promise)
|
|
60
57
|
], AccountQuery.prototype, "accounts", null);
|
|
58
|
+
tslib_1.__decorate([
|
|
59
|
+
(0, type_graphql_1.Directive)('@privilege(category: "accounting-published", privilege: "query", domainOwnerGranted: true)'),
|
|
60
|
+
(0, type_graphql_1.Query)(returns => account_choice_1.AccountChoiceList, { description: 'Account subjects to pick from - code, name and direction; a capped page at a time' }),
|
|
61
|
+
tslib_1.__param(0, (0, type_graphql_1.Args)()),
|
|
62
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
63
|
+
tslib_1.__metadata("design:type", Function),
|
|
64
|
+
tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
|
|
65
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
66
|
+
], AccountQuery.prototype, "accountChoices", null);
|
|
61
67
|
tslib_1.__decorate([
|
|
62
68
|
(0, type_graphql_1.FieldResolver)(type => accounting_category_1.AccountingCategory, { nullable: true }),
|
|
63
69
|
tslib_1.__param(0, (0, type_graphql_1.Root)()),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-query.js","sourceRoot":"","sources":["../../../server/service/account/account-query.ts"],"names":[],"mappings":";;;;AAAA,+CAA8F;AAE9F,
|
|
1
|
+
{"version":3,"file":"account-query.js","sourceRoot":"","sources":["../../../server/service/account/account-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'\n\nimport { Domain, getRepository, ListParam } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { AccountingCategory } from '../accounting-category/accounting-category'\nimport { Account } from './account'\nimport { AccountList } from './account-type'\nimport { AccountChoiceList, accountChoicesOf, accountPage, ACCOUNT_SEARCHABLES } from './account-choice'\n\n@Resolver(Account)\nexport class AccountQuery {\n @Directive('@privilege(category: \"accounting-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => Account!, { nullable: true, description: 'To fetch a Account' })\n async account(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Account> {\n const { domain } = context.state\n\n return await getRepository(Account).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Directive('@privilege(category: \"accounting-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => AccountList, { description: 'To fetch multiple Accounts' })\n async accounts(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<AccountList> {\n return await accountPage(getRepository(Account), context.state.domain, params, { searchables: ACCOUNT_SEARCHABLES })\n }\n\n /* Picking a subject without reading the chart - every seat may (ADR-0139). */\n @Directive('@privilege(category: \"accounting-published\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => AccountChoiceList, { description: 'Account subjects to pick from - code, name and direction; a capped page at a time' })\n async accountChoices(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<AccountChoiceList> {\n return (await accountChoicesOf(getRepository(Account), context.state.domain, params)) as any\n }\n\n @FieldResolver(type => AccountingCategory, { nullable: true })\n async category(@Root() account: Account): Promise<AccountingCategory | null> {\n return account.categoryId ? await getRepository(AccountingCategory).findOneBy({ id: account.categoryId }) : null\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() account: Account): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: account.domainId })\n }\n\n @FieldResolver(type => User)\n async updater(@Root() account: Account): Promise<User> {\n return await getRepository(User).findOneBy({ id: account.updaterId })\n }\n\n @FieldResolver(type => User)\n async creator(@Root() account: Account): Promise<User> {\n return await getRepository(User).findOneBy({ id: account.creatorId })\n }\n}\n"]}
|
|
@@ -8,6 +8,8 @@ import { ExpenditureRequest } from './expenditure-request';
|
|
|
8
8
|
import { ExpenditureRequestItem } from './expenditure-request-item';
|
|
9
9
|
import { ExpenditurePayment, ExpenditureQueue, ExpenditureRequestList, ExpenditureSummary } from './expenditure-request-type';
|
|
10
10
|
export declare class ExpenditureRequestQuery {
|
|
11
|
+
/** The last four digits of the account paid into - what the requester and the approvers see (ADR-0139). */
|
|
12
|
+
payeeAccountTail(request: ExpenditureRequest): string | undefined;
|
|
11
13
|
/** The caller's own requests - what an employee sees. */
|
|
12
14
|
myExpenditureRequests(params: ListParam, context: ResolverContext): Promise<ExpenditureRequestList>;
|
|
13
15
|
/** One of the caller's own requests, with its lines. */
|
|
@@ -49,6 +49,10 @@ async function summaryOf(domain, year, month, requesterId) {
|
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
51
|
let ExpenditureRequestQuery = class ExpenditureRequestQuery {
|
|
52
|
+
/** The last four digits of the account paid into - what the requester and the approvers see (ADR-0139). */
|
|
53
|
+
payeeAccountTail(request) {
|
|
54
|
+
return (0, biz_base_1.accountTailOf)(request.payeeAccountNumber);
|
|
55
|
+
}
|
|
52
56
|
/** The caller's own requests - what an employee sees. */
|
|
53
57
|
async myExpenditureRequests(params, context) {
|
|
54
58
|
const { domain, user } = context.state;
|
|
@@ -146,6 +150,13 @@ let ExpenditureRequestQuery = class ExpenditureRequestQuery {
|
|
|
146
150
|
}
|
|
147
151
|
};
|
|
148
152
|
exports.ExpenditureRequestQuery = ExpenditureRequestQuery;
|
|
153
|
+
tslib_1.__decorate([
|
|
154
|
+
(0, type_graphql_1.FieldResolver)(type => String, { nullable: true, description: "The last four digits of the account paid into" }),
|
|
155
|
+
tslib_1.__param(0, (0, type_graphql_1.Root)()),
|
|
156
|
+
tslib_1.__metadata("design:type", Function),
|
|
157
|
+
tslib_1.__metadata("design:paramtypes", [expenditure_request_1.ExpenditureRequest]),
|
|
158
|
+
tslib_1.__metadata("design:returntype", String)
|
|
159
|
+
], ExpenditureRequestQuery.prototype, "payeeAccountTail", null);
|
|
149
160
|
tslib_1.__decorate([
|
|
150
161
|
(0, type_graphql_1.Directive)('@privilege(category: "accounting-self", privilege: "query", domainOwnerGranted: true)'),
|
|
151
162
|
(0, type_graphql_1.Query)(returns => expenditure_request_type_1.ExpenditureRequestList, { description: "The caller's own expenditure requests" }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expenditure-request-query.js","sourceRoot":"","sources":["../../../server/service/expenditure-request/expenditure-request-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, FieldResolver, Int, Query, Resolver, Root, UseMiddleware } from 'type-graphql'\nimport { Like } from 'typeorm'\n\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam, SpeakRefusals } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { Attachment } from '@things-factory/attachment-base'\nimport { Counterparty, CounterpartyBankAccount } from '@things-factory/biz-base'\nimport { Department } from '@things-factory/organization'\nimport { TaxInvoice } from '@things-factory/tax-invoice'\n\nimport { Account } from '../account/account'\nimport { ExpenditureKind, ExpenditureRequest, ExpenditureRequestStatus } from './expenditure-request'\nimport { ExpenditureRequestItem } from './expenditure-request-item'\nimport { paymentStatesOf, ExpenditurePaymentState } from './expenditure-payment-state'\nimport { monthlySummary, statusCounts, type RequestStatus } from './expenditure-request-rules'\nimport { approvedWithStates, driftOf, RECEIPT_REF_TYPE } from './expenditure-request-service'\nimport { ExpenditurePayment, ExpenditureQueue, ExpenditureQueueRow, ExpenditureRequestList, ExpenditureSummary } from './expenditure-request-type'\n\nconst byId = async <T>(entity: new () => T, id: string | null | undefined, withDeleted = false): Promise<T | null> =>\n id ? ((await getRepository(entity).findOne({ where: { id } as any, withDeleted })) as T | null) : null\n\nasync function summaryOf(domain: { id: string }, year: number, month: number | undefined, requesterId?: string): Promise<ExpenditureSummary> {\n const period = month ? `${year}-${String(month).padStart(2, '0')}` : `${year}-%`\n const requests = await getRepository(ExpenditureRequest).find({\n where: {\n domain: { id: domain.id },\n kind: ExpenditureKind.REIMBURSEMENT,\n month: month ? period : Like(period),\n ...(requesterId ? { requester: { id: requesterId } } : {})\n } as any,\n relations: ['requester', 'items', 'items.account']\n })\n const shaped = requests.map(one => ({\n month: one.month,\n requesterId: one.requesterId ?? one.requester?.id,\n requesterName: one.requester?.name ?? null,\n status: one.status as RequestStatus,\n /* Summed by 계정과목; a line not yet filed counts under the category written on it. */\n items: (one.items ?? []).filter(item => !item.deletedAt).map(item => ({ ...item, category: item.account?.name ?? item.category }))\n }))\n\n const rows = monthlySummary(shaped)\n const approved = requests.filter(one => one.status === ExpenditureRequestStatus.APPROVED)\n approved.forEach(one => (one.items = (one.items ?? []).filter(item => !item.deletedAt)))\n const states = await paymentStatesOf(getRepository(ExpenditureRequest).manager, domain, approved as any)\n\n return {\n rows,\n statuses: Object.entries(statusCounts(shaped)).map(([status, count]) => ({ status, count })),\n approvedTotal: rows.reduce((sum, one) => sum + one.total, 0),\n unpaid: [...states.values()].reduce((sum, one) => sum + one.outstanding, 0)\n }\n}\n\n@UseMiddleware(SpeakRefusals)\n@Resolver(ExpenditureRequest)\nexport class ExpenditureRequestQuery {\n /** The caller's own requests - what an employee sees. */\n @Directive('@privilege(category: \"accounting-self\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequestList, { description: \"The caller's own expenditure requests\" })\n async myExpenditureRequests(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<ExpenditureRequestList> {\n const { domain, user } = context.state\n const queryBuilder = getQueryBuilderFromListParams({ domain, params, repository: getRepository(ExpenditureRequest), searchables: ['title', 'notes'], alias: 'request' })\n queryBuilder.andWhere('request.requester = :requester', { requester: user.id })\n queryBuilder.addOrderBy('request.createdAt', 'DESC')\n const [items, total] = await queryBuilder.getManyAndCount()\n return { items, total }\n }\n\n /** One of the caller's own requests, with its lines. */\n @Directive('@privilege(category: \"accounting-self\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequest, { nullable: true, description: \"One of the caller's own expenditure requests\" })\n async myExpenditureRequest(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<ExpenditureRequest | null> {\n const { domain, user } = context.state\n return await getRepository(ExpenditureRequest).findOne({ where: { id, domain: { id: domain.id }, requester: { id: user.id } } as any })\n }\n\n /** Every request of the domain - what finance sees. */\n @Directive('@privilege(category: \"accounting\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequestList, { description: 'Every expenditure request of the domain' })\n async expenditureRequests(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<ExpenditureRequestList> {\n const { domain } = context.state\n const queryBuilder = getQueryBuilderFromListParams({ domain, params, repository: getRepository(ExpenditureRequest), searchables: ['title', 'notes'], alias: 'request' })\n queryBuilder.addOrderBy('request.createdAt', 'DESC')\n const [items, total] = await queryBuilder.getManyAndCount()\n return { items, total }\n }\n\n @Directive('@privilege(category: \"accounting\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequest, { nullable: true, description: 'One expenditure request of the domain' })\n async expenditureRequest(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<ExpenditureRequest | null> {\n return await getRepository(ExpenditureRequest).findOne({ where: { id, domain: { id: context.state.domain.id } } as any })\n }\n\n /**\n * The payment queue (지급 대기) - approved requests still to pay, by the day they are to be paid, and the paid ones\n * whose bank line no statement has matched yet.\n */\n @Directive('@privilege(category: \"accounting\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureQueue, { description: 'Approved requests still to pay, and paid ones not yet matched to the bank' })\n async expenditureQueue(@Ctx() context: ResolverContext): Promise<ExpenditureQueue> {\n const { domain } = context.state\n const manager = getRepository(ExpenditureRequest).manager\n const { requests, states } = await approvedWithStates(manager, domain)\n\n const rows: ExpenditureQueueRow[] = []\n for (const request of requests) {\n const payment = states.get(request.id)!\n if (payment.state === ExpenditurePaymentState.NOTHING_TO_PAY) continue\n rows.push({\n request,\n payment,\n payeeName: (request.kind === ExpenditureKind.VENDOR ? request.counterparty?.name : request.requester?.name) ?? undefined,\n payeeAccountDrift: payment.outstanding > 0 ? await driftOf(manager, request) : undefined\n })\n }\n const due = (row: ExpenditureQueueRow) => row.request.dueDate ?? '9999-12-31'\n const waiting = rows\n .filter(row => row.payment.outstanding > 0)\n .sort((a, b) => due(a).localeCompare(due(b)) || String(a.request.decidedAt ?? '').localeCompare(String(b.request.decidedAt ?? '')))\n const unreconciled = rows.filter(row => row.payment.outstanding <= 0 && !row.payment.reconciled)\n return { waiting, unreconciled }\n }\n\n @Directive('@privilege(category: \"accounting\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureSummary, { description: 'Approved reimbursements per month, requester and category, with requests per status' })\n async expenditureSummary(\n @Arg('year', type => Int) year: number,\n @Arg('month', type => Int, { nullable: true }) month: number,\n @Ctx() context: ResolverContext\n ): Promise<ExpenditureSummary> {\n return await summaryOf(context.state.domain, year, month || undefined)\n }\n\n @Directive('@privilege(category: \"accounting-self\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureSummary, { description: \"The caller's own monthly summary of reimbursements\" })\n async myExpenditureSummary(\n @Arg('year', type => Int) year: number,\n @Arg('month', type => Int, { nullable: true }) month: number,\n @Ctx() context: ResolverContext\n ): Promise<ExpenditureSummary> {\n return await summaryOf(context.state.domain, year, month || undefined, context.state.user.id)\n }\n\n /** How far it is paid - read from its payments (ADR-0135 §2-4). */\n @FieldResolver(type => ExpenditurePayment, { nullable: true })\n async payment(@Root() request: ExpenditureRequest): Promise<ExpenditurePayment | null> {\n if (request.status !== ExpenditureRequestStatus.APPROVED) return null\n const items = await getRepository(ExpenditureRequestItem).find({ where: { request: { id: request.id } } as any })\n const states = await paymentStatesOf(getRepository(ExpenditureRequest).manager, { id: request.domainId! }, [{ id: request.id, items }])\n return states.get(request.id) ?? null\n }\n\n @FieldResolver(type => [ExpenditureRequestItem])\n async items(@Root() request: ExpenditureRequest): Promise<ExpenditureRequestItem[]> {\n if (request.items) return request.items.filter(item => !item.deletedAt)\n return await getRepository(ExpenditureRequestItem).find({ where: { request: { id: request.id } } as any, order: { spentDate: 'ASC', createdAt: 'ASC' } as any })\n }\n\n @FieldResolver(type => User, { nullable: true })\n async requester(@Root() request: ExpenditureRequest): Promise<User | null> {\n return request.requester ?? (await byId(User, request.requesterId))\n }\n\n @FieldResolver(type => Department, { nullable: true })\n async department(@Root() request: ExpenditureRequest): Promise<Department | null> {\n return request.department ?? (await byId(Department, request.departmentId))\n }\n\n @FieldResolver(type => Counterparty, { nullable: true })\n async counterparty(@Root() request: ExpenditureRequest): Promise<Counterparty | null> {\n return request.counterparty ?? (await byId(Counterparty, request.counterpartyId, true))\n }\n\n @FieldResolver(type => CounterpartyBankAccount, { nullable: true })\n async payeeAccount(@Root() request: ExpenditureRequest): Promise<CounterpartyBankAccount | null> {\n return request.payeeAccount ?? (await byId(CounterpartyBankAccount, request.payeeAccountId, true))\n }\n\n @FieldResolver(type => User, { nullable: true })\n async decidedBy(@Root() request: ExpenditureRequest): Promise<User | null> {\n return request.decidedBy ?? (await byId(User, request.decidedById))\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() request: ExpenditureRequest): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: request.domainId })\n }\n\n @FieldResolver(type => User, { nullable: true })\n async creator(@Root() request: ExpenditureRequest): Promise<User | null> {\n return await byId(User, request.creatorId)\n }\n\n @FieldResolver(type => User, { nullable: true })\n async updater(@Root() request: ExpenditureRequest): Promise<User | null> {\n return await byId(User, request.updaterId)\n }\n}\n\n@Resolver(ExpenditureRequestItem)\nexport class ExpenditureRequestItemQuery {\n @FieldResolver(type => ExpenditureRequest, { nullable: true })\n async request(@Root() item: ExpenditureRequestItem): Promise<ExpenditureRequest | null> {\n return item.request ?? (await byId(ExpenditureRequest, item.requestId))\n }\n\n @FieldResolver(type => Account, { nullable: true })\n async account(@Root() item: ExpenditureRequestItem): Promise<Account | null> {\n return item.account ?? (await byId(Account, item.accountId))\n }\n\n @FieldResolver(type => TaxInvoice, { nullable: true })\n async taxInvoice(@Root() item: ExpenditureRequestItem): Promise<TaxInvoice | null> {\n return item.taxInvoice ?? (await byId(TaxInvoice, item.taxInvoiceId, true))\n }\n\n /** Where the receipt is, or null - so an approver can see what was spent. */\n @FieldResolver(type => String, { nullable: true })\n async receiptUrl(@Root() item: ExpenditureRequestItem): Promise<string | null> {\n const attachment = await getRepository(Attachment).findOne({ where: { refType: RECEIPT_REF_TYPE, refBy: item.id }, order: { createdAt: 'DESC' } as any })\n return attachment?.fullpath ?? null\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() item: ExpenditureRequestItem): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: item.domainId })\n }\n\n @FieldResolver(type => User, { nullable: true })\n async creator(@Root() item: ExpenditureRequestItem): Promise<User | null> {\n return await byId(User, item.creatorId)\n }\n\n @FieldResolver(type => User, { nullable: true })\n async updater(@Root() item: ExpenditureRequestItem): Promise<User | null> {\n return await byId(User, item.updaterId)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"expenditure-request-query.js","sourceRoot":"","sources":["../../../server/service/expenditure-request/expenditure-request-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, Directive, FieldResolver, Int, Query, Resolver, Root, UseMiddleware } from 'type-graphql'\nimport { Like } from 'typeorm'\n\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam, SpeakRefusals } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { Attachment } from '@things-factory/attachment-base'\nimport { accountTailOf, Counterparty, CounterpartyBankAccount } from '@things-factory/biz-base'\nimport { Department } from '@things-factory/organization'\nimport { TaxInvoice } from '@things-factory/tax-invoice'\n\nimport { Account } from '../account/account'\nimport { ExpenditureKind, ExpenditureRequest, ExpenditureRequestStatus } from './expenditure-request'\nimport { ExpenditureRequestItem } from './expenditure-request-item'\nimport { paymentStatesOf, ExpenditurePaymentState } from './expenditure-payment-state'\nimport { monthlySummary, statusCounts, type RequestStatus } from './expenditure-request-rules'\nimport { approvedWithStates, driftOf, RECEIPT_REF_TYPE } from './expenditure-request-service'\nimport { ExpenditurePayment, ExpenditureQueue, ExpenditureQueueRow, ExpenditureRequestList, ExpenditureSummary } from './expenditure-request-type'\n\nconst byId = async <T>(entity: new () => T, id: string | null | undefined, withDeleted = false): Promise<T | null> =>\n id ? ((await getRepository(entity).findOne({ where: { id } as any, withDeleted })) as T | null) : null\n\nasync function summaryOf(domain: { id: string }, year: number, month: number | undefined, requesterId?: string): Promise<ExpenditureSummary> {\n const period = month ? `${year}-${String(month).padStart(2, '0')}` : `${year}-%`\n const requests = await getRepository(ExpenditureRequest).find({\n where: {\n domain: { id: domain.id },\n kind: ExpenditureKind.REIMBURSEMENT,\n month: month ? period : Like(period),\n ...(requesterId ? { requester: { id: requesterId } } : {})\n } as any,\n relations: ['requester', 'items', 'items.account']\n })\n const shaped = requests.map(one => ({\n month: one.month,\n requesterId: one.requesterId ?? one.requester?.id,\n requesterName: one.requester?.name ?? null,\n status: one.status as RequestStatus,\n /* Summed by 계정과목; a line not yet filed counts under the category written on it. */\n items: (one.items ?? []).filter(item => !item.deletedAt).map(item => ({ ...item, category: item.account?.name ?? item.category }))\n }))\n\n const rows = monthlySummary(shaped)\n const approved = requests.filter(one => one.status === ExpenditureRequestStatus.APPROVED)\n approved.forEach(one => (one.items = (one.items ?? []).filter(item => !item.deletedAt)))\n const states = await paymentStatesOf(getRepository(ExpenditureRequest).manager, domain, approved as any)\n\n return {\n rows,\n statuses: Object.entries(statusCounts(shaped)).map(([status, count]) => ({ status, count })),\n approvedTotal: rows.reduce((sum, one) => sum + one.total, 0),\n unpaid: [...states.values()].reduce((sum, one) => sum + one.outstanding, 0)\n }\n}\n\n@UseMiddleware(SpeakRefusals)\n@Resolver(ExpenditureRequest)\nexport class ExpenditureRequestQuery {\n /** The last four digits of the account paid into - what the requester and the approvers see (ADR-0139). */\n @FieldResolver(type => String, { nullable: true, description: \"The last four digits of the account paid into\" })\n payeeAccountTail(@Root() request: ExpenditureRequest): string | undefined {\n return accountTailOf(request.payeeAccountNumber)\n }\n\n /** The caller's own requests - what an employee sees. */\n @Directive('@privilege(category: \"accounting-self\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequestList, { description: \"The caller's own expenditure requests\" })\n async myExpenditureRequests(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<ExpenditureRequestList> {\n const { domain, user } = context.state\n const queryBuilder = getQueryBuilderFromListParams({ domain, params, repository: getRepository(ExpenditureRequest), searchables: ['title', 'notes'], alias: 'request' })\n queryBuilder.andWhere('request.requester = :requester', { requester: user.id })\n queryBuilder.addOrderBy('request.createdAt', 'DESC')\n const [items, total] = await queryBuilder.getManyAndCount()\n return { items, total }\n }\n\n /** One of the caller's own requests, with its lines. */\n @Directive('@privilege(category: \"accounting-self\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequest, { nullable: true, description: \"One of the caller's own expenditure requests\" })\n async myExpenditureRequest(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<ExpenditureRequest | null> {\n const { domain, user } = context.state\n return await getRepository(ExpenditureRequest).findOne({ where: { id, domain: { id: domain.id }, requester: { id: user.id } } as any })\n }\n\n /** Every request of the domain - what finance sees. */\n @Directive('@privilege(category: \"accounting\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequestList, { description: 'Every expenditure request of the domain' })\n async expenditureRequests(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<ExpenditureRequestList> {\n const { domain } = context.state\n const queryBuilder = getQueryBuilderFromListParams({ domain, params, repository: getRepository(ExpenditureRequest), searchables: ['title', 'notes'], alias: 'request' })\n queryBuilder.addOrderBy('request.createdAt', 'DESC')\n const [items, total] = await queryBuilder.getManyAndCount()\n return { items, total }\n }\n\n @Directive('@privilege(category: \"accounting\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureRequest, { nullable: true, description: 'One expenditure request of the domain' })\n async expenditureRequest(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<ExpenditureRequest | null> {\n return await getRepository(ExpenditureRequest).findOne({ where: { id, domain: { id: context.state.domain.id } } as any })\n }\n\n /**\n * The payment queue (지급 대기) - approved requests still to pay, by the day they are to be paid, and the paid ones\n * whose bank line no statement has matched yet.\n */\n @Directive('@privilege(category: \"accounting\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureQueue, { description: 'Approved requests still to pay, and paid ones not yet matched to the bank' })\n async expenditureQueue(@Ctx() context: ResolverContext): Promise<ExpenditureQueue> {\n const { domain } = context.state\n const manager = getRepository(ExpenditureRequest).manager\n const { requests, states } = await approvedWithStates(manager, domain)\n\n const rows: ExpenditureQueueRow[] = []\n for (const request of requests) {\n const payment = states.get(request.id)!\n if (payment.state === ExpenditurePaymentState.NOTHING_TO_PAY) continue\n rows.push({\n request,\n payment,\n payeeName: (request.kind === ExpenditureKind.VENDOR ? request.counterparty?.name : request.requester?.name) ?? undefined,\n payeeAccountDrift: payment.outstanding > 0 ? await driftOf(manager, request) : undefined\n })\n }\n const due = (row: ExpenditureQueueRow) => row.request.dueDate ?? '9999-12-31'\n const waiting = rows\n .filter(row => row.payment.outstanding > 0)\n .sort((a, b) => due(a).localeCompare(due(b)) || String(a.request.decidedAt ?? '').localeCompare(String(b.request.decidedAt ?? '')))\n const unreconciled = rows.filter(row => row.payment.outstanding <= 0 && !row.payment.reconciled)\n return { waiting, unreconciled }\n }\n\n @Directive('@privilege(category: \"accounting\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureSummary, { description: 'Approved reimbursements per month, requester and category, with requests per status' })\n async expenditureSummary(\n @Arg('year', type => Int) year: number,\n @Arg('month', type => Int, { nullable: true }) month: number,\n @Ctx() context: ResolverContext\n ): Promise<ExpenditureSummary> {\n return await summaryOf(context.state.domain, year, month || undefined)\n }\n\n @Directive('@privilege(category: \"accounting-self\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => ExpenditureSummary, { description: \"The caller's own monthly summary of reimbursements\" })\n async myExpenditureSummary(\n @Arg('year', type => Int) year: number,\n @Arg('month', type => Int, { nullable: true }) month: number,\n @Ctx() context: ResolverContext\n ): Promise<ExpenditureSummary> {\n return await summaryOf(context.state.domain, year, month || undefined, context.state.user.id)\n }\n\n /** How far it is paid - read from its payments (ADR-0135 §2-4). */\n @FieldResolver(type => ExpenditurePayment, { nullable: true })\n async payment(@Root() request: ExpenditureRequest): Promise<ExpenditurePayment | null> {\n if (request.status !== ExpenditureRequestStatus.APPROVED) return null\n const items = await getRepository(ExpenditureRequestItem).find({ where: { request: { id: request.id } } as any })\n const states = await paymentStatesOf(getRepository(ExpenditureRequest).manager, { id: request.domainId! }, [{ id: request.id, items }])\n return states.get(request.id) ?? null\n }\n\n @FieldResolver(type => [ExpenditureRequestItem])\n async items(@Root() request: ExpenditureRequest): Promise<ExpenditureRequestItem[]> {\n if (request.items) return request.items.filter(item => !item.deletedAt)\n return await getRepository(ExpenditureRequestItem).find({ where: { request: { id: request.id } } as any, order: { spentDate: 'ASC', createdAt: 'ASC' } as any })\n }\n\n @FieldResolver(type => User, { nullable: true })\n async requester(@Root() request: ExpenditureRequest): Promise<User | null> {\n return request.requester ?? (await byId(User, request.requesterId))\n }\n\n @FieldResolver(type => Department, { nullable: true })\n async department(@Root() request: ExpenditureRequest): Promise<Department | null> {\n return request.department ?? (await byId(Department, request.departmentId))\n }\n\n @FieldResolver(type => Counterparty, { nullable: true })\n async counterparty(@Root() request: ExpenditureRequest): Promise<Counterparty | null> {\n return request.counterparty ?? (await byId(Counterparty, request.counterpartyId, true))\n }\n\n @FieldResolver(type => CounterpartyBankAccount, { nullable: true })\n async payeeAccount(@Root() request: ExpenditureRequest): Promise<CounterpartyBankAccount | null> {\n return request.payeeAccount ?? (await byId(CounterpartyBankAccount, request.payeeAccountId, true))\n }\n\n @FieldResolver(type => User, { nullable: true })\n async decidedBy(@Root() request: ExpenditureRequest): Promise<User | null> {\n return request.decidedBy ?? (await byId(User, request.decidedById))\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() request: ExpenditureRequest): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: request.domainId })\n }\n\n @FieldResolver(type => User, { nullable: true })\n async creator(@Root() request: ExpenditureRequest): Promise<User | null> {\n return await byId(User, request.creatorId)\n }\n\n @FieldResolver(type => User, { nullable: true })\n async updater(@Root() request: ExpenditureRequest): Promise<User | null> {\n return await byId(User, request.updaterId)\n }\n}\n\n@Resolver(ExpenditureRequestItem)\nexport class ExpenditureRequestItemQuery {\n @FieldResolver(type => ExpenditureRequest, { nullable: true })\n async request(@Root() item: ExpenditureRequestItem): Promise<ExpenditureRequest | null> {\n return item.request ?? (await byId(ExpenditureRequest, item.requestId))\n }\n\n @FieldResolver(type => Account, { nullable: true })\n async account(@Root() item: ExpenditureRequestItem): Promise<Account | null> {\n return item.account ?? (await byId(Account, item.accountId))\n }\n\n @FieldResolver(type => TaxInvoice, { nullable: true })\n async taxInvoice(@Root() item: ExpenditureRequestItem): Promise<TaxInvoice | null> {\n return item.taxInvoice ?? (await byId(TaxInvoice, item.taxInvoiceId, true))\n }\n\n /** Where the receipt is, or null - so an approver can see what was spent. */\n @FieldResolver(type => String, { nullable: true })\n async receiptUrl(@Root() item: ExpenditureRequestItem): Promise<string | null> {\n const attachment = await getRepository(Attachment).findOne({ where: { refType: RECEIPT_REF_TYPE, refBy: item.id }, order: { createdAt: 'DESC' } as any })\n return attachment?.fullpath ?? null\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() item: ExpenditureRequestItem): Promise<Domain> {\n return await getRepository(Domain).findOneBy({ id: item.domainId })\n }\n\n @FieldResolver(type => User, { nullable: true })\n async creator(@Root() item: ExpenditureRequestItem): Promise<User | null> {\n return await byId(User, item.creatorId)\n }\n\n @FieldResolver(type => User, { nullable: true })\n async updater(@Root() item: ExpenditureRequestItem): Promise<User | null> {\n return await byId(User, item.updaterId)\n }\n}\n"]}
|
|
@@ -108,11 +108,13 @@ tslib_1.__decorate([
|
|
|
108
108
|
], ExpenditureRequest.prototype, "payeeBankName", void 0);
|
|
109
109
|
tslib_1.__decorate([
|
|
110
110
|
(0, typeorm_1.Column)({ nullable: true }),
|
|
111
|
+
(0, type_graphql_1.Directive)('@privilege(category: "bank", privilege: "query", domainOwnerGranted: false)'),
|
|
111
112
|
(0, type_graphql_1.Field)({ nullable: true, description: 'The account paid into, as approvers saw it - written at submission' }),
|
|
112
113
|
tslib_1.__metadata("design:type", String)
|
|
113
114
|
], ExpenditureRequest.prototype, "payeeAccountNumber", void 0);
|
|
114
115
|
tslib_1.__decorate([
|
|
115
116
|
(0, typeorm_1.Column)({ nullable: true }),
|
|
117
|
+
(0, type_graphql_1.Directive)('@privilege(category: "bank", privilege: "query", domainOwnerGranted: false)'),
|
|
116
118
|
(0, type_graphql_1.Field)({ nullable: true, description: 'The holder of the account paid into, as approvers saw it' }),
|
|
117
119
|
tslib_1.__metadata("design:type", String)
|
|
118
120
|
], ExpenditureRequest.prototype, "payeeHolderName", void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expenditure-request.js","sourceRoot":"","sources":["../../../server/service/expenditure-request/expenditure-request.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n ManyToOne,\n OneToMany,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Field, Float, ID, ObjectType, registerEnumType } from 'type-graphql'\n\nimport { Domain, moneyColumn } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { Counterparty, CounterpartyBankAccount } from '@things-factory/biz-base'\nimport { Department } from '@things-factory/organization'\n\nimport { ExpenditureRequestItem } from './expenditure-request-item'\n\nexport enum ExpenditureKind {\n /** Paying a counterparty - a supplier's invoice, a service, a deposit. */\n VENDOR = 'VENDOR',\n /** Paying an employee back what they spent for the company (경비 청구). */\n REIMBURSEMENT = 'REIMBURSEMENT'\n}\n\nregisterEnumType(ExpenditureKind, {\n name: 'ExpenditureKind',\n description: 'Who an expenditure request pays - a counterparty, or the employee who spent their own money'\n})\n\nexport enum ExpenditureRequestStatus {\n DRAFT = 'DRAFT',\n SUBMITTED = 'SUBMITTED',\n APPROVED = 'APPROVED',\n REJECTED = 'REJECTED',\n WITHDRAWN = 'WITHDRAWN'\n}\n\nregisterEnumType(ExpenditureRequestStatus, {\n name: 'ExpenditureRequestStatus',\n description:\n 'Where a request stands with its approvers - being written, waiting, decided. Whether it was paid is read from the bank lines that paid it'\n})\n\n/**\n * 지출결의 - money the company is asked to pay out, put up for approval before it leaves (ADR-0135).\n *\n * Two kinds share it: paying a counterparty, and paying an employee back (경비 청구, one claim per employee and\n * month). The requester writes the lines and submits; approvers decide through the worklist approval the submission\n * raises. Once approved, finance pays it from the payment queue.\n *\n * Whether it was paid, and whether that payment was reconciled with the bank, is not stored: it is read from the\n * payments on it (§`expenditure-payment-state.ts`). The account approvers saw is written down at submission, and it\n * is the account paid.\n */\n@Entity()\n@Index('ix_expenditure_request_0', (request: ExpenditureRequest) => [request.domain, request.status])\n@Index('ix_expenditure_request_1', (request: ExpenditureRequest) => [request.domain, request.requester, request.month])\n@Index('ix_expenditure_request_2', (request: ExpenditureRequest) => [request.domain, request.dueDate])\n@ObjectType({ description: 'Money the company is asked to pay out, put up for approval before it leaves' })\nexport class ExpenditureRequest {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier' })\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain, { nullable: true, description: 'The domain it belongs to' })\n domain?: Domain\n\n @RelationId((request: ExpenditureRequest) => request.domain)\n domainId?: string\n\n @Column()\n @Field(type => ExpenditureKind, { description: 'Whom it pays - a counterparty, or the employee paid back' })\n kind: ExpenditureKind\n\n @ManyToOne(type => User, { nullable: false })\n @Field(type => User, { nullable: true, description: 'Who wrote it - for a reimbursement, also who is paid' })\n requester?: User\n\n @RelationId((request: ExpenditureRequest) => request.requester)\n requesterId?: string\n\n @ManyToOne(type => Department, { nullable: true })\n @Field(type => Department, { nullable: true, description: \"The requester's department when it was written\" })\n department?: Department\n\n @RelationId((request: ExpenditureRequest) => request.department)\n departmentId?: string\n\n @ManyToOne(type => Counterparty, { nullable: true })\n @Field(type => Counterparty, { nullable: true, description: 'Who is paid, for a counterparty payment' })\n counterparty?: Counterparty\n\n @RelationId((request: ExpenditureRequest) => request.counterparty)\n counterpartyId?: string\n\n @ManyToOne(type => CounterpartyBankAccount, { nullable: true })\n @Field(type => CounterpartyBankAccount, { nullable: true, description: \"The counterparty's account chosen to be paid into\" })\n payeeAccount?: CounterpartyBankAccount\n\n @RelationId((request: ExpenditureRequest) => request.payeeAccount)\n payeeAccountId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'The bank of the account paid into, as approvers saw it' })\n payeeBankName?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'The account paid into, as approvers saw it - written at submission' })\n payeeAccountNumber?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'The holder of the account paid into, as approvers saw it' })\n payeeHolderName?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'YYYY-MM a reimbursement belongs to' })\n month?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'YYYY-MM-DD it is to be paid' })\n dueDate?: string\n\n @Column()\n @Field({ description: 'What it is, in a few words' })\n title: string\n\n @Column({ default: 'KRW' })\n @Field({ description: 'The currency it is asked in' })\n currency: string\n\n @Column({ default: ExpenditureRequestStatus.DRAFT })\n @Field(type => ExpenditureRequestStatus, { description: 'Where it stands with its approvers' })\n status: ExpenditureRequestStatus\n\n @Column(moneyColumn())\n @Field(type => Float, { description: 'Sum of the lines' })\n totalAmount: number\n\n @Column(moneyColumn())\n @Field(type => Float, { description: 'What the company is to pay - the lines not paid with the corporate card' })\n payableAmount: number\n\n @OneToMany(type => ExpenditureRequestItem, item => item.request)\n @Field(type => [ExpenditureRequestItem], { nullable: true, description: 'The lines' })\n items?: ExpenditureRequestItem[]\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'The worklist approval raised by the latest submission' })\n activityInstanceId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When it was last put up for approval' })\n submittedAt?: Date\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When approvers last decided' })\n decidedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'Who made the last decision' })\n decidedBy?: User\n\n @RelationId((request: ExpenditureRequest) => request.decidedBy)\n decidedById?: string\n\n @Column({ type: 'text', nullable: true })\n @Field({ nullable: true, description: 'Notes' })\n notes?: string\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'When it was written' })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'When it was last changed' })\n updatedAt?: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'When it was deleted - financial rows are kept, not erased' })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'Who wrote it' })\n creator?: User\n\n @RelationId((request: ExpenditureRequest) => request.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'Who changed it last' })\n updater?: User\n\n @RelationId((request: ExpenditureRequest) => request.updater)\n updaterId?: string\n}\n"]}
|
|
1
|
+
{"version":3,"file":"expenditure-request.js","sourceRoot":"","sources":["../../../server/service/expenditure-request/expenditure-request.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n ManyToOne,\n OneToMany,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Directive, Field, Float, ID, ObjectType, registerEnumType } from 'type-graphql'\n\nimport { Domain, moneyColumn } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { Counterparty, CounterpartyBankAccount } from '@things-factory/biz-base'\nimport { Department } from '@things-factory/organization'\n\nimport { ExpenditureRequestItem } from './expenditure-request-item'\n\nexport enum ExpenditureKind {\n /** Paying a counterparty - a supplier's invoice, a service, a deposit. */\n VENDOR = 'VENDOR',\n /** Paying an employee back what they spent for the company (경비 청구). */\n REIMBURSEMENT = 'REIMBURSEMENT'\n}\n\nregisterEnumType(ExpenditureKind, {\n name: 'ExpenditureKind',\n description: 'Who an expenditure request pays - a counterparty, or the employee who spent their own money'\n})\n\nexport enum ExpenditureRequestStatus {\n DRAFT = 'DRAFT',\n SUBMITTED = 'SUBMITTED',\n APPROVED = 'APPROVED',\n REJECTED = 'REJECTED',\n WITHDRAWN = 'WITHDRAWN'\n}\n\nregisterEnumType(ExpenditureRequestStatus, {\n name: 'ExpenditureRequestStatus',\n description:\n 'Where a request stands with its approvers - being written, waiting, decided. Whether it was paid is read from the bank lines that paid it'\n})\n\n/**\n * 지출결의 - money the company is asked to pay out, put up for approval before it leaves (ADR-0135).\n *\n * Two kinds share it: paying a counterparty, and paying an employee back (경비 청구, one claim per employee and\n * month). The requester writes the lines and submits; approvers decide through the worklist approval the submission\n * raises. Once approved, finance pays it from the payment queue.\n *\n * Whether it was paid, and whether that payment was reconciled with the bank, is not stored: it is read from the\n * payments on it (§`expenditure-payment-state.ts`). The account approvers saw is written down at submission, and it\n * is the account paid.\n */\n@Entity()\n@Index('ix_expenditure_request_0', (request: ExpenditureRequest) => [request.domain, request.status])\n@Index('ix_expenditure_request_1', (request: ExpenditureRequest) => [request.domain, request.requester, request.month])\n@Index('ix_expenditure_request_2', (request: ExpenditureRequest) => [request.domain, request.dueDate])\n@ObjectType({ description: 'Money the company is asked to pay out, put up for approval before it leaves' })\nexport class ExpenditureRequest {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier' })\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain, { nullable: true, description: 'The domain it belongs to' })\n domain?: Domain\n\n @RelationId((request: ExpenditureRequest) => request.domain)\n domainId?: string\n\n @Column()\n @Field(type => ExpenditureKind, { description: 'Whom it pays - a counterparty, or the employee paid back' })\n kind: ExpenditureKind\n\n @ManyToOne(type => User, { nullable: false })\n @Field(type => User, { nullable: true, description: 'Who wrote it - for a reimbursement, also who is paid' })\n requester?: User\n\n @RelationId((request: ExpenditureRequest) => request.requester)\n requesterId?: string\n\n @ManyToOne(type => Department, { nullable: true })\n @Field(type => Department, { nullable: true, description: \"The requester's department when it was written\" })\n department?: Department\n\n @RelationId((request: ExpenditureRequest) => request.department)\n departmentId?: string\n\n @ManyToOne(type => Counterparty, { nullable: true })\n @Field(type => Counterparty, { nullable: true, description: 'Who is paid, for a counterparty payment' })\n counterparty?: Counterparty\n\n @RelationId((request: ExpenditureRequest) => request.counterparty)\n counterpartyId?: string\n\n @ManyToOne(type => CounterpartyBankAccount, { nullable: true })\n @Field(type => CounterpartyBankAccount, { nullable: true, description: \"The counterparty's account chosen to be paid into\" })\n payeeAccount?: CounterpartyBankAccount\n\n @RelationId((request: ExpenditureRequest) => request.payeeAccount)\n payeeAccountId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'The bank of the account paid into, as approvers saw it' })\n payeeBankName?: string\n\n /* The whole number and the holder are the bank book's (ADR-0139); everyone else sees the bank and `payeeAccountTail`. */\n @Column({ nullable: true })\n @Directive('@privilege(category: \"bank\", privilege: \"query\", domainOwnerGranted: false)')\n @Field({ nullable: true, description: 'The account paid into, as approvers saw it - written at submission' })\n payeeAccountNumber?: string\n\n @Column({ nullable: true })\n @Directive('@privilege(category: \"bank\", privilege: \"query\", domainOwnerGranted: false)')\n @Field({ nullable: true, description: 'The holder of the account paid into, as approvers saw it' })\n payeeHolderName?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'YYYY-MM a reimbursement belongs to' })\n month?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'YYYY-MM-DD it is to be paid' })\n dueDate?: string\n\n @Column()\n @Field({ description: 'What it is, in a few words' })\n title: string\n\n @Column({ default: 'KRW' })\n @Field({ description: 'The currency it is asked in' })\n currency: string\n\n @Column({ default: ExpenditureRequestStatus.DRAFT })\n @Field(type => ExpenditureRequestStatus, { description: 'Where it stands with its approvers' })\n status: ExpenditureRequestStatus\n\n @Column(moneyColumn())\n @Field(type => Float, { description: 'Sum of the lines' })\n totalAmount: number\n\n @Column(moneyColumn())\n @Field(type => Float, { description: 'What the company is to pay - the lines not paid with the corporate card' })\n payableAmount: number\n\n @OneToMany(type => ExpenditureRequestItem, item => item.request)\n @Field(type => [ExpenditureRequestItem], { nullable: true, description: 'The lines' })\n items?: ExpenditureRequestItem[]\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'The worklist approval raised by the latest submission' })\n activityInstanceId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When it was last put up for approval' })\n submittedAt?: Date\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'When approvers last decided' })\n decidedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'Who made the last decision' })\n decidedBy?: User\n\n @RelationId((request: ExpenditureRequest) => request.decidedBy)\n decidedById?: string\n\n @Column({ type: 'text', nullable: true })\n @Field({ nullable: true, description: 'Notes' })\n notes?: string\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'When it was written' })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'When it was last changed' })\n updatedAt?: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'When it was deleted - financial rows are kept, not erased' })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'Who wrote it' })\n creator?: User\n\n @RelationId((request: ExpenditureRequest) => request.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'Who changed it last' })\n updater?: User\n\n @RelationId((request: ExpenditureRequest) => request.updater)\n updaterId?: string\n}\n"]}
|
|
@@ -27,6 +27,7 @@ export * from './recurring-cash-item/recurring-schedule';
|
|
|
27
27
|
export * from './recurring-cash-item/recurring-cash-item-service';
|
|
28
28
|
export * from './account/account-match';
|
|
29
29
|
export * from './account/default-accounts';
|
|
30
|
+
export * from './account/account-choice';
|
|
30
31
|
export * from './bank-statement/bank-source';
|
|
31
32
|
export * from './bank-statement/bank-parser';
|
|
32
33
|
export * from './bank-statement/bank-reconcile';
|
|
@@ -33,6 +33,7 @@ tslib_1.__exportStar(require("./recurring-cash-item/recurring-schedule"), export
|
|
|
33
33
|
tslib_1.__exportStar(require("./recurring-cash-item/recurring-cash-item-service"), exports);
|
|
34
34
|
tslib_1.__exportStar(require("./account/account-match"), exports);
|
|
35
35
|
tslib_1.__exportStar(require("./account/default-accounts"), exports);
|
|
36
|
+
tslib_1.__exportStar(require("./account/account-choice"), exports);
|
|
36
37
|
tslib_1.__exportStar(require("./bank-statement/bank-source"), exports);
|
|
37
38
|
tslib_1.__exportStar(require("./bank-statement/bank-parser"), exports);
|
|
38
39
|
tslib_1.__exportStar(require("./bank-statement/bank-reconcile"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,2DAAgC;AAChC,oFAAyD;AACzD,oFAAyD;AACzD,oEAAyC;AACzC,sEAA2C;AAC3C,0EAA+C;AAC/C,4DAAiC;AACjC,4DAAiC;AACjC,oFAAyD;AACzD,oFAAyD;AACzD,wFAA6D;AAC7D,sEAA2C;AAC3C,0EAA+C;AAC/C,oEAAyC;AACzC,oFAAyD;AACzD,yFAA8D;AAE9D,qBAAqB;AACrB,2EAAgD;AAChD,4EAAiD;AACjD,8EAAmD;AACnD,oEAAyC;AACzC,oEAAyC;AACzC,qEAA0C;AAC1C,qEAA0C;AAC1C,yFAA8D;AAC9D,4FAAiE;AACjE,mFAAwD;AACxD,4FAAiE;AACjE,kEAAuC;AACvC,qEAA0C;AAC1C,uEAA4C;AAC5C,uEAA4C;AAC5C,0EAA+C;AAC/C,4EAAiD;AACjD,uEAA4C;AAC5C,4FAAiE;AACjE,8FAAmE;AACnE,0FAA+D;AAC/D,0FAA+D;AAC/D,4FAAiE;AAEjE,mCAAmC;AACnC,+DAI8B;AAC9B,+DAI8B;AAC9B,+CAIsB;AACtB,iDAIuB;AACvB,qDAIyB;AACzB,uCAIkB;AAClB,uCAIkB;AAClB,+DAI8B;AAC9B,+DAI8B;AAC9B,mEAIgC;AAChC,iDAIuB;AACvB,qDAIyB;AACzB,+CAIsB;AACtB,iEAI+B;AAC/B,+DAI8B;AAEjB,QAAA,QAAQ,GAAG;IACtB,GAAG,8BAA0B;IAC7B,GAAG,8BAA0B;IAC7B,GAAG,sBAAmB;IACtB,GAAG,uBAAmB;IACtB,GAAG,yBAAqB;IACxB,GAAG,kBAAe;IAClB,GAAG,kBAAe;IAClB,GAAG,8BAA0B;IAC7B,GAAG,8BAAyB;IAC5B,GAAG,gCAA4B;IAC/B,GAAG,uBAAmB;IACtB,GAAG,yBAAqB;IACxB,GAAG,sBAAkB;IACrB,GAAG,+BAA2B;IAC9B,GAAG,8BAA0B;CAC9B,CAAA;AAEY,QAAA,WAAW,GAAG;IACzB,GAAG,iCAA6B;IAChC,GAAG,iCAA6B;IAChC,GAAG,yBAAsB;IACzB,GAAG,0BAAsB;IACzB,GAAG,4BAAwB;IAC3B,GAAG,qBAAkB;IACrB,GAAG,qBAAkB;IACrB,GAAG,iCAA6B;IAChC,GAAG,iCAA4B;IAC/B,GAAG,mCAA+B;IAClC,GAAG,0BAAsB;IACzB,GAAG,4BAAwB;IAC3B,GAAG,yBAAqB;IACxB,GAAG,kCAA8B;IACjC,GAAG,iCAA6B;CACjC,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,GAAG,+BAA2B;QAC9B,GAAG,+BAA2B;QAC9B,GAAG,uBAAoB;QACvB,GAAG,wBAAoB;QACvB,GAAG,0BAAsB;QACzB,GAAG,mBAAgB;QACnB,GAAG,mBAAgB;QACnB,GAAG,+BAA2B;QAC9B,GAAG,+BAA0B;QAC7B,GAAG,iCAA6B;QAChC,GAAG,wBAAoB;QACvB,GAAG,0BAAsB;QACzB,GAAG,uBAAmB;QACtB,GAAG,gCAA4B;QAC/B,GAAG,+BAA2B;KAC/B;CACF,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './cash-flow-type'\nexport * from './financial-statement/financial-statement'\nexport * from './accounting-category/accounting-category'\nexport * from './transaction/transaction'\nexport * from './bank-account/bank-account'\nexport * from './bank-statement/bank-statement'\nexport * from './payment/payment'\nexport * from './account/account'\nexport * from './accounting-document/accounting-document'\nexport * from './recurring-cash-item/recurring-cash-item'\nexport * from './financial-institution/financial-institution'\nexport * from './fiscal-month/fiscal-month'\nexport * from './fiscal-quarter/fiscal-quarter'\nexport * from './fiscal-year/fiscal-year'\nexport * from './expenditure-request/expenditure-request'\nexport * from './expenditure-request/expenditure-request-item'\n\n/* EXPORT SERVICES */\nexport * from './transaction/transaction-period'\nexport * from './transaction/transaction-service'\nexport * from './bank-account/bank-account-service'\nexport * from './payment/payment-targets'\nexport * from './payment/payment-service'\nexport * from './payment/payment-currency'\nexport * from './payment/document-targets'\nexport * from './financial-statement/financial-statement-line'\nexport * from './financial-statement/financial-statement-service'\nexport * from './recurring-cash-item/recurring-schedule'\nexport * from './recurring-cash-item/recurring-cash-item-service'\nexport * from './account/account-match'\nexport * from './account/default-accounts'\nexport * from './bank-statement/bank-source'\nexport * from './bank-statement/bank-parser'\nexport * from './bank-statement/bank-reconcile'\nexport * from './bank-statement/bank-import-type'\nexport * from './bank-statement/bank-import'\nexport * from './counterparty-account/counterparty-account-rules'\nexport * from './counterparty-account/counterparty-account-service'\nexport * from './expenditure-request/expenditure-request-rules'\nexport * from './expenditure-request/expenditure-payment-state'\nexport * from './expenditure-request/expenditure-request-service'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport {\n entities as FinancialStatementEntities,\n resolvers as FinancialStatementResolvers,\n subscribers as FinancialStatementSubscribers\n} from './financial-statement'\nimport {\n entities as AccountingCategoryEntities,\n resolvers as AccountingCategoryResolvers,\n subscribers as AccountingCategorySubscribers\n} from './accounting-category'\nimport {\n entities as TransactionEntities,\n resolvers as TransactionResolvers,\n subscribers as TransactionSubscribers\n} from './transaction'\nimport {\n entities as BankAccountEntities,\n resolvers as BankAccountResolvers,\n subscribers as BankAccountSubscribers\n} from './bank-account'\nimport {\n entities as BankStatementEntities,\n resolvers as BankStatementResolvers,\n subscribers as BankStatementSubscribers\n} from './bank-statement'\nimport {\n entities as PaymentEntities,\n resolvers as PaymentResolvers,\n subscribers as PaymentSubscribers\n} from './payment'\nimport {\n entities as AccountEntities,\n resolvers as AccountResolvers,\n subscribers as AccountSubscribers\n} from './account'\nimport {\n entities as AccountingDocumentEntities,\n resolvers as AccountingDocumentResolvers,\n subscribers as AccountingDocumentSubscribers\n} from './accounting-document'\nimport {\n entities as RecurringCashItemEntities,\n resolvers as RecurringCashItemResolvers,\n subscribers as RecurringCashItemSubscribers\n} from './recurring-cash-item'\nimport {\n entities as FinancialInstitutionEntities,\n resolvers as FinancialInstitutionResolvers,\n subscribers as FinancialInstitutionSubscribers\n} from './financial-institution'\nimport {\n entities as FiscalMonthEntities,\n resolvers as FiscalMonthResolvers,\n subscribers as FiscalMonthSubscribers\n} from './fiscal-month'\nimport {\n entities as FiscalQuarterEntities,\n resolvers as FiscalQuarterResolvers,\n subscribers as FiscalQuarterSubscribers\n} from './fiscal-quarter'\nimport {\n entities as FiscalYearEntities,\n resolvers as FiscalYearResolvers,\n subscribers as FiscalYearSubscribers\n} from './fiscal-year'\nimport {\n entities as CounterpartyAccountEntities,\n resolvers as CounterpartyAccountResolvers,\n subscribers as CounterpartyAccountSubscribers\n} from './counterparty-account'\nimport {\n entities as ExpenditureRequestEntities,\n resolvers as ExpenditureRequestResolvers,\n subscribers as ExpenditureRequestSubscribers\n} from './expenditure-request'\n\nexport const entities = [\n ...FinancialStatementEntities,\n ...AccountingCategoryEntities,\n ...TransactionEntities,\n ...BankAccountEntities,\n ...BankStatementEntities,\n ...PaymentEntities,\n ...AccountEntities,\n ...AccountingDocumentEntities,\n ...RecurringCashItemEntities,\n ...FinancialInstitutionEntities,\n ...FiscalMonthEntities,\n ...FiscalQuarterEntities,\n ...FiscalYearEntities,\n ...CounterpartyAccountEntities,\n ...ExpenditureRequestEntities\n]\n\nexport const subscribers = [\n ...FinancialStatementSubscribers,\n ...AccountingCategorySubscribers,\n ...TransactionSubscribers,\n ...BankAccountSubscribers,\n ...BankStatementSubscribers,\n ...PaymentSubscribers,\n ...AccountSubscribers,\n ...AccountingDocumentSubscribers,\n ...RecurringCashItemSubscribers,\n ...FinancialInstitutionSubscribers,\n ...FiscalMonthSubscribers,\n ...FiscalQuarterSubscribers,\n ...FiscalYearSubscribers,\n ...CounterpartyAccountSubscribers,\n ...ExpenditureRequestSubscribers\n]\n\nexport const schema = {\n resolverClasses: [\n ...FinancialStatementResolvers,\n ...AccountingCategoryResolvers,\n ...TransactionResolvers,\n ...BankAccountResolvers,\n ...BankStatementResolvers,\n ...PaymentResolvers,\n ...AccountResolvers,\n ...AccountingDocumentResolvers,\n ...RecurringCashItemResolvers,\n ...FinancialInstitutionResolvers,\n ...FiscalMonthResolvers,\n ...FiscalQuarterResolvers,\n ...FiscalYearResolvers,\n ...CounterpartyAccountResolvers,\n ...ExpenditureRequestResolvers\n ]\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,2DAAgC;AAChC,oFAAyD;AACzD,oFAAyD;AACzD,oEAAyC;AACzC,sEAA2C;AAC3C,0EAA+C;AAC/C,4DAAiC;AACjC,4DAAiC;AACjC,oFAAyD;AACzD,oFAAyD;AACzD,wFAA6D;AAC7D,sEAA2C;AAC3C,0EAA+C;AAC/C,oEAAyC;AACzC,oFAAyD;AACzD,yFAA8D;AAE9D,qBAAqB;AACrB,2EAAgD;AAChD,4EAAiD;AACjD,8EAAmD;AACnD,oEAAyC;AACzC,oEAAyC;AACzC,qEAA0C;AAC1C,qEAA0C;AAC1C,yFAA8D;AAC9D,4FAAiE;AACjE,mFAAwD;AACxD,4FAAiE;AACjE,kEAAuC;AACvC,qEAA0C;AAC1C,mEAAwC;AACxC,uEAA4C;AAC5C,uEAA4C;AAC5C,0EAA+C;AAC/C,4EAAiD;AACjD,uEAA4C;AAC5C,4FAAiE;AACjE,8FAAmE;AACnE,0FAA+D;AAC/D,0FAA+D;AAC/D,4FAAiE;AAEjE,mCAAmC;AACnC,+DAI8B;AAC9B,+DAI8B;AAC9B,+CAIsB;AACtB,iDAIuB;AACvB,qDAIyB;AACzB,uCAIkB;AAClB,uCAIkB;AAClB,+DAI8B;AAC9B,+DAI8B;AAC9B,mEAIgC;AAChC,iDAIuB;AACvB,qDAIyB;AACzB,+CAIsB;AACtB,iEAI+B;AAC/B,+DAI8B;AAEjB,QAAA,QAAQ,GAAG;IACtB,GAAG,8BAA0B;IAC7B,GAAG,8BAA0B;IAC7B,GAAG,sBAAmB;IACtB,GAAG,uBAAmB;IACtB,GAAG,yBAAqB;IACxB,GAAG,kBAAe;IAClB,GAAG,kBAAe;IAClB,GAAG,8BAA0B;IAC7B,GAAG,8BAAyB;IAC5B,GAAG,gCAA4B;IAC/B,GAAG,uBAAmB;IACtB,GAAG,yBAAqB;IACxB,GAAG,sBAAkB;IACrB,GAAG,+BAA2B;IAC9B,GAAG,8BAA0B;CAC9B,CAAA;AAEY,QAAA,WAAW,GAAG;IACzB,GAAG,iCAA6B;IAChC,GAAG,iCAA6B;IAChC,GAAG,yBAAsB;IACzB,GAAG,0BAAsB;IACzB,GAAG,4BAAwB;IAC3B,GAAG,qBAAkB;IACrB,GAAG,qBAAkB;IACrB,GAAG,iCAA6B;IAChC,GAAG,iCAA4B;IAC/B,GAAG,mCAA+B;IAClC,GAAG,0BAAsB;IACzB,GAAG,4BAAwB;IAC3B,GAAG,yBAAqB;IACxB,GAAG,kCAA8B;IACjC,GAAG,iCAA6B;CACjC,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,GAAG,+BAA2B;QAC9B,GAAG,+BAA2B;QAC9B,GAAG,uBAAoB;QACvB,GAAG,wBAAoB;QACvB,GAAG,0BAAsB;QACzB,GAAG,mBAAgB;QACnB,GAAG,mBAAgB;QACnB,GAAG,+BAA2B;QAC9B,GAAG,+BAA0B;QAC7B,GAAG,iCAA6B;QAChC,GAAG,wBAAoB;QACvB,GAAG,0BAAsB;QACzB,GAAG,uBAAmB;QACtB,GAAG,gCAA4B;QAC/B,GAAG,+BAA2B;KAC/B;CACF,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './cash-flow-type'\nexport * from './financial-statement/financial-statement'\nexport * from './accounting-category/accounting-category'\nexport * from './transaction/transaction'\nexport * from './bank-account/bank-account'\nexport * from './bank-statement/bank-statement'\nexport * from './payment/payment'\nexport * from './account/account'\nexport * from './accounting-document/accounting-document'\nexport * from './recurring-cash-item/recurring-cash-item'\nexport * from './financial-institution/financial-institution'\nexport * from './fiscal-month/fiscal-month'\nexport * from './fiscal-quarter/fiscal-quarter'\nexport * from './fiscal-year/fiscal-year'\nexport * from './expenditure-request/expenditure-request'\nexport * from './expenditure-request/expenditure-request-item'\n\n/* EXPORT SERVICES */\nexport * from './transaction/transaction-period'\nexport * from './transaction/transaction-service'\nexport * from './bank-account/bank-account-service'\nexport * from './payment/payment-targets'\nexport * from './payment/payment-service'\nexport * from './payment/payment-currency'\nexport * from './payment/document-targets'\nexport * from './financial-statement/financial-statement-line'\nexport * from './financial-statement/financial-statement-service'\nexport * from './recurring-cash-item/recurring-schedule'\nexport * from './recurring-cash-item/recurring-cash-item-service'\nexport * from './account/account-match'\nexport * from './account/default-accounts'\nexport * from './account/account-choice'\nexport * from './bank-statement/bank-source'\nexport * from './bank-statement/bank-parser'\nexport * from './bank-statement/bank-reconcile'\nexport * from './bank-statement/bank-import-type'\nexport * from './bank-statement/bank-import'\nexport * from './counterparty-account/counterparty-account-rules'\nexport * from './counterparty-account/counterparty-account-service'\nexport * from './expenditure-request/expenditure-request-rules'\nexport * from './expenditure-request/expenditure-payment-state'\nexport * from './expenditure-request/expenditure-request-service'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport {\n entities as FinancialStatementEntities,\n resolvers as FinancialStatementResolvers,\n subscribers as FinancialStatementSubscribers\n} from './financial-statement'\nimport {\n entities as AccountingCategoryEntities,\n resolvers as AccountingCategoryResolvers,\n subscribers as AccountingCategorySubscribers\n} from './accounting-category'\nimport {\n entities as TransactionEntities,\n resolvers as TransactionResolvers,\n subscribers as TransactionSubscribers\n} from './transaction'\nimport {\n entities as BankAccountEntities,\n resolvers as BankAccountResolvers,\n subscribers as BankAccountSubscribers\n} from './bank-account'\nimport {\n entities as BankStatementEntities,\n resolvers as BankStatementResolvers,\n subscribers as BankStatementSubscribers\n} from './bank-statement'\nimport {\n entities as PaymentEntities,\n resolvers as PaymentResolvers,\n subscribers as PaymentSubscribers\n} from './payment'\nimport {\n entities as AccountEntities,\n resolvers as AccountResolvers,\n subscribers as AccountSubscribers\n} from './account'\nimport {\n entities as AccountingDocumentEntities,\n resolvers as AccountingDocumentResolvers,\n subscribers as AccountingDocumentSubscribers\n} from './accounting-document'\nimport {\n entities as RecurringCashItemEntities,\n resolvers as RecurringCashItemResolvers,\n subscribers as RecurringCashItemSubscribers\n} from './recurring-cash-item'\nimport {\n entities as FinancialInstitutionEntities,\n resolvers as FinancialInstitutionResolvers,\n subscribers as FinancialInstitutionSubscribers\n} from './financial-institution'\nimport {\n entities as FiscalMonthEntities,\n resolvers as FiscalMonthResolvers,\n subscribers as FiscalMonthSubscribers\n} from './fiscal-month'\nimport {\n entities as FiscalQuarterEntities,\n resolvers as FiscalQuarterResolvers,\n subscribers as FiscalQuarterSubscribers\n} from './fiscal-quarter'\nimport {\n entities as FiscalYearEntities,\n resolvers as FiscalYearResolvers,\n subscribers as FiscalYearSubscribers\n} from './fiscal-year'\nimport {\n entities as CounterpartyAccountEntities,\n resolvers as CounterpartyAccountResolvers,\n subscribers as CounterpartyAccountSubscribers\n} from './counterparty-account'\nimport {\n entities as ExpenditureRequestEntities,\n resolvers as ExpenditureRequestResolvers,\n subscribers as ExpenditureRequestSubscribers\n} from './expenditure-request'\n\nexport const entities = [\n ...FinancialStatementEntities,\n ...AccountingCategoryEntities,\n ...TransactionEntities,\n ...BankAccountEntities,\n ...BankStatementEntities,\n ...PaymentEntities,\n ...AccountEntities,\n ...AccountingDocumentEntities,\n ...RecurringCashItemEntities,\n ...FinancialInstitutionEntities,\n ...FiscalMonthEntities,\n ...FiscalQuarterEntities,\n ...FiscalYearEntities,\n ...CounterpartyAccountEntities,\n ...ExpenditureRequestEntities\n]\n\nexport const subscribers = [\n ...FinancialStatementSubscribers,\n ...AccountingCategorySubscribers,\n ...TransactionSubscribers,\n ...BankAccountSubscribers,\n ...BankStatementSubscribers,\n ...PaymentSubscribers,\n ...AccountSubscribers,\n ...AccountingDocumentSubscribers,\n ...RecurringCashItemSubscribers,\n ...FinancialInstitutionSubscribers,\n ...FiscalMonthSubscribers,\n ...FiscalQuarterSubscribers,\n ...FiscalYearSubscribers,\n ...CounterpartyAccountSubscribers,\n ...ExpenditureRequestSubscribers\n]\n\nexport const schema = {\n resolverClasses: [\n ...FinancialStatementResolvers,\n ...AccountingCategoryResolvers,\n ...TransactionResolvers,\n ...BankAccountResolvers,\n ...BankStatementResolvers,\n ...PaymentResolvers,\n ...AccountResolvers,\n ...AccountingDocumentResolvers,\n ...RecurringCashItemResolvers,\n ...FinancialInstitutionResolvers,\n ...FiscalMonthResolvers,\n ...FiscalQuarterResolvers,\n ...FiscalYearResolvers,\n ...CounterpartyAccountResolvers,\n ...ExpenditureRequestResolvers\n ]\n}\n"]}
|