From 59f8010122ac3baf2f304792b4491165bec779b7 Mon Sep 17 00:00:00 2001 From: "a.bouhuolia" Date: Tue, 9 Mar 2021 17:47:01 +0200 Subject: [PATCH] fix: payment receive and made. --- .../PaymentForm/PaymentMadeEntriesTable.js | 33 +++-- .../PaymentForm/PaymentMadeFormBody.js | 1 - .../PaymentForm/PaymentMadeInnerProvider.js | 11 +- .../PaymentMades/PaymentForm/components.js | 7 +- .../PaymentMades/PaymentForm/utils.js | 11 ++ .../Invoices/InvoicesLanding/components.js | 3 +- .../PaymentReceiveForm/PaymentReceiveForm.js | 4 +- .../PaymentReceiveFormProvider.js | 1 - .../PaymentReceiveInnerProvider.js | 4 +- .../PaymentReceiveItemsTable.js | 26 ++-- .../PaymentReceiveForm/utils.js | 3 +- .../PaymentsLanding/components.js | 14 +- .../Receipts/ReceiptsLanding/components.js | 1 + client/src/hooks/query/invoices.js | 6 + client/src/hooks/query/paymentMades.js | 6 + client/src/lang/en/index.js | 2 +- .../PaymentMades/paymentMades.reducer.js | 4 +- client/src/style/App.scss | 9 +- .../src/style/pages/PaymentMade/PageForm.scss | 13 ++ .../style/pages/PaymentReceive/PageForm.scss | 4 - .../controllers/Purchases/BillsPayments.ts | 13 +- .../api/controllers/Sales/PaymentReceives.ts | 87 ++++++------ .../{ => BillPayments}/BillPayments.ts | 114 +--------------- .../BillPayments/BillPaymentsPages.ts | 101 ++++++++++++++ .../Purchases/BillPayments/constants.ts | 12 ++ .../PaymentReceives/PaymentReceivesPages.ts | 110 +++++++++++++++ .../{ => PaymentReceives}/PaymentsReceives.ts | 126 +----------------- .../Sales/PaymentReceives/constants.ts | 13 ++ server/src/services/Sales/SalesInvoices.ts | 1 + server/src/subscribers/paymentMades.ts | 2 +- server/src/subscribers/paymentReceives.ts | 2 +- 31 files changed, 395 insertions(+), 349 deletions(-) rename server/src/services/Purchases/{ => BillPayments}/BillPayments.ts (85%) create mode 100644 server/src/services/Purchases/BillPayments/BillPaymentsPages.ts create mode 100644 server/src/services/Purchases/BillPayments/constants.ts create mode 100644 server/src/services/Sales/PaymentReceives/PaymentReceivesPages.ts rename server/src/services/Sales/{ => PaymentReceives}/PaymentsReceives.ts (85%) create mode 100644 server/src/services/Sales/PaymentReceives/constants.ts diff --git a/client/src/containers/Purchases/PaymentMades/PaymentForm/PaymentMadeEntriesTable.js b/client/src/containers/Purchases/PaymentMades/PaymentForm/PaymentMadeEntriesTable.js index 747a1aa79..56e1e20eb 100644 --- a/client/src/containers/Purchases/PaymentMades/PaymentForm/PaymentMadeEntriesTable.js +++ b/client/src/containers/Purchases/PaymentMades/PaymentForm/PaymentMadeEntriesTable.js @@ -1,38 +1,37 @@ -import React, { useMemo, useCallback } from 'react'; +import React, { useCallback } from 'react'; import { CloudLoadingIndicator } from 'components'; -import { Button } from '@blueprintjs/core'; -import { FormattedMessage as T } from 'react-intl'; import classNames from 'classnames'; import { CLASSES } from 'common/classes'; import { DataTableEditable } from 'components'; import { usePaymentMadeEntriesTableColumns } from './components'; -import { usePaymentMadeFormContext } from './PaymentMadeFormProvider'; -import { compose, updateTableRow, safeSumBy } from 'utils'; -import withAlertActions from 'containers/Alert/withAlertActions'; +import { usePaymentMadeInnerContext } from './PaymentMadeInnerProvider'; +import { compose, updateTableRow } from 'utils'; +import { useFormikContext } from 'formik'; /** * Payment made items table. */ -function PaymentMadeEntriesTable({ +export default function PaymentMadeEntriesTable({ onUpdateData, entries, - - // #withAlertsActions - openAlert, }) { - const { paymentVendorId, isDueBillsFetching } = usePaymentMadeFormContext(); + // Payment made inner context. + const { isNewEntriesFetching } = usePaymentMadeInnerContext(); + // Payment entries table columns. const columns = usePaymentMadeEntriesTableColumns(); + // Formik context. + const { values: { vendor_id } } = useFormikContext(); + // Handle update data. const handleUpdateData = useCallback( (rowIndex, columnId, value) => { const newRows = compose(updateTableRow(rowIndex, columnId, value))( entries, ); - onUpdateData(newRows); }, [onUpdateData, entries], @@ -40,14 +39,14 @@ function PaymentMadeEntriesTable({ // Detarmines the right no results message before selecting vendor and aftering // selecting vendor id. - const noResultsMessage = paymentVendorId + const noResultsMessage = vendor_id ? 'There is no payable bills for this vendor that can be applied for this payment' : 'Please select a vendor to display all open bills for it.'; return ( - + ); -} - -export default compose(withAlertActions)(PaymentMadeEntriesTable); +} \ No newline at end of file diff --git a/client/src/containers/Purchases/PaymentMades/PaymentForm/PaymentMadeFormBody.js b/client/src/containers/Purchases/PaymentMades/PaymentForm/PaymentMadeFormBody.js index 334303194..9a3a5c200 100644 --- a/client/src/containers/Purchases/PaymentMades/PaymentForm/PaymentMadeFormBody.js +++ b/client/src/containers/Purchases/PaymentMades/PaymentForm/PaymentMadeFormBody.js @@ -17,7 +17,6 @@ export default function PaymentMadeFormBody() { /> )} - ) } \ No newline at end of file diff --git a/client/src/containers/Purchases/PaymentMades/PaymentForm/PaymentMadeInnerProvider.js b/client/src/containers/Purchases/PaymentMades/PaymentForm/PaymentMadeInnerProvider.js index 9da5fe240..49e41a555 100644 --- a/client/src/containers/Purchases/PaymentMades/PaymentForm/PaymentMadeInnerProvider.js +++ b/client/src/containers/Purchases/PaymentMades/PaymentForm/PaymentMadeInnerProvider.js @@ -1,8 +1,8 @@ import { useFormikContext } from 'formik'; -import { isEmpty } from 'lodash'; import React, { createContext, useContext, useEffect } from 'react'; import { usePaymentMadeNewPageEntries } from 'hooks/query'; import { usePaymentMadeFormContext } from './PaymentMadeFormProvider'; +import { transformToNewPageEntries } from './utils'; const PaymentMadeInnerContext = createContext(); @@ -10,6 +10,7 @@ const PaymentMadeInnerContext = createContext(); * Payment made inner form provider. */ function PaymentMadeInnerProvider({ ...props }) { + // Payment made form context. const { isNewMode } = usePaymentMadeFormContext(); // Formik context. @@ -27,16 +28,16 @@ function PaymentMadeInnerProvider({ ...props }) { }); useEffect(() => { - if (!isNewEntriesFetching && !isEmpty(newPageEntries)) { - setFieldValue('entries', newPageEntries) + if (!isNewEntriesFetching && newPageEntries && isNewMode) { + setFieldValue('entries', transformToNewPageEntries(newPageEntries)); } - }, [isNewEntriesFetching, newPageEntries, setFieldValue]); + }, [isNewEntriesFetching, newPageEntries, isNewMode, setFieldValue]); // Provider payload. const provider = { newPageEntries, isNewEntriesLoading, - isNewEntriesFetching + isNewEntriesFetching, }; return ; diff --git a/client/src/containers/Purchases/PaymentMades/PaymentForm/components.js b/client/src/containers/Purchases/PaymentMades/PaymentForm/components.js index 9b95d879c..a2881df3d 100644 --- a/client/src/containers/Purchases/PaymentMades/PaymentForm/components.js +++ b/client/src/containers/Purchases/PaymentMades/PaymentForm/components.js @@ -72,6 +72,7 @@ export function usePaymentMadeEntriesTableColumns() { Cell: BillDateCell, disableSortBy: true, width: 250, + className: 'bill_date', }, { Header: formatMessage({ id: 'bill_number' }), @@ -85,7 +86,7 @@ export function usePaymentMadeEntriesTableColumns() { Cell: MoneyTableCell, Footer: AmountFooterCell, disableSortBy: true, - className: '', + className: 'amount', }, { Header: formatMessage({ id: 'amount_due' }), @@ -93,7 +94,7 @@ export function usePaymentMadeEntriesTableColumns() { Cell: MoneyTableCell, Footer: DueAmountFooterCell, disableSortBy: true, - className: '', + className: 'due_amount', }, { Header: formatMessage({ id: 'payment_amount' }), @@ -101,7 +102,7 @@ export function usePaymentMadeEntriesTableColumns() { Cell: MoneyFieldCell, Footer: PaymentAmountFooterCell, disableSortBy: true, - className: '', + className: 'payment_amount', }, ], [formatMessage], diff --git a/client/src/containers/Purchases/PaymentMades/PaymentForm/utils.js b/client/src/containers/Purchases/PaymentMades/PaymentForm/utils.js index 858d4d282..22732440c 100644 --- a/client/src/containers/Purchases/PaymentMades/PaymentForm/utils.js +++ b/client/src/containers/Purchases/PaymentMades/PaymentForm/utils.js @@ -32,7 +32,18 @@ export const transformToEditForm = (paymentMade, paymentMadeEntries) => { entries: [ ...paymentMadeEntries.map((paymentMadeEntry) => ({ ...transformToForm(paymentMadeEntry, defaultPaymentMadeEntry), + payment_amount: paymentMadeEntry.payment_amount || '', })), ], }; }; + +/** + * Transform the new page entries. + */ +export const transformToNewPageEntries = (entries) => { + return entries.map((entry) => ({ + ...transformToForm(entry, defaultPaymentMadeEntry), + payment_amount: '', + })); +} \ No newline at end of file diff --git a/client/src/containers/Sales/Invoices/InvoicesLanding/components.js b/client/src/containers/Sales/Invoices/InvoicesLanding/components.js index 470f717ea..05d4868bc 100644 --- a/client/src/containers/Sales/Invoices/InvoicesLanding/components.js +++ b/client/src/containers/Sales/Invoices/InvoicesLanding/components.js @@ -54,8 +54,7 @@ export const statusAccessor = (row) => { , }} /> diff --git a/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/PaymentReceiveForm.js b/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/PaymentReceiveForm.js index 3ec1b59b2..485bf9406 100644 --- a/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/PaymentReceiveForm.js +++ b/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/PaymentReceiveForm.js @@ -6,6 +6,8 @@ import { Intent } from '@blueprintjs/core'; import classNames from 'classnames'; import { useHistory } from 'react-router-dom'; +import 'style/pages/PaymentReceive/PageForm.scss'; + import { CLASSES } from 'common/classes'; import PaymentReceiveHeader from './PaymentReceiveFormHeader'; import PaymentReceiveFormBody from './PaymentReceiveFormBody'; @@ -29,8 +31,6 @@ import { transformToEditForm, } from './utils'; -import 'style/pages/PaymentReceive/PageForm.scss'; - /** * Payment Receive form. */ diff --git a/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/PaymentReceiveFormProvider.js b/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/PaymentReceiveFormProvider.js index e208fee66..5657671b4 100644 --- a/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/PaymentReceiveFormProvider.js +++ b/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/PaymentReceiveFormProvider.js @@ -30,7 +30,6 @@ function PaymentReceiveFormProvider({ paymentReceiveId, ...props }) { } = usePaymentReceiveEditPage(paymentReceiveId, { enabled: !!paymentReceiveId, }); - // Handle fetch accounts data. const { data: accounts, isFetching: isAccountsFetching } = useAccounts(); diff --git a/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/PaymentReceiveInnerProvider.js b/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/PaymentReceiveInnerProvider.js index c642911f6..b69d17771 100644 --- a/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/PaymentReceiveInnerProvider.js +++ b/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/PaymentReceiveInnerProvider.js @@ -29,10 +29,10 @@ function PaymentReceiveInnerProvider({ ...props }) { }); useEffect(() => { - if (!isDueInvoicesFetching && !isEmpty(dueInvoices)) { + if (!isDueInvoicesFetching && dueInvoices && isNewMode) { setFieldValue('entries', transformInvoicesNewPageEntries(dueInvoices)); } - }, [isDueInvoicesFetching, dueInvoices, setFieldValue]); + }, [isDueInvoicesFetching, dueInvoices, isNewMode, setFieldValue]); // Provider payload. const provider = { diff --git a/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/PaymentReceiveItemsTable.js b/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/PaymentReceiveItemsTable.js index df4688f69..40986c467 100644 --- a/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/PaymentReceiveItemsTable.js +++ b/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/PaymentReceiveItemsTable.js @@ -1,38 +1,34 @@ import React, { useCallback } from 'react'; -import { Button } from '@blueprintjs/core'; -import { FormattedMessage as T } from 'react-intl'; import { CloudLoadingIndicator } from 'components'; import classNames from 'classnames'; +import { useFormikContext } from 'formik'; import { CLASSES } from 'common/classes'; -import { usePaymentReceiveFormContext } from './PaymentReceiveFormProvider'; +import { usePaymentReceiveInnerContext } from './PaymentReceiveInnerProvider'; import { DataTableEditable } from 'components'; import { usePaymentReceiveEntriesColumns } from './components'; -import { compose, updateTableRow, safeSumBy } from 'utils'; -import withAlertActions from 'containers/Alert/withAlertActions'; - +import { compose, updateTableRow } from 'utils'; /** * Payment receive items table. */ -function PaymentReceiveItemsTable({ +export default function PaymentReceiveItemsTable({ entries, onUpdateData, - - // #withDialogActions - openAlert }) { // Payment receive form context. const { isDueInvoicesFetching, - paymentCustomerId, - } = usePaymentReceiveFormContext(); + } = usePaymentReceiveInnerContext(); // Payment receive entries form context. const columns = usePaymentReceiveEntriesColumns(); + // Formik context. + const { values: { customer_id } } = useFormikContext(); + // No results message. - const noResultsMessage = paymentCustomerId + const noResultsMessage = customer_id ? 'There is no receivable invoices for this customer that can be applied for this payment' : 'Please select a customer to display all open invoices for it.'; @@ -62,6 +58,4 @@ function PaymentReceiveItemsTable({ /> ); -} - -export default compose(withAlertActions)(PaymentReceiveItemsTable); \ No newline at end of file +} \ No newline at end of file diff --git a/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/utils.js b/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/utils.js index 6388f0a7b..3625997f2 100644 --- a/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/utils.js +++ b/client/src/containers/Sales/PaymentReceives/PaymentReceiveForm/utils.js @@ -32,6 +32,7 @@ export const transformToEditForm = (paymentReceive, paymentReceiveEntries) => ({ entries: [ ...paymentReceiveEntries.map((paymentReceiveEntry) => ({ ...transformToForm(paymentReceiveEntry, defaultPaymentReceiveEntry), + payment_amount: paymentReceiveEntry.payment_amount || '', })), ], }); @@ -47,7 +48,7 @@ export const transformInvoicesNewPageEntries = (invoices) => [ due_amount: invoice.due_amount, date: invoice.invoice_date, amount: invoice.balance, - payment_amount: 0, + payment_amount: '', invoice_no: invoice.invoice_no, total_payment_amount: invoice.payment_amount, })), diff --git a/client/src/containers/Sales/PaymentReceives/PaymentsLanding/components.js b/client/src/containers/Sales/PaymentReceives/PaymentsLanding/components.js index 9a09e90f1..748b3b8f5 100644 --- a/client/src/containers/Sales/PaymentReceives/PaymentsLanding/components.js +++ b/client/src/containers/Sales/PaymentReceives/PaymentsLanding/components.js @@ -114,13 +114,6 @@ export function usePaymentReceivesColumns() { width: 140, className: 'payment_receive_no', }, - { - id: 'reference_no', - Header: formatMessage({ id: 'reference_no' }), - accessor: 'reference_no', - width: 140, - className: 'reference_no', - }, { id: 'deposit_account', Header: formatMessage({ id: 'deposit_account' }), @@ -128,6 +121,13 @@ export function usePaymentReceivesColumns() { width: 140, className: 'deposit_account_id', }, + { + id: 'reference_no', + Header: formatMessage({ id: 'reference_no' }), + accessor: 'reference_no', + width: 140, + className: 'reference_no', + }, { id: 'actions', Header: '', diff --git a/client/src/containers/Sales/Receipts/ReceiptsLanding/components.js b/client/src/containers/Sales/Receipts/ReceiptsLanding/components.js index de9aa78d6..bd2993b08 100644 --- a/client/src/containers/Sales/Receipts/ReceiptsLanding/components.js +++ b/client/src/containers/Sales/Receipts/ReceiptsLanding/components.js @@ -34,6 +34,7 @@ export function ActionsMenu({ /> } text={formatMessage({ id: 'mark_as_closed' })} onClick={safeCallback(onClose, receipt)} /> diff --git a/client/src/hooks/query/invoices.js b/client/src/hooks/query/invoices.js index d95f60818..4b74e32cd 100644 --- a/client/src/hooks/query/invoices.js +++ b/client/src/hooks/query/invoices.js @@ -147,6 +147,12 @@ export function useDueInvoices(customerId, props) { }), { select: (res) => res.data.sales_invoices, + initialDataUpdatedAt: 0, + initialData: { + data: { + sales_invoices: [], + }, + }, ...props, }, ); diff --git a/client/src/hooks/query/paymentMades.js b/client/src/hooks/query/paymentMades.js index 00789db87..595eea6e1 100644 --- a/client/src/hooks/query/paymentMades.js +++ b/client/src/hooks/query/paymentMades.js @@ -131,6 +131,12 @@ export function usePaymentMadeNewPageEntries(vendorId, props) { }), { select: (res) => res.data.entries, + initialDataUpdatedAt: 0, + initialData: { + data: { + entries: [], + } + }, ...props, }, ); diff --git a/client/src/lang/en/index.js b/client/src/lang/en/index.js index ba3a32915..4af4b7a39 100644 --- a/client/src/lang/en/index.js +++ b/client/src/lang/en/index.js @@ -861,7 +861,7 @@ export default { deliver_and_new: 'Deliver and new', deliver_continue_editing: 'Deliver (continue editing)', due_in: 'Due in {due} day.', - day_partially_paid: 'Partially paid, {currencySign}{due} due.', + day_partially_paid: 'Partially paid, {due} due.', overdue_by: 'Overdue by {overdue} day.', paid: 'Paid', your_account_has_been_locked: diff --git a/client/src/store/PaymentMades/paymentMades.reducer.js b/client/src/store/PaymentMades/paymentMades.reducer.js index 626cc25e5..c1660a313 100644 --- a/client/src/store/PaymentMades/paymentMades.reducer.js +++ b/client/src/store/PaymentMades/paymentMades.reducer.js @@ -6,11 +6,11 @@ import { const initialState = { tableState: { pageSize: 12, - pageIndex: 1, + pageIndex: 0, sortBy: [], }, }; - + export default createReducer(initialState, { ...createTableStateReducers('PAYMENT_MADES'), }); diff --git a/client/src/style/App.scss b/client/src/style/App.scss index 737d919d9..d0759f264 100644 --- a/client/src/style/App.scss +++ b/client/src/style/App.scss @@ -44,9 +44,6 @@ body.hide-scrollbar .Pane2{ overflow: hidden; } - - - .bp3-fill{ .bp3-popover-wrapper, .bp3-popover-target { @@ -96,8 +93,10 @@ body.hide-scrollbar .Pane2{ } - - .bp3-progress-bar.bp3-intent-primary .bp3-progress-meter{ background-color: #0066ff; } + +.bp3-overlay-backdrop{ + background-color: rgba(0,10,30, .7); +} \ No newline at end of file diff --git a/client/src/style/pages/PaymentMade/PageForm.scss b/client/src/style/pages/PaymentMade/PageForm.scss index 9f51fcdad..b730fb844 100644 --- a/client/src/style/pages/PaymentMade/PageForm.scss +++ b/client/src/style/pages/PaymentMade/PageForm.scss @@ -67,6 +67,19 @@ body.page-payment-made-edit{ } .table{ + .th, + .td { + &.amount, + &.due_amount, + &.payment_amount { + + &, + input { + text-align: right; + } + } + } + .tr{ .td:first-of-type, .th:first-of-type{ diff --git a/client/src/style/pages/PaymentReceive/PageForm.scss b/client/src/style/pages/PaymentReceive/PageForm.scss index cb5ad1496..1fdc4859d 100644 --- a/client/src/style/pages/PaymentReceive/PageForm.scss +++ b/client/src/style/pages/PaymentReceive/PageForm.scss @@ -70,11 +70,8 @@ body.page-payment-receive-edit{ } .table { - - .th, .td { - &.invoice_amount, &.amount_due, &.payment_amount { @@ -87,7 +84,6 @@ body.page-payment-receive-edit{ } .tr { - .td:first-of-type, .th:first-of-type { diff --git a/server/src/api/controllers/Purchases/BillsPayments.ts b/server/src/api/controllers/Purchases/BillsPayments.ts index 297472803..0e7f9c4c3 100644 --- a/server/src/api/controllers/Purchases/BillsPayments.ts +++ b/server/src/api/controllers/Purchases/BillsPayments.ts @@ -4,11 +4,11 @@ import { check, param, query, ValidationChain } from 'express-validator'; import asyncMiddleware from 'api/middleware/asyncMiddleware'; import { ServiceError } from 'exceptions'; import BaseController from 'api/controllers/BaseController'; -import BillPaymentsService from 'services/Purchases/BillPayments'; +import BillPaymentsService from 'services/Purchases/BillPayments/BillPayments'; +import BillPaymentsPages from 'services/Purchases/BillPayments/BillPaymentsPages'; import DynamicListingService from 'services/DynamicListing/DynamicListService'; import AccountsService from 'services/Accounts/AccountsService'; -import ResourceController from '../Resources'; -import { Request } from 'express-validator/src/base'; + /** * Bills payments controller. @@ -25,6 +25,9 @@ export default class BillsPayments extends BaseController { @Inject() dynamicListService: DynamicListingService; + @Inject() + billPaymentsPages: BillPaymentsPages; + /** * Router constructor. */ @@ -144,7 +147,7 @@ export default class BillsPayments extends BaseController { const { vendorId } = this.matchedQueryData(req); try { - const entries = await this.billPaymentService.getNewPageEntries( + const entries = await this.billPaymentsPages.getNewPageEntries( tenantId, vendorId ); @@ -171,7 +174,7 @@ export default class BillsPayments extends BaseController { const { billPayment, entries, - } = await this.billPaymentService.getBillPaymentEditPage( + } = await this.billPaymentsPages.getBillPaymentEditPage( tenantId, paymentReceiveId ); diff --git a/server/src/api/controllers/Sales/PaymentReceives.ts b/server/src/api/controllers/Sales/PaymentReceives.ts index 70d521885..6d6a14ac0 100644 --- a/server/src/api/controllers/Sales/PaymentReceives.ts +++ b/server/src/api/controllers/Sales/PaymentReceives.ts @@ -4,7 +4,8 @@ import { Inject, Service } from 'typedi'; import { IPaymentReceiveDTO } from 'interfaces'; import BaseController from 'api/controllers/BaseController'; import asyncMiddleware from 'api/middleware/asyncMiddleware'; -import PaymentReceiveService from 'services/Sales/PaymentsReceives'; +import PaymentReceiveService from 'services/Sales/PaymentReceives/PaymentsReceives'; +import PaymentReceivesPages from 'services/Sales/PaymentReceives/PaymentReceivesPages'; import DynamicListingService from 'services/DynamicListing/DynamicListService'; import { ServiceError } from 'exceptions'; @@ -17,6 +18,9 @@ export default class PaymentReceivesController extends BaseController { @Inject() paymentReceiveService: PaymentReceiveService; + @Inject() + PaymentReceivesPages: PaymentReceivesPages; + @Inject() dynamicListService: DynamicListingService; @@ -132,9 +136,7 @@ export default class PaymentReceivesController extends BaseController { * @return {Array} */ get newPaymentReceiveValidation() { - return [ - ...this.paymentReceiveSchema, - ]; + return [...this.paymentReceiveSchema]; } /** @@ -149,6 +151,9 @@ export default class PaymentReceivesController extends BaseController { /** * Records payment receive to the given customer with associated invoices. + * @param {Request} req + * @param {Response} res + * @return {Response} */ async newPaymentReceive(req: Request, res: Response, next: NextFunction) { const { tenantId, user } = req; @@ -165,6 +170,7 @@ export default class PaymentReceivesController extends BaseController { message: 'The payment receive has been created successfully.', }); } catch (error) { + console.log(error); next(error); } } @@ -222,39 +228,6 @@ export default class PaymentReceivesController extends BaseController { } } - /** - * Retrieve the given payment receive details. - * @asycn - * @param {Request} req - - * @param {Response} res - - */ - async getPaymentReceiveEditPage( - req: Request, - res: Response, - next: NextFunction - ) { - const { tenantId, user } = req; - const { id: paymentReceiveId } = req.params; - - try { - const { - paymentReceive, - entries, - } = await this.paymentReceiveService.getPaymentReceiveEditPage( - tenantId, - paymentReceiveId, - user - ); - - return res.status(200).send({ - payment_receive: this.transfromToResponse({ ...paymentReceive }), - entries: this.transfromToResponse([...entries]), - }); - } catch (error) { - next(error); - } - } - /** * Retrieve sale invoices that associated with the given payment receive. * @param {Request} req @@ -334,7 +307,7 @@ export default class PaymentReceivesController extends BaseController { const { customerId } = this.matchedQueryData(req); try { - const entries = await this.paymentReceiveService.getNewPageEntries( + const entries = await this.PaymentReceivesPages.getNewPageEntries( tenantId, customerId ); @@ -346,6 +319,39 @@ export default class PaymentReceivesController extends BaseController { } } + /** + * Retrieve the given payment receive details. + * @asycn + * @param {Request} req - + * @param {Response} res - + */ + async getPaymentReceiveEditPage( + req: Request, + res: Response, + next: NextFunction + ) { + const { tenantId, user } = req; + const { id: paymentReceiveId } = req.params; + + try { + const { + paymentReceive, + entries, + } = await this.PaymentReceivesPages.getPaymentReceiveEditPage( + tenantId, + paymentReceiveId, + user + ); + + return res.status(200).send({ + payment_receive: this.transfromToResponse({ ...paymentReceive }), + entries: this.transfromToResponse([...entries]), + }); + } catch (error) { + next(error); + } + } + /** * Retrieve the payment receive details. * @param {Request} req @@ -454,6 +460,11 @@ export default class PaymentReceivesController extends BaseController { errors: [{ type: 'PAYMENT_CUSTOMER_SHOULD_NOT_UPDATE', code: 1200 }], }); } + if (error.errorType === 'PAYMENT_RECEIVE_NO_REQUIRED') { + return res.boom.badRequest(null, { + errors: [{ type: 'PAYMENT_RECEIVE_NO_REQUIRED', code: 1300 }], + }); + } } next(error); } diff --git a/server/src/services/Purchases/BillPayments.ts b/server/src/services/Purchases/BillPayments/BillPayments.ts similarity index 85% rename from server/src/services/Purchases/BillPayments.ts rename to server/src/services/Purchases/BillPayments/BillPayments.ts index 989a2427f..d2201ceb3 100644 --- a/server/src/services/Purchases/BillPayments.ts +++ b/server/src/services/Purchases/BillPayments/BillPayments.ts @@ -15,7 +15,6 @@ import { IPaginationMeta, IFilterMeta, IBillPaymentEntry, - IBillReceivePageEntry, } from 'interfaces'; import AccountsService from 'services/Accounts/AccountsService'; import JournalPoster from 'services/Accounting/JournalPoster'; @@ -28,19 +27,7 @@ import { entriesAmountDiff, formatDateFields } from 'utils'; import { ServiceError } from 'exceptions'; import { ACCOUNT_PARENT_TYPE } from 'data/AccountTypes'; import VendorsService from 'services/Contacts/VendorsService'; - -const ERRORS = { - BILL_VENDOR_NOT_FOUND: 'VENDOR_NOT_FOUND', - PAYMENT_MADE_NOT_FOUND: 'PAYMENT_MADE_NOT_FOUND', - BILL_PAYMENT_NUMBER_NOT_UNQIUE: 'BILL_PAYMENT_NUMBER_NOT_UNQIUE', - PAYMENT_ACCOUNT_NOT_FOUND: 'PAYMENT_ACCOUNT_NOT_FOUND', - PAYMENT_ACCOUNT_NOT_CURRENT_ASSET_TYPE: - 'PAYMENT_ACCOUNT_NOT_CURRENT_ASSET_TYPE', - BILL_ENTRIES_IDS_NOT_FOUND: 'BILL_ENTRIES_IDS_NOT_FOUND', - BILL_PAYMENT_ENTRIES_NOT_FOUND: 'BILL_PAYMENT_ENTRIES_NOT_FOUND', - INVALID_BILL_PAYMENT_AMOUNT: 'INVALID_BILL_PAYMENT_AMOUNT', - PAYMENT_NUMBER_SHOULD_NOT_MODIFY: 'PAYMENT_NUMBER_SHOULD_NOT_MODIFY', -}; +import { ERRORS } from './constants'; /** * Bill payments service. @@ -271,7 +258,7 @@ export default class BillPaymentsService { * * Validate the payment vendor whether modified. * @param {string} billPaymentNo */ - validateVendorNotModified( + private validateVendorNotModified( billPaymentDTO: IBillPaymentDTO, oldBillPayment: IBillPayment ) { @@ -646,7 +633,6 @@ export default class BillPaymentsService { BillPayment, billPaymentsFilter ); - this.logger.info('[bill_payment] try to get bill payments list.', { tenantId, }); @@ -666,51 +652,6 @@ export default class BillPaymentsService { }; } - /** - * Retrieve bill payment with associated metadata. - * @param {number} billPaymentId - The bill payment id. - * @return {object} - */ - public async getBillPaymentEditPage( - tenantId: number, - billPaymentId: number - ): Promise<{ - billPayment: Omit; - entries: IBillReceivePageEntry[]; - }> { - const { BillPayment, Bill } = this.tenancy.models(tenantId); - const billPayment = await BillPayment.query() - .findById(billPaymentId) - .withGraphFetched('entries.bill'); - - // Throw not found the bill payment. - if (!billPayment) { - throw new ServiceError(ERRORS.PAYMENT_MADE_NOT_FOUND); - } - const paymentEntries = billPayment.entries.map((entry) => ({ - ...this.mapBillToPageEntry(entry.bill), - paymentAmount: entry.paymentAmount, - })); - - const resPayableBills = await Bill.query() - .modify('dueBills') - .where('vendor_id', billPayment.vendorId) - .whereNotIn( - 'id', - billPayment.entries.map((e) => e.billId) - ) - .orderBy('bill_date', 'ASC'); - - // Mapping the payable bills to entries. - const restPayableEntries = resPayableBills.map(this.mapBillToPageEntry); - const entries = [...paymentEntries, ...restPayableEntries]; - - return { - billPayment: omit(billPayment, ['entries']), - entries, - }; - } - /** * Saves bills payment amount changes different. * @param {number} tenantId - @@ -746,55 +687,4 @@ export default class BillPaymentsService { ); await Promise.all(opers); } - - /** - * Retrive edit page invoices entries from the given sale invoices models. - * @param {ISaleInvoice[]} invoices - Invoices. - * @return {IPaymentReceiveEditPageEntry} - */ - public mapBillToPageEntry(bill: IBill): IBillReceivePageEntry { - return { - entryType: 'invoice', - billId: bill.id, - dueAmount: bill.dueAmount + bill.paymentAmount, - amount: bill.amount, - billNo: bill.billNumber, - totalPaymentAmount: bill.paymentAmount, - paymentAmount: bill.paymentAmount, - date: bill.billDate, - }; - } - - public mapBillToNewPageEntry(bill: IBill): IBillReceivePageEntry { - return { - entryType: 'invoice', - billId: bill.id, - dueAmount: bill.dueAmount, - amount: bill.amount, - billNo: bill.billNumber, - date: bill.billDate, - totalPaymentAmount: bill.paymentAmount, - paymentAmount: 0, - }; - } - - /** - * Retrieve the payable entries of the new page once vendor be selected. - * @param {number} tenantId - * @param {number} vendorId - */ - async getNewPageEntries( - tenantId: number, - vendorId: number - ): Promise { - const { Bill } = this.tenancy.models(tenantId); - - // Retrieve all payable bills that assocaited to the payment made transaction. - const payableBills = await Bill.query() - .modify('dueBills') - .where('vendor_id', vendorId) - .orderBy('bill_date', 'ASC'); - - return payableBills.map(this.mapBillToNewPageEntry); - } } diff --git a/server/src/services/Purchases/BillPayments/BillPaymentsPages.ts b/server/src/services/Purchases/BillPayments/BillPaymentsPages.ts new file mode 100644 index 000000000..2a7420690 --- /dev/null +++ b/server/src/services/Purchases/BillPayments/BillPaymentsPages.ts @@ -0,0 +1,101 @@ +import { Inject, Service } from 'typedi'; +import { omit } from 'lodash'; +import TenancyService from 'services/Tenancy/TenancyService'; +import { IBill, IBillPayment, IBillReceivePageEntry } from 'interfaces'; +import { ERRORS } from './constants'; +import { ServiceError } from 'exceptions'; + +/** + * Bill payments edit and create pages services. + */ +@Service() +export default class BillPaymentsPages { + @Inject() + tenancy: TenancyService; + + /** + * Retrieve bill payment with associated metadata. + * @param {number} billPaymentId - The bill payment id. + * @return {object} + */ + public async getBillPaymentEditPage( + tenantId: number, + billPaymentId: number + ): Promise<{ + billPayment: Omit; + entries: IBillReceivePageEntry[]; + }> { + const { BillPayment, Bill } = this.tenancy.models(tenantId); + const billPayment = await BillPayment.query() + .findById(billPaymentId) + .withGraphFetched('entries.bill'); + + // Throw not found the bill payment. + if (!billPayment) { + throw new ServiceError(ERRORS.PAYMENT_MADE_NOT_FOUND); + } + const paymentEntries = billPayment.entries.map((entry) => ({ + ...this.mapBillToPageEntry(entry.bill), + dueAmount: entry.bill.dueAmount + entry.paymentAmount, + paymentAmount: entry.paymentAmount, + })); + + const resPayableBills = await Bill.query() + .modify('opened') + .modify('dueBills') + .where('vendor_id', billPayment.vendorId) + .whereNotIn( + 'id', + billPayment.entries.map((e) => e.billId) + ) + .orderBy('bill_date', 'ASC'); + + // Mapping the payable bills to entries. + const restPayableEntries = resPayableBills.map(this.mapBillToPageEntry); + const entries = [...paymentEntries, ...restPayableEntries]; + + return { + billPayment: omit(billPayment, ['entries']), + entries, + }; + } + + /** + * Retrieve the payable entries of the new page once vendor be selected. + * @param {number} tenantId + * @param {number} vendorId + */ + public async getNewPageEntries( + tenantId: number, + vendorId: number + ): Promise { + const { Bill } = this.tenancy.models(tenantId); + + // Retrieve all payable bills that assocaited to the payment made transaction. + const payableBills = await Bill.query() + .modify('opened') + .modify('dueBills') + .where('vendor_id', vendorId) + .orderBy('bill_date', 'ASC'); + + return payableBills.map(this.mapBillToPageEntry); + } + + /** + * Retrive edit page invoices entries from the given sale invoices models. + * @param {ISaleInvoice[]} invoices - Invoices. + * @return {IPaymentReceiveEditPageEntry} + */ + private mapBillToPageEntry(bill: IBill): IBillReceivePageEntry { + return { + entryType: 'invoice', + billId: bill.id, + dueAmount: bill.dueAmount, + amount: bill.amount, + billNo: bill.billNumber, + totalPaymentAmount: bill.paymentAmount, + paymentAmount: bill.paymentAmount, + date: bill.billDate, + }; + } +} diff --git a/server/src/services/Purchases/BillPayments/constants.ts b/server/src/services/Purchases/BillPayments/constants.ts new file mode 100644 index 000000000..b38962971 --- /dev/null +++ b/server/src/services/Purchases/BillPayments/constants.ts @@ -0,0 +1,12 @@ +export const ERRORS = { + BILL_VENDOR_NOT_FOUND: 'VENDOR_NOT_FOUND', + PAYMENT_MADE_NOT_FOUND: 'PAYMENT_MADE_NOT_FOUND', + BILL_PAYMENT_NUMBER_NOT_UNQIUE: 'BILL_PAYMENT_NUMBER_NOT_UNQIUE', + PAYMENT_ACCOUNT_NOT_FOUND: 'PAYMENT_ACCOUNT_NOT_FOUND', + PAYMENT_ACCOUNT_NOT_CURRENT_ASSET_TYPE: + 'PAYMENT_ACCOUNT_NOT_CURRENT_ASSET_TYPE', + BILL_ENTRIES_IDS_NOT_FOUND: 'BILL_ENTRIES_IDS_NOT_FOUND', + BILL_PAYMENT_ENTRIES_NOT_FOUND: 'BILL_PAYMENT_ENTRIES_NOT_FOUND', + INVALID_BILL_PAYMENT_AMOUNT: 'INVALID_BILL_PAYMENT_AMOUNT', + PAYMENT_NUMBER_SHOULD_NOT_MODIFY: 'PAYMENT_NUMBER_SHOULD_NOT_MODIFY', +}; diff --git a/server/src/services/Sales/PaymentReceives/PaymentReceivesPages.ts b/server/src/services/Sales/PaymentReceives/PaymentReceivesPages.ts new file mode 100644 index 000000000..98daa575c --- /dev/null +++ b/server/src/services/Sales/PaymentReceives/PaymentReceivesPages.ts @@ -0,0 +1,110 @@ +import { Inject, Service } from 'typedi'; +import { omit } from 'lodash'; +import { + ISaleInvoice, + IPaymentReceivePageEntry, + IPaymentReceive, + ISystemUser, +} from 'interfaces'; +import TenancyService from 'services/Tenancy/TenancyService'; +import { ServiceError } from 'exceptions'; +import { ERRORS } from './constants'; + +/** + * Payment receives edit/new pages service. + */ +@Service() +export default class PaymentReceivesPages { + @Inject() + tenancy: TenancyService; + + @Inject('logger') + logger: any; + + /** + * Retrive page invoices entries from the given sale invoices models. + * @param {ISaleInvoice[]} invoices - Invoices. + * @return {IPaymentReceivePageEntry} + */ + private invoiceToPageEntry(invoice: ISaleInvoice): IPaymentReceivePageEntry { + return { + entryType: 'invoice', + invoiceId: invoice.id, + dueAmount: invoice.dueAmount, + amount: invoice.balance, + invoiceNo: invoice.invoiceNo, + totalPaymentAmount: invoice.paymentAmount, + paymentAmount: invoice.paymentAmount, + date: invoice.invoiceDate, + }; + } + + /** + * Retrieve payment receive new page receivable entries. + * @param {number} tenantId - Tenant id. + * @param {number} vendorId - Vendor id. + * @return {IPaymentReceivePageEntry[]} + */ + public async getNewPageEntries(tenantId: number, customerId: number) { + const { SaleInvoice } = this.tenancy.models(tenantId); + + // Retrieve due invoices. + const entries = await SaleInvoice.query() + .modify('delivered') + .modify('dueInvoices') + .where('customer_id', customerId) + .orderBy('invoice_date', 'ASC'); + + return entries.map(this.invoiceToPageEntry); + } + + /** + * Retrieve the payment receive details of the given id. + * @param {number} tenantId - Tenant id. + * @param {Integer} paymentReceiveId - Payment receive id. + */ + public async getPaymentReceiveEditPage( + tenantId: number, + paymentReceiveId: number, + ): Promise<{ + paymentReceive: Omit; + entries: IPaymentReceivePageEntry[]; + }> { + const { PaymentReceive, SaleInvoice } = this.tenancy.models(tenantId); + + // Retrieve payment receive. + const paymentReceive = await PaymentReceive.query() + .findById(paymentReceiveId) + .withGraphFetched('entries.invoice'); + + // Throw not found the payment receive. + if (!paymentReceive) { + throw new ServiceError(ERRORS.PAYMENT_RECEIVE_NOT_EXISTS); + } + const paymentEntries = paymentReceive.entries.map((entry) => ({ + ...this.invoiceToPageEntry(entry.invoice), + dueAmount: entry.invoice.dueAmount + entry.paymentAmount, + paymentAmount: entry.paymentAmount, + })); + // Retrieves all receivable bills that associated to the payment receive transaction. + const restReceivableInvoices = await SaleInvoice.query() + .modify('delivered') + .modify('dueInvoices') + .where('customer_id', paymentReceive.customerId) + .whereNotIn( + 'id', + paymentReceive.entries.map((entry) => entry.invoiceId) + ) + .orderBy('invoice_date', 'ASC'); + + const restReceivableEntries = restReceivableInvoices.map( + this.invoiceToPageEntry + ); + const entries = [...paymentEntries, ...restReceivableEntries]; + + return { + paymentReceive: omit(paymentReceive, ['entries']), + entries, + }; + } +} diff --git a/server/src/services/Sales/PaymentsReceives.ts b/server/src/services/Sales/PaymentReceives/PaymentsReceives.ts similarity index 85% rename from server/src/services/Sales/PaymentsReceives.ts rename to server/src/services/Sales/PaymentReceives/PaymentsReceives.ts index 2a6acafbf..868b320d7 100644 --- a/server/src/services/Sales/PaymentsReceives.ts +++ b/server/src/services/Sales/PaymentReceives/PaymentsReceives.ts @@ -17,7 +17,6 @@ import { IPaymentReceivesFilter, ISaleInvoice, ISystemUser, - IPaymentReceivePageEntry, } from 'interfaces'; import AccountsService from 'services/Accounts/AccountsService'; import JournalPoster from 'services/Accounting/JournalPoster'; @@ -31,21 +30,9 @@ import CustomersService from 'services/Contacts/CustomersService'; import ItemsEntriesService from 'services/Items/ItemsEntriesService'; import JournalCommands from 'services/Accounting/JournalCommands'; import { ACCOUNT_PARENT_TYPE } from 'data/AccountTypes'; -import AutoIncrementOrdersService from './AutoIncrementOrdersService'; +import AutoIncrementOrdersService from '../AutoIncrementOrdersService'; +import { ERRORS } from './constants'; -const ERRORS = { - PAYMENT_RECEIVE_NO_EXISTS: 'PAYMENT_RECEIVE_NO_EXISTS', - PAYMENT_RECEIVE_NOT_EXISTS: 'PAYMENT_RECEIVE_NOT_EXISTS', - DEPOSIT_ACCOUNT_NOT_FOUND: 'DEPOSIT_ACCOUNT_NOT_FOUND', - DEPOSIT_ACCOUNT_INVALID_TYPE: 'DEPOSIT_ACCOUNT_INVALID_TYPE', - INVALID_PAYMENT_AMOUNT: 'INVALID_PAYMENT_AMOUNT', - INVOICES_IDS_NOT_FOUND: 'INVOICES_IDS_NOT_FOUND', - ENTRIES_IDS_NOT_EXISTS: 'ENTRIES_IDS_NOT_EXISTS', - INVOICES_NOT_DELIVERED_YET: 'INVOICES_NOT_DELIVERED_YET', - PAYMENT_RECEIVE_NO_IS_REQUIRED: 'PAYMENT_RECEIVE_NO_IS_REQUIRED', - PAYMENT_RECEIVE_NO_REQUIRED: 'PAYMENT_RECEIVE_NO_REQUIRED', - PAYMENT_CUSTOMER_SHOULD_NOT_UPDATE: 'PAYMENT_CUSTOMER_SHOULD_NOT_UPDATE', -}; /** * Payment receive service. * @service @@ -532,7 +519,7 @@ export default class PaymentReceiveService { * @param {Integer} paymentReceiveId - Payment receive id. * @param {IPaymentReceive} paymentReceive - Payment receive object. */ - async deletePaymentReceive( + public async deletePaymentReceive( tenantId: number, paymentReceiveId: number, authorizedUser: ISystemUser @@ -572,7 +559,7 @@ export default class PaymentReceiveService { * @param {number} paymentReceiveId - Payment receive id. * @return {Promise} */ - async getPaymentReceive( + public async getPaymentReceive( tenantId: number, paymentReceiveId: number ): Promise { @@ -591,76 +578,6 @@ export default class PaymentReceiveService { return paymentReceive; } - /** - * Retrive edit page invoices entries from the given sale invoices models. - * @param {ISaleInvoice[]} invoices - Invoices. - * @return {IPaymentReceiveEditPageEntry} - */ - public invoiceToPageEntry( - invoice: ISaleInvoice - ): IPaymentReceiveEditPageEntry { - return { - entryType: 'invoice', - invoiceId: invoice.id, - dueAmount: invoice.dueAmount + invoice.paymentAmount, - amount: invoice.balance, - invoiceNo: invoice.invoiceNo, - totalPaymentAmount: invoice.paymentAmount, - paymentAmount: invoice.paymentAmount, - date: invoice.invoiceDate, - }; - } - - /** - * Retrieve the payment receive details of the given id. - * @param {number} tenantId - Tenant id. - * @param {Integer} paymentReceiveId - Payment receive id. - */ - public async getPaymentReceiveEditPage( - tenantId: number, - paymentReceiveId: number, - authorizedUser: ISystemUser - ): Promise<{ - paymentReceive: Omit; - entries: IPaymentReceivePageEntry[]; - }> { - const { PaymentReceive, SaleInvoice } = this.tenancy.models(tenantId); - - // Retrieve payment receive. - const paymentReceive = await PaymentReceive.query() - .findById(paymentReceiveId) - .withGraphFetched('entries.invoice'); - - // Throw not found the payment receive. - if (!paymentReceive) { - throw new ServiceError(ERRORS.PAYMENT_RECEIVE_NOT_EXISTS); - } - const paymentEntries = paymentReceive.entries.map((entry) => ({ - ...this.invoiceToPageEntry(entry.invoice), - paymentAmount: entry.paymentAmount, - })); - - // Retrieves all receivable bills that associated to the payment receive transaction. - const restReceivableInvoices = await SaleInvoice.query() - .modify('dueInvoices') - .where('customer_id', paymentReceive.customerId) - .whereNotIn( - 'id', - paymentReceive.entries.map((entry) => entry.invoiceId) - ) - .orderBy('invoice_date', 'ASC'); - - const restReceivableEntries = restReceivableInvoices.map( - this.invoiceToPageEntry - ); - const entries = [...paymentEntries, ...restReceivableEntries]; - - return { - paymentReceive: omit(paymentReceive, ['entries']), - entries, - }; - } - /** * Retrieve sale invoices that assocaited to the given payment receive. * @param {number} tenantId - Tenant id. @@ -680,7 +597,6 @@ export default class PaymentReceiveService { const paymentReceiveInvoicesIds = paymentReceive.entries.map( (entry) => entry.invoiceId ); - const saleInvoices = await SaleInvoice.query().whereIn( 'id', paymentReceiveInvoicesIds @@ -726,22 +642,6 @@ export default class PaymentReceiveService { }; } - /** - * Retrieve the payment receive details with associated invoices. - * @param {Integer} paymentReceiveId - */ - async getPaymentReceiveWithInvoices( - tenantId: number, - paymentReceiveId: number - ) { - const { PaymentReceive } = this.tenancy.models(tenantId); - - return PaymentReceive.query() - .where('id', paymentReceiveId) - .withGraphFetched('invoices') - .first(); - } - /** * Records payment receive journal transactions. * @@ -871,22 +771,4 @@ export default class PaymentReceiveService { }); await Promise.all([...opers]); } - - /** - * Retrieve payment receive new page receivable entries. - * @param {number} tenantId - Tenant id. - * @param {number} vendorId - Vendor id. - * @return {IPaymentReceivePageEntry[]} - */ - async getNewPageEntries(tenantId: number, customerId: number) { - const { SaleInvoice } = this.tenancy.models(tenantId); - - // Retrieve due invoices. - const entries = await SaleInvoice.query() - .modify('dueInvoices') - .where('customer_id', customerId) - .orderBy('invoice_date', 'ASC'); - - return entries.map(this.invoiceToPageEntry); - } } diff --git a/server/src/services/Sales/PaymentReceives/constants.ts b/server/src/services/Sales/PaymentReceives/constants.ts new file mode 100644 index 000000000..d17c64d0a --- /dev/null +++ b/server/src/services/Sales/PaymentReceives/constants.ts @@ -0,0 +1,13 @@ +export const ERRORS = { + PAYMENT_RECEIVE_NO_EXISTS: 'PAYMENT_RECEIVE_NO_EXISTS', + PAYMENT_RECEIVE_NOT_EXISTS: 'PAYMENT_RECEIVE_NOT_EXISTS', + DEPOSIT_ACCOUNT_NOT_FOUND: 'DEPOSIT_ACCOUNT_NOT_FOUND', + DEPOSIT_ACCOUNT_INVALID_TYPE: 'DEPOSIT_ACCOUNT_INVALID_TYPE', + INVALID_PAYMENT_AMOUNT: 'INVALID_PAYMENT_AMOUNT', + INVOICES_IDS_NOT_FOUND: 'INVOICES_IDS_NOT_FOUND', + ENTRIES_IDS_NOT_EXISTS: 'ENTRIES_IDS_NOT_EXISTS', + INVOICES_NOT_DELIVERED_YET: 'INVOICES_NOT_DELIVERED_YET', + PAYMENT_RECEIVE_NO_IS_REQUIRED: 'PAYMENT_RECEIVE_NO_IS_REQUIRED', + PAYMENT_RECEIVE_NO_REQUIRED: 'PAYMENT_RECEIVE_NO_REQUIRED', + PAYMENT_CUSTOMER_SHOULD_NOT_UPDATE: 'PAYMENT_CUSTOMER_SHOULD_NOT_UPDATE', +}; diff --git a/server/src/services/Sales/SalesInvoices.ts b/server/src/services/Sales/SalesInvoices.ts index 36d6c586d..487a63377 100644 --- a/server/src/services/Sales/SalesInvoices.ts +++ b/server/src/services/Sales/SalesInvoices.ts @@ -656,6 +656,7 @@ export default class SaleInvoicesService { const salesInvoices = await SaleInvoice.query().onBuild((query) => { query.modify('dueInvoices'); + query.modify('delivered'); if (customerId) { query.where('customer_id', customerId); diff --git a/server/src/subscribers/paymentMades.ts b/server/src/subscribers/paymentMades.ts index 171cf3b95..5f76d9062 100644 --- a/server/src/subscribers/paymentMades.ts +++ b/server/src/subscribers/paymentMades.ts @@ -1,7 +1,7 @@ import { Container, Inject, Service } from 'typedi'; import { EventSubscriber, On } from 'event-dispatch'; import events from 'subscribers/events'; -import BillPaymentsService from 'services/Purchases/BillPayments'; +import BillPaymentsService from 'services/Purchases/BillPayments/BillPayments'; import TenancyService from 'services/Tenancy/TenancyService'; @EventSubscriber() diff --git a/server/src/subscribers/paymentReceives.ts b/server/src/subscribers/paymentReceives.ts index 60186060d..422e6d207 100644 --- a/server/src/subscribers/paymentReceives.ts +++ b/server/src/subscribers/paymentReceives.ts @@ -2,7 +2,7 @@ import { Container, Inject, Service } from 'typedi'; import { EventSubscriber, On } from 'event-dispatch'; import events from 'subscribers/events'; import TenancyService from 'services/Tenancy/TenancyService'; -import PaymentReceiveService from 'services/Sales/PaymentsReceives'; +import PaymentReceiveService from 'services/Sales/PaymentReceives/PaymentsReceives'; import SettingsService from 'services/Settings/SettingsService'; @EventSubscriber()