@accounter/server
Version:
Accounter GraphQL server
92 lines (87 loc) • 3.11 kB
text/typescript
import { DocumentType } from '../../../shared/enums.js';
import {
formatFinancialAmount,
optionalDateToTimelessDateString,
} from '../../../shared/helpers/index.js';
import { DocumentsProvider } from '../providers/documents.provider.js';
import type { document_type, DocumentsModule } from '../types.js';
export const normalizeDocumentType = (type: document_type): DocumentType => {
switch (type) {
case 'CREDIT_INVOICE':
return DocumentType.CreditInvoice;
case 'INVOICE':
return DocumentType.Invoice;
case 'INVOICE_RECEIPT':
return DocumentType.InvoiceReceipt;
case 'OTHER':
return DocumentType.Other;
case 'PROFORMA':
return DocumentType.Proforma;
case 'RECEIPT':
return DocumentType.Receipt;
case 'UNPROCESSED':
return DocumentType.Unprocessed;
default:
throw new Error(`Unknown document type: ${type}`);
}
};
export const commonDocumentsFields: DocumentsModule.DocumentResolvers = {
id: documentRoot => documentRoot.id,
image: documentRoot => {
const url = documentRoot.image_url ?? null;
if (!url) {
console.log('no image url', documentRoot.image_url, documentRoot.id);
}
return url;
},
file: documentRoot => {
const url = documentRoot.file_url ?? null;
if (!url) {
console.log('no file url', documentRoot.file_url, documentRoot.id);
}
return url;
},
isReviewed: documentRoot => documentRoot.is_reviewed,
documentType: documentRoot => normalizeDocumentType(documentRoot.type),
description: documentRoot => documentRoot.description,
remarks: documentRoot => documentRoot.remarks,
};
export const commonFinancialDocumentsFields:
| DocumentsModule.InvoiceResolvers
| DocumentsModule.ReceiptResolvers
| DocumentsModule.InvoiceReceiptResolvers
| DocumentsModule.ProformaResolvers = {
serialNumber: documentRoot => documentRoot.serial_number ?? '',
date: documentRoot => optionalDateToTimelessDateString(documentRoot.date),
amount: documentRoot =>
formatFinancialAmount(documentRoot.total_amount, documentRoot.currency_code),
vat: documentRoot =>
documentRoot.vat_amount == null
? null
: formatFinancialAmount(documentRoot.vat_amount, documentRoot.currency_code),
vatReportDateOverride: documentRoot =>
optionalDateToTimelessDateString(documentRoot.vat_report_date_override),
noVatAmount: documentRoot =>
documentRoot.no_vat_amount ? Number(documentRoot.no_vat_amount) : null,
allocationNumber: documentRoot => documentRoot.allocation_number,
exchangeRateOverride: documentRoot =>
documentRoot.exchange_rate_override == null
? null
: Number(documentRoot.exchange_rate_override),
};
export const commonChargeFields: DocumentsModule.ChargeResolvers = {
additionalDocuments: async (DbCharge, _, { injector }) => {
if (!DbCharge.id) {
return [];
}
try {
const docs = await injector
.get(DocumentsProvider)
.getDocumentsByChargeIdLoader.load(DbCharge.id);
return docs;
} catch (e) {
console.error(e);
return [];
}
},
};