feat: wip UI upload attachments

This commit is contained in:
Ahmed Bouhuolia
2024-05-28 23:34:51 +02:00
parent fcd61c6159
commit cfdbcea9c0
49 changed files with 286 additions and 67 deletions

View File

@@ -158,6 +158,8 @@ export default class SalesReceiptsController extends BaseController {
.toInt(),
check('receipt_message').optional().trim().escape(),
check('statement').optional().trim().escape(),
check('attachments').isArray().optional(),
check('attachments.*.key').exists().isString(),
];
}

View File

@@ -236,7 +236,7 @@ export default class SaleEstimate extends mixin(TenantModel, [
to: 'documents.id',
},
filter(query) {
query.where('model_ref', 'Expense');
query.where('model_ref', 'SaleEstimate');
},
},
};

View File

@@ -540,7 +540,7 @@ export default class SaleInvoice extends mixin(TenantModel, [
to: 'documents.id',
},
filter(query) {
query.where('model_ref', 'Expense');
query.where('model_ref', 'SaleInvoice');
},
},
};

View File

@@ -99,8 +99,6 @@ export class AttachmentsOnManualJournals {
manualJournalDTO,
manualJournal,
}: IManualJournalEventEditedPayload) {
// if (isEmpty(saleInvoiceDTO.attachments)) return;
const keys = manualJournalDTO.attachments?.map(
(attachment) => attachment.key
);

View File

@@ -2,6 +2,7 @@ import { Transformer } from '@/lib/Transformer/Transformer';
import { formatNumber } from 'utils';
import { ItemEntryTransformer } from '../Sales/Invoices/ItemEntryTransformer';
import { ICreditNote } from '@/interfaces';
import { AttachmentTransformer } from '../Attachments/AttachmentTransformer';
export class CreditNoteTransformer extends Transformer {
/**
@@ -16,6 +17,7 @@ export class CreditNoteTransformer extends Transformer {
'formattedCreditsUsed',
'formattedSubtotal',
'entries',
'attachments',
];
};
@@ -80,4 +82,13 @@ export class CreditNoteTransformer extends Transformer {
currencyCode: credit.currencyCode,
});
};
/**
* Retrieves the credit note attachments.
* @param {ISaleInvoice} invoice
* @returns
*/
protected attachments = (creditNote) => {
return this.item(creditNote.attachments, new AttachmentTransformer());
};
}

View File

@@ -78,7 +78,7 @@ export class EditManualJournal {
return {
id: oldManualJournal.id,
...omit(manualJournalDTO, ['publish']),
...omit(manualJournalDTO, ['publish', 'attachments']),
...(manualJournalDTO.publish && !oldManualJournal.publishedAt
? { publishedAt: moment().toMySqlDateTime() }
: {}),
@@ -143,6 +143,7 @@ export class EditManualJournal {
tenantId,
manualJournal,
oldManualJournal,
manualJournalDTO,
trx,
} as IManualJournalEventEditedPayload);

View File

@@ -28,7 +28,7 @@ export class GetManualJournal {
.withGraphFetched('entries.contact')
.withGraphFetched('entries.branch')
.withGraphFetched('transactions')
.withGraphFetched('media')
.withGraphFetched('attachments')
.throwIfNotFound();
return this.transformer.transform(

View File

@@ -1,6 +1,7 @@
import { IManualJournal } from '@/interfaces';
import { Transformer } from '@/lib/Transformer/Transformer';
import { formatNumber } from 'utils';
import { AttachmentTransformer } from '../Attachments/AttachmentTransformer';
export class ManualJournalTransfromer extends Transformer {
/**
@@ -8,7 +9,12 @@ export class ManualJournalTransfromer extends Transformer {
* @returns {Array}
*/
public includeAttributes = (): string[] => {
return ['formattedAmount', 'formattedDate', 'formattedPublishedAt'];
return [
'formattedAmount',
'formattedDate',
'formattedPublishedAt',
'attachments',
];
};
/**
@@ -39,4 +45,13 @@ export class ManualJournalTransfromer extends Transformer {
protected formattedPublishedAt = (manualJorunal: IManualJournal): string => {
return this.formatDate(manualJorunal.publishedAt);
};
/**
* Retrieves the manual journal attachments.
* @param {ISaleInvoice} invoice
* @returns
*/
protected attachments = (manualJorunal: IManualJournal) => {
return this.item(manualJorunal.attachments, new AttachmentTransformer());
};
}

View File

@@ -2,6 +2,7 @@ import { IBillPayment } from '@/interfaces';
import { Transformer } from '@/lib/Transformer/Transformer';
import { formatNumber } from 'utils';
import { BillPaymentEntryTransformer } from './BillPaymentEntryTransformer';
import { AttachmentTransformer } from '@/services/Attachments/AttachmentTransformer';
export class BillPaymentTransformer extends Transformer {
/**
@@ -9,7 +10,12 @@ export class BillPaymentTransformer extends Transformer {
* @returns {Array}
*/
public includeAttributes = (): string[] => {
return ['formattedPaymentDate', 'formattedAmount', 'entries'];
return [
'formattedPaymentDate',
'formattedAmount',
'entries',
'attachments',
];
};
/**
@@ -38,4 +44,13 @@ export class BillPaymentTransformer extends Transformer {
protected entries = (billPayment) => {
return this.item(billPayment.entries, new BillPaymentEntryTransformer());
};
/**
* Retrieves the bill attachments.
* @param {ISaleInvoice} invoice
* @returns
*/
protected attachments = (billPayment) => {
return this.item(billPayment.attachments, new AttachmentTransformer());
};
}

View File

@@ -1,6 +1,6 @@
import { Inject, Service } from 'typedi';
import * as R from 'ramda';
import { sumBy } from 'lodash';
import { omit, sumBy } from 'lodash';
import { IBillPayment, IBillPaymentDTO, IVendor } from '@/interfaces';
import { BranchTransactionDTOTransform } from '@/services/Branches/Integrations/BranchTransactionDTOTransform';
import { formatDateFields } from '@/utils';
@@ -24,7 +24,9 @@ export class CommandBillPaymentDTOTransformer {
oldBillPayment?: IBillPayment
): Promise<IBillPayment> {
const initialDTO = {
...formatDateFields(billPaymentDTO, ['paymentDate']),
...formatDateFields(omit(billPaymentDTO, ['attachments']), [
'paymentDate',
]),
amount: sumBy(billPaymentDTO.entries, 'paymentAmount'),
currencyCode: vendor.currencyCode,
exchangeRate: billPaymentDTO.exchangeRate || 1,

View File

@@ -13,7 +13,7 @@ export class GetBillPayment {
private transformer: TransformerInjectable;
/**
* Retrieve bill payment.
* Retrieves bill payment.
* @param {number} tenantId
* @param {number} billPyamentId
* @return {Promise<IBillPayment>}
@@ -30,6 +30,7 @@ export class GetBillPayment {
.withGraphFetched('paymentAccount')
.withGraphFetched('transactions')
.withGraphFetched('branch')
.withGraphFetched('attachments')
.findById(billPyamentId)
.throwIfNotFound();

View File

@@ -29,7 +29,8 @@ export class GetBill {
.withGraphFetched('vendor')
.withGraphFetched('entries.item')
.withGraphFetched('branch')
.withGraphFetched('taxes.taxRate');
.withGraphFetched('taxes.taxRate')
.withGraphFetched('attachments');
// Validates the bill existance.
this.validators.validateBillExistance(bill);

View File

@@ -1,5 +1,6 @@
import { IBill } from '@/interfaces';
import { Transformer } from '@/lib/Transformer/Transformer';
import { AttachmentTransformer } from '@/services/Attachments/AttachmentTransformer';
import { ItemEntryTransformer } from '@/services/Sales/Invoices/ItemEntryTransformer';
import { SaleInvoiceTaxEntryTransformer } from '@/services/Sales/Invoices/SaleInvoiceTaxEntryTransformer';
import { formatNumber } from 'utils';
@@ -26,6 +27,7 @@ export class PurchaseInvoiceTransformer extends Transformer {
'totalLocalFormatted',
'taxes',
'entries',
'attachments',
];
};
@@ -192,4 +194,13 @@ export class PurchaseInvoiceTransformer extends Transformer {
currencyCode: bill.currencyCode,
});
};
/**
* Retrieves the bill attachments.
* @param {ISaleInvoice} invoice
* @returns
*/
protected attachments = (bill) => {
return this.item(bill.attachments, new AttachmentTransformer());
};
}

View File

@@ -64,7 +64,7 @@ export default class BaseVendorCredit {
autoNextNumber;
const initialDTO = {
...omit(vendorCreditDTO, ['open']),
...omit(vendorCreditDTO, ['open', 'attachments']),
amount,
currencyCode: vendorCurrencyCode,
exchangeRate: vendorCreditDTO.exchangeRate || 1,

View File

@@ -26,7 +26,8 @@ export default class GetVendorCredit {
.findById(vendorCreditId)
.withGraphFetched('entries.item')
.withGraphFetched('vendor')
.withGraphFetched('branch');
.withGraphFetched('branch')
.withGraphFetched('attachments');
if (!vendorCredit) {
throw new ServiceError(ERRORS.VENDOR_CREDIT_NOT_FOUND);

View File

@@ -1,5 +1,6 @@
import { IVendorCredit } from '@/interfaces';
import { Transformer } from '@/lib/Transformer/Transformer';
import { AttachmentTransformer } from '@/services/Attachments/AttachmentTransformer';
import { ItemEntryTransformer } from '@/services/Sales/Invoices/ItemEntryTransformer';
import { formatNumber } from 'utils';
@@ -16,6 +17,7 @@ export class VendorCreditTransformer extends Transformer {
'formattedCreditsRemaining',
'formattedInvoicedAmount',
'entries',
'attachments',
];
};
@@ -80,4 +82,13 @@ export class VendorCreditTransformer extends Transformer {
currencyCode: vendorCredit.currencyCode,
});
};
/**
* Retrieves the vendor credit attachments.
* @param {IVendorCredit} invoice
* @returns
*/
protected attachments = (vendorCredit) => {
return this.item(vendorCredit.attachments, new AttachmentTransformer());
};
}

View File

@@ -28,7 +28,8 @@ export class GetSaleEstimate {
.findById(estimateId)
.withGraphFetched('entries.item')
.withGraphFetched('customer')
.withGraphFetched('branch');
.withGraphFetched('branch')
.withGraphFetched('attachments');
// Validates the estimate existance.
this.validators.validateEstimateExistance(estimate);

View File

@@ -2,6 +2,7 @@ import { ISaleEstimate } from '@/interfaces';
import { Transformer } from '@/lib/Transformer/Transformer';
import { formatNumber } from 'utils';
import { ItemEntryTransformer } from '../Invoices/ItemEntryTransformer';
import { AttachmentTransformer } from '@/services/Attachments/AttachmentTransformer';
export class SaleEstimateTransfromer extends Transformer {
/**
@@ -18,6 +19,7 @@ export class SaleEstimateTransfromer extends Transformer {
'formattedApprovedAtDate',
'formattedRejectedAtDate',
'entries',
'attachments',
];
};
@@ -91,9 +93,18 @@ export class SaleEstimateTransfromer extends Transformer {
* @param {ISaleEstimate} estimate
* @returns {}
*/
protected entries = (estimate) => {
protected entries = (estimate: ISaleEstimate) => {
return this.item(estimate.entries, new ItemEntryTransformer(), {
currencyCode: estimate.currencyCode,
});
};
/**
* Retrieves the sale estimate attachments.
* @param {ISaleInvoice} invoice
* @returns
*/
protected attachments = (estimate: ISaleEstimate) => {
return this.item(estimate.attachments, new AttachmentTransformer());
};
}

View File

@@ -101,6 +101,7 @@ export class CreateSaleReceipt {
tenantId,
saleReceipt,
saleReceiptId: saleReceipt.id,
saleReceiptDTO,
trx,
} as ISaleReceiptCreatedPayload);

View File

@@ -110,6 +110,7 @@ export class EditSaleReceipt {
oldSaleReceipt,
saleReceipt,
saleReceiptId,
saleReceiptDTO,
trx,
} as ISaleReceiptEditedPayload);

View File

@@ -28,7 +28,8 @@ export class GetSaleReceipt {
.withGraphFetched('entries.item')
.withGraphFetched('customer')
.withGraphFetched('depositAccount')
.withGraphFetched('branch');
.withGraphFetched('branch')
.withGraphFetched('attachments');
// Valdiates the sale receipt existance.
this.validators.validateReceiptExistance(saleReceipt);

View File

@@ -68,9 +68,10 @@ export class SaleReceiptDTOTransformer {
const initialDTO = {
amount,
...formatDateFields(omit(saleReceiptDTO, ['closed', 'entries']), [
'receiptDate',
]),
...formatDateFields(
omit(saleReceiptDTO, ['closed', 'entries', 'attachments']),
['receiptDate']
),
currencyCode: paymentCustomer.currencyCode,
exchangeRate: saleReceiptDTO.exchangeRate || 1,
receiptNumber,

View File

@@ -3,6 +3,7 @@ import { ISaleReceipt } from '@/interfaces';
import { Transformer } from '@/lib/Transformer/Transformer';
import { formatNumber } from 'utils';
import { ItemEntryTransformer } from '../Invoices/ItemEntryTransformer';
import { AttachmentTransformer } from '@/services/Attachments/AttachmentTransformer';
@Service()
export class SaleReceiptTransformer extends Transformer {
@@ -17,6 +18,7 @@ export class SaleReceiptTransformer extends Transformer {
'formattedReceiptDate',
'formattedClosedAtDate',
'entries',
'attachments',
];
};
@@ -68,4 +70,13 @@ export class SaleReceiptTransformer extends Transformer {
currencyCode: receipt.currencyCode,
});
};
/**
* Retrieves the sale receipt attachments.
* @param {ISaleReceipt} invoice
* @returns
*/
protected attachments = (receipt) => {
return this.item(receipt.attachments, new AttachmentTransformer());
};
}