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()