@things-factory/invoice 10.1.258 → 10.1.260
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-client/pages/invoice-list.d.ts +3 -11
- package/dist-client/pages/invoice-list.js +24 -85
- package/dist-client/pages/invoice-list.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +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/service/invoice/invoice-query.d.ts +1 -0
- package/dist-server/service/invoice/invoice-query.js +37 -3
- package/dist-server/service/invoice/invoice-query.js.map +1 -1
- package/dist-server/service/invoice/invoice-remaining.d.ts +12 -0
- package/dist-server/service/invoice/invoice-remaining.js +16 -0
- package/dist-server/service/invoice/invoice-remaining.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/dist-shared/invoice-standing.d.ts +30 -3
- package/dist-shared/invoice-standing.js +45 -4
- package/dist-shared/invoice-standing.js.map +1 -1
- package/package.json +10 -10
- package/shared/invoice-standing.ts +43 -5
- package/tsconfig.shared.tsbuildinfo +1 -1
|
@@ -4,6 +4,7 @@ export * from './invoice/invoice';
|
|
|
4
4
|
export * from './invoice/commercial-document';
|
|
5
5
|
export * from './invoice/invoice-rules';
|
|
6
6
|
export * from './invoice/invoice-service';
|
|
7
|
+
export * from './invoice/invoice-remaining';
|
|
7
8
|
export * from './invoice/invoice-files';
|
|
8
9
|
export * from './invoice/invoice-document-file';
|
|
9
10
|
export * from './invoice/invoice-type';
|
|
@@ -8,6 +8,7 @@ tslib_1.__exportStar(require("./invoice/invoice"), exports);
|
|
|
8
8
|
tslib_1.__exportStar(require("./invoice/commercial-document"), exports);
|
|
9
9
|
tslib_1.__exportStar(require("./invoice/invoice-rules"), exports);
|
|
10
10
|
tslib_1.__exportStar(require("./invoice/invoice-service"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./invoice/invoice-remaining"), exports);
|
|
11
12
|
tslib_1.__exportStar(require("./invoice/invoice-files"), exports);
|
|
12
13
|
tslib_1.__exportStar(require("./invoice/invoice-document-file"), exports);
|
|
13
14
|
tslib_1.__exportStar(require("./invoice/invoice-type"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,wEAA6C;AAC7C,sEAA2C;AAC3C,4DAAiC;AACjC,wEAA6C;AAC7C,kEAAuC;AACvC,oEAAyC;AACzC,kEAAuC;AACvC,0EAA+C;AAC/C,iEAAsC;AACtC,iEAAsC;AACtC,sFAA2D;AAC3D,2DAAoC;AACpC,sEAA+C;AAC/C,oEAA6C;AAC7C,8EAAuD;AACvD,MAAM,OAAO,GAAgE,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAA;AACtH,QAAA,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AAC/C,QAAA,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;AACrD,QAAA,MAAM,GAAG,EAAE,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAA","sourcesContent":["export * from './invoice-event/invoice-event'\nexport * from './invoice-item/invoice-item'\nexport * from './invoice/invoice'\nexport * from './invoice/commercial-document'\nexport * from './invoice/invoice-rules'\nexport * from './invoice/invoice-service'\nexport * from './invoice/invoice-files'\nexport * from './invoice/invoice-document-file'\nexport * from './invoice/invoice-type'\nexport * from './invoice/invoice-read'\nexport * from './document-defaults/document-defaults-rules'\nimport * as invoice from './invoice'\nimport * as invoiceEvent from './invoice-event'\nimport * as invoiceItem from './invoice-item'\nimport * as documentDefaults from './document-defaults'\nconst modules: { entities: any[]; subscribers: any[]; resolvers: any[] }[] = [invoice, invoiceItem, invoiceEvent, documentDefaults]\nexport const entities = modules.flatMap(one => one.entities)\nexport const subscribers = modules.flatMap(one => one.subscribers)\nexport const schema = { resolverClasses: modules.flatMap(one => one.resolvers) }\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,wEAA6C;AAC7C,sEAA2C;AAC3C,4DAAiC;AACjC,wEAA6C;AAC7C,kEAAuC;AACvC,oEAAyC;AACzC,sEAA2C;AAC3C,kEAAuC;AACvC,0EAA+C;AAC/C,iEAAsC;AACtC,iEAAsC;AACtC,sFAA2D;AAC3D,2DAAoC;AACpC,sEAA+C;AAC/C,oEAA6C;AAC7C,8EAAuD;AACvD,MAAM,OAAO,GAAgE,CAAC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAA;AACtH,QAAA,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;AAC/C,QAAA,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;AACrD,QAAA,MAAM,GAAG,EAAE,eAAe,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAA","sourcesContent":["export * from './invoice-event/invoice-event'\nexport * from './invoice-item/invoice-item'\nexport * from './invoice/invoice'\nexport * from './invoice/commercial-document'\nexport * from './invoice/invoice-rules'\nexport * from './invoice/invoice-service'\nexport * from './invoice/invoice-remaining'\nexport * from './invoice/invoice-files'\nexport * from './invoice/invoice-document-file'\nexport * from './invoice/invoice-type'\nexport * from './invoice/invoice-read'\nexport * from './document-defaults/document-defaults-rules'\nimport * as invoice from './invoice'\nimport * as invoiceEvent from './invoice-event'\nimport * as invoiceItem from './invoice-item'\nimport * as documentDefaults from './document-defaults'\nconst modules: { entities: any[]; subscribers: any[]; resolvers: any[] }[] = [invoice, invoiceItem, invoiceEvent, documentDefaults]\nexport const entities = modules.flatMap(one => one.entities)\nexport const subscribers = modules.flatMap(one => one.subscribers)\nexport const schema = { resolverClasses: modules.flatMap(one => one.resolvers) }\n"]}
|
|
@@ -11,6 +11,7 @@ export declare class InvoiceQuery {
|
|
|
11
11
|
invoices(params: ListParam, context: ResolverContext): Promise<InvoiceList>;
|
|
12
12
|
invoiceEvents(invoiceId: string, context: ResolverContext): Promise<InvoiceEvent[]>;
|
|
13
13
|
invoiceDocumentFile(id: string, format: DocumentFileFormat, language: string, context: ResolverContext): Promise<DocumentFile>;
|
|
14
|
+
remainingAmount(invoice: Invoice, context: ResolverContext): Promise<number | null>;
|
|
14
15
|
items(invoice: Invoice): Promise<InvoiceItem[]>;
|
|
15
16
|
taxGroups(invoice: Invoice): Promise<import("./invoice-rules").TaxGroup[]>;
|
|
16
17
|
lineSupplyAmount(invoice: Invoice): Promise<number>;
|
|
@@ -7,12 +7,14 @@ const auth_base_1 = require("@things-factory/auth-base");
|
|
|
7
7
|
const biz_base_1 = require("@things-factory/biz-base");
|
|
8
8
|
const shell_1 = require("@things-factory/shell");
|
|
9
9
|
const type_graphql_1 = require("type-graphql");
|
|
10
|
+
const typeorm_1 = require("typeorm");
|
|
10
11
|
const invoice_event_1 = require("../invoice-event/invoice-event");
|
|
11
12
|
const invoice_item_1 = require("../invoice-item/invoice-item");
|
|
12
13
|
const commercial_document_1 = require("./commercial-document");
|
|
13
14
|
const invoice_1 = require("./invoice");
|
|
14
15
|
const invoice_document_file_1 = require("./invoice-document-file");
|
|
15
16
|
const invoice_files_1 = require("./invoice-files");
|
|
17
|
+
const invoice_remaining_1 = require("./invoice-remaining");
|
|
16
18
|
const invoice_rules_1 = require("./invoice-rules");
|
|
17
19
|
const invoice_service_1 = require("./invoice-service");
|
|
18
20
|
const invoice_type_1 = require("./invoice-type");
|
|
@@ -21,13 +23,30 @@ let InvoiceQuery = class InvoiceQuery {
|
|
|
21
23
|
return (0, shell_1.getRepository)(invoice_1.Invoice).findOne({ where: { id, domain: { id: context.state.domain.id } } });
|
|
22
24
|
}
|
|
23
25
|
async invoices(params, context) {
|
|
26
|
+
const { domain } = context.state;
|
|
27
|
+
const repository = (0, shell_1.getRepository)(invoice_1.Invoice);
|
|
28
|
+
/* `overdue` (its value the day asked on) is no column: issued, due before that day, and still owing. */
|
|
29
|
+
const asked = (params.filters ?? []).find(one => one.name === 'overdue');
|
|
24
30
|
const query = (0, shell_1.getQueryBuilderFromListParams)({
|
|
25
|
-
domain
|
|
26
|
-
params,
|
|
27
|
-
repository
|
|
31
|
+
domain,
|
|
32
|
+
params: asked ? { ...params, filters: params.filters.filter(one => one.name !== 'overdue') } : params,
|
|
33
|
+
repository,
|
|
28
34
|
searchables: ['number', 'supplierName', 'buyerName', 'purchaseOrder', 'notes']
|
|
29
35
|
});
|
|
36
|
+
if (asked) {
|
|
37
|
+
const today = String(asked.value);
|
|
38
|
+
query.andWhere(`${query.alias}.status = :issued AND ${query.alias}.dueDate < :today`, { issued: 'ISSUED', today });
|
|
39
|
+
const late = await repository.find({ where: { domain: { id: domain.id }, status: 'ISSUED', dueDate: (0, typeorm_1.LessThan)(today) }, select: ['id'] });
|
|
40
|
+
const remaining = await (0, invoice_remaining_1.remainingOf)(repository.manager, domain, late.map(one => one.id));
|
|
41
|
+
if (remaining) {
|
|
42
|
+
const owing = late.map(one => one.id).filter(id => (remaining.get(id) ?? 1) > 0);
|
|
43
|
+
query.andWhere(owing.length ? `${query.alias}.id IN (:...owing)` : '1 = 0', { owing });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
30
46
|
const [items, total] = await query.getManyAndCount();
|
|
47
|
+
const remaining = await (0, invoice_remaining_1.remainingOf)(repository.manager, domain, items.filter(one => one.status === 'ISSUED').map(one => one.id));
|
|
48
|
+
for (const item of items)
|
|
49
|
+
item.remainingAmount = remaining?.get(item.id);
|
|
31
50
|
return { items, total };
|
|
32
51
|
}
|
|
33
52
|
invoiceEvents(invoiceId, context) {
|
|
@@ -46,6 +65,13 @@ let InvoiceQuery = class InvoiceQuery {
|
|
|
46
65
|
terms: [{ label: print.t('field.invoice-due-date'), value: invoice.dueDate }]
|
|
47
66
|
});
|
|
48
67
|
}
|
|
68
|
+
async remainingAmount(invoice, context) {
|
|
69
|
+
if (invoice.remainingAmount !== undefined)
|
|
70
|
+
return invoice.remainingAmount ?? null;
|
|
71
|
+
if (invoice.status !== 'ISSUED')
|
|
72
|
+
return null;
|
|
73
|
+
return (await (0, invoice_remaining_1.remainingOf)((0, shell_1.getRepository)(invoice_1.Invoice).manager, context.state.domain, [invoice.id]))?.get(invoice.id) ?? null;
|
|
74
|
+
}
|
|
49
75
|
async items(invoice) {
|
|
50
76
|
return invoice.items ?? (0, shell_1.getRepository)(invoice_item_1.InvoiceItem).find({ where: { invoice: { id: invoice.id } }, order: { position: 'ASC' } });
|
|
51
77
|
}
|
|
@@ -110,6 +136,14 @@ tslib_1.__decorate([
|
|
|
110
136
|
tslib_1.__metadata("design:paramtypes", [String, String, String, Object]),
|
|
111
137
|
tslib_1.__metadata("design:returntype", Promise)
|
|
112
138
|
], InvoiceQuery.prototype, "invoiceDocumentFile", null);
|
|
139
|
+
tslib_1.__decorate([
|
|
140
|
+
(0, type_graphql_1.FieldResolver)(type => type_graphql_1.Float, { nullable: true, description: 'What an issued invoice still owes, as the application that ties its payments says; empty when none does' }),
|
|
141
|
+
tslib_1.__param(0, (0, type_graphql_1.Root)()),
|
|
142
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
143
|
+
tslib_1.__metadata("design:type", Function),
|
|
144
|
+
tslib_1.__metadata("design:paramtypes", [invoice_1.Invoice, Object]),
|
|
145
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
146
|
+
], InvoiceQuery.prototype, "remainingAmount", null);
|
|
113
147
|
tslib_1.__decorate([
|
|
114
148
|
(0, type_graphql_1.FieldResolver)(type => [invoice_item_1.InvoiceItem]),
|
|
115
149
|
tslib_1.__param(0, (0, type_graphql_1.Root)()),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoice-query.js","sourceRoot":"","sources":["../../../server/service/invoice/invoice-query.ts"],"names":[],"mappings":";;;;AAAA,qEAA4D;AAC5D,yDAAgD;AAChD,uDAAuD;AACvD,iDAAsH;AACtH,+CAAoH;AAEpH,kEAA6D;AAC7D,+DAA0D;AAC1D,+DAAwD;AACxD,uCAAmC;AACnC,mEAAyE;AACzE,mDAAyC;AACzC,mDAA2D;AAC3D,uDAAmD;AACnD,iDAA8E;AAIvE,IAAM,YAAY,GAAlB,MAAM,YAAY;IAGvB,OAAO,CAAY,EAAU,EAAS,OAAwB;QAC5D,OAAO,IAAA,qBAAa,EAAC,iBAAO,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IACnG,CAAC;IAIK,AAAN,KAAK,CAAC,QAAQ,CAA0B,MAAiB,EAAS,OAAwB;QACxF,MAAM,KAAK,GAAG,IAAA,qCAA6B,EAAC;YAC1C,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM;YAC5B,MAAM;YACN,UAAU,EAAE,IAAA,qBAAa,EAAC,iBAAO,CAAC;YAClC,WAAW,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,CAAC;SAC/E,CAAC,CAAA;QACF,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,KAAK,CAAC,eAAe,EAAE,CAAA;QACpD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACzB,CAAC;IAID,aAAa,CAAmB,SAAiB,EAAS,OAAwB;QAChF,OAAO,IAAA,qBAAa,EAAC,4BAAY,CAAC,CAAC,IAAI,CAAC;YACtC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;YAC9E,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;SAC5B,CAAC,CAAA;IACJ,CAAC;IAED,uHAAuH;IAGjH,AAAN,KAAK,CAAC,mBAAmB,CACZ,EAAU,EACgE,MAA0B,EACU,QAAgB,EAClI,OAAwB;QAE/B,MAAM,OAAO,GAAG,MAAM,IAAA,iCAAe,EAAC,IAAA,qBAAa,EAAC,iBAAO,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAC/F,MAAM,KAAK,GAAG,IAAA,uCAAe,EAAC,OAAO,EAAE,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAA;QACpE,OAAO,IAAA,sCAAc,EAAC,OAAO,EAAE,MAAM,EAAE;YACrC,GAAG,KAAK;YACR,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC;YACrC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,wBAAwB,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;SAC9E,CAAC,CAAA;IACJ,CAAC;IAGK,AAAN,KAAK,CAAC,KAAK,CAAS,OAAgB;QAClC,OAAO,OAAO,CAAC,KAAK,IAAI,IAAA,qBAAa,EAAC,0BAAW,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;IACjI,CAAC;IAGK,AAAN,KAAK,CAAC,SAAS,CAAS,OAAgB;QACtC,OAAO,IAAA,2BAAW,EAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACtE,CAAC;IAGK,AAAN,KAAK,CAAC,gBAAgB,CAAS,OAAgB;QAC7C,OAAO,IAAA,4BAAY,EAAC,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACvE,CAAC;IAGD,KAAK,CAAS,GAAY;QACxB,OAAO,IAAA,uBAAO,EAAC,IAAA,qBAAa,EAAC,iBAAO,CAAC,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,QAAS,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;IAC/E,CAAC;IAGD,YAAY,CAAS,GAAY;QAC/B,OAAO,GAAG,CAAC,YAAY,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAA,qBAAa,EAAC,uBAAY,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IACjI,CAAC;IAGD,MAAM,CAAS,GAAY;QACzB,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAA,qBAAa,EAAC,cAAM,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IACzG,CAAC;IAGD,OAAO,CAAS,GAAY;QAC1B,OAAO,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,qBAAa,EAAC,gBAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC1G,CAAC;IAGD,OAAO,CAAS,GAAY;QAC1B,OAAO,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,qBAAa,EAAC,gBAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC1G,CAAC;CACF,CAAA;AAtFY,oCAAY;AAGvB;IAFC,IAAA,wBAAS,EAAC,+EAA+E,CAAC;IAC1F,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;IACtE,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;2CAEpC;AAIK;IAFL,IAAA,wBAAS,EAAC,+EAA+E,CAAC;IAC1F,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,0BAAW,EAAE,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC;IAC3D,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAjB,iBAAS;;4CASxD;AAID;IAFC,IAAA,wBAAS,EAAC,+EAA+E,CAAC;IAC1F,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,4BAAY,CAAC,EAAE,EAAE,WAAW,EAAE,oDAAoD,EAAE,CAAC;IACtF,mBAAA,IAAA,kBAAG,EAAC,WAAW,CAAC,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;iDAKxD;AAKK;IAFL,IAAA,wBAAS,EAAC,+EAA+E,CAAC;IAC1F,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,2BAAY,EAAE,EAAE,WAAW,EAAE,wGAAwG,EAAE,CAAC;IAEpJ,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IACT,mBAAA,IAAA,kBAAG,EAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,iCAAkB,EAAE,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC,CAAA;IACnF,mBAAA,IAAA,kBAAG,EAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,qEAAqE,EAAE,CAAC,CAAA;IACvH,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;uDASP;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,0BAAW,CAAC,CAAC;IACxB,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAU,iBAAO;;yCAEnC;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,sCAAgB,CAAC,CAAC;IACzB,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAU,iBAAO;;6CAEvC;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,oBAAK,EAAE,EAAE,WAAW,EAAE,6DAA6D,EAAE,CAAC;IACrF,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAU,iBAAO;;oDAE9C;AAGD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,4BAAU,CAAC,EAAE,EAAE,WAAW,EAAE,uDAAuD,EAAE,CAAC;IACvG,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAM,iBAAO;;yCAEzB;AAGD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,uBAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1C,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAM,iBAAO;;gDAEhC;AAGD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,cAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1C,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAM,iBAAO;;0CAE1B;AAGD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACvC,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAM,iBAAO;;2CAE3B;AAGD;IADC,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACvC,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAM,iBAAO;;2CAE3B;uBArFU,YAAY;IAFxB,IAAA,4BAAa,EAAC,qBAAa,CAAC;IAC5B,IAAA,uBAAQ,EAAC,iBAAO,CAAC;GACL,YAAY,CAsFxB","sourcesContent":["import { Attachment } from '@things-factory/attachment-base'\nimport { User } from '@things-factory/auth-base'\nimport { Counterparty } from '@things-factory/biz-base'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam, SpeakRefusals } from '@things-factory/shell'\nimport { Arg, Args, Ctx, Directive, FieldResolver, Float, Query, Resolver, Root, UseMiddleware } from 'type-graphql'\n\nimport { InvoiceEvent } from '../invoice-event/invoice-event'\nimport { InvoiceItem } from '../invoice-item/invoice-item'\nimport { DocumentTaxGroup } from './commercial-document'\nimport { Invoice } from './invoice'\nimport { documentFileOf, printTranslator } from './invoice-document-file'\nimport { filesOf } from './invoice-files'\nimport { lineSupplyOf, taxGroupsOf } from './invoice-rules'\nimport { invoiceInDomain } from './invoice-service'\nimport { DocumentFile, DocumentFileFormat, InvoiceList } from './invoice-type'\n\n@UseMiddleware(SpeakRefusals)\n@Resolver(Invoice)\nexport class InvoiceQuery {\n @Directive('@privilege(category: \"invoice\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(type => Invoice, { nullable: true, description: 'To fetch an invoice' })\n invoice(@Arg('id') id: string, @Ctx() context: ResolverContext) {\n return getRepository(Invoice).findOne({ where: { id, domain: { id: context.state.domain.id } } })\n }\n\n @Directive('@privilege(category: \"invoice\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(type => InvoiceList, { description: 'To fetch a page of invoices' })\n async invoices(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<InvoiceList> {\n const query = getQueryBuilderFromListParams({\n domain: context.state.domain,\n params,\n repository: getRepository(Invoice),\n searchables: ['number', 'supplierName', 'buyerName', 'purchaseOrder', 'notes']\n })\n const [items, total] = await query.getManyAndCount()\n return { items, total }\n }\n\n @Directive('@privilege(category: \"invoice\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(type => [InvoiceEvent], { description: 'To fetch what happened to an invoice, oldest first' })\n invoiceEvents(@Arg('invoiceId') invoiceId: string, @Ctx() context: ResolverContext) {\n return getRepository(InvoiceEvent).find({\n where: { domain: { id: context.state.domain.id }, invoice: { id: invoiceId } },\n order: { createdAt: 'ASC' }\n })\n }\n\n /* The invoice as its buyer reads it (ADR-0170 decision 10) - the page to preview and print, or the PDF to download. */\n @Directive('@privilege(category: \"invoice\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(type => DocumentFile, { description: 'Prints an invoice as an HTML page or a PDF, in Korean or English - its own language when none is named' })\n async invoiceDocumentFile(\n @Arg('id') id: string,\n @Arg('format', type => DocumentFileFormat, { description: 'An HTML page or a PDF' }) format: DocumentFileFormat,\n @Arg('language', { nullable: true, description: 'The language of the print, ko or en - the invoice\\'s own when empty' }) language: string,\n @Ctx() context: ResolverContext\n ): Promise<DocumentFile> {\n const invoice = await invoiceInDomain(getRepository(Invoice).manager, context.state.domain, id)\n const print = printTranslator(context, language || invoice.language)\n return documentFileOf(invoice, format, {\n ...print,\n title: print.t('title.invoice-print'),\n terms: [{ label: print.t('field.invoice-due-date'), value: invoice.dueDate }]\n })\n }\n\n @FieldResolver(type => [InvoiceItem])\n async items(@Root() invoice: Invoice) {\n return invoice.items ?? getRepository(InvoiceItem).find({ where: { invoice: { id: invoice.id } }, order: { position: 'ASC' } })\n }\n\n @FieldResolver(type => [DocumentTaxGroup])\n async taxGroups(@Root() invoice: Invoice) {\n return taxGroupsOf({ ...invoice, items: await this.items(invoice) })\n }\n\n @FieldResolver(type => Float, { description: \"The lines' supply before the discount of the whole document\" })\n async lineSupplyAmount(@Root() invoice: Invoice) {\n return lineSupplyOf({ ...invoice, items: await this.items(invoice) })\n }\n\n @FieldResolver(type => [Attachment], { description: 'The files the invoice keeps, the first attached first' })\n files(@Root() row: Invoice) {\n return filesOf(getRepository(Invoice).manager, { id: row.domainId! }, row.id)\n }\n\n @FieldResolver(type => Counterparty, { nullable: true })\n counterparty(@Root() row: Invoice) {\n return row.counterparty ?? (row.counterpartyId ? getRepository(Counterparty).findOneBy({ id: row.counterpartyId }) : undefined)\n }\n\n @FieldResolver(type => Domain, { nullable: true })\n domain(@Root() row: Invoice) {\n return row.domain ?? (row.domainId ? getRepository(Domain).findOneBy({ id: row.domainId }) : undefined)\n }\n\n @FieldResolver(type => User, { nullable: true })\n creator(@Root() row: Invoice) {\n return row.creator ?? (row.creatorId ? getRepository(User).findOneBy({ id: row.creatorId }) : undefined)\n }\n\n @FieldResolver(type => User, { nullable: true })\n updater(@Root() row: Invoice) {\n return row.updater ?? (row.updaterId ? getRepository(User).findOneBy({ id: row.updaterId }) : undefined)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"invoice-query.js","sourceRoot":"","sources":["../../../server/service/invoice/invoice-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Attachment } from '@things-factory/attachment-base'\nimport { User } from '@things-factory/auth-base'\nimport { Counterparty } from '@things-factory/biz-base'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam, SpeakRefusals } from '@things-factory/shell'\nimport { Arg, Args, Ctx, Directive, FieldResolver, Float, Query, Resolver, Root, UseMiddleware } from 'type-graphql'\nimport { In, LessThan } from 'typeorm'\n\nimport { InvoiceEvent } from '../invoice-event/invoice-event'\nimport { InvoiceItem } from '../invoice-item/invoice-item'\nimport { DocumentTaxGroup } from './commercial-document'\nimport { Invoice } from './invoice'\nimport { documentFileOf, printTranslator } from './invoice-document-file'\nimport { filesOf } from './invoice-files'\nimport { remainingOf } from './invoice-remaining'\nimport { lineSupplyOf, taxGroupsOf } from './invoice-rules'\nimport { invoiceInDomain } from './invoice-service'\nimport { DocumentFile, DocumentFileFormat, InvoiceList } from './invoice-type'\n\n@UseMiddleware(SpeakRefusals)\n@Resolver(Invoice)\nexport class InvoiceQuery {\n @Directive('@privilege(category: \"invoice\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(type => Invoice, { nullable: true, description: 'To fetch an invoice' })\n invoice(@Arg('id') id: string, @Ctx() context: ResolverContext) {\n return getRepository(Invoice).findOne({ where: { id, domain: { id: context.state.domain.id } } })\n }\n\n @Directive('@privilege(category: \"invoice\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(type => InvoiceList, { description: 'To fetch a page of invoices' })\n async invoices(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<InvoiceList> {\n const { domain } = context.state\n const repository = getRepository(Invoice)\n /* `overdue` (its value the day asked on) is no column: issued, due before that day, and still owing. */\n const asked = (params.filters ?? []).find(one => one.name === 'overdue')\n const query = getQueryBuilderFromListParams({\n domain,\n params: asked ? { ...params, filters: params.filters!.filter(one => one.name !== 'overdue') } : params,\n repository,\n searchables: ['number', 'supplierName', 'buyerName', 'purchaseOrder', 'notes']\n })\n if (asked) {\n const today = String(asked.value)\n query.andWhere(`${query.alias}.status = :issued AND ${query.alias}.dueDate < :today`, { issued: 'ISSUED', today })\n const late = await repository.find({ where: { domain: { id: domain.id }, status: 'ISSUED', dueDate: LessThan(today) } as any, select: ['id'] })\n const remaining = await remainingOf(repository.manager, domain, late.map(one => one.id))\n if (remaining) {\n const owing = late.map(one => one.id).filter(id => (remaining.get(id) ?? 1) > 0)\n query.andWhere(owing.length ? `${query.alias}.id IN (:...owing)` : '1 = 0', { owing })\n }\n }\n const [items, total] = await query.getManyAndCount()\n const remaining = await remainingOf(repository.manager, domain, items.filter(one => one.status === 'ISSUED').map(one => one.id))\n for (const item of items) (item as any).remainingAmount = remaining?.get(item.id)\n return { items, total }\n }\n\n @Directive('@privilege(category: \"invoice\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(type => [InvoiceEvent], { description: 'To fetch what happened to an invoice, oldest first' })\n invoiceEvents(@Arg('invoiceId') invoiceId: string, @Ctx() context: ResolverContext) {\n return getRepository(InvoiceEvent).find({\n where: { domain: { id: context.state.domain.id }, invoice: { id: invoiceId } },\n order: { createdAt: 'ASC' }\n })\n }\n\n /* The invoice as its buyer reads it (ADR-0170 decision 10) - the page to preview and print, or the PDF to download. */\n @Directive('@privilege(category: \"invoice\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(type => DocumentFile, { description: 'Prints an invoice as an HTML page or a PDF, in Korean or English - its own language when none is named' })\n async invoiceDocumentFile(\n @Arg('id') id: string,\n @Arg('format', type => DocumentFileFormat, { description: 'An HTML page or a PDF' }) format: DocumentFileFormat,\n @Arg('language', { nullable: true, description: 'The language of the print, ko or en - the invoice\\'s own when empty' }) language: string,\n @Ctx() context: ResolverContext\n ): Promise<DocumentFile> {\n const invoice = await invoiceInDomain(getRepository(Invoice).manager, context.state.domain, id)\n const print = printTranslator(context, language || invoice.language)\n return documentFileOf(invoice, format, {\n ...print,\n title: print.t('title.invoice-print'),\n terms: [{ label: print.t('field.invoice-due-date'), value: invoice.dueDate }]\n })\n }\n\n @FieldResolver(type => Float, { nullable: true, description: 'What an issued invoice still owes, as the application that ties its payments says; empty when none does' })\n async remainingAmount(@Root() invoice: Invoice, @Ctx() context: ResolverContext): Promise<number | null> {\n if ((invoice as any).remainingAmount !== undefined) return (invoice as any).remainingAmount ?? null\n if (invoice.status !== 'ISSUED') return null\n return (await remainingOf(getRepository(Invoice).manager, context.state.domain, [invoice.id]))?.get(invoice.id) ?? null\n }\n\n @FieldResolver(type => [InvoiceItem])\n async items(@Root() invoice: Invoice) {\n return invoice.items ?? getRepository(InvoiceItem).find({ where: { invoice: { id: invoice.id } }, order: { position: 'ASC' } })\n }\n\n @FieldResolver(type => [DocumentTaxGroup])\n async taxGroups(@Root() invoice: Invoice) {\n return taxGroupsOf({ ...invoice, items: await this.items(invoice) })\n }\n\n @FieldResolver(type => Float, { description: \"The lines' supply before the discount of the whole document\" })\n async lineSupplyAmount(@Root() invoice: Invoice) {\n return lineSupplyOf({ ...invoice, items: await this.items(invoice) })\n }\n\n @FieldResolver(type => [Attachment], { description: 'The files the invoice keeps, the first attached first' })\n files(@Root() row: Invoice) {\n return filesOf(getRepository(Invoice).manager, { id: row.domainId! }, row.id)\n }\n\n @FieldResolver(type => Counterparty, { nullable: true })\n counterparty(@Root() row: Invoice) {\n return row.counterparty ?? (row.counterpartyId ? getRepository(Counterparty).findOneBy({ id: row.counterpartyId }) : undefined)\n }\n\n @FieldResolver(type => Domain, { nullable: true })\n domain(@Root() row: Invoice) {\n return row.domain ?? (row.domainId ? getRepository(Domain).findOneBy({ id: row.domainId }) : undefined)\n }\n\n @FieldResolver(type => User, { nullable: true })\n creator(@Root() row: Invoice) {\n return row.creator ?? (row.creatorId ? getRepository(User).findOneBy({ id: row.creatorId }) : undefined)\n }\n\n @FieldResolver(type => User, { nullable: true })\n updater(@Root() row: Invoice) {\n return row.updater ?? (row.updaterId ? getRepository(User).findOneBy({ id: row.updaterId }) : undefined)\n }\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Domain } from '@things-factory/shell';
|
|
2
|
+
import { EntityManager } from 'typeorm';
|
|
3
|
+
/**
|
|
4
|
+
* What an issued invoice still owes, in its currency. The invoice module keeps no payments - an application ties them
|
|
5
|
+
* (Office: the bank lines on it, and what the banks kept on the way) and says what is left; without one nothing is
|
|
6
|
+
* known and an invoice past its day reads overdue.
|
|
7
|
+
*/
|
|
8
|
+
export type InvoiceRemainingReader = (manager: EntityManager, domain: Domain, invoiceIds: string[]) => Promise<Map<string, number>>;
|
|
9
|
+
/** The application that ties payments to invoices says what each still owes. */
|
|
10
|
+
export declare function registerInvoiceRemaining(one: InvoiceRemainingReader): void;
|
|
11
|
+
/** What each invoice still owes, or undefined when no application ties payments. */
|
|
12
|
+
export declare function remainingOf(manager: EntityManager, domain: Domain, invoiceIds: string[]): Promise<Map<string, number> | undefined>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerInvoiceRemaining = registerInvoiceRemaining;
|
|
4
|
+
exports.remainingOf = remainingOf;
|
|
5
|
+
let reader;
|
|
6
|
+
/** The application that ties payments to invoices says what each still owes. */
|
|
7
|
+
function registerInvoiceRemaining(one) {
|
|
8
|
+
reader = one;
|
|
9
|
+
}
|
|
10
|
+
/** What each invoice still owes, or undefined when no application ties payments. */
|
|
11
|
+
async function remainingOf(manager, domain, invoiceIds) {
|
|
12
|
+
if (!reader)
|
|
13
|
+
return undefined;
|
|
14
|
+
return invoiceIds.length ? reader(manager, domain, invoiceIds) : new Map();
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=invoice-remaining.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoice-remaining.js","sourceRoot":"","sources":["../../../server/service/invoice/invoice-remaining.ts"],"names":[],"mappings":";;AAaA,4DAEC;AAGD,kCAGC;AAXD,IAAI,MAA0C,CAAA;AAE9C,gFAAgF;AAChF,SAAgB,wBAAwB,CAAC,GAA2B;IAClE,MAAM,GAAG,GAAG,CAAA;AACd,CAAC;AAED,oFAAoF;AAC7E,KAAK,UAAU,WAAW,CAAC,OAAsB,EAAE,MAAc,EAAE,UAAoB;IAC5F,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAC7B,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAA;AAC5E,CAAC","sourcesContent":["import { Domain } from '@things-factory/shell'\nimport { EntityManager } from 'typeorm'\n\n/**\n * What an issued invoice still owes, in its currency. The invoice module keeps no payments - an application ties them\n * (Office: the bank lines on it, and what the banks kept on the way) and says what is left; without one nothing is\n * known and an invoice past its day reads overdue.\n */\nexport type InvoiceRemainingReader = (manager: EntityManager, domain: Domain, invoiceIds: string[]) => Promise<Map<string, number>>\n\nlet reader: InvoiceRemainingReader | undefined\n\n/** The application that ties payments to invoices says what each still owes. */\nexport function registerInvoiceRemaining(one: InvoiceRemainingReader) {\n reader = one\n}\n\n/** What each invoice still owes, or undefined when no application ties payments. */\nexport async function remainingOf(manager: EntityManager, domain: Domain, invoiceIds: string[]): Promise<Map<string, number> | undefined> {\n if (!reader) return undefined\n return invoiceIds.length ? reader(manager, domain, invoiceIds) : new Map()\n}\n"]}
|