Review tax invoice numbering

src/tax-document-types.tsTypeScript
@@ -0,0 +1,54 @@
1+export type TaxDocumentKind = "invoice" | "credit-note";
2+
3+export interface IssueTaxDocumentInput {
4+ requestKey: string;
5+ legalEntityCode: string;
6+ legalEntityTimeZone: string;
7+ kind: TaxDocumentKind;
8+ issuedAt: Date;
9+ originalInvoiceNumber?: string;
10+}
11+
12+export interface TaxDocument {
13+ requestKey: string;
14+ legalEntityCode: string;
15+ kind: TaxDocumentKind;
16+ fiscalYear: number;
17+ sequence: number;
18+ number: string;
19+ issuedAt: string;
20+ originalInvoiceNumber?: string;
21+}
22+
23+export interface IssuanceTransaction {
24+ readonly transactionId: string;
25+}
26+
27+export interface SequenceRepository {
28+ read(scope: string): Promise<number | undefined>;
29+ write(scope: string, value: number): Promise<void>;
30+ next(scope: string, transaction: IssuanceTransaction): Promise<number>;
31+}
32+
33+export interface TaxDocumentRepository {
34+ findByRequestKey(
35+ requestKey: string,
36+ transaction?: IssuanceTransaction,
37+ ): Promise<TaxDocument | undefined>;
38+ insert(document: TaxDocument, transaction?: IssuanceTransaction): Promise<void>;
39+ invoiceExists(
40+ legalEntityCode: string,
41+ number: string,
42+ transaction?: IssuanceTransaction,
43+ ): Promise<boolean>;
44+}
45+
46+export interface NumberingDependencies {
47+ sequences: SequenceRepository;
48+ documents: TaxDocumentRepository;
49+ database: {
50+ transaction<T>(
51+ work: (transaction: IssuanceTransaction) => Promise<T>,
52+ ): Promise<T>;
53+ };
54+}