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+
}