Compare commits

..

28 Commits

Author SHA1 Message Date
allcontributors[bot]
55ba66205c docs: update .all-contributorsrc [skip ci] 2024-08-14 14:20:36 +00:00
allcontributors[bot]
291bf80135 docs: update README.md [skip ci] 2024-08-14 14:20:35 +00:00
Ahmed Bouhuolia
8c89e04f54 Merge pull request #603 from Champetaman/fix-import-drag-area-colors-blue
Fix: Enhance Dropzone visual feedback for dropzone
2024-08-14 16:17:44 +02:00
Ahmed Bouhuolia
f97b127a69 fix: style tweaks in dropzoen accept/reject modes 2024-08-14 16:12:13 +02:00
Ahmed Bouhuolia
64c4d7b5a4 Merge pull request #599 from bigcapitalhq/rename-payment-receives-to-payment-received
fix: Typo payment receive messages
2024-08-14 14:54:54 +02:00
Ahmed Bouhuolia
ea2fad648b Merge branch 'develop' into rename-payment-receives-to-payment-received 2024-08-14 14:54:48 +02:00
Camilo Oviedo
9b8b51cb91 fix: Enhance visual feedback on file drag-and-drop 2024-08-14 16:29:38 +10:00
Camilo Oviedo
09b7e74d65 fix: Enhance visual feedback on file drag-and-drop 2024-08-14 16:21:48 +10:00
Ahmed Bouhuolia
7137e06d99 Merge pull request #602 from bigcapitalhq/remove-views-tabs-from-receipts-list
fix: Remove views tabs from receipts list
2024-08-14 00:06:14 +02:00
Ahmed Bouhuolia
fc29b765f7 fix: remove views tabs from receipts list 2024-08-14 00:04:11 +02:00
Ahmed Bouhuolia
2946475f89 Merge pull request #601 from bigcapitalhq/autofill-quick-customer-vendor
fix: Autofill the quick created customer/vendor
2024-08-13 23:59:26 +02:00
Ahmed Bouhuolia
d2193fdac0 fix: autofill the quick created customer/vendor 2024-08-13 23:55:53 +02:00
Ahmed Bouhuolia
ec2b7e332e Merge pull request #600 from bigcapitalhq/fix-typo-categories-list
fix: Typo categories list
2024-08-13 19:39:17 +02:00
Ahmed Bouhuolia
a3704df6dd fix: Typo categories list 2024-08-13 19:38:07 +02:00
Ahmed Bouhuolia
c3c784e52c Merge pull request #598 from bigcapitalhq/move-payment-mades-to-payments-made
fix: Typo payments made
2024-08-13 19:33:02 +02:00
Ahmed Bouhuolia
bbcf695a6c fix: Typo payments made 2024-08-13 19:10:09 +02:00
Ahmed Bouhuolia
038d4dd5a7 chore: renmame payment receive term to payment received 2024-08-13 15:15:07 +02:00
Ahmed Bouhuolia
961e4b99e8 fix: rename interfaces to PaymentReceived 2024-08-13 14:17:37 +02:00
Ahmed Bouhuolia
9991eebaaf fix(server): rename term to 2024-08-13 13:41:09 +02:00
Ahmed Bouhuolia
cd90fede54 Merge pull request #597 from bigcapitalhq/refresh-acccounts-bank-transactions
fix: Refresh accounts and account transactions.
2024-08-13 11:39:11 +02:00
Ahmed Bouhuolia
a2d28648bd fix: refresh accounts and account transactions. 2024-08-13 11:37:59 +02:00
Ahmed Bouhuolia
3097d05eda Merge pull request #596 from bigcapitalhq/transaction-type-description-general-ledger
fix: Transaction type and description do not show in general ledger.
2024-08-12 21:11:02 +02:00
Ahmed Bouhuolia
ff94d8d9b2 fix: Transaction type and description do not show in general ledger. 2024-08-12 21:08:02 +02:00
Ahmed Bouhuolia
79cc09fad9 Merge pull request #595 from bigcapitalhq/add-comparators-to-amount-bank-rule
feat: Add amount comparators to amount bank rule field
2024-08-12 20:17:20 +02:00
Ahmed Bouhuolia
c1b29c3f23 fix: add equal condition to number fields on bank rule 2024-08-12 20:16:18 +02:00
Ahmed Bouhuolia
cf4bb3007e feat: run re-recognizing bank transactions on edit bank rule 2024-08-12 20:07:01 +02:00
Ahmed Bouhuolia
193a86cf30 feat: add amount comparators to amount bank rule field 2024-08-12 17:53:57 +02:00
Ahmed Bouhuolia
7a81f14eb2 Merge pull request #594 from bigcapitalhq/multi-lines-transactions-statements
fix: Multi-lines transactions statements
2024-08-12 16:33:01 +02:00
193 changed files with 1004 additions and 671 deletions

View File

@@ -150,6 +150,15 @@
"contributions": [ "contributions": [
"bug" "bug"
] ]
},
{
"login": "Champetaman",
"name": "Camilo Oviedo",
"avatar_url": "https://avatars.githubusercontent.com/u/64604272?v=4",
"profile": "https://www.camilooviedo.com/",
"contributions": [
"code"
]
} }
], ],
"contributorsPerLine": 7, "contributorsPerLine": 7,

View File

@@ -129,6 +129,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/oleynikd"><img src="https://avatars.githubusercontent.com/u/3976868?v=4?s=100" width="100px;" alt="Denis"/><br /><sub><b>Denis</b></sub></a><br /><a href="https://github.com/bigcapitalhq/bigcapital/issues?q=author%3Aoleynikd" title="Bug reports">🐛</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/oleynikd"><img src="https://avatars.githubusercontent.com/u/3976868?v=4?s=100" width="100px;" alt="Denis"/><br /><sub><b>Denis</b></sub></a><br /><a href="https://github.com/bigcapitalhq/bigcapital/issues?q=author%3Aoleynikd" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://myself.vercel.app/"><img src="https://avatars.githubusercontent.com/u/42431274?v=4?s=100" width="100px;" alt="Sachin Mittal"/><br /><sub><b>Sachin Mittal</b></sub></a><br /><a href="https://github.com/bigcapitalhq/bigcapital/issues?q=author%3Amittalsam98" title="Bug reports">🐛</a></td> <td align="center" valign="top" width="14.28%"><a href="https://myself.vercel.app/"><img src="https://avatars.githubusercontent.com/u/42431274?v=4?s=100" width="100px;" alt="Sachin Mittal"/><br /><sub><b>Sachin Mittal</b></sub></a><br /><a href="https://github.com/bigcapitalhq/bigcapital/issues?q=author%3Amittalsam98" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://www.camilooviedo.com/"><img src="https://avatars.githubusercontent.com/u/64604272?v=4?s=100" width="100px;" alt="Camilo Oviedo"/><br /><sub><b>Camilo Oviedo</b></sub></a><br /><a href="https://github.com/bigcapitalhq/bigcapital/commits?author=Champetaman" title="Code">💻</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -33,7 +33,16 @@ export class BankingRulesController extends BaseController {
body('conditions.*.field').exists().isIn(['description', 'amount']), body('conditions.*.field').exists().isIn(['description', 'amount']),
body('conditions.*.comparator') body('conditions.*.comparator')
.exists() .exists()
.isIn(['equals', 'contains', 'not_contain']) .isIn([
'equals',
'equal',
'contains',
'not_contain',
'bigger',
'bigger_or_equal',
'smaller',
'smaller_or_equal',
])
.default('contain') .default('contain')
.trim(), .trim(),
body('conditions.*.value').exists().trim(), body('conditions.*.value').exists().trim(),

View File

@@ -9,9 +9,9 @@ import {
} from '@/interfaces'; } from '@/interfaces';
import BaseController from '@/api/controllers/BaseController'; import BaseController from '@/api/controllers/BaseController';
import asyncMiddleware from '@/api/middleware/asyncMiddleware'; import asyncMiddleware from '@/api/middleware/asyncMiddleware';
import PaymentReceivesPages from '@/services/Sales/PaymentReceives/PaymentReceivesPages'; import PaymentsReceivedPages from '@/services/Sales/PaymentReceived/PaymentsReceivedPages';
import { PaymentReceivesApplication } from '@/services/Sales/PaymentReceived/PaymentReceivedApplication';
import DynamicListingService from '@/services/DynamicListing/DynamicListService'; import DynamicListingService from '@/services/DynamicListing/DynamicListService';
import { PaymentReceivesApplication } from '@/services/Sales/PaymentReceives/PaymentReceivesApplication';
import CheckPolicies from '@/api/middleware/CheckPolicies'; import CheckPolicies from '@/api/middleware/CheckPolicies';
import { ServiceError } from '@/exceptions'; import { ServiceError } from '@/exceptions';
import { ACCEPT_TYPE } from '@/interfaces/Http'; import { ACCEPT_TYPE } from '@/interfaces/Http';
@@ -22,7 +22,7 @@ export default class PaymentReceivesController extends BaseController {
private paymentReceiveApplication: PaymentReceivesApplication; private paymentReceiveApplication: PaymentReceivesApplication;
@Inject() @Inject()
private PaymentReceivesPages: PaymentReceivesPages; private PaymentsReceivedPages: PaymentsReceivedPages;
@Inject() @Inject()
private dynamicListService: DynamicListingService; private dynamicListService: DynamicListingService;
@@ -229,7 +229,7 @@ export default class PaymentReceivesController extends BaseController {
try { try {
const storedPaymentReceive = const storedPaymentReceive =
await this.paymentReceiveApplication.createPaymentReceive( await this.paymentReceiveApplication.createPaymentReceived(
tenantId, tenantId,
paymentReceive, paymentReceive,
user user
@@ -376,7 +376,7 @@ export default class PaymentReceivesController extends BaseController {
const { customerId } = this.matchedQueryData(req); const { customerId } = this.matchedQueryData(req);
try { try {
const entries = await this.PaymentReceivesPages.getNewPageEntries( const entries = await this.PaymentsReceivedPages.getNewPageEntries(
tenantId, tenantId,
customerId customerId
); );
@@ -404,7 +404,7 @@ export default class PaymentReceivesController extends BaseController {
try { try {
const { paymentReceive, entries } = const { paymentReceive, entries } =
await this.PaymentReceivesPages.getPaymentReceiveEditPage( await this.PaymentsReceivedPages.getPaymentReceiveEditPage(
tenantId, tenantId,
paymentReceiveId, paymentReceiveId,
user user

View File

@@ -30,7 +30,7 @@ export interface IGeneralLedgerSheetAccountTransaction {
currencyCode: string; currencyCode: string;
note?: string; note?: string;
transactionType?: string; transactionTypeFormatted: string;
transactionNumber: string; transactionNumber: string;
referenceId?: number; referenceId?: number;

View File

@@ -8,7 +8,7 @@ import { ILedgerEntry } from './Ledger';
import { ISaleInvoice } from './SaleInvoice'; import { ISaleInvoice } from './SaleInvoice';
import { AttachmentLinkDTO } from './Attachments'; import { AttachmentLinkDTO } from './Attachments';
export interface IPaymentReceive { export interface IPaymentReceived {
id?: number; id?: number;
customerId: number; customerId: number;
paymentDate: Date; paymentDate: Date;
@@ -19,14 +19,14 @@ export interface IPaymentReceive {
depositAccountId: number; depositAccountId: number;
paymentReceiveNo: string; paymentReceiveNo: string;
statement: string; statement: string;
entries: IPaymentReceiveEntry[]; entries: IPaymentReceivedEntry[];
userId: number; userId: number;
createdAt: Date; createdAt: Date;
updatedAt: Date; updatedAt: Date;
localAmount?: number; localAmount?: number;
branchId?: number; branchId?: number;
} }
export interface IPaymentReceiveCreateDTO { export interface IPaymentReceivedCreateDTO {
customerId: number; customerId: number;
paymentDate: Date; paymentDate: Date;
amount: number; amount: number;
@@ -35,13 +35,13 @@ export interface IPaymentReceiveCreateDTO {
depositAccountId: number; depositAccountId: number;
paymentReceiveNo?: string; paymentReceiveNo?: string;
statement: string; statement: string;
entries: IPaymentReceiveEntryDTO[]; entries: IPaymentReceivedEntryDTO[];
branchId?: number; branchId?: number;
attachments?: AttachmentLinkDTO[]; attachments?: AttachmentLinkDTO[];
} }
export interface IPaymentReceiveEditDTO { export interface IPaymentReceivedEditDTO {
customerId: number; customerId: number;
paymentDate: Date; paymentDate: Date;
amount: number; amount: number;
@@ -50,12 +50,12 @@ export interface IPaymentReceiveEditDTO {
depositAccountId: number; depositAccountId: number;
paymentReceiveNo?: string; paymentReceiveNo?: string;
statement: string; statement: string;
entries: IPaymentReceiveEntryDTO[]; entries: IPaymentReceivedEntryDTO[];
branchId?: number; branchId?: number;
attachments?: AttachmentLinkDTO[]; attachments?: AttachmentLinkDTO[];
} }
export interface IPaymentReceiveEntry { export interface IPaymentReceivedEntry {
id?: number; id?: number;
paymentReceiveId: number; paymentReceiveId: number;
invoiceId: number; invoiceId: number;
@@ -64,7 +64,7 @@ export interface IPaymentReceiveEntry {
invoice?: ISaleInvoice; invoice?: ISaleInvoice;
} }
export interface IPaymentReceiveEntryDTO { export interface IPaymentReceivedEntryDTO {
id?: number; id?: number;
index: number; index: number;
paymentReceiveId: number; paymentReceiveId: number;
@@ -72,7 +72,7 @@ export interface IPaymentReceiveEntryDTO {
paymentAmount: number; paymentAmount: number;
} }
export interface IPaymentReceivesFilter extends IDynamicListFilterDTO { export interface IPaymentsReceivedFilter extends IDynamicListFilterDTO {
stringifiedFilterRoles?: string; stringifiedFilterRoles?: string;
} }
@@ -88,65 +88,65 @@ export interface IPaymentReceivePageEntry {
date: Date | string; date: Date | string;
} }
export interface IPaymentReceiveEditPage { export interface IPaymentReceivedEditPage {
paymentReceive: IPaymentReceive; paymentReceive: IPaymentReceived;
entries: IPaymentReceivePageEntry[]; entries: IPaymentReceivePageEntry[];
} }
export interface IPaymentsReceiveService { export interface IPaymentsReceivedService {
validateCustomerHasNoPayments( validateCustomerHasNoPayments(
tenantId: number, tenantId: number,
customerId: number customerId: number
): Promise<void>; ): Promise<void>;
} }
export interface IPaymentReceiveSmsDetails { export interface IPaymentReceivedSmsDetails {
customerName: string; customerName: string;
customerPhoneNumber: string; customerPhoneNumber: string;
smsMessage: string; smsMessage: string;
} }
export interface IPaymentReceiveCreatingPayload { export interface IPaymentReceivedCreatingPayload {
tenantId: number; tenantId: number;
paymentReceiveDTO: IPaymentReceiveCreateDTO; paymentReceiveDTO: IPaymentReceivedCreateDTO;
trx: Knex.Transaction; trx: Knex.Transaction;
} }
export interface IPaymentReceiveCreatedPayload { export interface IPaymentReceivedCreatedPayload {
tenantId: number; tenantId: number;
paymentReceive: IPaymentReceive; paymentReceive: IPaymentReceived;
paymentReceiveId: number; paymentReceiveId: number;
authorizedUser: ISystemUser; authorizedUser: ISystemUser;
paymentReceiveDTO: IPaymentReceiveCreateDTO; paymentReceiveDTO: IPaymentReceivedCreateDTO;
trx: Knex.Transaction; trx: Knex.Transaction;
} }
export interface IPaymentReceiveEditedPayload { export interface IPaymentReceivedEditedPayload {
tenantId: number; tenantId: number;
paymentReceiveId: number; paymentReceiveId: number;
paymentReceive: IPaymentReceive; paymentReceive: IPaymentReceived;
oldPaymentReceive: IPaymentReceive; oldPaymentReceive: IPaymentReceived;
paymentReceiveDTO: IPaymentReceiveEditDTO; paymentReceiveDTO: IPaymentReceivedEditDTO;
authorizedUser: ISystemUser; authorizedUser: ISystemUser;
trx: Knex.Transaction; trx: Knex.Transaction;
} }
export interface IPaymentReceiveEditingPayload { export interface IPaymentReceivedEditingPayload {
tenantId: number; tenantId: number;
oldPaymentReceive: IPaymentReceive; oldPaymentReceive: IPaymentReceived;
paymentReceiveDTO: IPaymentReceiveEditDTO; paymentReceiveDTO: IPaymentReceivedEditDTO;
trx: Knex.Transaction; trx: Knex.Transaction;
} }
export interface IPaymentReceiveDeletingPayload { export interface IPaymentReceivedDeletingPayload {
tenantId: number; tenantId: number;
oldPaymentReceive: IPaymentReceive; oldPaymentReceive: IPaymentReceived;
trx: Knex.Transaction; trx: Knex.Transaction;
} }
export interface IPaymentReceiveDeletedPayload { export interface IPaymentReceivedDeletedPayload {
tenantId: number; tenantId: number;
paymentReceiveId: number; paymentReceiveId: number;
oldPaymentReceive: IPaymentReceive; oldPaymentReceive: IPaymentReceived;
authorizedUser: ISystemUser; authorizedUser: ISystemUser;
trx: Knex.Transaction; trx: Knex.Transaction;
} }

View File

@@ -34,4 +34,4 @@
// import 'services/Sales/SaleInvoiceWriteoffSubscriber'; // import 'services/Sales/SaleInvoiceWriteoffSubscriber';
// import 'subscribers/SaleInvoices/SendSmsNotificationToCustomer'; // import 'subscribers/SaleInvoices/SendSmsNotificationToCustomer';
// import 'subscribers/SaleReceipt/SendNotificationToCustomer'; // import 'subscribers/SaleReceipt/SendNotificationToCustomer';
// import 'services/Sales/PaymentReceives/PaymentReceiveSmsSubscriber'; // import 'services/Sales/PaymentReceived/PaymentReceiveSmsSubscriber';

View File

@@ -9,7 +9,7 @@ import { SendSaleInvoiceMailJob } from '@/services/Sales/Invoices/SendSaleInvoic
import { SendSaleInvoiceReminderMailJob } from '@/services/Sales/Invoices/SendSaleInvoiceMailReminderJob'; import { SendSaleInvoiceReminderMailJob } from '@/services/Sales/Invoices/SendSaleInvoiceMailReminderJob';
import { SendSaleEstimateMailJob } from '@/services/Sales/Estimates/SendSaleEstimateMailJob'; import { SendSaleEstimateMailJob } from '@/services/Sales/Estimates/SendSaleEstimateMailJob';
import { SaleReceiptMailNotificationJob } from '@/services/Sales/Receipts/SaleReceiptMailNotificationJob'; import { SaleReceiptMailNotificationJob } from '@/services/Sales/Receipts/SaleReceiptMailNotificationJob';
import { PaymentReceiveMailNotificationJob } from '@/services/Sales/PaymentReceives/PaymentReceiveMailNotificationJob'; import { PaymentReceivedMailNotificationJob } from '@/services/Sales/PaymentReceived/PaymentReceivedMailNotificationJob';
import { PlaidFetchTransactionsJob } from '@/services/Banking/Plaid/PlaidFetchTransactionsJob'; import { PlaidFetchTransactionsJob } from '@/services/Banking/Plaid/PlaidFetchTransactionsJob';
import { ImportDeleteExpiredFilesJobs } from '@/services/Import/jobs/ImportDeleteExpiredFilesJob'; import { ImportDeleteExpiredFilesJobs } from '@/services/Import/jobs/ImportDeleteExpiredFilesJob';
import { SendVerifyMailJob } from '@/services/Authentication/jobs/SendVerifyMailJob'; import { SendVerifyMailJob } from '@/services/Authentication/jobs/SendVerifyMailJob';
@@ -28,7 +28,7 @@ export default ({ agenda }: { agenda: Agenda }) => {
new SendSaleInvoiceReminderMailJob(agenda); new SendSaleInvoiceReminderMailJob(agenda);
new SendSaleEstimateMailJob(agenda); new SendSaleEstimateMailJob(agenda);
new SaleReceiptMailNotificationJob(agenda); new SaleReceiptMailNotificationJob(agenda);
new PaymentReceiveMailNotificationJob(agenda); new PaymentReceivedMailNotificationJob(agenda);
new PlaidFetchTransactionsJob(agenda); new PlaidFetchTransactionsJob(agenda);
new ImportDeleteExpiredFilesJobs(agenda); new ImportDeleteExpiredFilesJobs(agenda);
new SendVerifyMailJob(agenda); new SendVerifyMailJob(agenda);

View File

@@ -3,7 +3,7 @@ import TenantModel from 'models/TenantModel';
import ModelSetting from './ModelSetting'; import ModelSetting from './ModelSetting';
import BillPaymentSettings from './BillPayment.Settings'; import BillPaymentSettings from './BillPayment.Settings';
import CustomViewBaseModel from './CustomViewBaseModel'; import CustomViewBaseModel from './CustomViewBaseModel';
import { DEFAULT_VIEWS } from '@/services/Sales/PaymentReceives/constants'; import { DEFAULT_VIEWS } from '@/services/Sales/PaymentReceived/constants';
import ModelSearchable from './ModelSearchable'; import ModelSearchable from './ModelSearchable';
export default class BillPayment extends mixin(TenantModel, [ export default class BillPayment extends mixin(TenantModel, [

View File

@@ -3,7 +3,7 @@ import TenantModel from 'models/TenantModel';
import ModelSetting from './ModelSetting'; import ModelSetting from './ModelSetting';
import PaymentReceiveSettings from './PaymentReceive.Settings'; import PaymentReceiveSettings from './PaymentReceive.Settings';
import CustomViewBaseModel from './CustomViewBaseModel'; import CustomViewBaseModel from './CustomViewBaseModel';
import { DEFAULT_VIEWS } from '@/services/Sales/PaymentReceives/constants'; import { DEFAULT_VIEWS } from '@/services/Sales/PaymentReceived/constants';
import ModelSearchable from './ModelSearchable'; import ModelSearchable from './ModelSearchable';
export default class PaymentReceive extends mixin(TenantModel, [ export default class PaymentReceive extends mixin(TenantModel, [

View File

@@ -249,6 +249,7 @@ export default class Ledger implements ILedger {
transactionId: entry.referenceId, transactionId: entry.referenceId,
transactionType: entry.referenceType, transactionType: entry.referenceType,
transactionSubType: entry.transactionType,
transactionNumber: entry.transactionNumber, transactionNumber: entry.transactionNumber,
referenceNumber: entry.referenceNumber, referenceNumber: entry.referenceNumber,
@@ -262,6 +263,8 @@ export default class Ledger implements ILedger {
taxRateId: entry.taxRateId, taxRateId: entry.taxRateId,
taxRate: entry.taxRate, taxRate: entry.taxRate,
note: entry.note,
}; };
} }

View File

@@ -1,10 +1,10 @@
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
import { isEmpty } from 'lodash'; import { isEmpty } from 'lodash';
import { import {
IPaymentReceiveCreatedPayload, IPaymentReceivedCreatedPayload,
IPaymentReceiveCreatingPayload, IPaymentReceivedCreatingPayload,
IPaymentReceiveDeletingPayload, IPaymentReceivedDeletingPayload,
IPaymentReceiveEditedPayload, IPaymentReceivedEditedPayload,
} from '@/interfaces'; } from '@/interfaces';
import events from '@/subscribers/events'; import events from '@/subscribers/events';
import { LinkAttachment } from '../LinkAttachment'; import { LinkAttachment } from '../LinkAttachment';
@@ -50,13 +50,13 @@ export class AttachmentsOnPaymentsReceived {
/** /**
* Validates the attachment keys on creating payment. * Validates the attachment keys on creating payment.
* @param {IPaymentReceiveCreatingPayload} * @param {IPaymentReceivedCreatingPayload}
* @returns {Promise<void>} * @returns {Promise<void>}
*/ */
private async validateAttachmentsOnPaymentCreate({ private async validateAttachmentsOnPaymentCreate({
paymentReceiveDTO, paymentReceiveDTO,
tenantId, tenantId,
}: IPaymentReceiveCreatingPayload): Promise<void> { }: IPaymentReceivedCreatingPayload): Promise<void> {
if (isEmpty(paymentReceiveDTO.attachments)) { if (isEmpty(paymentReceiveDTO.attachments)) {
return; return;
} }
@@ -67,7 +67,7 @@ export class AttachmentsOnPaymentsReceived {
/** /**
* Handles linking the attachments of the created payment. * Handles linking the attachments of the created payment.
* @param {IPaymentReceiveCreatedPayload} * @param {IPaymentReceivedCreatedPayload}
* @returns {Promise<void>} * @returns {Promise<void>}
*/ */
private async handleAttachmentsOnPaymentCreated({ private async handleAttachmentsOnPaymentCreated({
@@ -75,7 +75,7 @@ export class AttachmentsOnPaymentsReceived {
paymentReceiveDTO, paymentReceiveDTO,
paymentReceive, paymentReceive,
trx, trx,
}: IPaymentReceiveCreatedPayload): Promise<void> { }: IPaymentReceivedCreatedPayload): Promise<void> {
if (isEmpty(paymentReceiveDTO.attachments)) return; if (isEmpty(paymentReceiveDTO.attachments)) return;
const keys = paymentReceiveDTO.attachments?.map( const keys = paymentReceiveDTO.attachments?.map(
@@ -92,14 +92,14 @@ export class AttachmentsOnPaymentsReceived {
/** /**
* Handles unlinking all the unpresented keys of the edited payment. * Handles unlinking all the unpresented keys of the edited payment.
* @param {IPaymentReceiveEditedPayload} * @param {IPaymentReceivedEditedPayload}
*/ */
private async handleUnlinkUnpresentedKeysOnPaymentEdited({ private async handleUnlinkUnpresentedKeysOnPaymentEdited({
tenantId, tenantId,
paymentReceiveDTO, paymentReceiveDTO,
oldPaymentReceive, oldPaymentReceive,
trx, trx,
}: IPaymentReceiveEditedPayload) { }: IPaymentReceivedEditedPayload) {
const keys = paymentReceiveDTO.attachments?.map( const keys = paymentReceiveDTO.attachments?.map(
(attachment) => attachment.key (attachment) => attachment.key
); );
@@ -114,7 +114,7 @@ export class AttachmentsOnPaymentsReceived {
/** /**
* Handles linking all the presented keys of the edited payment. * Handles linking all the presented keys of the edited payment.
* @param {IPaymentReceiveEditedPayload} * @param {IPaymentReceivedEditedPayload}
* @returns {Promise<void>} * @returns {Promise<void>}
*/ */
private async handleLinkPresentedKeysOnPaymentEdited({ private async handleLinkPresentedKeysOnPaymentEdited({
@@ -122,7 +122,7 @@ export class AttachmentsOnPaymentsReceived {
paymentReceiveDTO, paymentReceiveDTO,
oldPaymentReceive, oldPaymentReceive,
trx, trx,
}: IPaymentReceiveEditedPayload) { }: IPaymentReceivedEditedPayload) {
if (isEmpty(paymentReceiveDTO.attachments)) return; if (isEmpty(paymentReceiveDTO.attachments)) return;
const keys = paymentReceiveDTO.attachments?.map( const keys = paymentReceiveDTO.attachments?.map(
@@ -146,7 +146,7 @@ export class AttachmentsOnPaymentsReceived {
tenantId, tenantId,
oldPaymentReceive, oldPaymentReceive,
trx, trx,
}: IPaymentReceiveDeletingPayload) { }: IPaymentReceivedDeletingPayload) {
await this.unlinkAttachmentService.unlinkAllModelKeys( await this.unlinkAttachmentService.unlinkAllModelKeys(
tenantId, tenantId,
'PaymentReceive', 'PaymentReceive',

View File

@@ -1,7 +1,7 @@
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
import { import {
IBillPaymentEventDeletedPayload, IBillPaymentEventDeletedPayload,
IPaymentReceiveDeletedPayload, IPaymentReceivedDeletedPayload,
} from '@/interfaces'; } from '@/interfaces';
import { ValidateTransactionMatched } from '../ValidateTransactionsMatched'; import { ValidateTransactionMatched } from '../ValidateTransactionsMatched';
import events from '@/subscribers/events'; import events from '@/subscribers/events';
@@ -23,7 +23,7 @@ export class ValidateMatchingOnPaymentMadeDelete {
/** /**
* Validates the payment made transaction whether matched with bank transaction on deleting. * Validates the payment made transaction whether matched with bank transaction on deleting.
* @param {IPaymentReceiveDeletedPayload} * @param {IPaymentReceivedDeletedPayload}
*/ */
public async validateMatchingOnPaymentMadeDeleting({ public async validateMatchingOnPaymentMadeDeleting({
tenantId, tenantId,

View File

@@ -1,5 +1,5 @@
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
import { IPaymentReceiveDeletedPayload } from '@/interfaces'; import { IPaymentReceivedDeletedPayload } from '@/interfaces';
import { ValidateTransactionMatched } from '../ValidateTransactionsMatched'; import { ValidateTransactionMatched } from '../ValidateTransactionsMatched';
import events from '@/subscribers/events'; import events from '@/subscribers/events';
@@ -20,13 +20,13 @@ export class ValidateMatchingOnPaymentReceivedDelete {
/** /**
* Validates the payment received transaction whether matched with bank transaction on deleting. * Validates the payment received transaction whether matched with bank transaction on deleting.
* @param {IPaymentReceiveDeletedPayload} * @param {IPaymentReceivedDeletedPayload}
*/ */
public async validateMatchingOnPaymentReceivedDeleting({ public async validateMatchingOnPaymentReceivedDeleting({
tenantId, tenantId,
oldPaymentReceive, oldPaymentReceive,
trx, trx,
}: IPaymentReceiveDeletedPayload) { }: IPaymentReceivedDeletedPayload) {
await this.validateNoMatchingLinkedService.validateTransactionNoMatchLinking( await this.validateNoMatchingLinkedService.validateTransactionNoMatchLinking(
tenantId, tenantId,
'PaymentReceive', 'PaymentReceive',

View File

@@ -33,17 +33,29 @@ const matchNumberCondition = (
transaction: UncategorizedCashflowTransaction, transaction: UncategorizedCashflowTransaction,
condition: IBankRuleCondition condition: IBankRuleCondition
) => { ) => {
const conditionValue = parseFloat(condition.value);
const transactionAmount =
condition.field === 'amount'
? Math.abs(transaction[condition.field])
: (transaction[condition.field] as unknown as number);
switch (condition.comparator) { switch (condition.comparator) {
case BankRuleConditionComparator.Equals: case BankRuleConditionComparator.Equals:
return transaction[condition.field] === condition.value; case BankRuleConditionComparator.Equal:
case BankRuleConditionComparator.Contains: return transactionAmount === conditionValue;
return transaction[condition.field]
?.toString() case BankRuleConditionComparator.BiggerOrEqual:
.includes(condition.value.toString()); return transactionAmount >= conditionValue;
case BankRuleConditionComparator.NotContain:
return !transaction[condition.field] case BankRuleConditionComparator.Bigger:
?.toString() return transactionAmount > conditionValue;
.includes(condition.value.toString());
case BankRuleConditionComparator.Smaller:
return transactionAmount < conditionValue;
case BankRuleConditionComparator.SmallerOrEqual:
return transactionAmount <= conditionValue;
default: default:
return false; return false;
} }
@@ -53,18 +65,19 @@ const matchTextCondition = (
transaction: UncategorizedCashflowTransaction, transaction: UncategorizedCashflowTransaction,
condition: IBankRuleCondition condition: IBankRuleCondition
): boolean => { ): boolean => {
const transactionValue = transaction[condition.field] as string;
switch (condition.comparator) { switch (condition.comparator) {
case BankRuleConditionComparator.Equals: case BankRuleConditionComparator.Equals:
return transaction[condition.field] === condition.value; case BankRuleConditionComparator.Equal:
return transactionValue === condition.value;
case BankRuleConditionComparator.Contains: case BankRuleConditionComparator.Contains:
const fieldValue = lowerCase(transaction[condition.field]); const fieldValue = lowerCase(transactionValue);
const conditionValue = lowerCase(condition.value); const conditionValue = lowerCase(condition.value);
return fieldValue.includes(conditionValue); return fieldValue.includes(conditionValue);
case BankRuleConditionComparator.NotContain: case BankRuleConditionComparator.NotContain:
return !transaction[condition.field]?.includes( return !transactionValue?.includes(condition.value.toString());
condition.value.toString()
);
default: default:
return false; return false;
} }
@@ -101,8 +114,8 @@ const determineFieldType = (field: string): string => {
case 'amount': case 'amount':
return 'number'; return 'number';
case 'description': case 'description':
return 'text'; case 'payee':
default: default:
return 'unknown'; return 'text';
} }
}; };

View File

@@ -1,4 +1,5 @@
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
import { isEqual, omit } from 'lodash';
import events from '@/subscribers/events'; import events from '@/subscribers/events';
import { import {
IBankRuleEventCreatedPayload, IBankRuleEventCreatedPayload,
@@ -55,10 +56,22 @@ export class TriggerRecognizedTransactions {
private async recognizedTransactionsOnRuleEdited({ private async recognizedTransactionsOnRuleEdited({
tenantId, tenantId,
editRuleDTO, editRuleDTO,
oldBankRule,
bankRule,
ruleId, ruleId,
}: IBankRuleEventEditedPayload) { }: IBankRuleEventEditedPayload) {
const payload = { tenantId, ruleId }; const payload = { tenantId, ruleId };
// Cannot continue if the new and old bank rule values are the same,
// after excluding `createdAt` and `updatedAt` dates.
if (
isEqual(
omit(bankRule, ['createdAt', 'updatedAt']),
omit(oldBankRule, ['createdAt', 'updatedAt'])
)
) {
return;
}
await this.agenda.now( await this.agenda.now(
'rerecognize-uncategorized-transactions-job', 'rerecognize-uncategorized-transactions-job',
payload payload

View File

@@ -47,6 +47,7 @@ export class EditBankRuleService {
const oldBankRule = await BankRule.query() const oldBankRule = await BankRule.query()
.findById(ruleId) .findById(ruleId)
.withGraphFetched('conditions')
.throwIfNotFound(); .throwIfNotFound();
const tranformDTO = this.transformDTO(editRuleDTO); const tranformDTO = this.transformDTO(editRuleDTO);
@@ -64,15 +65,15 @@ export class EditBankRuleService {
} as IBankRuleEventEditingPayload); } as IBankRuleEventEditingPayload);
// Updates the given bank rule. // Updates the given bank rule.
await BankRule.query(trx).upsertGraphAndFetch({ const bankRule = await BankRule.query(trx).upsertGraphAndFetch({
...tranformDTO, ...tranformDTO,
id: ruleId, id: ruleId,
}); });
// Triggers `onBankRuleEdited` event. // Triggers `onBankRuleEdited` event.
await this.eventPublisher.emitAsync(events.bankRules.onEdited, { await this.eventPublisher.emitAsync(events.bankRules.onEdited, {
tenantId, tenantId,
oldBankRule, oldBankRule,
bankRule,
ruleId, ruleId,
editRuleDTO, editRuleDTO,
trx, trx,

View File

@@ -1,15 +1,20 @@
import { Knex } from 'knex'; import { Knex } from 'knex';
export enum BankRuleConditionField { export enum BankRuleConditionField {
Amount = 'Amount', Amount = 'amount',
Description = 'Description', Description = 'description',
Payee = 'Payee', Payee = 'payee',
} }
export enum BankRuleConditionComparator { export enum BankRuleConditionComparator {
Contains = 'contains', Contains = 'contains',
Equals = 'equals', Equals = 'equals',
Equal = 'equal',
NotContain = 'not_contain', NotContain = 'not_contain',
Bigger = 'bigger',
BiggerOrEqual = 'bigger_or_equal',
Smaller = 'smaller',
SmallerOrEqual = 'smaller_or_equal',
} }
export interface IBankRuleCondition { export interface IBankRuleCondition {
@@ -56,7 +61,15 @@ export enum BankRuleAssignCategory {
export interface IBankRuleConditionDTO { export interface IBankRuleConditionDTO {
id?: number; id?: number;
field: string; field: string;
comparator: string; comparator:
| 'contains'
| 'equals'
| 'not_contains'
| 'equal'
| 'bigger'
| 'bigger_or_equal'
| 'smaller'
| 'smaller_or_equal';
value: number; value: number;
} }
@@ -99,6 +112,8 @@ export interface IBankRuleEventEditingPayload {
export interface IBankRuleEventEditedPayload { export interface IBankRuleEventEditedPayload {
tenantId: number; tenantId: number;
ruleId: number; ruleId: number;
oldBankRule: IBankRule;
bankRule: IBankRule;
editRuleDTO: IEditBankRuleDTO; editRuleDTO: IEditBankRuleDTO;
trx?: Knex.Transaction; trx?: Knex.Transaction;
} }

View File

@@ -1,8 +1,8 @@
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
import events from '@/subscribers/events'; import events from '@/subscribers/events';
import { import {
IPaymentReceiveCreatingPayload, IPaymentReceivedCreatingPayload,
IPaymentReceiveEditingPayload, IPaymentReceivedEditingPayload,
} from '@/interfaces'; } from '@/interfaces';
import { ValidateBranchExistance } from '../../Integrations/ValidateBranchExistance'; import { ValidateBranchExistance } from '../../Integrations/ValidateBranchExistance';
@@ -28,12 +28,12 @@ export class PaymentReceiveBranchValidateSubscriber {
/** /**
* Validate branch existance on estimate creating. * Validate branch existance on estimate creating.
* @param {IPaymentReceiveCreatingPayload} payload * @param {IPaymentReceivedCreatingPayload} payload
*/ */
private validateBranchExistanceOnPaymentCreating = async ({ private validateBranchExistanceOnPaymentCreating = async ({
tenantId, tenantId,
paymentReceiveDTO, paymentReceiveDTO,
}: IPaymentReceiveCreatingPayload) => { }: IPaymentReceivedCreatingPayload) => {
await this.validateBranchExistance.validateTransactionBranchWhenActive( await this.validateBranchExistance.validateTransactionBranchWhenActive(
tenantId, tenantId,
paymentReceiveDTO.branchId paymentReceiveDTO.branchId
@@ -42,12 +42,12 @@ export class PaymentReceiveBranchValidateSubscriber {
/** /**
* Validate branch existance once estimate editing. * Validate branch existance once estimate editing.
* @param {IPaymentReceiveEditingPayload} payload * @param {IPaymentReceivedEditingPayload} payload
*/ */
private validateBranchExistanceOnPaymentEditing = async ({ private validateBranchExistanceOnPaymentEditing = async ({
paymentReceiveDTO, paymentReceiveDTO,
tenantId, tenantId,
}: IPaymentReceiveEditingPayload) => { }: IPaymentReceivedEditingPayload) => {
await this.validateBranchExistance.validateTransactionBranchWhenActive( await this.validateBranchExistance.validateTransactionBranchWhenActive(
tenantId, tenantId,
paymentReceiveDTO.branchId paymentReceiveDTO.branchId

View File

@@ -9,7 +9,7 @@ import {
} from '@/interfaces'; } from '@/interfaces';
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
import UnitOfWork from '@/services/UnitOfWork'; import UnitOfWork from '@/services/UnitOfWork';
import { PaymentReceiveValidators } from '../Sales/PaymentReceives/PaymentReceiveValidators'; import { PaymentReceivedValidators } from '../Sales/PaymentReceived/PaymentReceivedValidators';
import BaseCreditNotes from './CreditNotes'; import BaseCreditNotes from './CreditNotes';
import { import {
IApplyCreditToInvoicesDTO, IApplyCreditToInvoicesDTO,
@@ -26,7 +26,7 @@ export default class CreditNoteApplyToInvoices extends BaseCreditNotes {
private tenancy: HasTenancyService; private tenancy: HasTenancyService;
@Inject() @Inject()
private paymentReceiveValidators: PaymentReceiveValidators; private paymentReceiveValidators: PaymentReceivedValidators;
@Inject() @Inject()
private uow: UnitOfWork; private uow: UnitOfWork;

View File

@@ -9,7 +9,7 @@ import { SaleInvoicesExportable } from '../Sales/Invoices/SaleInvoicesExportable
import { SaleEstimatesExportable } from '../Sales/Estimates/SaleEstimatesExportable'; import { SaleEstimatesExportable } from '../Sales/Estimates/SaleEstimatesExportable';
import { SaleReceiptsExportable } from '../Sales/Receipts/SaleReceiptsExportable'; import { SaleReceiptsExportable } from '../Sales/Receipts/SaleReceiptsExportable';
import { BillsExportable } from '../Purchases/Bills/BillsExportable'; import { BillsExportable } from '../Purchases/Bills/BillsExportable';
import { PaymentsReceivedExportable } from '../Sales/PaymentReceives/PaymentsReceivedExportable'; import { PaymentsReceivedExportable } from '../Sales/PaymentReceived/PaymentsReceivedExportable';
import { BillPaymentExportable } from '../Purchases/BillPayments/BillPaymentExportable'; import { BillPaymentExportable } from '../Purchases/BillPayments/BillPaymentExportable';
import { ManualJournalsExportable } from '../ManualJournals/ManualJournalExportable'; import { ManualJournalsExportable } from '../ManualJournals/ManualJournalExportable';
import { CreditNotesExportable } from '../CreditNotes/CreditNotesExportable'; import { CreditNotesExportable } from '../CreditNotes/CreditNotesExportable';

View File

@@ -15,6 +15,7 @@ import { FinancialSheetStructure } from '../FinancialSheetStructure';
import { flatToNestedArray } from '@/utils'; import { flatToNestedArray } from '@/utils';
import Ledger from '@/services/Accounting/Ledger'; import Ledger from '@/services/Accounting/Ledger';
import { calculateRunningBalance } from './_utils'; import { calculateRunningBalance } from './_utils';
import { getTransactionTypeLabel } from '@/utils/transactions-types';
/** /**
* General ledger sheet. * General ledger sheet.
@@ -90,11 +91,13 @@ export default class GeneralLedgerSheet extends R.compose(
date: entry.date, date: entry.date,
dateFormatted: moment(entry.date).format('YYYY MMM DD'), dateFormatted: moment(entry.date).format('YYYY MMM DD'),
transactionNumber: entry.transactionNumber, referenceType: entry.transactionType,
referenceType: entry.referenceType, referenceId: entry.transactionId,
referenceId: entry.referenceId,
referenceTypeFormatted: this.i18n.__(entry.referenceTypeFormatted),
transactionNumber: entry.transactionNumber,
transactionTypeFormatted: this.i18n.__(
getTransactionTypeLabel(entry.transactionType, entry.transactionSubType)
),
contactName: get(contact, 'displayName'), contactName: get(contact, 'displayName'),
contactType: get(contact, 'contactService'), contactType: get(contact, 'contactService'),

View File

@@ -67,7 +67,7 @@ export class GeneralLedgerTable extends R.compose(
return [ return [
{ key: 'date', accessor: 'dateFormatted' }, { key: 'date', accessor: 'dateFormatted' },
{ key: 'account_name', accessor: 'account.name' }, { key: 'account_name', accessor: 'account.name' },
{ key: 'reference_type', accessor: 'referenceTypeFormatted' }, { key: 'reference_type', accessor: 'transactionTypeFormatted' },
{ key: 'reference_number', accessor: 'transactionNumber' }, { key: 'reference_number', accessor: 'transactionNumber' },
{ key: 'description', accessor: 'note' }, { key: 'description', accessor: 'note' },
{ key: 'credit', accessor: 'formattedCredit' }, { key: 'credit', accessor: 'formattedCredit' },

View File

@@ -13,7 +13,7 @@ import { SaleInvoicesImportable } from '../Sales/Invoices/SaleInvoicesImportable
import { SaleEstimatesImportable } from '../Sales/Estimates/SaleEstimatesImportable'; import { SaleEstimatesImportable } from '../Sales/Estimates/SaleEstimatesImportable';
import { BillPaymentsImportable } from '../Purchases/BillPayments/BillPaymentsImportable'; import { BillPaymentsImportable } from '../Purchases/BillPayments/BillPaymentsImportable';
import { VendorCreditsImportable } from '../Purchases/VendorCredits/VendorCreditsImportable'; import { VendorCreditsImportable } from '../Purchases/VendorCredits/VendorCreditsImportable';
import { PaymentReceivesImportable } from '../Sales/PaymentReceives/PaymentReceivesImportable'; import { PaymentsReceivedImportable } from '../Sales/PaymentReceived/PaymentsReceivedImportable';
import { CreditNotesImportable } from '../CreditNotes/CreditNotesImportable'; import { CreditNotesImportable } from '../CreditNotes/CreditNotesImportable';
import { SaleReceiptsImportable } from '../Sales/Receipts/SaleReceiptsImportable'; import { SaleReceiptsImportable } from '../Sales/Receipts/SaleReceiptsImportable';
import { TaxRatesImportable } from '../TaxRates/TaxRatesImportable'; import { TaxRatesImportable } from '../TaxRates/TaxRatesImportable';
@@ -45,7 +45,7 @@ export class ImportableResources {
{ resource: 'SaleInvoice', importable: SaleInvoicesImportable }, { resource: 'SaleInvoice', importable: SaleInvoicesImportable },
{ resource: 'SaleEstimate', importable: SaleEstimatesImportable }, { resource: 'SaleEstimate', importable: SaleEstimatesImportable },
{ resource: 'BillPayment', importable: BillPaymentsImportable }, { resource: 'BillPayment', importable: BillPaymentsImportable },
{ resource: 'PaymentReceive', importable: PaymentReceivesImportable }, { resource: 'PaymentReceive', importable: PaymentsReceivedImportable },
{ resource: 'VendorCredit', importable: VendorCreditsImportable }, { resource: 'VendorCredit', importable: VendorCreditsImportable },
{ resource: 'CreditNote', importable: CreditNotesImportable }, { resource: 'CreditNote', importable: CreditNotesImportable },
{ resource: 'SaleReceipt', importable: SaleReceiptsImportable }, { resource: 'SaleReceipt', importable: SaleReceiptsImportable },

View File

@@ -6,7 +6,7 @@ import SaleNotifyBySms from '../SaleNotifyBySms';
import SmsNotificationsSettingsService from '@/services/Settings/SmsNotificationsSettings'; import SmsNotificationsSettingsService from '@/services/Settings/SmsNotificationsSettings';
import { import {
ICustomer, ICustomer,
IPaymentReceiveSmsDetails, IPaymentReceivedSmsDetails,
ISaleEstimate, ISaleEstimate,
SMS_NOTIFICATION_KEY, SMS_NOTIFICATION_KEY,
} from '@/interfaces'; } from '@/interfaces';
@@ -173,12 +173,12 @@ export class SaleEstimateNotifyBySms {
* Retrieve the SMS details of the given payment receive transaction. * Retrieve the SMS details of the given payment receive transaction.
* @param {number} tenantId * @param {number} tenantId
* @param {number} saleEstimateId * @param {number} saleEstimateId
* @returns {Promise<IPaymentReceiveSmsDetails>} * @returns {Promise<IPaymentReceivedSmsDetails>}
*/ */
public smsDetails = async ( public smsDetails = async (
tenantId: number, tenantId: number,
saleEstimateId: number saleEstimateId: number
): Promise<IPaymentReceiveSmsDetails> => { ): Promise<IPaymentReceivedSmsDetails> => {
const { SaleEstimate } = this.tenancy.models(tenantId); const { SaleEstimate } = this.tenancy.models(tenantId);
// Retrieve the sale invoice or throw not found service error. // Retrieve the sale invoice or throw not found service error.

View File

@@ -3,7 +3,7 @@ import { CreateSaleEstimate } from './CreateSaleEstimate';
import { import {
IFilterMeta, IFilterMeta,
IPaginationMeta, IPaginationMeta,
IPaymentReceiveSmsDetails, IPaymentReceivedSmsDetails,
ISaleEstimate, ISaleEstimate,
ISaleEstimateDTO, ISaleEstimateDTO,
ISalesEstimatesFilter, ISalesEstimatesFilter,
@@ -191,12 +191,12 @@ export class SaleEstimatesApplication {
* Retrieve the SMS details of the given payment receive transaction. * Retrieve the SMS details of the given payment receive transaction.
* @param {number} tenantId * @param {number} tenantId
* @param {number} saleEstimateId * @param {number} saleEstimateId
* @returns {Promise<IPaymentReceiveSmsDetails>} * @returns {Promise<IPaymentReceivedSmsDetails>}
*/ */
public getSaleEstimateSmsDetails = ( public getSaleEstimateSmsDetails = (
tenantId: number, tenantId: number,
saleEstimateId: number saleEstimateId: number
): Promise<IPaymentReceiveSmsDetails> => { ): Promise<IPaymentReceivedSmsDetails> => {
return this.saleEstimateNotifyBySmsService.smsDetails( return this.saleEstimateNotifyBySmsService.smsDetails(
tenantId, tenantId,
saleEstimateId saleEstimateId

View File

@@ -2,7 +2,7 @@ import { Knex } from 'knex';
import async from 'async'; import async from 'async';
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
import HasTenancyService from '@/services/Tenancy/TenancyService'; import HasTenancyService from '@/services/Tenancy/TenancyService';
import { PaymentReceiveGLEntries } from '../PaymentReceives/PaymentReceiveGLEntries'; import { PaymentReceivedGLEntries } from '../PaymentReceived/PaymentReceivedGLEntries';
@Service() @Service()
export class InvoicePaymentsGLEntriesRewrite { export class InvoicePaymentsGLEntriesRewrite {
@@ -10,7 +10,7 @@ export class InvoicePaymentsGLEntriesRewrite {
public tenancy: HasTenancyService; public tenancy: HasTenancyService;
@Inject() @Inject()
public paymentGLEntries: PaymentReceiveGLEntries; public paymentGLEntries: PaymentReceivedGLEntries;
/** /**
* Rewrites the payment GL entries task. * Rewrites the payment GL entries task.

View File

@@ -2,23 +2,23 @@ import { Inject, Service } from 'typedi';
import { Knex } from 'knex'; import { Knex } from 'knex';
import { import {
ICustomer, ICustomer,
IPaymentReceiveCreateDTO, IPaymentReceivedCreateDTO,
IPaymentReceiveCreatedPayload, IPaymentReceivedCreatedPayload,
IPaymentReceiveCreatingPayload, IPaymentReceivedCreatingPayload,
ISystemUser, ISystemUser,
} from '@/interfaces'; } from '@/interfaces';
import { PaymentReceiveValidators } from './PaymentReceiveValidators'; import { PaymentReceivedValidators } from './PaymentReceivedValidators';
import events from '@/subscribers/events'; import events from '@/subscribers/events';
import HasTenancyService from '@/services/Tenancy/TenancyService'; import HasTenancyService from '@/services/Tenancy/TenancyService';
import UnitOfWork from '@/services/UnitOfWork'; import UnitOfWork from '@/services/UnitOfWork';
import { PaymentReceiveDTOTransformer } from './PaymentReceiveDTOTransformer'; import { PaymentReceiveDTOTransformer } from './PaymentReceivedDTOTransformer';
import { TenantMetadata } from '@/system/models'; import { TenantMetadata } from '@/system/models';
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
@Service() @Service()
export class CreatePaymentReceive { export class CreatePaymentReceived {
@Inject() @Inject()
private validators: PaymentReceiveValidators; private validators: PaymentReceivedValidators;
@Inject() @Inject()
private eventPublisher: EventPublisher; private eventPublisher: EventPublisher;
@@ -37,11 +37,11 @@ export class CreatePaymentReceive {
* with associated invoices payment and journal transactions. * with associated invoices payment and journal transactions.
* @async * @async
* @param {number} tenantId - Tenant id. * @param {number} tenantId - Tenant id.
* @param {IPaymentReceive} paymentReceive * @param {IPaymentReceived} paymentReceive
*/ */
public async createPaymentReceive( public async createPaymentReceived(
tenantId: number, tenantId: number,
paymentReceiveDTO: IPaymentReceiveCreateDTO, paymentReceiveDTO: IPaymentReceivedCreateDTO,
authorizedUser: ISystemUser, authorizedUser: ISystemUser,
trx?: Knex.Transaction trx?: Knex.Transaction
) { ) {
@@ -97,7 +97,7 @@ export class CreatePaymentReceive {
trx, trx,
paymentReceiveDTO, paymentReceiveDTO,
tenantId, tenantId,
} as IPaymentReceiveCreatingPayload); } as IPaymentReceivedCreatingPayload);
// Inserts the payment receive transaction. // Inserts the payment receive transaction.
const paymentReceive = await PaymentReceive.query( const paymentReceive = await PaymentReceive.query(
@@ -113,7 +113,7 @@ export class CreatePaymentReceive {
paymentReceiveDTO, paymentReceiveDTO,
authorizedUser, authorizedUser,
trx, trx,
} as IPaymentReceiveCreatedPayload); } as IPaymentReceivedCreatedPayload);
return paymentReceive; return paymentReceive;
}, },
@@ -125,13 +125,13 @@ export class CreatePaymentReceive {
* Transform the create payment receive DTO. * Transform the create payment receive DTO.
* @param {number} tenantId * @param {number} tenantId
* @param {ICustomer} customer * @param {ICustomer} customer
* @param {IPaymentReceiveCreateDTO} paymentReceiveDTO * @param {IPaymentReceivedCreateDTO} paymentReceiveDTO
* @returns * @returns
*/ */
private transformCreateDTOToModel = async ( private transformCreateDTOToModel = async (
tenantId: number, tenantId: number,
customer: ICustomer, customer: ICustomer,
paymentReceiveDTO: IPaymentReceiveCreateDTO paymentReceiveDTO: IPaymentReceivedCreateDTO
) => { ) => {
return this.transformer.transformPaymentReceiveDTOToModel( return this.transformer.transformPaymentReceiveDTOToModel(
tenantId, tenantId,

View File

@@ -1,8 +1,8 @@
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
import { Knex } from 'knex'; import { Knex } from 'knex';
import { import {
IPaymentReceiveDeletedPayload, IPaymentReceivedDeletedPayload,
IPaymentReceiveDeletingPayload, IPaymentReceivedDeletingPayload,
ISystemUser, ISystemUser,
} from '@/interfaces'; } from '@/interfaces';
import UnitOfWork from '@/services/UnitOfWork'; import UnitOfWork from '@/services/UnitOfWork';
@@ -11,7 +11,7 @@ import events from '@/subscribers/events';
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
@Service() @Service()
export class DeletePaymentReceive { export class DeletePaymentReceived {
@Inject() @Inject()
private eventPublisher: EventPublisher; private eventPublisher: EventPublisher;
@@ -33,7 +33,7 @@ export class DeletePaymentReceive {
* @async * @async
* @param {number} tenantId - Tenant id. * @param {number} tenantId - Tenant id.
* @param {Integer} paymentReceiveId - Payment receive id. * @param {Integer} paymentReceiveId - Payment receive id.
* @param {IPaymentReceive} paymentReceive - Payment receive object. * @param {IPaymentReceived} paymentReceive - Payment receive object.
*/ */
public async deletePaymentReceive( public async deletePaymentReceive(
tenantId: number, tenantId: number,
@@ -56,7 +56,7 @@ export class DeletePaymentReceive {
tenantId, tenantId,
oldPaymentReceive, oldPaymentReceive,
trx, trx,
} as IPaymentReceiveDeletingPayload); } as IPaymentReceivedDeletingPayload);
// Deletes the payment receive associated entries. // Deletes the payment receive associated entries.
await PaymentReceiveEntry.query(trx) await PaymentReceiveEntry.query(trx)
@@ -73,7 +73,7 @@ export class DeletePaymentReceive {
oldPaymentReceive, oldPaymentReceive,
authorizedUser, authorizedUser,
trx, trx,
} as IPaymentReceiveDeletedPayload); } as IPaymentReceivedDeletedPayload);
}); });
} }
} }

View File

@@ -2,14 +2,14 @@ import { Inject, Service } from 'typedi';
import { Knex } from 'knex'; import { Knex } from 'knex';
import { import {
ICustomer, ICustomer,
IPaymentReceive, IPaymentReceived,
IPaymentReceiveEditDTO, IPaymentReceivedEditDTO,
IPaymentReceiveEditedPayload, IPaymentReceivedEditedPayload,
IPaymentReceiveEditingPayload, IPaymentReceivedEditingPayload,
ISystemUser, ISystemUser,
} from '@/interfaces'; } from '@/interfaces';
import { PaymentReceiveDTOTransformer } from './PaymentReceiveDTOTransformer'; import { PaymentReceiveDTOTransformer } from './PaymentReceivedDTOTransformer';
import { PaymentReceiveValidators } from './PaymentReceiveValidators'; import { PaymentReceivedValidators } from './PaymentReceivedValidators';
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
import events from '@/subscribers/events'; import events from '@/subscribers/events';
import UnitOfWork from '@/services/UnitOfWork'; import UnitOfWork from '@/services/UnitOfWork';
@@ -17,12 +17,12 @@ import HasTenancyService from '@/services/Tenancy/TenancyService';
import { TenantMetadata } from '@/system/models'; import { TenantMetadata } from '@/system/models';
@Service() @Service()
export class EditPaymentReceive { export class EditPaymentReceived {
@Inject() @Inject()
private transformer: PaymentReceiveDTOTransformer; private transformer: PaymentReceiveDTOTransformer;
@Inject() @Inject()
private validators: PaymentReceiveValidators; private validators: PaymentReceivedValidators;
@Inject() @Inject()
private eventPublisher: EventPublisher; private eventPublisher: EventPublisher;
@@ -46,12 +46,12 @@ export class EditPaymentReceive {
* @async * @async
* @param {number} tenantId - * @param {number} tenantId -
* @param {Integer} paymentReceiveId - * @param {Integer} paymentReceiveId -
* @param {IPaymentReceive} paymentReceive - * @param {IPaymentReceived} paymentReceive -
*/ */
public async editPaymentReceive( public async editPaymentReceive(
tenantId: number, tenantId: number,
paymentReceiveId: number, paymentReceiveId: number,
paymentReceiveDTO: IPaymentReceiveEditDTO, paymentReceiveDTO: IPaymentReceivedEditDTO,
authorizedUser: ISystemUser authorizedUser: ISystemUser
) { ) {
const { PaymentReceive, Contact } = this.tenancy.models(tenantId); const { PaymentReceive, Contact } = this.tenancy.models(tenantId);
@@ -131,7 +131,7 @@ export class EditPaymentReceive {
tenantId, tenantId,
oldPaymentReceive, oldPaymentReceive,
paymentReceiveDTO, paymentReceiveDTO,
} as IPaymentReceiveEditingPayload); } as IPaymentReceivedEditingPayload);
// Update the payment receive transaction. // Update the payment receive transaction.
const paymentReceive = await PaymentReceive.query( const paymentReceive = await PaymentReceive.query(
@@ -149,7 +149,7 @@ export class EditPaymentReceive {
paymentReceiveDTO, paymentReceiveDTO,
authorizedUser, authorizedUser,
trx, trx,
} as IPaymentReceiveEditedPayload); } as IPaymentReceivedEditedPayload);
return paymentReceive; return paymentReceive;
}); });
@@ -159,15 +159,15 @@ export class EditPaymentReceive {
* Transform the edit payment receive DTO. * Transform the edit payment receive DTO.
* @param {number} tenantId * @param {number} tenantId
* @param {ICustomer} customer * @param {ICustomer} customer
* @param {IPaymentReceiveEditDTO} paymentReceiveDTO * @param {IPaymentReceivedEditDTO} paymentReceiveDTO
* @param {IPaymentReceive} oldPaymentReceive * @param {IPaymentReceived} oldPaymentReceive
* @returns * @returns
*/ */
private transformEditDTOToModel = async ( private transformEditDTOToModel = async (
tenantId: number, tenantId: number,
customer: ICustomer, customer: ICustomer,
paymentReceiveDTO: IPaymentReceiveEditDTO, paymentReceiveDTO: IPaymentReceivedEditDTO,
oldPaymentReceive: IPaymentReceive oldPaymentReceive: IPaymentReceived
) => { ) => {
return this.transformer.transformPaymentReceiveDTOToModel( return this.transformer.transformPaymentReceiveDTOToModel(
tenantId, tenantId,

View File

@@ -1,13 +1,13 @@
import { ServiceError } from '@/exceptions'; import { ServiceError } from '@/exceptions';
import { IPaymentReceive } from '@/interfaces'; import { IPaymentReceived } from '@/interfaces';
import HasTenancyService from '@/services/Tenancy/TenancyService'; import HasTenancyService from '@/services/Tenancy/TenancyService';
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
import { ERRORS } from './constants'; import { ERRORS } from './constants';
import { PaymentReceiveTransfromer } from './PaymentReceiveTransformer'; import { PaymentReceiveTransfromer } from './PaymentReceivedTransformer';
import { TransformerInjectable } from '@/lib/Transformer/TransformerInjectable'; import { TransformerInjectable } from '@/lib/Transformer/TransformerInjectable';
@Service() @Service()
export class GetPaymentReceive { export class GetPaymentReceived {
@Inject() @Inject()
private tenancy: HasTenancyService; private tenancy: HasTenancyService;
@@ -18,12 +18,12 @@ export class GetPaymentReceive {
* Retrieve payment receive details. * Retrieve payment receive details.
* @param {number} tenantId - Tenant id. * @param {number} tenantId - Tenant id.
* @param {number} paymentReceiveId - Payment receive id. * @param {number} paymentReceiveId - Payment receive id.
* @return {Promise<IPaymentReceive>} * @return {Promise<IPaymentReceived>}
*/ */
public async getPaymentReceive( public async getPaymentReceive(
tenantId: number, tenantId: number,
paymentReceiveId: number paymentReceiveId: number
): Promise<IPaymentReceive> { ): Promise<IPaymentReceived> {
const { PaymentReceive } = this.tenancy.models(tenantId); const { PaymentReceive } = this.tenancy.models(tenantId);
const paymentReceive = await PaymentReceive.query() const paymentReceive = await PaymentReceive.query()

View File

@@ -1,14 +1,14 @@
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
import HasTenancyService from '@/services/Tenancy/TenancyService'; import HasTenancyService from '@/services/Tenancy/TenancyService';
import { PaymentReceiveValidators } from './PaymentReceiveValidators'; import { PaymentReceivedValidators } from './PaymentReceivedValidators';
@Service() @Service()
export class GetPaymentReceiveInvoices { export class GetPaymentReceivedInvoices {
@Inject() @Inject()
private tenancy: HasTenancyService; private tenancy: HasTenancyService;
@Inject() @Inject()
private validators: PaymentReceiveValidators; private validators: PaymentReceivedValidators;
/** /**
* Retrieve sale invoices that assocaited to the given payment receive. * Retrieve sale invoices that assocaited to the given payment receive.

View File

@@ -1,10 +1,10 @@
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
import { ChromiumlyTenancy } from '@/services/ChromiumlyTenancy/ChromiumlyTenancy'; import { ChromiumlyTenancy } from '@/services/ChromiumlyTenancy/ChromiumlyTenancy';
import { TemplateInjectable } from '@/services/TemplateInjectable/TemplateInjectable'; import { TemplateInjectable } from '@/services/TemplateInjectable/TemplateInjectable';
import { GetPaymentReceive } from './GetPaymentReceive'; import { GetPaymentReceived } from './GetPaymentReceived';
@Service() @Service()
export default class GetPaymentReceivePdf { export default class GetPaymentReceivedPdf {
@Inject() @Inject()
private chromiumlyTenancy: ChromiumlyTenancy; private chromiumlyTenancy: ChromiumlyTenancy;
@@ -12,12 +12,12 @@ export default class GetPaymentReceivePdf {
private templateInjectable: TemplateInjectable; private templateInjectable: TemplateInjectable;
@Inject() @Inject()
private getPaymentService: GetPaymentReceive; private getPaymentService: GetPaymentReceived;
/** /**
* Retrieve sale invoice pdf content. * Retrieve sale invoice pdf content.
* @param {number} tenantId - * @param {number} tenantId -
* @param {IPaymentReceive} paymentReceive - * @param {IPaymentReceived} paymentReceive -
* @returns {Promise<Buffer>} * @returns {Promise<Buffer>}
*/ */
async getPaymentReceivePdf( async getPaymentReceivePdf(

View File

@@ -3,10 +3,10 @@ import * as R from 'ramda';
import { import {
IFilterMeta, IFilterMeta,
IPaginationMeta, IPaginationMeta,
IPaymentReceive, IPaymentReceived,
IPaymentReceivesFilter, IPaymentsReceivedFilter,
} from '@/interfaces'; } from '@/interfaces';
import { PaymentReceiveTransfromer } from './PaymentReceiveTransformer'; import { PaymentReceiveTransfromer } from './PaymentReceivedTransformer';
import HasTenancyService from '@/services/Tenancy/TenancyService'; import HasTenancyService from '@/services/Tenancy/TenancyService';
import { TransformerInjectable } from '@/lib/Transformer/TransformerInjectable'; import { TransformerInjectable } from '@/lib/Transformer/TransformerInjectable';
import DynamicListingService from '@/services/DynamicListing/DynamicListService'; import DynamicListingService from '@/services/DynamicListing/DynamicListService';
@@ -25,13 +25,13 @@ export class GetPaymentReceives {
/** /**
* Retrieve payment receives paginated and filterable list. * Retrieve payment receives paginated and filterable list.
* @param {number} tenantId * @param {number} tenantId
* @param {IPaymentReceivesFilter} paymentReceivesFilter * @param {IPaymentsReceivedFilter} paymentReceivesFilter
*/ */
public async getPaymentReceives( public async getPaymentReceives(
tenantId: number, tenantId: number,
filterDTO: IPaymentReceivesFilter filterDTO: IPaymentsReceivedFilter
): Promise<{ ): Promise<{
paymentReceives: IPaymentReceive[]; paymentReceives: IPaymentReceived[];
pagination: IPaginationMeta; pagination: IPaginationMeta;
filterMeta: IFilterMeta; filterMeta: IFilterMeta;
}> { }> {

View File

@@ -1,44 +1,44 @@
import { import {
IFilterMeta, IFilterMeta,
IPaginationMeta, IPaginationMeta,
IPaymentReceive, IPaymentReceived,
IPaymentReceiveCreateDTO, IPaymentReceivedCreateDTO,
IPaymentReceiveEditDTO, IPaymentReceivedEditDTO,
IPaymentReceiveSmsDetails, IPaymentReceivedSmsDetails,
IPaymentReceivesFilter, IPaymentsReceivedFilter,
ISystemUser, ISystemUser,
PaymentReceiveMailOptsDTO, PaymentReceiveMailOptsDTO,
} from '@/interfaces'; } from '@/interfaces';
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
import { CreatePaymentReceive } from './CreatePaymentReceive'; import { CreatePaymentReceived } from './CreatePaymentReceived';
import { EditPaymentReceive } from './EditPaymentReceive'; import { EditPaymentReceived } from './EditPaymentReceived';
import { DeletePaymentReceive } from './DeletePaymentReceive'; import { DeletePaymentReceived } from './DeletePaymentReceived';
import { GetPaymentReceives } from './GetPaymentReceives'; import { GetPaymentReceives } from './GetPaymentsReceived';
import { GetPaymentReceive } from './GetPaymentReceive'; import { GetPaymentReceived } from './GetPaymentReceived';
import { GetPaymentReceiveInvoices } from './GetPaymentReceiveInvoices'; import { GetPaymentReceivedInvoices } from './GetPaymentReceivedInvoices';
import { PaymentReceiveNotifyBySms } from './PaymentReceiveSmsNotify'; import { PaymentReceiveNotifyBySms } from './PaymentReceivedSmsNotify';
import GetPaymentReceivePdf from './GetPaymentReeceivePdf'; import GetPaymentReceivedPdf from './GetPaymentReceivedPdf';
import { SendPaymentReceiveMailNotification } from './PaymentReceiveMailNotification'; import { SendPaymentReceiveMailNotification } from './PaymentReceivedMailNotification';
@Service() @Service()
export class PaymentReceivesApplication { export class PaymentReceivesApplication {
@Inject() @Inject()
private createPaymentReceiveService: CreatePaymentReceive; private createPaymentReceivedService: CreatePaymentReceived;
@Inject() @Inject()
private editPaymentReceiveService: EditPaymentReceive; private editPaymentReceivedService: EditPaymentReceived;
@Inject() @Inject()
private deletePaymentReceiveService: DeletePaymentReceive; private deletePaymentReceivedService: DeletePaymentReceived;
@Inject() @Inject()
private getPaymentReceivesService: GetPaymentReceives; private getPaymentsReceivedService: GetPaymentReceives;
@Inject() @Inject()
private getPaymentReceiveService: GetPaymentReceive; private getPaymentReceivedService: GetPaymentReceived;
@Inject() @Inject()
private getPaymentReceiveInvoicesService: GetPaymentReceiveInvoices; private getPaymentReceiveInvoicesService: GetPaymentReceivedInvoices;
@Inject() @Inject()
private paymentSmsNotify: PaymentReceiveNotifyBySms; private paymentSmsNotify: PaymentReceiveNotifyBySms;
@@ -47,21 +47,21 @@ export class PaymentReceivesApplication {
private paymentMailNotify: SendPaymentReceiveMailNotification; private paymentMailNotify: SendPaymentReceiveMailNotification;
@Inject() @Inject()
private getPaymentReceivePdfService: GetPaymentReceivePdf; private getPaymentReceivePdfService: GetPaymentReceivedPdf;
/** /**
* Creates a new payment receive. * Creates a new payment receive.
* @param {number} tenantId * @param {number} tenantId
* @param {IPaymentReceiveCreateDTO} paymentReceiveDTO * @param {IPaymentReceivedCreateDTO} paymentReceiveDTO
* @param {ISystemUser} authorizedUser * @param {ISystemUser} authorizedUser
* @returns * @returns
*/ */
public createPaymentReceive( public createPaymentReceived(
tenantId: number, tenantId: number,
paymentReceiveDTO: IPaymentReceiveCreateDTO, paymentReceiveDTO: IPaymentReceivedCreateDTO,
authorizedUser: ISystemUser authorizedUser: ISystemUser
) { ) {
return this.createPaymentReceiveService.createPaymentReceive( return this.createPaymentReceivedService.createPaymentReceived(
tenantId, tenantId,
paymentReceiveDTO, paymentReceiveDTO,
authorizedUser authorizedUser
@@ -72,17 +72,17 @@ export class PaymentReceivesApplication {
* Edit details the given payment receive with associated entries. * Edit details the given payment receive with associated entries.
* @param {number} tenantId * @param {number} tenantId
* @param {number} paymentReceiveId * @param {number} paymentReceiveId
* @param {IPaymentReceiveEditDTO} paymentReceiveDTO * @param {IPaymentReceivedEditDTO} paymentReceiveDTO
* @param {ISystemUser} authorizedUser * @param {ISystemUser} authorizedUser
* @returns * @returns
*/ */
public editPaymentReceive( public editPaymentReceive(
tenantId: number, tenantId: number,
paymentReceiveId: number, paymentReceiveId: number,
paymentReceiveDTO: IPaymentReceiveEditDTO, paymentReceiveDTO: IPaymentReceivedEditDTO,
authorizedUser: ISystemUser authorizedUser: ISystemUser
) { ) {
return this.editPaymentReceiveService.editPaymentReceive( return this.editPaymentReceivedService.editPaymentReceive(
tenantId, tenantId,
paymentReceiveId, paymentReceiveId,
paymentReceiveDTO, paymentReceiveDTO,
@@ -102,7 +102,7 @@ export class PaymentReceivesApplication {
paymentReceiveId: number, paymentReceiveId: number,
authorizedUser: ISystemUser authorizedUser: ISystemUser
) { ) {
return this.deletePaymentReceiveService.deletePaymentReceive( return this.deletePaymentReceivedService.deletePaymentReceive(
tenantId, tenantId,
paymentReceiveId, paymentReceiveId,
authorizedUser authorizedUser
@@ -112,18 +112,18 @@ export class PaymentReceivesApplication {
/** /**
* Retrieve payment receives paginated and filterable. * Retrieve payment receives paginated and filterable.
* @param {number} tenantId * @param {number} tenantId
* @param {IPaymentReceivesFilter} filterDTO * @param {IPaymentsReceivedFilter} filterDTO
* @returns * @returns
*/ */
public async getPaymentReceives( public async getPaymentReceives(
tenantId: number, tenantId: number,
filterDTO: IPaymentReceivesFilter filterDTO: IPaymentsReceivedFilter
): Promise<{ ): Promise<{
paymentReceives: IPaymentReceive[]; paymentReceives: IPaymentReceived[];
pagination: IPaginationMeta; pagination: IPaginationMeta;
filterMeta: IFilterMeta; filterMeta: IFilterMeta;
}> { }> {
return this.getPaymentReceivesService.getPaymentReceives( return this.getPaymentsReceivedService.getPaymentReceives(
tenantId, tenantId,
filterDTO filterDTO
); );
@@ -133,13 +133,13 @@ export class PaymentReceivesApplication {
* Retrieves the given payment receive. * Retrieves the given payment receive.
* @param {number} tenantId * @param {number} tenantId
* @param {number} paymentReceiveId * @param {number} paymentReceiveId
* @returns {Promise<IPaymentReceive>} * @returns {Promise<IPaymentReceived>}
*/ */
public async getPaymentReceive( public async getPaymentReceive(
tenantId: number, tenantId: number,
paymentReceiveId: number paymentReceiveId: number
): Promise<IPaymentReceive> { ): Promise<IPaymentReceived> {
return this.getPaymentReceiveService.getPaymentReceive( return this.getPaymentReceivedService.getPaymentReceive(
tenantId, tenantId,
paymentReceiveId paymentReceiveId
); );
@@ -175,7 +175,7 @@ export class PaymentReceivesApplication {
public getPaymentSmsDetails = async ( public getPaymentSmsDetails = async (
tenantId: number, tenantId: number,
paymentReceiveId: number paymentReceiveId: number
): Promise<IPaymentReceiveSmsDetails> => { ): Promise<IPaymentReceivedSmsDetails> => {
return this.paymentSmsNotify.smsDetails(tenantId, paymentReceiveId); return this.paymentSmsNotify.smsDetails(tenantId, paymentReceiveId);
}; };

View File

@@ -3,22 +3,22 @@ import { Inject, Service } from 'typedi';
import { omit, sumBy } from 'lodash'; import { omit, sumBy } from 'lodash';
import { import {
ICustomer, ICustomer,
IPaymentReceive, IPaymentReceived,
IPaymentReceiveCreateDTO, IPaymentReceivedCreateDTO,
IPaymentReceiveEditDTO, IPaymentReceivedEditDTO,
} from '@/interfaces'; } from '@/interfaces';
import { PaymentReceiveValidators } from './PaymentReceiveValidators'; import { PaymentReceivedValidators } from './PaymentReceivedValidators';
import { PaymentReceiveIncrement } from './PaymentReceiveIncrement'; import { PaymentReceivedIncrement } from './PaymentReceivedIncrement';
import { BranchTransactionDTOTransform } from '@/services/Branches/Integrations/BranchTransactionDTOTransform'; import { BranchTransactionDTOTransform } from '@/services/Branches/Integrations/BranchTransactionDTOTransform';
import { formatDateFields } from '@/utils'; import { formatDateFields } from '@/utils';
@Service() @Service()
export class PaymentReceiveDTOTransformer { export class PaymentReceiveDTOTransformer {
@Inject() @Inject()
private validators: PaymentReceiveValidators; private validators: PaymentReceivedValidators;
@Inject() @Inject()
private increments: PaymentReceiveIncrement; private increments: PaymentReceivedIncrement;
@Inject() @Inject()
private branchDTOTransform: BranchTransactionDTOTransform; private branchDTOTransform: BranchTransactionDTOTransform;
@@ -26,16 +26,16 @@ export class PaymentReceiveDTOTransformer {
/** /**
* Transformes the create payment receive DTO to model object. * Transformes the create payment receive DTO to model object.
* @param {number} tenantId * @param {number} tenantId
* @param {IPaymentReceiveCreateDTO|IPaymentReceiveEditDTO} paymentReceiveDTO - Payment receive DTO. * @param {IPaymentReceivedCreateDTO|IPaymentReceivedEditDTO} paymentReceiveDTO - Payment receive DTO.
* @param {IPaymentReceive} oldPaymentReceive - * @param {IPaymentReceived} oldPaymentReceive -
* @return {IPaymentReceive} * @return {IPaymentReceived}
*/ */
public async transformPaymentReceiveDTOToModel( public async transformPaymentReceiveDTOToModel(
tenantId: number, tenantId: number,
customer: ICustomer, customer: ICustomer,
paymentReceiveDTO: IPaymentReceiveCreateDTO | IPaymentReceiveEditDTO, paymentReceiveDTO: IPaymentReceivedCreateDTO | IPaymentReceivedEditDTO,
oldPaymentReceive?: IPaymentReceive oldPaymentReceive?: IPaymentReceived
): Promise<IPaymentReceive> { ): Promise<IPaymentReceived> {
const amount = const amount =
paymentReceiveDTO.amount ?? paymentReceiveDTO.amount ??
sumBy(paymentReceiveDTO.entries, 'paymentAmount'); sumBy(paymentReceiveDTO.entries, 'paymentAmount');
@@ -65,7 +65,7 @@ export class PaymentReceiveDTOTransformer {
})), })),
}; };
return R.compose( return R.compose(
this.branchDTOTransform.transformDTO<IPaymentReceive>(tenantId) this.branchDTOTransform.transformDTO<IPaymentReceived>(tenantId)
)(initialDTO); )(initialDTO);
} }
} }

View File

@@ -2,7 +2,7 @@ import { Transformer } from '@/lib/Transformer/Transformer';
import { SaleInvoiceTransformer } from '../Invoices/SaleInvoiceTransformer'; import { SaleInvoiceTransformer } from '../Invoices/SaleInvoiceTransformer';
import { formatNumber } from '@/utils'; import { formatNumber } from '@/utils';
export class PaymentReceiveEntryTransfromer extends Transformer { export class PaymentReceivedEntryTransfromer extends Transformer {
/** /**
* Include these attributes to payment receive entry object. * Include these attributes to payment receive entry object.
* @returns {Array} * @returns {Array}

View File

@@ -4,7 +4,7 @@ import { Knex } from 'knex';
import Ledger from '@/services/Accounting/Ledger'; import Ledger from '@/services/Accounting/Ledger';
import TenancyService from '@/services/Tenancy/TenancyService'; import TenancyService from '@/services/Tenancy/TenancyService';
import { import {
IPaymentReceive, IPaymentReceived,
ILedgerEntry, ILedgerEntry,
AccountNormal, AccountNormal,
IPaymentReceiveGLCommonEntry, IPaymentReceiveGLCommonEntry,
@@ -13,7 +13,7 @@ import LedgerStorageService from '@/services/Accounting/LedgerStorageService';
import { TenantMetadata } from '@/system/models'; import { TenantMetadata } from '@/system/models';
@Service() @Service()
export class PaymentReceiveGLEntries { export class PaymentReceivedGLEntries {
@Inject() @Inject()
private tenancy: TenancyService; private tenancy: TenancyService;
@@ -93,14 +93,14 @@ export class PaymentReceiveGLEntries {
/** /**
* Retrieves the payment receive general ledger. * Retrieves the payment receive general ledger.
* @param {number} tenantId - * @param {number} tenantId -
* @param {IPaymentReceive} paymentReceive - * @param {IPaymentReceived} paymentReceive -
* @param {string} baseCurrencyCode - * @param {string} baseCurrencyCode -
* @param {Knex.Transaction} trx - * @param {Knex.Transaction} trx -
* @returns {Ledger} * @returns {Ledger}
*/ */
public getPaymentReceiveGLedger = async ( public getPaymentReceiveGLedger = async (
tenantId: number, tenantId: number,
paymentReceive: IPaymentReceive, paymentReceive: IPaymentReceived,
baseCurrencyCode: string, baseCurrencyCode: string,
trx?: Knex.Transaction trx?: Knex.Transaction
): Promise<Ledger> => { ): Promise<Ledger> => {
@@ -132,7 +132,7 @@ export class PaymentReceiveGLEntries {
* @returns {number} * @returns {number}
*/ */
private getPaymentExGainOrLoss = ( private getPaymentExGainOrLoss = (
paymentReceive: IPaymentReceive paymentReceive: IPaymentReceived
): number => { ): number => {
return sumBy(paymentReceive.entries, (entry) => { return sumBy(paymentReceive.entries, (entry) => {
const paymentLocalAmount = const paymentLocalAmount =
@@ -145,11 +145,11 @@ export class PaymentReceiveGLEntries {
/** /**
* Retrieves the common entry of payment receive. * Retrieves the common entry of payment receive.
* @param {IPaymentReceive} paymentReceive * @param {IPaymentReceived} paymentReceive
* @returns {} * @returns {}
*/ */
private getPaymentReceiveCommonEntry = ( private getPaymentReceiveCommonEntry = (
paymentReceive: IPaymentReceive paymentReceive: IPaymentReceived
): IPaymentReceiveGLCommonEntry => { ): IPaymentReceiveGLCommonEntry => {
return { return {
debit: 0, debit: 0,
@@ -174,14 +174,14 @@ export class PaymentReceiveGLEntries {
/** /**
* Retrieves the payment exchange gain/loss entry. * Retrieves the payment exchange gain/loss entry.
* @param {IPaymentReceive} paymentReceive - * @param {IPaymentReceived} paymentReceive -
* @param {number} ARAccountId - * @param {number} ARAccountId -
* @param {number} exchangeGainOrLossAccountId - * @param {number} exchangeGainOrLossAccountId -
* @param {string} baseCurrencyCode - * @param {string} baseCurrencyCode -
* @returns {ILedgerEntry[]} * @returns {ILedgerEntry[]}
*/ */
private getPaymentExchangeGainLossEntry = ( private getPaymentExchangeGainLossEntry = (
paymentReceive: IPaymentReceive, paymentReceive: IPaymentReceived,
ARAccountId: number, ARAccountId: number,
exchangeGainOrLossAccountId: number, exchangeGainOrLossAccountId: number,
baseCurrencyCode: string baseCurrencyCode: string
@@ -219,11 +219,11 @@ export class PaymentReceiveGLEntries {
/** /**
* Retrieves the payment deposit GL entry. * Retrieves the payment deposit GL entry.
* @param {IPaymentReceive} paymentReceive * @param {IPaymentReceived} paymentReceive
* @returns {ILedgerEntry} * @returns {ILedgerEntry}
*/ */
private getPaymentDepositGLEntry = ( private getPaymentDepositGLEntry = (
paymentReceive: IPaymentReceive paymentReceive: IPaymentReceived
): ILedgerEntry => { ): ILedgerEntry => {
const commonJournal = this.getPaymentReceiveCommonEntry(paymentReceive); const commonJournal = this.getPaymentReceiveCommonEntry(paymentReceive);
@@ -238,12 +238,12 @@ export class PaymentReceiveGLEntries {
/** /**
* Retrieves the payment receivable entry. * Retrieves the payment receivable entry.
* @param {IPaymentReceive} paymentReceive * @param {IPaymentReceived} paymentReceive
* @param {number} ARAccountId * @param {number} ARAccountId
* @returns {ILedgerEntry} * @returns {ILedgerEntry}
*/ */
private getPaymentReceivableEntry = ( private getPaymentReceivableEntry = (
paymentReceive: IPaymentReceive, paymentReceive: IPaymentReceived,
ARAccountId: number ARAccountId: number
): ILedgerEntry => { ): ILedgerEntry => {
const commonJournal = this.getPaymentReceiveCommonEntry(paymentReceive); const commonJournal = this.getPaymentReceiveCommonEntry(paymentReceive);
@@ -267,14 +267,14 @@ export class PaymentReceiveGLEntries {
* - Payment account [current asset] -> Credit * - Payment account [current asset] -> Credit
* *
* @param {number} tenantId * @param {number} tenantId
* @param {IPaymentReceive} paymentRecieve - Payment receive model. * @param {IPaymentReceived} paymentRecieve - Payment receive model.
* @param {number} ARAccountId - A/R account id. * @param {number} ARAccountId - A/R account id.
* @param {number} exGainOrLossAccountId - Exchange gain/loss account id. * @param {number} exGainOrLossAccountId - Exchange gain/loss account id.
* @param {string} baseCurrency - Base currency code. * @param {string} baseCurrency - Base currency code.
* @returns {Promise<ILedgerEntry>} * @returns {Promise<ILedgerEntry>}
*/ */
public getPaymentReceiveGLEntries = ( public getPaymentReceiveGLEntries = (
paymentReceive: IPaymentReceive, paymentReceive: IPaymentReceived,
ARAccountId: number, ARAccountId: number,
exGainOrLossAccountId: number, exGainOrLossAccountId: number,
baseCurrency: string baseCurrency: string

View File

@@ -2,7 +2,7 @@ import { Inject, Service } from 'typedi';
import AutoIncrementOrdersService from '../AutoIncrementOrdersService'; import AutoIncrementOrdersService from '../AutoIncrementOrdersService';
@Service() @Service()
export class PaymentReceiveIncrement { export class PaymentReceivedIncrement {
@Inject() @Inject()
private autoIncrementOrdersService: AutoIncrementOrdersService; private autoIncrementOrdersService: AutoIncrementOrdersService;

View File

@@ -1,11 +1,11 @@
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
import { Knex } from 'knex'; import { Knex } from 'knex';
import { IPaymentReceiveEntryDTO } from '@/interfaces'; import { IPaymentReceivedEntryDTO } from '@/interfaces';
import HasTenancyService from '@/services/Tenancy/TenancyService'; import HasTenancyService from '@/services/Tenancy/TenancyService';
import { entriesAmountDiff } from '@/utils'; import { entriesAmountDiff } from '@/utils';
@Service() @Service()
export class PaymentReceiveInvoiceSync { export class PaymentReceivedInvoiceSync {
@Inject() @Inject()
private tenancy: HasTenancyService; private tenancy: HasTenancyService;
@@ -19,8 +19,8 @@ export class PaymentReceiveInvoiceSync {
*/ */
public async saveChangeInvoicePaymentAmount( public async saveChangeInvoicePaymentAmount(
tenantId: number, tenantId: number,
newPaymentReceiveEntries: IPaymentReceiveEntryDTO[], newPaymentReceiveEntries: IPaymentReceivedEntryDTO[],
oldPaymentReceiveEntries?: IPaymentReceiveEntryDTO[], oldPaymentReceiveEntries?: IPaymentReceivedEntryDTO[],
trx?: Knex.Transaction trx?: Knex.Transaction
): Promise<void> { ): Promise<void> {
const { SaleInvoice } = this.tenancy.models(tenantId); const { SaleInvoice } = this.tenancy.models(tenantId);

View File

@@ -11,7 +11,7 @@ import {
DEFAULT_PAYMENT_MAIL_CONTENT, DEFAULT_PAYMENT_MAIL_CONTENT,
DEFAULT_PAYMENT_MAIL_SUBJECT, DEFAULT_PAYMENT_MAIL_SUBJECT,
} from './constants'; } from './constants';
import { GetPaymentReceive } from './GetPaymentReceive'; import { GetPaymentReceived } from './GetPaymentReceived';
import { ContactMailNotification } from '@/services/MailNotification/ContactMailNotification'; import { ContactMailNotification } from '@/services/MailNotification/ContactMailNotification';
import { parseAndValidateMailOptions } from '@/services/MailNotification/utils'; import { parseAndValidateMailOptions } from '@/services/MailNotification/utils';
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
@@ -23,7 +23,7 @@ export class SendPaymentReceiveMailNotification {
private tenancy: HasTenancyService; private tenancy: HasTenancyService;
@Inject() @Inject()
private getPaymentService: GetPaymentReceive; private getPaymentService: GetPaymentReceived;
@Inject() @Inject()
private contactMailNotification: ContactMailNotification; private contactMailNotification: ContactMailNotification;

View File

@@ -1,8 +1,8 @@
import Container, { Service } from 'typedi'; import Container, { Service } from 'typedi';
import { SendPaymentReceiveMailNotification } from './PaymentReceiveMailNotification'; import { SendPaymentReceiveMailNotification } from './PaymentReceivedMailNotification';
@Service() @Service()
export class PaymentReceiveMailNotificationJob { export class PaymentReceivedMailNotificationJob {
/** /**
* Constructor method. * Constructor method.
*/ */

View File

@@ -2,17 +2,17 @@ import { Service, Inject } from 'typedi';
import HasTenancyService from '@/services/Tenancy/TenancyService'; import HasTenancyService from '@/services/Tenancy/TenancyService';
import events from '@/subscribers/events'; import events from '@/subscribers/events';
import { import {
IPaymentReceiveSmsDetails, IPaymentReceivedSmsDetails,
SMS_NOTIFICATION_KEY, SMS_NOTIFICATION_KEY,
IPaymentReceive, IPaymentReceived,
IPaymentReceiveEntry, IPaymentReceivedEntry,
} from '@/interfaces'; } from '@/interfaces';
import SmsNotificationsSettingsService from '@/services/Settings/SmsNotificationsSettings'; import SmsNotificationsSettingsService from '@/services/Settings/SmsNotificationsSettings';
import { formatNumber, formatSmsMessage } from 'utils'; import { formatNumber, formatSmsMessage } from 'utils';
import { TenantMetadata } from '@/system/models'; import { TenantMetadata } from '@/system/models';
import SaleNotifyBySms from '../SaleNotifyBySms'; import SaleNotifyBySms from '../SaleNotifyBySms';
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher'; import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
import { PaymentReceiveValidators } from './PaymentReceiveValidators'; import { PaymentReceivedValidators } from './PaymentReceivedValidators';
@Service() @Service()
export class PaymentReceiveNotifyBySms { export class PaymentReceiveNotifyBySms {
@@ -29,7 +29,7 @@ export class PaymentReceiveNotifyBySms {
private saleSmsNotification: SaleNotifyBySms; private saleSmsNotification: SaleNotifyBySms;
@Inject() @Inject()
private validators: PaymentReceiveValidators; private validators: PaymentReceivedValidators;
/** /**
* Notify customer via sms about payment receive details. * Notify customer via sms about payment receive details.
@@ -71,12 +71,12 @@ export class PaymentReceiveNotifyBySms {
/** /**
* Sends the payment details sms notification of the given customer. * Sends the payment details sms notification of the given customer.
* @param {number} tenantId * @param {number} tenantId
* @param {IPaymentReceive} paymentReceive * @param {IPaymentReceived} paymentReceive
* @param {ICustomer} customer * @param {ICustomer} customer
*/ */
private sendSmsNotification = async ( private sendSmsNotification = async (
tenantId: number, tenantId: number,
paymentReceive: IPaymentReceive paymentReceive: IPaymentReceived
) => { ) => {
const smsClient = this.tenancy.smsClient(tenantId); const smsClient = this.tenancy.smsClient(tenantId);
const tenantMetadata = await TenantMetadata.query().findOne({ tenantId }); const tenantMetadata = await TenantMetadata.query().findOne({ tenantId });
@@ -116,12 +116,12 @@ export class PaymentReceiveNotifyBySms {
/** /**
* Formates the payment receive details sms message. * Formates the payment receive details sms message.
* @param {number} tenantId - * @param {number} tenantId -
* @param {IPaymentReceive} payment - * @param {IPaymentReceived} payment -
* @param {ICustomer} customer - * @param {ICustomer} customer -
*/ */
private formattedPaymentDetailsMessage = ( private formattedPaymentDetailsMessage = (
tenantId: number, tenantId: number,
payment: IPaymentReceive, payment: IPaymentReceived,
tenantMetadata: TenantMetadata tenantMetadata: TenantMetadata
) => { ) => {
const notification = this.smsNotificationsSettings.getSmsNotificationMeta( const notification = this.smsNotificationsSettings.getSmsNotificationMeta(
@@ -138,14 +138,14 @@ export class PaymentReceiveNotifyBySms {
/** /**
* Formattes the payment details sms notification messafge. * Formattes the payment details sms notification messafge.
* @param {string} smsMessage * @param {string} smsMessage
* @param {IPaymentReceive} payment * @param {IPaymentReceived} payment
* @param {ICustomer} customer * @param {ICustomer} customer
* @param {TenantMetadata} tenantMetadata * @param {TenantMetadata} tenantMetadata
* @returns {string} * @returns {string}
*/ */
private formatPaymentDetailsMessage = ( private formatPaymentDetailsMessage = (
smsMessage: string, smsMessage: string,
payment: IPaymentReceive, payment: IPaymentReceived,
tenantMetadata: any tenantMetadata: any
): string => { ): string => {
const invoiceNumbers = this.stringifyPaymentInvoicesNumber(payment); const invoiceNumbers = this.stringifyPaymentInvoicesNumber(payment);
@@ -167,12 +167,12 @@ export class PaymentReceiveNotifyBySms {
/** /**
* Stringify payment receive invoices to numbers as string. * Stringify payment receive invoices to numbers as string.
* @param {IPaymentReceive} payment * @param {IPaymentReceived} payment
* @returns {string} * @returns {string}
*/ */
private stringifyPaymentInvoicesNumber(payment: IPaymentReceive) { private stringifyPaymentInvoicesNumber(payment: IPaymentReceived) {
const invoicesNumberes = payment.entries.map( const invoicesNumberes = payment.entries.map(
(entry: IPaymentReceiveEntry) => entry.invoice.invoiceNo (entry: IPaymentReceivedEntry) => entry.invoice.invoiceNo
); );
return invoicesNumberes.join(', '); return invoicesNumberes.join(', ');
} }
@@ -185,7 +185,7 @@ export class PaymentReceiveNotifyBySms {
public smsDetails = async ( public smsDetails = async (
tenantId: number, tenantId: number,
paymentReceiveid: number paymentReceiveid: number
): Promise<IPaymentReceiveSmsDetails> => { ): Promise<IPaymentReceivedSmsDetails> => {
const { PaymentReceive } = this.tenancy.models(tenantId); const { PaymentReceive } = this.tenancy.models(tenantId);
// Retrieve the payment receive or throw not found service error. // Retrieve the payment receive or throw not found service error.

View File

@@ -1,8 +1,7 @@
import { Container } from 'typedi'; import { Container } from 'typedi';
import { On, EventSubscriber } from 'event-dispatch'; import { On, EventSubscriber } from 'event-dispatch';
import events from '@/subscribers/events'; import events from '@/subscribers/events';
import SaleReceiptNotifyBySms from '@/services/Sales/SaleReceiptNotifyBySms'; import { PaymentReceiveNotifyBySms } from './PaymentReceivedSmsNotify';
import PaymentReceiveNotifyBySms from './PaymentReceiveSmsNotify';
@EventSubscriber() @EventSubscriber()
export default class SendSmsNotificationPaymentReceive { export default class SendSmsNotificationPaymentReceive {

View File

@@ -1,7 +1,7 @@
import { IPaymentReceive, IPaymentReceiveEntry } from '@/interfaces'; import { IPaymentReceived, IPaymentReceivedEntry } from '@/interfaces';
import { Transformer } from '@/lib/Transformer/Transformer'; import { Transformer } from '@/lib/Transformer/Transformer';
import { formatNumber } from 'utils'; import { formatNumber } from 'utils';
import { PaymentReceiveEntryTransfromer } from './PaymentReceiveEntryTransformer'; import { PaymentReceivedEntryTransfromer } from './PaymentReceivedEntryTransformer';
export class PaymentReceiveTransfromer extends Transformer { export class PaymentReceiveTransfromer extends Transformer {
/** /**
@@ -24,25 +24,25 @@ export class PaymentReceiveTransfromer extends Transformer {
* @param {ISaleInvoice} invoice * @param {ISaleInvoice} invoice
* @returns {String} * @returns {String}
*/ */
protected formattedPaymentDate = (payment: IPaymentReceive): string => { protected formattedPaymentDate = (payment: IPaymentReceived): string => {
return this.formatDate(payment.paymentDate); return this.formatDate(payment.paymentDate);
}; };
/** /**
* Retrieves the formatted created at date. * Retrieves the formatted created at date.
* @param {IPaymentReceive} payment * @param {IPaymentReceived} payment
* @returns {string} * @returns {string}
*/ */
protected formattedCreatedAt = (payment: IPaymentReceive): string => { protected formattedCreatedAt = (payment: IPaymentReceived): string => {
return this.formatDate(payment.createdAt); return this.formatDate(payment.createdAt);
}; };
/** /**
* Retrieve the formatted payment subtotal. * Retrieve the formatted payment subtotal.
* @param {IPaymentReceive} payment * @param {IPaymentReceived} payment
* @returns {string} * @returns {string}
*/ */
protected subtotalFormatted = (payment: IPaymentReceive): string => { protected subtotalFormatted = (payment: IPaymentReceived): string => {
return formatNumber(payment.amount, { return formatNumber(payment.amount, {
currencyCode: payment.currencyCode, currencyCode: payment.currencyCode,
money: false, money: false,
@@ -54,25 +54,25 @@ export class PaymentReceiveTransfromer extends Transformer {
* @param {ISaleInvoice} invoice * @param {ISaleInvoice} invoice
* @returns {string} * @returns {string}
*/ */
protected formattedAmount = (payment: IPaymentReceive): string => { protected formattedAmount = (payment: IPaymentReceived): string => {
return formatNumber(payment.amount, { currencyCode: payment.currencyCode }); return formatNumber(payment.amount, { currencyCode: payment.currencyCode });
}; };
/** /**
* Retrieve the formatted exchange rate. * Retrieve the formatted exchange rate.
* @param {IPaymentReceive} payment * @param {IPaymentReceived} payment
* @returns {string} * @returns {string}
*/ */
protected formattedExchangeRate = (payment: IPaymentReceive): string => { protected formattedExchangeRate = (payment: IPaymentReceived): string => {
return formatNumber(payment.exchangeRate, { money: false }); return formatNumber(payment.exchangeRate, { money: false });
}; };
/** /**
* Retrieves the payment entries. * Retrieves the payment entries.
* @param {IPaymentReceive} payment * @param {IPaymentReceived} payment
* @returns {IPaymentReceiveEntry[]} * @returns {IPaymentReceivedEntry[]}
*/ */
protected entries = (payment: IPaymentReceive): IPaymentReceiveEntry[] => { protected entries = (payment: IPaymentReceived): IPaymentReceivedEntry[] => {
return this.item(payment.entries, new PaymentReceiveEntryTransfromer()); return this.item(payment.entries, new PaymentReceivedEntryTransfromer());
}; };
} }

View File

@@ -2,10 +2,10 @@ import { Inject, Service } from 'typedi';
import { difference, sumBy } from 'lodash'; import { difference, sumBy } from 'lodash';
import { import {
IAccount, IAccount,
IPaymentReceive, IPaymentReceived,
IPaymentReceiveEditDTO, IPaymentReceivedEditDTO,
IPaymentReceiveEntry, IPaymentReceivedEntry,
IPaymentReceiveEntryDTO, IPaymentReceivedEntryDTO,
ISaleInvoice, ISaleInvoice,
} from '@/interfaces'; } from '@/interfaces';
import { ServiceError } from '@/exceptions'; import { ServiceError } from '@/exceptions';
@@ -15,7 +15,7 @@ import { ACCOUNT_TYPE } from '@/data/AccountTypes';
import { PaymentReceive } from '@/models'; import { PaymentReceive } from '@/models';
@Service() @Service()
export class PaymentReceiveValidators { export class PaymentReceivedValidators {
@Inject() @Inject()
private tenancy: HasTenancyService; private tenancy: HasTenancyService;
@@ -58,7 +58,7 @@ export class PaymentReceiveValidators {
* Validates the invoices IDs existance. * Validates the invoices IDs existance.
* @param {number} tenantId - * @param {number} tenantId -
* @param {number} customerId - * @param {number} customerId -
* @param {IPaymentReceiveEntryDTO[]} paymentReceiveEntries - * @param {IPaymentReceivedEntryDTO[]} paymentReceiveEntries -
*/ */
public async validateInvoicesIDsExistance( public async validateInvoicesIDsExistance(
tenantId: number, tenantId: number,
@@ -100,12 +100,12 @@ export class PaymentReceiveValidators {
*/ */
public async validateInvoicesPaymentsAmount( public async validateInvoicesPaymentsAmount(
tenantId: number, tenantId: number,
paymentReceiveEntries: IPaymentReceiveEntryDTO[], paymentReceiveEntries: IPaymentReceivedEntryDTO[],
oldPaymentEntries: IPaymentReceiveEntry[] = [] oldPaymentEntries: IPaymentReceivedEntry[] = []
) { ) {
const { SaleInvoice } = this.tenancy.models(tenantId); const { SaleInvoice } = this.tenancy.models(tenantId);
const invoicesIds = paymentReceiveEntries.map( const invoicesIds = paymentReceiveEntries.map(
(e: IPaymentReceiveEntryDTO) => e.invoiceId (e: IPaymentReceivedEntryDTO) => e.invoiceId
); );
const storedInvoices = await SaleInvoice.query().whereIn('id', invoicesIds); const storedInvoices = await SaleInvoice.query().whereIn('id', invoicesIds);
@@ -124,7 +124,7 @@ export class PaymentReceiveValidators {
const hasWrongPaymentAmount: any[] = []; const hasWrongPaymentAmount: any[] = [];
paymentReceiveEntries.forEach( paymentReceiveEntries.forEach(
(entry: IPaymentReceiveEntryDTO, index: number) => { (entry: IPaymentReceivedEntryDTO, index: number) => {
const entryInvoice = storedInvoicesMap.get(entry.invoiceId); const entryInvoice = storedInvoicesMap.get(entry.invoiceId);
const { dueAmount } = entryInvoice; const { dueAmount } = entryInvoice;
@@ -140,9 +140,9 @@ export class PaymentReceiveValidators {
/** /**
* Validate the payment receive number require. * Validate the payment receive number require.
* @param {IPaymentReceive} paymentReceiveObj * @param {IPaymentReceived} paymentReceiveObj
*/ */
public validatePaymentReceiveNoRequire(paymentReceiveObj: IPaymentReceive) { public validatePaymentReceiveNoRequire(paymentReceiveObj: IPaymentReceived) {
if (!paymentReceiveObj.paymentReceiveNo) { if (!paymentReceiveObj.paymentReceiveNo) {
throw new ServiceError(ERRORS.PAYMENT_RECEIVE_NO_IS_REQUIRED); throw new ServiceError(ERRORS.PAYMENT_RECEIVE_NO_IS_REQUIRED);
} }
@@ -152,12 +152,12 @@ export class PaymentReceiveValidators {
* Validate the payment receive entries IDs existance. * Validate the payment receive entries IDs existance.
* @param {number} tenantId * @param {number} tenantId
* @param {number} paymentReceiveId * @param {number} paymentReceiveId
* @param {IPaymentReceiveEntryDTO[]} paymentReceiveEntries * @param {IPaymentReceivedEntryDTO[]} paymentReceiveEntries
*/ */
public async validateEntriesIdsExistance( public async validateEntriesIdsExistance(
tenantId: number, tenantId: number,
paymentReceiveId: number, paymentReceiveId: number,
paymentReceiveEntries: IPaymentReceiveEntryDTO[] paymentReceiveEntries: IPaymentReceivedEntryDTO[]
) { ) {
const { PaymentReceiveEntry } = this.tenancy.models(tenantId); const { PaymentReceiveEntry } = this.tenancy.models(tenantId);
@@ -189,12 +189,12 @@ export class PaymentReceiveValidators {
/** /**
* Validate the payment customer whether modified. * Validate the payment customer whether modified.
* @param {IPaymentReceiveEditDTO} paymentReceiveDTO * @param {IPaymentReceivedEditDTO} paymentReceiveDTO
* @param {IPaymentReceive} oldPaymentReceive * @param {IPaymentReceived} oldPaymentReceive
*/ */
public validateCustomerNotModified( public validateCustomerNotModified(
paymentReceiveDTO: IPaymentReceiveEditDTO, paymentReceiveDTO: IPaymentReceivedEditDTO,
oldPaymentReceive: IPaymentReceive oldPaymentReceive: IPaymentReceived
) { ) {
if (paymentReceiveDTO.customerId !== oldPaymentReceive.customerId) { if (paymentReceiveDTO.customerId !== oldPaymentReceive.customerId) {
throw new ServiceError(ERRORS.PAYMENT_CUSTOMER_SHOULD_NOT_UPDATE); throw new ServiceError(ERRORS.PAYMENT_CUSTOMER_SHOULD_NOT_UPDATE);
@@ -230,7 +230,7 @@ export class PaymentReceiveValidators {
async getPaymentReceiveOrThrowError( async getPaymentReceiveOrThrowError(
tenantId: number, tenantId: number,
paymentReceiveId: number paymentReceiveId: number
): Promise<IPaymentReceive> { ): Promise<IPaymentReceived> {
const { PaymentReceive } = this.tenancy.models(tenantId); const { PaymentReceive } = this.tenancy.models(tenantId);
const paymentReceive = await PaymentReceive.query() const paymentReceive = await PaymentReceive.query()
.withGraphFetched('entries') .withGraphFetched('entries')

View File

@@ -1,7 +1,7 @@
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
import { IAccountsStructureType, IPaymentReceivesFilter } from '@/interfaces'; import { IAccountsStructureType, IPaymentsReceivedFilter } from '@/interfaces';
import { Exportable } from '@/services/Export/Exportable'; import { Exportable } from '@/services/Export/Exportable';
import { PaymentReceivesApplication } from './PaymentReceivesApplication'; import { PaymentReceivesApplication } from './PaymentReceivedApplication';
@Service() @Service()
export class PaymentsReceivedExportable extends Exportable { export class PaymentsReceivedExportable extends Exportable {
@@ -11,17 +11,17 @@ export class PaymentsReceivedExportable extends Exportable {
/** /**
* Retrieves the accounts data to exportable sheet. * Retrieves the accounts data to exportable sheet.
* @param {number} tenantId * @param {number} tenantId
* @param {IPaymentReceivesFilter} query - * @param {IPaymentsReceivedFilter} query -
* @returns * @returns
*/ */
public exportable(tenantId: number, query: IPaymentReceivesFilter) { public exportable(tenantId: number, query: IPaymentsReceivedFilter) {
const parsedQuery = { const parsedQuery = {
sortOrder: 'desc', sortOrder: 'desc',
columnSortBy: 'created_at', columnSortBy: 'created_at',
inactiveMode: false, inactiveMode: false,
...query, ...query,
structure: IAccountsStructureType.Flat, structure: IAccountsStructureType.Flat,
} as IPaymentReceivesFilter; } as IPaymentsReceivedFilter;
return this.paymentReceivedApp return this.paymentReceivedApp
.getPaymentReceives(tenantId, parsedQuery) .getPaymentReceives(tenantId, parsedQuery)

View File

@@ -1,14 +1,14 @@
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
import { Knex } from 'knex'; import { Knex } from 'knex';
import { IPaymentReceiveCreateDTO } from '@/interfaces'; import { IPaymentReceivedCreateDTO } from '@/interfaces';
import { Importable } from '@/services/Import/Importable'; import { Importable } from '@/services/Import/Importable';
import { CreatePaymentReceive } from './CreatePaymentReceive'; import { CreatePaymentReceived } from './CreatePaymentReceived';
import { PaymentsReceiveSampleData } from './constants'; import { PaymentsReceiveSampleData } from './constants';
@Service() @Service()
export class PaymentReceivesImportable extends Importable { export class PaymentsReceivedImportable extends Importable {
@Inject() @Inject()
private createPaymentReceiveService: CreatePaymentReceive; private createPaymentReceiveService: CreatePaymentReceived;
/** /**
* Importing to account service. * Importing to account service.
@@ -18,10 +18,10 @@ export class PaymentReceivesImportable extends Importable {
*/ */
public importable( public importable(
tenantId: number, tenantId: number,
createPaymentDTO: IPaymentReceiveCreateDTO, createPaymentDTO: IPaymentReceivedCreateDTO,
trx?: Knex.Transaction trx?: Knex.Transaction
) { ) {
return this.createPaymentReceiveService.createPaymentReceive( return this.createPaymentReceiveService.createPaymentReceived(
tenantId, tenantId,
createPaymentDTO, createPaymentDTO,
{}, {},

View File

@@ -3,7 +3,7 @@ import { omit } from 'lodash';
import { import {
ISaleInvoice, ISaleInvoice,
IPaymentReceivePageEntry, IPaymentReceivePageEntry,
IPaymentReceive, IPaymentReceived,
ISystemUser, ISystemUser,
} from '@/interfaces'; } from '@/interfaces';
import TenancyService from '@/services/Tenancy/TenancyService'; import TenancyService from '@/services/Tenancy/TenancyService';
@@ -14,12 +14,9 @@ import { ERRORS } from './constants';
* Payment receives edit/new pages service. * Payment receives edit/new pages service.
*/ */
@Service() @Service()
export default class PaymentReceivesPages { export default class PaymentsReceivedPages {
@Inject() @Inject()
tenancy: TenancyService; private tenancy: TenancyService;
@Inject('logger')
logger: any;
/** /**
* Retrive page invoices entries from the given sale invoices models. * Retrive page invoices entries from the given sale invoices models.
@@ -68,7 +65,7 @@ export default class PaymentReceivesPages {
tenantId: number, tenantId: number,
paymentReceiveId: number paymentReceiveId: number
): Promise<{ ): Promise<{
paymentReceive: Omit<IPaymentReceive, 'entries'>; paymentReceive: Omit<IPaymentReceived, 'entries'>;
entries: IPaymentReceivePageEntry[]; entries: IPaymentReceivePageEntry[];
}> { }> {
const { PaymentReceive, SaleInvoice } = this.tenancy.models(tenantId); const { PaymentReceive, SaleInvoice } = this.tenancy.models(tenantId);

View File

@@ -5,9 +5,9 @@ import {
ISaleInvoiceCreatingPaylaod, ISaleInvoiceCreatingPaylaod,
ISaleReceiptDeletingPayload, ISaleReceiptDeletingPayload,
ICreditNoteDeletingPayload, ICreditNoteDeletingPayload,
IPaymentReceiveCreatingPayload, IPaymentReceivedCreatingPayload,
IRefundCreditNoteDeletingPayload, IRefundCreditNoteDeletingPayload,
IPaymentReceiveDeletingPayload, IPaymentReceivedDeletingPayload,
ISaleEstimateDeletingPayload, ISaleEstimateDeletingPayload,
ISaleEstimateCreatingPayload, ISaleEstimateCreatingPayload,
ISaleEstimateEditingPayload, ISaleEstimateEditingPayload,
@@ -17,7 +17,7 @@ import {
ISaleInvoiceWrittenOffCancelPayload, ISaleInvoiceWrittenOffCancelPayload,
ICreditNoteEditingPayload, ICreditNoteEditingPayload,
ISaleReceiptEditingPayload, ISaleReceiptEditingPayload,
IPaymentReceiveEditingPayload, IPaymentReceivedEditingPayload,
ISaleReceiptEventClosingPayload, ISaleReceiptEventClosingPayload,
ICreditNoteCreatingPayload, ICreditNoteCreatingPayload,
} from '@/interfaces'; } from '@/interfaces';
@@ -454,13 +454,13 @@ export default class SalesTransactionLockingGuardSubscriber {
/** /**
* Transaction locking guard on payment receive editing. * Transaction locking guard on payment receive editing.
* @param {IPaymentReceiveEditingPayload} * @param {IPaymentReceivedEditingPayload}
*/ */
private transactionLockingGuardOnPaymentEditing = async ({ private transactionLockingGuardOnPaymentEditing = async ({
tenantId, tenantId,
oldPaymentReceive, oldPaymentReceive,
paymentReceiveDTO, paymentReceiveDTO,
}: IPaymentReceiveEditingPayload) => { }: IPaymentReceivedEditingPayload) => {
// Validate the old payment date. // Validate the old payment date.
await this.salesLockingGuard.transactionLockingGuard( await this.salesLockingGuard.transactionLockingGuard(
tenantId, tenantId,
@@ -475,12 +475,12 @@ export default class SalesTransactionLockingGuardSubscriber {
/** /**
* Transaction locking guard on payment creating. * Transaction locking guard on payment creating.
* @param {IPaymentReceiveCreatingPayload} * @param {IPaymentReceivedCreatingPayload}
*/ */
private transactionLockingGuardOnPaymentCreating = async ({ private transactionLockingGuardOnPaymentCreating = async ({
tenantId, tenantId,
paymentReceiveDTO, paymentReceiveDTO,
}: IPaymentReceiveCreatingPayload) => { }: IPaymentReceivedCreatingPayload) => {
await this.salesLockingGuard.transactionLockingGuard( await this.salesLockingGuard.transactionLockingGuard(
tenantId, tenantId,
paymentReceiveDTO.paymentDate paymentReceiveDTO.paymentDate
@@ -489,12 +489,12 @@ export default class SalesTransactionLockingGuardSubscriber {
/** /**
* Transaction locking guard on payment deleting. * Transaction locking guard on payment deleting.
* @param {IPaymentReceiveDeletingPayload} payload - * @param {IPaymentReceivedDeletingPayload} payload -
*/ */
private transactionLockingGuardPaymentDeleting = async ({ private transactionLockingGuardPaymentDeleting = async ({
oldPaymentReceive, oldPaymentReceive,
tenantId, tenantId,
}: IPaymentReceiveDeletingPayload) => { }: IPaymentReceivedDeletingPayload) => {
await this.salesLockingGuard.transactionLockingGuard( await this.salesLockingGuard.transactionLockingGuard(
tenantId, tenantId,
oldPaymentReceive.paymentDate oldPaymentReceive.paymentDate

View File

@@ -1,13 +1,13 @@
import { Service, Inject } from 'typedi'; import { Service, Inject } from 'typedi';
import events from '@/subscribers/events'; import events from '@/subscribers/events';
import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher'; import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher';
import { PaymentReceiveIncrement } from '@/services/Sales/PaymentReceives/PaymentReceiveIncrement'; import { PaymentReceivedIncrement } from '@/services/Sales/PaymentReceived/PaymentReceivedIncrement';
import { IPaymentReceiveCreatedPayload } from '@/interfaces'; import { IPaymentReceivedCreatedPayload } from '@/interfaces';
@Service() @Service()
export default class PaymentReceiveAutoSerialSubscriber extends EventSubscriber { export default class PaymentReceiveAutoSerialSubscriber extends EventSubscriber {
@Inject() @Inject()
private paymentIncrement: PaymentReceiveIncrement; private paymentIncrement: PaymentReceivedIncrement;
/** /**
* Attaches the events with handles. * Attaches the events with handles.
@@ -22,13 +22,13 @@ export default class PaymentReceiveAutoSerialSubscriber extends EventSubscriber
/** /**
* Handles increment next number of payment receive once be created. * Handles increment next number of payment receive once be created.
* @param {IPaymentReceiveCreatedPayload} payload - * @param {IPaymentReceivedCreatedPayload} payload -
*/ */
private handlePaymentNextNumberIncrement = async ({ private handlePaymentNextNumberIncrement = async ({
tenantId, tenantId,
paymentReceiveId, paymentReceiveId,
trx, trx,
}: IPaymentReceiveCreatedPayload) => { }: IPaymentReceivedCreatedPayload) => {
await this.paymentIncrement.incrementNextPaymentReceiveNumber(tenantId); await this.paymentIncrement.incrementNextPaymentReceiveNumber(tenantId);
}; };
} }

View File

@@ -1,16 +1,16 @@
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
import events from '@/subscribers/events'; import events from '@/subscribers/events';
import { PaymentReceiveInvoiceSync } from '@/services/Sales/PaymentReceives/PaymentReceiveInvoiceSync'; import { PaymentReceivedInvoiceSync } from '@/services/Sales/PaymentReceived/PaymentReceivedInvoiceSync';
import { import {
IPaymentReceiveCreatedPayload, IPaymentReceivedCreatedPayload,
IPaymentReceiveDeletedPayload, IPaymentReceivedDeletedPayload,
IPaymentReceiveEditedPayload, IPaymentReceivedEditedPayload,
} from '@/interfaces'; } from '@/interfaces';
@Service() @Service()
export default class PaymentReceiveSyncInvoicesSubscriber { export default class PaymentReceiveSyncInvoicesSubscriber {
@Inject() @Inject()
private paymentSyncInvoice: PaymentReceiveInvoiceSync; private paymentSyncInvoice: PaymentReceivedInvoiceSync;
/** /**
* Attaches the events to handles. * Attaches the events to handles.
@@ -39,7 +39,7 @@ export default class PaymentReceiveSyncInvoicesSubscriber {
tenantId, tenantId,
paymentReceive, paymentReceive,
trx, trx,
}: IPaymentReceiveCreatedPayload) => { }: IPaymentReceivedCreatedPayload) => {
await this.paymentSyncInvoice.saveChangeInvoicePaymentAmount( await this.paymentSyncInvoice.saveChangeInvoicePaymentAmount(
tenantId, tenantId,
paymentReceive.entries, paymentReceive.entries,
@@ -57,7 +57,7 @@ export default class PaymentReceiveSyncInvoicesSubscriber {
paymentReceive, paymentReceive,
oldPaymentReceive, oldPaymentReceive,
trx, trx,
}: IPaymentReceiveEditedPayload) => { }: IPaymentReceivedEditedPayload) => {
await this.paymentSyncInvoice.saveChangeInvoicePaymentAmount( await this.paymentSyncInvoice.saveChangeInvoicePaymentAmount(
tenantId, tenantId,
paymentReceive.entries, paymentReceive.entries,
@@ -74,7 +74,7 @@ export default class PaymentReceiveSyncInvoicesSubscriber {
paymentReceiveId, paymentReceiveId,
oldPaymentReceive, oldPaymentReceive,
trx, trx,
}: IPaymentReceiveDeletedPayload) => { }: IPaymentReceivedDeletedPayload) => {
await this.paymentSyncInvoice.saveChangeInvoicePaymentAmount( await this.paymentSyncInvoice.saveChangeInvoicePaymentAmount(
tenantId, tenantId,
oldPaymentReceive.entries.map((entry) => ({ oldPaymentReceive.entries.map((entry) => ({

View File

@@ -1,7 +1,7 @@
import { Service, Inject } from 'typedi'; import { Service, Inject } from 'typedi';
import events from '@/subscribers/events'; import events from '@/subscribers/events';
import { PaymentReceiveNotifyBySms } from '@/services/Sales/PaymentReceives/PaymentReceiveSmsNotify'; import { PaymentReceiveNotifyBySms } from '@/services/Sales/PaymentReceived/PaymentReceivedSmsNotify';
import { IPaymentReceiveCreatedPayload } from '@/interfaces'; import { IPaymentReceivedCreatedPayload } from '@/interfaces';
import { runAfterTransaction } from '@/services/UnitOfWork/TransactionsHooks'; import { runAfterTransaction } from '@/services/UnitOfWork/TransactionsHooks';
@Service() @Service()
@@ -26,7 +26,7 @@ export default class SendSmsNotificationPaymentReceive {
tenantId, tenantId,
paymentReceiveId, paymentReceiveId,
trx, trx,
}: IPaymentReceiveCreatedPayload) => { }: IPaymentReceivedCreatedPayload) => {
// Notify via Sms after transactions complete running. // Notify via Sms after transactions complete running.
runAfterTransaction(trx, async () => { runAfterTransaction(trx, async () => {
try { try {
@@ -34,7 +34,7 @@ export default class SendSmsNotificationPaymentReceive {
tenantId, tenantId,
paymentReceiveId paymentReceiveId
); );
} catch (error) {} } catch (error) { }
}); });
}; };
} }

View File

@@ -1,16 +1,16 @@
import { Inject, Service } from 'typedi'; import { Inject, Service } from 'typedi';
import { import {
IPaymentReceiveCreatedPayload, IPaymentReceivedCreatedPayload,
IPaymentReceiveDeletedPayload, IPaymentReceivedDeletedPayload,
IPaymentReceiveEditedPayload, IPaymentReceivedEditedPayload,
} from '@/interfaces'; } from '@/interfaces';
import events from '@/subscribers/events'; import events from '@/subscribers/events';
import { PaymentReceiveGLEntries } from '@/services/Sales/PaymentReceives/PaymentReceiveGLEntries'; import { PaymentReceivedGLEntries } from '@/services/Sales/PaymentReceived/PaymentReceivedGLEntries';
@Service() @Service()
export default class PaymentReceivesWriteGLEntriesSubscriber { export default class PaymentReceivesWriteGLEntriesSubscriber {
@Inject() @Inject()
private paymentReceiveGLEntries: PaymentReceiveGLEntries; private paymentReceiveGLEntries: PaymentReceivedGLEntries;
/** /**
* Attaches events with handlers. * Attaches events with handlers.
@@ -37,7 +37,7 @@ export default class PaymentReceivesWriteGLEntriesSubscriber {
tenantId, tenantId,
paymentReceiveId, paymentReceiveId,
trx, trx,
}: IPaymentReceiveCreatedPayload) => { }: IPaymentReceivedCreatedPayload) => {
await this.paymentReceiveGLEntries.writePaymentGLEntries( await this.paymentReceiveGLEntries.writePaymentGLEntries(
tenantId, tenantId,
paymentReceiveId, paymentReceiveId,
@@ -52,7 +52,7 @@ export default class PaymentReceivesWriteGLEntriesSubscriber {
tenantId, tenantId,
paymentReceive, paymentReceive,
trx, trx,
}: IPaymentReceiveEditedPayload) => { }: IPaymentReceivedEditedPayload) => {
await this.paymentReceiveGLEntries.rewritePaymentGLEntries( await this.paymentReceiveGLEntries.rewritePaymentGLEntries(
tenantId, tenantId,
paymentReceive.id, paymentReceive.id,
@@ -67,7 +67,7 @@ export default class PaymentReceivesWriteGLEntriesSubscriber {
tenantId, tenantId,
paymentReceiveId, paymentReceiveId,
trx, trx,
}: IPaymentReceiveDeletedPayload) => { }: IPaymentReceivedDeletedPayload) => {
await this.paymentReceiveGLEntries.revertPaymentGLEntries( await this.paymentReceiveGLEntries.revertPaymentGLEntries(
tenantId, tenantId,
paymentReceiveId, paymentReceiveId,

View File

@@ -1,9 +1,11 @@
// @ts-nocheck // @ts-nocheck
import React from 'react'; import React from 'react';
import * as R from 'ramda'; import * as R from 'ramda';
import { useFormikContext } from 'formik';
import { createNewItemFromQuery, createNewItemRenderer } from './utils'; import { createNewItemFromQuery, createNewItemRenderer } from './utils';
import { FSelect } from '../Forms'; import { FSelect } from '../Forms';
import withDrawerActions from '@/containers/Drawer/withDrawerActions'; import withDrawerActions from '@/containers/Drawer/withDrawerActions';
import { useCreateAutofillListener } from '@/hooks/state/autofill';
import { DRAWERS } from '@/constants/drawers'; import { DRAWERS } from '@/constants/drawers';
/** /**
@@ -17,6 +19,7 @@ function CustomerSelectRoot({
// #ownProps // #ownProps
items, items,
allowCreate, allowCreate,
name,
...props ...props
}) { }) {
// Maybe inject create new item props to suggest component. // Maybe inject create new item props to suggest component.
@@ -24,14 +27,21 @@ function CustomerSelectRoot({
const maybeCreateNewItemFromQuery = allowCreate const maybeCreateNewItemFromQuery = allowCreate
? createNewItemFromQuery ? createNewItemFromQuery
: null; : null;
const { setFieldValue } = useFormikContext();
// Creates autofill listener once the quick customer drawer submit the form.
const autofillRef = useCreateAutofillListener((payload: any) => {
setFieldValue(name, payload.customerId);
});
// Handles the create item click. // Handles the create item click.
const handleCreateItemClick = () => { const handleCreateItemClick = (item) => {
openDrawer(DRAWERS.QUICK_CREATE_CUSTOMER); const displayName = item.name;
openDrawer(DRAWERS.QUICK_CREATE_CUSTOMER, { autofillRef, displayName });
}; };
return ( return (
<FSelect <FSelect
name={name}
items={items} items={items}
textAccessor={'display_name'} textAccessor={'display_name'}
labelAccessor={'formatted_balance'} labelAccessor={'formatted_balance'}

View File

@@ -49,7 +49,7 @@ import InvoiceExchangeRateChangeDialog from '@/containers/Sales/Invoices/Invoice
import InvoiceMailDialog from '@/containers/Sales/Invoices/InvoiceMailDialog/InvoiceMailDialog'; import InvoiceMailDialog from '@/containers/Sales/Invoices/InvoiceMailDialog/InvoiceMailDialog';
import EstimateMailDialog from '@/containers/Sales/Estimates/EstimateMailDialog/EstimateMailDialog'; import EstimateMailDialog from '@/containers/Sales/Estimates/EstimateMailDialog/EstimateMailDialog';
import ReceiptMailDialog from '@/containers/Sales/Receipts/ReceiptMailDialog/ReceiptMailDialog'; import ReceiptMailDialog from '@/containers/Sales/Receipts/ReceiptMailDialog/ReceiptMailDialog';
import PaymentMailDialog from '@/containers/Sales/PaymentReceives/PaymentMailDialog/PaymentMailDialog'; import PaymentMailDialog from '@/containers/Sales/PaymentsReceived/PaymentMailDialog/PaymentMailDialog';
import { ExportDialog } from '@/containers/Dialogs/ExportDialog'; import { ExportDialog } from '@/containers/Dialogs/ExportDialog';
import { RuleFormDialog } from '@/containers/Banking/Rules/RuleFormDialog/RuleFormDialog'; import { RuleFormDialog } from '@/containers/Banking/Rules/RuleFormDialog/RuleFormDialog';
import { DisconnectBankAccountDialog } from '@/containers/CashFlow/AccountTransactions/dialogs/DisconnectBankAccountDialog/DisconnectBankAccountDialog'; import { DisconnectBankAccountDialog } from '@/containers/CashFlow/AccountTransactions/dialogs/DisconnectBankAccountDialog/DisconnectBankAccountDialog';

View File

@@ -39,7 +39,7 @@ export default function DrawersContainer() {
<InvoiceDetailDrawer name={DRAWERS.INVOICE_DETAILS} /> <InvoiceDetailDrawer name={DRAWERS.INVOICE_DETAILS} />
<EstimateDetailDrawer name={DRAWERS.ESTIMATE_DETAILS} /> <EstimateDetailDrawer name={DRAWERS.ESTIMATE_DETAILS} />
<ReceiptDetailDrawer name={DRAWERS.RECEIPT_DETAILS} /> <ReceiptDetailDrawer name={DRAWERS.RECEIPT_DETAILS} />
<PaymentReceiveDetailDrawer name={DRAWERS.PAYMENT_RECEIVE_DETAILS} /> <PaymentReceiveDetailDrawer name={DRAWERS.PAYMENT_RECEIVED_DETAILS} />
<PaymentMadeDetailDrawer name={DRAWERS.PAYMENT_MADE_DETAILS} /> <PaymentMadeDetailDrawer name={DRAWERS.PAYMENT_MADE_DETAILS} />
<ItemDetailDrawer name={DRAWERS.ITEM_DETAILS} /> <ItemDetailDrawer name={DRAWERS.ITEM_DETAILS} />
<CustomerDetailsDrawer name={DRAWERS.CUSTOMER_DETAILS} /> <CustomerDetailsDrawer name={DRAWERS.CUSTOMER_DETAILS} />

View File

@@ -1,5 +1,3 @@
.root { .root {
padding: 20px; padding: 20px;
border: 2px dotted #c5cbd3; border: 2px dotted #c5cbd3;
@@ -9,4 +7,14 @@
flex-direction: column; flex-direction: column;
background: #fff; background: #fff;
position: relative; position: relative;
transition: background-color 0.3s ease, border-color 0.3s ease;
&.dropzoneAccept {
border-color: rgb(0, 82, 204);
background: rgba(0, 82, 204, 0.05);
}
&.dropzoneReject {
border-color: #AC2F33;
background: rgba(172, 47, 51, 0.05)
}
} }

View File

@@ -235,7 +235,14 @@ export const Dropzone = (_props: DropzoneProps) => {
> >
<Box <Box
{...getRootProps({ {...getRootProps({
className: clsx(styles.root, classNames?.root), className: clsx(
styles.root,
{
[styles.dropzoneAccept]: isDragAccept,
[styles.dropzoneReject]: isDragReject
},
classNames?.root
),
})} })}
// {...getStyles('root', { focusable: true })} // {...getStyles('root', { focusable: true })}
{...others} {...others}
@@ -253,7 +260,7 @@ export const Dropzone = (_props: DropzoneProps) => {
<input {...getInputProps(inputProps)} name={name} /> <input {...getInputProps(inputProps)} name={name} />
<div <div
data-enable-pointer-events={enablePointerEvents || undefined} data-enable-pointer-events={enablePointerEvents || undefined}
className={classNames?.content} className={clsx(styles.content, classNames?.content)}
> >
{children} {children}
</div> </div>
@@ -268,8 +275,6 @@ Dropzone.Idle = DropzoneIdle;
Dropzone.Reject = DropzoneReject; Dropzone.Reject = DropzoneReject;
type PossibleRef<T> = Ref<T> | undefined; type PossibleRef<T> = Ref<T> | undefined;
export function assignRef<T>(ref: PossibleRef<T>, value: T) { export function assignRef<T>(ref: PossibleRef<T>, value: T) {

View File

@@ -1,9 +1,11 @@
// @ts-nocheck // @ts-nocheck
import React from 'react'; import React from 'react';
import * as R from 'ramda'; import * as R from 'ramda';
import { useFormikContext } from 'formik';
import withDrawerActions from '@/containers/Drawer/withDrawerActions'; import withDrawerActions from '@/containers/Drawer/withDrawerActions';
import { createNewItemFromQuery, createNewItemRenderer } from './utils'; import { createNewItemFromQuery, createNewItemRenderer } from './utils';
import { FSelect } from '../Forms'; import { FSelect } from '../Forms';
import { useCreateAutofillListener } from '@/hooks/state/autofill';
import { DRAWERS } from '@/constants/drawers'; import { DRAWERS } from '@/constants/drawers';
/** /**
@@ -15,6 +17,7 @@ function VendorsSelectRoot({
openDrawer, openDrawer,
// #ownProps // #ownProps
name,
items, items,
allowCreate, allowCreate,
@@ -25,14 +28,24 @@ function VendorsSelectRoot({
const maybeCreateNewItemFromQuery = allowCreate const maybeCreateNewItemFromQuery = allowCreate
? createNewItemFromQuery ? createNewItemFromQuery
: null; : null;
const { setFieldValue } = useFormikContext();
// Creates a new autofill listener once the quick vendor drawer submits the form.
const autofillRef = useCreateAutofillListener((payload: any) => {
setFieldValue(name, payload.vendorId);
});
// Handles the create item click. // Handles the create item click.
const handleCreateItemClick = () => { const handleCreateItemClick = (item) => {
openDrawer(DRAWERS.QUICK_WRITE_VENDOR); openDrawer(DRAWERS.QUICK_WRITE_VENDOR, {
autofillRef,
displayName: item.name,
});
}; };
return ( return (
<FSelect <FSelect
name={name}
items={items} items={items}
textAccessor={'display_name'} textAccessor={'display_name'}
labelAccessor={'formatted_balance'} labelAccessor={'formatted_balance'}

View File

@@ -6,7 +6,7 @@ export enum DRAWERS {
BILL_DETAILS = 'bill-drawer', BILL_DETAILS = 'bill-drawer',
INVOICE_DETAILS = 'invoice-detail-drawer', INVOICE_DETAILS = 'invoice-detail-drawer',
RECEIPT_DETAILS = 'receipt-detail-drawer', RECEIPT_DETAILS = 'receipt-detail-drawer',
PAYMENT_RECEIVE_DETAILS = 'payment-receive-detail-drawer', PAYMENT_RECEIVED_DETAILS = 'payment-receive-detail-drawer',
PAYMENT_MADE_DETAILS = 'payment-made-drawer', PAYMENT_MADE_DETAILS = 'payment-made-drawer',
ESTIMATE_DETAILS = 'estimate-detail-drawer', ESTIMATE_DETAILS = 'estimate-detail-drawer',
ITEM_DETAILS = 'item-detail-drawer', ITEM_DETAILS = 'item-detail-drawer',

View File

@@ -55,7 +55,7 @@ export const accountsReceivable = [
description: ( description: (
<T id={'manage_payment_transactions_from_your_customers'} /> <T id={'manage_payment_transactions_from_your_customers'} />
), ),
link: '/payment-receives', link: '/payments-received',
subject: AbilitySubject.PaymentReceive, subject: AbilitySubject.PaymentReceive,
ability: PaymentReceiveAction.View, ability: PaymentReceiveAction.View,
}, },
@@ -88,7 +88,7 @@ export const accountsPayable = [
{ {
title: <T id={'vendors_payments'} />, title: <T id={'vendors_payments'} />,
description: <T id={'manage_payments_transactions_to_your_vendors'} />, description: <T id={'manage_payments_transactions_to_your_vendors'} />,
link: '/payment-mades', link: '/payments-made',
subject: AbilitySubject.PaymentMade, subject: AbilitySubject.PaymentMade,
ability: PaymentMadeAction.View, ability: PaymentMadeAction.View,
}, },

View File

@@ -74,7 +74,7 @@ export const SidebarMenu = [
}, },
}, },
{ {
text: <T id={'category_list'} />, text: <T id={'categories_list'} />,
href: '/items/categories', href: '/items/categories',
type: ISidebarMenuItemType.Link, type: ISidebarMenuItemType.Link,
permission: { permission: {
@@ -179,8 +179,8 @@ export const SidebarMenu = [
type: ISidebarMenuItemType.Link, type: ISidebarMenuItemType.Link,
}, },
{ {
text: <T id={'sidebar.payment_receives'} />, text: <T id={'sidebar.payments_received'} />,
href: '/payment-receives', href: '/payments-received',
type: ISidebarMenuItemType.Link, type: ISidebarMenuItemType.Link,
permission: { permission: {
subject: AbilitySubject.PaymentReceive, subject: AbilitySubject.PaymentReceive,
@@ -226,8 +226,8 @@ export const SidebarMenu = [
type: ISidebarMenuItemType.Link, type: ISidebarMenuItemType.Link,
}, },
{ {
text: <T id={'sidebar.new_payment_receive'} />, text: <T id={'sidebar.new_payment_received'} />,
href: '/payment-receives/new', href: '/payment-received/new',
type: ISidebarMenuItemType.Link, type: ISidebarMenuItemType.Link,
permission: { permission: {
subject: AbilitySubject.PaymentReceive, subject: AbilitySubject.PaymentReceive,
@@ -265,8 +265,8 @@ export const SidebarMenu = [
type: ISidebarMenuItemType.Link, type: ISidebarMenuItemType.Link,
}, },
{ {
text: <T id={'payment_mades'} />, text: <T id={'payments_made'} />,
href: '/payment-mades', href: '/payments-made',
type: ISidebarMenuItemType.Link, type: ISidebarMenuItemType.Link,
permission: { permission: {
subject: AbilitySubject.PaymentMade, subject: AbilitySubject.PaymentMade,
@@ -299,7 +299,7 @@ export const SidebarMenu = [
}, },
{ {
text: <T id={'sidebar.new_payment_made'} />, text: <T id={'sidebar.new_payment_made'} />,
href: '/payment-mades/new', href: '/payments-made/new',
type: ISidebarMenuItemType.Link, type: ISidebarMenuItemType.Link,
permission: { permission: {
subject: AbilitySubject.PaymentMade, subject: AbilitySubject.PaymentMade,

View File

@@ -21,7 +21,7 @@ import { DRAWERS } from '@/constants/drawers';
/** /**
* Payment receive delete alert. * Payment receive delete alert.
*/ */
function PaymentReceiveDeleteAlert({ function PaymentReceivedDeleteAlert({
name, name,
// #withAlertStoreConnect // #withAlertStoreConnect
@@ -48,11 +48,11 @@ function PaymentReceiveDeleteAlert({
.then(() => { .then(() => {
AppToaster.show({ AppToaster.show({
message: intl.get( message: intl.get(
'the_payment_receive_has_been_deleted_successfully', 'the_payment_received_has_been_deleted_successfully',
), ),
intent: Intent.SUCCESS, intent: Intent.SUCCESS,
}); });
closeDrawer(DRAWERS.PAYMENT_RECEIVE_DETAILS); closeDrawer(DRAWERS.PAYMENT_RECEIVED_DETAILS);
}) })
.catch( .catch(
({ ({
@@ -81,7 +81,7 @@ function PaymentReceiveDeleteAlert({
> >
<p> <p>
<FormattedHTMLMessage <FormattedHTMLMessage
id={'once_delete_this_payment_receive_you_will_able_to_restore_it'} id={'once_delete_this_payment_received_you_will_able_to_restore_it'}
/> />
</p> </p>
</Alert> </Alert>
@@ -92,4 +92,4 @@ export default compose(
withAlertStoreConnect(), withAlertStoreConnect(),
withAlertActions, withAlertActions,
withDrawerActions, withDrawerActions,
)(PaymentReceiveDeleteAlert); )(PaymentReceivedDeleteAlert);

View File

@@ -6,9 +6,9 @@ import InventoryAdjustmentsAlerts from '@/containers/InventoryAdjustments/Invent
import EstimatesAlerts from '@/containers/Sales/Estimates/EstimatesAlerts'; import EstimatesAlerts from '@/containers/Sales/Estimates/EstimatesAlerts';
import InvoicesAlerts from '@/containers/Sales/Invoices/InvoicesAlerts'; import InvoicesAlerts from '@/containers/Sales/Invoices/InvoicesAlerts';
import ReceiptsAlerts from '@/containers/Sales/Receipts/ReceiptsAlerts'; import ReceiptsAlerts from '@/containers/Sales/Receipts/ReceiptsAlerts';
import PaymentReceiveAlerts from '@/containers/Sales/PaymentReceives/PaymentReceiveAlerts'; import PaymentsReceivedAlerts from '@/containers/Sales/PaymentsReceived/PaymentsReceivedAlerts';
import BillsAlerts from '@/containers/Purchases/Bills/BillsLanding/BillsAlerts'; import BillsAlerts from '@/containers/Purchases/Bills/BillsLanding/BillsAlerts';
import PaymentMadesAlerts from '@/containers/Purchases/PaymentMades/PaymentMadesAlerts'; import PaymentsMadeAlerts from '@/containers/Purchases/PaymentsMade/PaymentsMadeAlerts';
import CustomersAlerts from '@/containers/Customers/CustomersAlerts'; import CustomersAlerts from '@/containers/Customers/CustomersAlerts';
import VendorsAlerts from '@/containers/Vendors/VendorsAlerts'; import VendorsAlerts from '@/containers/Vendors/VendorsAlerts';
import ManualJournalsAlerts from '@/containers/Accounting/JournalsLanding/ManualJournalsAlerts'; import ManualJournalsAlerts from '@/containers/Accounting/JournalsLanding/ManualJournalsAlerts';
@@ -38,9 +38,9 @@ export default [
...EstimatesAlerts, ...EstimatesAlerts,
...InvoicesAlerts, ...InvoicesAlerts,
...ReceiptsAlerts, ...ReceiptsAlerts,
...PaymentReceiveAlerts, ...PaymentsReceivedAlerts,
...BillsAlerts, ...BillsAlerts,
...PaymentMadesAlerts, ...PaymentsMadeAlerts,
...CustomersAlerts, ...CustomersAlerts,
...VendorsAlerts, ...VendorsAlerts,
...ManualJournalsAlerts, ...ManualJournalsAlerts,

View File

@@ -1,6 +1,7 @@
// @ts-nocheck // @ts-nocheck
import { useCallback, useMemo } from 'react'; import { useCallback, useMemo } from 'react';
import { Form, Formik, FormikHelpers, useFormikContext } from 'formik'; import { Form, Formik, FormikHelpers, useFormikContext } from 'formik';
import { get } from 'lodash';
import { Button, Classes, Intent, Radio, Tag } from '@blueprintjs/core'; import { Button, Classes, Intent, Radio, Tag } from '@blueprintjs/core';
import * as R from 'ramda'; import * as R from 'ramda';
import { CreateRuleFormSchema } from './RuleFormContentForm.schema'; import { CreateRuleFormSchema } from './RuleFormContentForm.schema';
@@ -17,11 +18,12 @@ import {
} from '@/components'; } from '@/components';
import { useCreateBankRule, useEditBankRule } from '@/hooks/query/bank-rules'; import { useCreateBankRule, useEditBankRule } from '@/hooks/query/bank-rules';
import { import {
FieldCondition,
Fields, Fields,
RuleFormValues, RuleFormValues,
TransactionTypeOptions, TransactionTypeOptions,
getAccountRootFromMoneyCategory, getAccountRootFromMoneyCategory,
getDefaultFieldConditionByFieldKey,
getFieldConditionsByFieldKey,
initialValues, initialValues,
} from './_utils'; } from './_utils';
import { useRuleFormDialogBoot } from './RuleFormBoot'; import { useRuleFormDialogBoot } from './RuleFormBoot';
@@ -175,6 +177,13 @@ function RuleFormConditions() {
setFieldValue('conditions', _conditions); setFieldValue('conditions', _conditions);
}; };
const handleConditionFieldChange = R.curry((index, item) => {
const defaultComparator = getDefaultFieldConditionByFieldKey(item.value);
setFieldValue(`conditions[${index}].field`, item.value);
setFieldValue(`conditions[${index}].comparator`, defaultComparator);
});
return ( return (
<Box style={{ marginBottom: 15 }}> <Box style={{ marginBottom: 15 }}>
<Stack spacing={15}> <Stack spacing={15}>
@@ -190,6 +199,7 @@ function RuleFormConditions() {
name={`conditions[${index}].field`} name={`conditions[${index}].field`}
items={Fields} items={Fields}
popoverProps={{ minimal: true, inline: false }} popoverProps={{ minimal: true, inline: false }}
onItemChange={handleConditionFieldChange(index)}
fastField fastField
/> />
</FFormGroup> </FFormGroup>
@@ -202,8 +212,13 @@ function RuleFormConditions() {
> >
<FSelect <FSelect
name={`conditions[${index}].comparator`} name={`conditions[${index}].comparator`}
items={FieldCondition} items={getFieldConditionsByFieldKey(
get(values, `conditions[${index}].field`),
)}
popoverProps={{ minimal: true, inline: false }} popoverProps={{ minimal: true, inline: false }}
shouldUpdateDeps={{
fieldKey: get(values, `conditions[${index}].field`),
}}
fastField fastField
/> />
</FFormGroup> </FFormGroup>

View File

@@ -42,11 +42,25 @@ export const Fields = [
{ value: 'amount', text: 'Amount' }, { value: 'amount', text: 'Amount' },
{ value: 'payee', text: 'Payee' }, { value: 'payee', text: 'Payee' },
]; ];
export const FieldCondition = [
export const TextFieldConditions = [
{ value: 'contains', text: 'Contains' }, { value: 'contains', text: 'Contains' },
{ value: 'equals', text: 'Equals' }, { value: 'equals', text: 'Equals' },
{ value: 'not_contains', text: 'Not Contains' }, { value: 'not_contains', text: 'Not Contains' },
]; ];
export const NumberFieldConditions = [
{ value: 'equal', text: 'Equal' },
{ value: 'bigger', text: 'Bigger' },
{ value: 'bigger_or_equal', text: 'Bigger or Equal' },
{ value: 'smaller', text: 'Smaller' },
{ value: 'smaller_or_equal', text: 'Smaller or Equal' },
];
export const FieldCondition = [
...TextFieldConditions,
...NumberFieldConditions,
];
export const AssignTransactionTypeOptions = [ export const AssignTransactionTypeOptions = [
{ value: 'expense', text: 'Expense' }, { value: 'expense', text: 'Expense' },
]; ];
@@ -56,3 +70,21 @@ export const getAccountRootFromMoneyCategory = (category: string): string[] => {
return get(MoneyCategoryPerCreditAccountRootType, _category) || []; return get(MoneyCategoryPerCreditAccountRootType, _category) || [];
}; };
export const getFieldConditionsByFieldKey = (fieldKey?: string) => {
switch (fieldKey) {
case 'amount':
return NumberFieldConditions;
default:
return TextFieldConditions;
}
};
export const getDefaultFieldConditionByFieldKey = (fieldKey?: string) => {
switch (fieldKey) {
case 'amount':
return 'bigger_or_equal';
default:
return 'contains';
}
};

View File

@@ -32,7 +32,7 @@ import {
getAddMoneyOutOptions, getAddMoneyOutOptions,
getAddMoneyInOptions, getAddMoneyInOptions,
} from '@/constants/cashflowOptions'; } from '@/constants/cashflowOptions';
import { useRefreshCashflowTransactionsInfinity } from '@/hooks/query'; import { useRefreshCashflowTransactions } from '@/hooks/query';
import { useAccountTransactionsContext } from './AccountTransactionsProvider'; import { useAccountTransactionsContext } from './AccountTransactionsProvider';
import withDialogActions from '@/containers/Dialog/withDialogActions'; import withDialogActions from '@/containers/Dialog/withDialogActions';
@@ -76,7 +76,7 @@ function AccountTransactionsActionsBar({
const { accountId, currentAccount } = useAccountTransactionsContext(); const { accountId, currentAccount } = useAccountTransactionsContext();
// Refresh cashflow infinity transactions hook. // Refresh cashflow infinity transactions hook.
const { refresh } = useRefreshCashflowTransactionsInfinity(); const { refresh } = useRefreshCashflowTransactions();
const { mutateAsync: updateBankAccount } = useUpdateBankAccount(); const { mutateAsync: updateBankAccount } = useUpdateBankAccount();
@@ -141,7 +141,7 @@ function AccountTransactionsActionsBar({
}; };
// Handle the refresh button click. // Handle the refresh button click.
const handleRefreshBtnClick = () => { const handleRefreshBtnClick = () => {
refresh(); refresh(accountId);
}; };
const { const {

View File

@@ -48,8 +48,11 @@ function AccountTransactionsDataTable({
const columns = useAccountTransactionsColumns(); const columns = useAccountTransactionsColumns();
// Retrieve list context. // Retrieve list context.
const { cashflowTransactions, isCashFlowTransactionsLoading } = const {
useAccountTransactionsAllContext(); cashflowTransactions,
isCashFlowTransactionsLoading,
isCashFlowTransactionsFetching,
} = useAccountTransactionsAllContext();
const { mutateAsync: uncategorizeTransaction } = useUncategorizeTransaction(); const { mutateAsync: uncategorizeTransaction } = useUncategorizeTransaction();
const { mutateAsync: unmatchTransaction } = const { mutateAsync: unmatchTransaction } =
@@ -118,6 +121,7 @@ function AccountTransactionsDataTable({
sticky={true} sticky={true}
loading={isCashFlowTransactionsLoading} loading={isCashFlowTransactionsLoading}
headerLoading={isCashFlowTransactionsLoading} headerLoading={isCashFlowTransactionsLoading}
progressBarLoading={isCashFlowTransactionsFetching}
expandColumnSpace={1} expandColumnSpace={1}
expandToggleColumn={2} expandToggleColumn={2}
selectionColumnWidth={45} selectionColumnWidth={45}

View File

@@ -13,10 +13,10 @@ import {
useAccountTransactionsContext, useAccountTransactionsContext,
} from './AccountTransactionsProvider'; } from './AccountTransactionsProvider';
import { AccountTransactionsDetailsBar } from './AccountTransactionsDetailsBar'; import { AccountTransactionsDetailsBar } from './AccountTransactionsDetailsBar';
import { AccountTransactionsProgressBar } from './components';
import { AccountTransactionsFilterTabs } from './AccountTransactionsFilterTabs'; import { AccountTransactionsFilterTabs } from './AccountTransactionsFilterTabs';
import { AppContentShell } from '@/components/AppShell'; import { AppContentShell } from '@/components/AppShell';
import { CategorizeTransactionAside } from '../CategorizeTransactionAside/CategorizeTransactionAside'; import { CategorizeTransactionAside } from '../CategorizeTransactionAside/CategorizeTransactionAside';
import { AccountTransactionsLoadingBar } from './components';
import { withBanking } from '../withBanking'; import { withBanking } from '../withBanking';
/** /**
@@ -42,8 +42,8 @@ function AccountTransactionsMain() {
return ( return (
<AppContentShell.Main ref={(e) => setScrollableRef(e)}> <AppContentShell.Main ref={(e) => setScrollableRef(e)}>
<AccountTransactionsActionsBar /> <AccountTransactionsActionsBar />
<AccountTransactionsLoadingBar />
<AccountTransactionsDetailsBar /> <AccountTransactionsDetailsBar />
<AccountTransactionsProgressBar />
<DashboardPageContent> <DashboardPageContent>
<AccountTransactionsFilterTabs /> <AccountTransactionsFilterTabs />

View File

@@ -39,6 +39,7 @@ function AccountTransactionsProvider({ query, ...props }) {
const { const {
data: bankAccountMetaSummary, data: bankAccountMetaSummary,
isLoading: isBankAccountMetaSummaryLoading, isLoading: isBankAccountMetaSummaryLoading,
isFetching: isBankAccountMetaSummaryFetching,
} = useGetBankAccountSummaryMeta(accountId); } = useGetBankAccountSummaryMeta(accountId);
const [scrollableRef, setScrollableRef] = useState(); const [scrollableRef, setScrollableRef] = useState();
@@ -52,15 +53,18 @@ function AccountTransactionsProvider({ query, ...props }) {
isCashFlowAccountsFetching, isCashFlowAccountsFetching,
isCashFlowAccountsLoading, isCashFlowAccountsLoading,
isCurrentAccountFetching, isCurrentAccountFetching,
isCurrentAccountLoading, isCurrentAccountLoading,
isBankAccountMetaSummaryLoading, isBankAccountMetaSummaryLoading,
isBankAccountMetaSummaryFetching,
filterTab, filterTab,
setFilterTab, setFilterTab,
scrollableRef, scrollableRef,
setScrollableRef setScrollableRef,
}; };
return ( return (

View File

@@ -34,7 +34,11 @@ function ExcludedTransactionsTableRoot({
// #withBankingActions // #withBankingActions
setExcludedTransactionsSelected, setExcludedTransactionsSelected,
}: ExcludeTransactionsTableProps) { }: ExcludeTransactionsTableProps) {
const { excludedBankTransactions } = useExcludedTransactionsBoot(); const {
excludedBankTransactions,
isExcludedTransactionsLoading,
isExcludedTransactionsFetching,
} = useExcludedTransactionsBoot();
const { mutateAsync: unexcludeBankTransaction } = const { mutateAsync: unexcludeBankTransaction } =
useUnexcludeUncategorizedTransaction(); useUnexcludeUncategorizedTransaction();
@@ -79,8 +83,9 @@ function ExcludedTransactionsTableRoot({
columns={columns} columns={columns}
data={excludedBankTransactions} data={excludedBankTransactions}
sticky={true} sticky={true}
loading={false} loading={isExcludedTransactionsLoading}
headerLoading={false} headerLoading={isExcludedTransactionsLoading}
progressBarLoading={isExcludedTransactionsFetching}
expandColumnSpace={1} expandColumnSpace={1}
expandToggleColumn={2} expandToggleColumn={2}
selectionColumnWidth={45} selectionColumnWidth={45}

View File

@@ -30,8 +30,11 @@ function PendingTransactionsDataTableRoot({
const { scrollableRef } = useAccountTransactionsContext(); const { scrollableRef } = useAccountTransactionsContext();
// Retrieve list context. // Retrieve list context.
const { pendingTransactions, isPendingTransactionsLoading } = const {
usePendingTransactionsContext(); pendingTransactions,
isPendingTransactionsLoading,
isPendingTransactionFetching,
} = usePendingTransactionsContext();
return ( return (
<CashflowTransactionsTable <CashflowTransactionsTable
@@ -41,6 +44,7 @@ function PendingTransactionsDataTableRoot({
sticky={true} sticky={true}
loading={isPendingTransactionsLoading} loading={isPendingTransactionsLoading}
headerLoading={isPendingTransactionsLoading} headerLoading={isPendingTransactionsLoading}
progressBarLoading={isPendingTransactionFetching}
TableCellRenderer={TableFastCell} TableCellRenderer={TableFastCell}
TableLoadingRenderer={TableSkeletonRows} TableLoadingRenderer={TableSkeletonRows}
TableRowsRenderer={TableVirtualizedListRows} TableRowsRenderer={TableVirtualizedListRows}

View File

@@ -52,8 +52,11 @@ function AccountTransactionsDataTable({
const { scrollableRef } = useAccountTransactionsContext(); const { scrollableRef } = useAccountTransactionsContext();
// Retrieve list context. // Retrieve list context.
const { uncategorizedTransactions, isUncategorizedTransactionsLoading } = const {
useAccountUncategorizedTransactionsContext(); uncategorizedTransactions,
isUncategorizedTransactionsLoading,
isUncategorizedTransactionFetching,
} = useAccountUncategorizedTransactionsContext();
const { mutateAsync: excludeTransaction } = const { mutateAsync: excludeTransaction } =
useExcludeUncategorizedTransaction(); useExcludeUncategorizedTransaction();
@@ -105,6 +108,7 @@ function AccountTransactionsDataTable({
selectionColumn={true} selectionColumn={true}
loading={isUncategorizedTransactionsLoading} loading={isUncategorizedTransactionsLoading}
headerLoading={isUncategorizedTransactionsLoading} headerLoading={isUncategorizedTransactionsLoading}
progressBarLoading={isUncategorizedTransactionFetching}
expandColumnSpace={1} expandColumnSpace={1}
expandToggleColumn={2} expandToggleColumn={2}
selectionColumnWidth={45} selectionColumnWidth={45}

View File

@@ -1,18 +1,29 @@
// @ts-nocheck // @ts-nocheck
import React from 'react'; import React from 'react';
import intl from 'react-intl-universal'; import intl from 'react-intl-universal';
import { import { Intent, Menu, MenuItem, Tag } from '@blueprintjs/core';
Intent, import { FormatDateCell, Icon } from '@/components';
Menu,
MenuItem,
Tag,
PopoverInteractionKind,
Position,
Tooltip,
} from '@blueprintjs/core';
import { Box, FormatDateCell, Icon, MaterialProgressBar } from '@/components';
import { useAccountTransactionsContext } from './AccountTransactionsProvider';
import { safeCallback } from '@/utils'; import { safeCallback } from '@/utils';
import { useAccountTransactionsContext } from './AccountTransactionsProvider';
import FinancialLoadingBar from '@/containers/FinancialStatements/FinancialLoadingBar';
export function AccountTransactionsLoadingBar() {
const {
isBankAccountMetaSummaryFetching,
isCurrentAccountFetching,
isCashFlowAccountsFetching,
} = useAccountTransactionsContext();
const isLoading =
isCashFlowAccountsFetching ||
isCurrentAccountFetching ||
isBankAccountMetaSummaryFetching;
if (isLoading) {
return <FinancialLoadingBar />;
}
return null;
}
export function ActionsMenu({ export function ActionsMenu({
payload: { onUncategorize, onUnmatch }, payload: { onUncategorize, onUnmatch },
@@ -137,16 +148,3 @@ export function useAccountTransactionsColumns() {
[], [],
); );
} }
/**
* Account transactions progress bar.
*/
export function AccountTransactionsProgressBar() {
const { isCashFlowTransactionsFetching, isUncategorizedTransactionFetching } =
useAccountTransactionsContext();
return isCashFlowTransactionsFetching ||
isUncategorizedTransactionFetching ? (
<MaterialProgressBar />
) : null;
}

View File

@@ -66,7 +66,7 @@ export const handleCashFlowTransactionType = (reference, openDrawer) => {
expenseId: reference.reference_id, expenseId: reference.reference_id,
}); });
case 'PaymentReceive': case 'PaymentReceive':
return openDrawer(DRAWERS.PAYMENT_RECEIVE_DETAILS, { return openDrawer(DRAWERS.PAYMENT_RECEIVED_DETAILS, {
paymentReceiveId: reference.reference_id, paymentReceiveId: reference.reference_id,
}); });
case 'BillPayment': case 'BillPayment':

View File

@@ -10,6 +10,7 @@ import { CashFlowAccountsProvider } from './CashFlowAccountsProvider';
import CashflowAccountsGrid from './CashflowAccountsGrid'; import CashflowAccountsGrid from './CashflowAccountsGrid';
import CashFlowAccountsActionsBar from './CashFlowAccountsActionsBar'; import CashFlowAccountsActionsBar from './CashFlowAccountsActionsBar';
import { CashflowAccountsPlaidLink } from './CashflowAccountsPlaidLink'; import { CashflowAccountsPlaidLink } from './CashflowAccountsPlaidLink';
import { CashflowAccountsLoadingBar } from './CashFlowAccountsLoadingBar';
import withCashflowAccounts from '@/containers/CashFlow/AccountTransactions/withCashflowAccounts'; import withCashflowAccounts from '@/containers/CashFlow/AccountTransactions/withCashflowAccounts';
import withCashflowAccountsTableActions from '@/containers/CashFlow/AccountTransactions/withCashflowAccountsTableActions'; import withCashflowAccountsTableActions from '@/containers/CashFlow/AccountTransactions/withCashflowAccountsTableActions';
@@ -35,6 +36,7 @@ function CashFlowAccountsList({
return ( return (
<CashFlowAccountsProvider tableState={cashflowAccountsTableState}> <CashFlowAccountsProvider tableState={cashflowAccountsTableState}>
<CashFlowAccountsActionsBar /> <CashFlowAccountsActionsBar />
<CashflowAccountsLoadingBar />
<DashboardPageContent> <DashboardPageContent>
<CashflowAccountsGrid /> <CashflowAccountsGrid />

View File

@@ -0,0 +1,12 @@
// @ts-nocheck
import FinancialLoadingBar from '@/containers/FinancialStatements/FinancialLoadingBar';
import { useCashFlowAccountsContext } from './CashFlowAccountsProvider';
export function CashflowAccountsLoadingBar() {
const { isCashFlowAccountsFetching } = useCashFlowAccountsContext();
if (isCashFlowAccountsFetching) {
return <FinancialLoadingBar />;
}
return null;
}

View File

@@ -52,7 +52,7 @@ function CustomerFormFormik({
...defaultInitialValues, ...defaultInitialValues,
currency_code: base_currency, currency_code: base_currency,
...transformToForm(contactDuplicate || customer, defaultInitialValues), ...transformToForm(contactDuplicate || customer, defaultInitialValues),
...initialCustomerValues, ...transformToForm(initialCustomerValues, defaultInitialValues),
}), }),
[customer, contactDuplicate, base_currency, initialCustomerValues], [customer, contactDuplicate, base_currency, initialCustomerValues],
); );
@@ -62,7 +62,7 @@ function CustomerFormFormik({
const { setSubmitting, resetForm } = formArgs; const { setSubmitting, resetForm } = formArgs;
const formValues = { ...values }; const formValues = { ...values };
const onSuccess = () => { const onSuccess = (res) => {
AppToaster.show({ AppToaster.show({
message: intl.get( message: intl.get(
isNewMode isNewMode
@@ -73,8 +73,7 @@ function CustomerFormFormik({
}); });
setSubmitting(false); setSubmitting(false);
resetForm(); resetForm();
saveInvoke(onSubmitSuccess, values, formArgs, submitPayload, res.data);
saveInvoke(onSubmitSuccess, values, formArgs, submitPayload);
}; };
const onError = () => { const onError = () => {

View File

@@ -25,7 +25,7 @@ function PaymentReceivePdfPreviewDialog({
return ( return (
<Dialog <Dialog
name={dialogName} name={dialogName}
title={<T id={'payment_receive_preview.dialog.title'} />} title={<T id={'payment_received_preview.dialog.title'} />}
className={classNames(CLASSES.DIALOG_PDF_PREVIEW)} className={classNames(CLASSES.DIALOG_PDF_PREVIEW)}
autoFocus={true} autoFocus={true}
canEscapeKeyClose={true} canEscapeKeyClose={true}

View File

@@ -7,7 +7,7 @@ import { useFormikContext } from 'formik';
import { Intent } from '@blueprintjs/core'; import { Intent } from '@blueprintjs/core';
import { AppToaster } from '@/components'; import { AppToaster } from '@/components';
import { useQuickPaymentMadeContext } from './QuickPaymentMadeFormProvider'; import { useQuickPaymentMadeContext } from './QuickPaymentMadeFormProvider';
import { PAYMENT_MADE_ERRORS } from '@/containers/Purchases/PaymentMades/constants'; import { PAYMENT_MADE_ERRORS } from '@/containers/Purchases/PaymentsMade/constants';
// Default initial values of payment made. // Default initial values of payment made.
export const defaultPaymentMade = { export const defaultPaymentMade = {

View File

@@ -9,7 +9,7 @@ const Schema = Yup.object().shape({
.required() .required()
.nullable() .nullable()
.max(DATATYPES_LENGTH.STRING) .max(DATATYPES_LENGTH.STRING)
.label(intl.get('payment_receive_no_')), .label(intl.get('payment_received_no_')),
payment_date: Yup.date().required().label(intl.get('payment_date_')), payment_date: Yup.date().required().label(intl.get('payment_date_')),
deposit_account_id: Yup.number() deposit_account_id: Yup.number()
.required() .required()

View File

@@ -70,7 +70,7 @@ function QuickPaymentReceiveForm({
// Handle request response success. // Handle request response success.
const onSaved = (response) => { const onSaved = (response) => {
AppToaster.show({ AppToaster.show({
message: intl.get('the_payment_receive_transaction_has_been_created'), message: intl.get('the_payment_received_transaction_has_been_created'),
intent: Intent.SUCCESS, intent: Intent.SUCCESS,
}); });
closeDialog(dialogName); closeDialog(dialogName);

View File

@@ -34,7 +34,7 @@ export const transformErrors = (errors, { setFieldError }) => {
if (getError('PAYMENT_RECEIVE_NO_REQUIRED')) { if (getError('PAYMENT_RECEIVE_NO_REQUIRED')) {
setFieldError( setFieldError(
'payment_receive_no', 'payment_receive_no',
intl.get('payment_receive_number_required'), intl.get('payment_received_number_required'),
); );
} }
if (getError('INVALID_PAYMENT_AMOUNT')) { if (getError('INVALID_PAYMENT_AMOUNT')) {

View File

@@ -48,7 +48,7 @@ function BillPaymentTransactionTable({
// Handles edit bill payment transactions. // Handles edit bill payment transactions.
const handleEditBillPaymentTransactions = ({ bill_payment_id }) => { const handleEditBillPaymentTransactions = ({ bill_payment_id }) => {
history.push(`/payment-mades/${bill_payment_id}/edit`); history.push(`/payments-made/${bill_payment_id}/edit`);
closeDrawer(DRAWERS.BILL_DETAILS); closeDrawer(DRAWERS.BILL_DETAILS);
}; };

View File

@@ -68,7 +68,7 @@ function CustomerDetailsActionsBar({
}; };
// Handle new payment receive button click. // Handle new payment receive button click.
const handleNewPaymentClick = () => { const handleNewPaymentClick = () => {
history.push('/payment-receives/new'); history.push('/payment-received/new');
closeDrawer(DRAWERS.CUSTOMER_DETAILS); closeDrawer(DRAWERS.CUSTOMER_DETAILS);
}; };
// Handle new estimate button click. // Handle new estimate button click.

View File

@@ -47,14 +47,14 @@ function InvoicePaymentTransactionsTable({
// Handles delete payment transactions. // Handles delete payment transactions.
const handleDeletePaymentTransactons = ({ payment_receive_id }) => { const handleDeletePaymentTransactons = ({ payment_receive_id }) => {
openAlert('payment-receive-delete', { openAlert('payment-received-delete', {
paymentReceiveId: payment_receive_id, paymentReceiveId: payment_receive_id,
}); });
}; };
// Handles edit payment transactions. // Handles edit payment transactions.
const handleEditPaymentTransactions = ({ payment_receive_id }) => { const handleEditPaymentTransactions = ({ payment_receive_id }) => {
history.push(`/payment-receives/${payment_receive_id}/edit`); history.push(`/payments-received/${payment_receive_id}/edit`);
closeDrawer(DRAWERS.INVOICE_DETAILS); closeDrawer(DRAWERS.INVOICE_DETAILS);
}; };
return ( return (

View File

@@ -42,7 +42,7 @@ function PaymentMadeDetailActionsBar({
// Handle edit payment made. // Handle edit payment made.
const handleEditPaymentMade = () => { const handleEditPaymentMade = () => {
history.push(`/payment-mades/${paymentMadeId}/edit`); history.push(`/payments-made/${paymentMadeId}/edit`);
closeDrawer(DRAWERS.PAYMENT_MADE_DETAILS); closeDrawer(DRAWERS.PAYMENT_MADE_DETAILS);
}; };

View File

@@ -33,7 +33,7 @@ import { DialogsName } from '@/constants/dialogs';
/** /**
* Payment receive actions bar. * Payment receive actions bar.
*/ */
function PaymentReceiveActionsBar({ function PaymentsReceivedActionsBar({
// #withAlertsActions // #withAlertsActions
openAlert, openAlert,
@@ -50,13 +50,13 @@ function PaymentReceiveActionsBar({
// Handle edit payment receive. // Handle edit payment receive.
const handleEditPaymentReceive = () => { const handleEditPaymentReceive = () => {
history.push(`/payment-receives/${paymentReceiveId}/edit`); history.push(`/payments-received/${paymentReceiveId}/edit`);
closeDrawer(DRAWERS.PAYMENT_RECEIVE_DETAILS); closeDrawer(DRAWERS.PAYMENT_RECEIVED_DETAILS);
}; };
// Handle delete payment receive. // Handle delete payment receive.
const handleDeletePaymentReceive = () => { const handleDeletePaymentReceive = () => {
openAlert('payment-receive-delete', { paymentReceiveId }); openAlert('payment-received-delete', { paymentReceiveId });
}; };
// Handle notify via SMS. // Handle notify via SMS.
@@ -80,7 +80,7 @@ function PaymentReceiveActionsBar({
<Button <Button
className={Classes.MINIMAL} className={Classes.MINIMAL}
icon={<Icon icon="pen-18" />} icon={<Icon icon="pen-18" />}
text={<T id={'edit_payment_receive'} />} text={<T id={'edit_payment_received'} />}
onClick={handleEditPaymentReceive} onClick={handleEditPaymentReceive}
/> />
<NavbarDivider /> <NavbarDivider />
@@ -129,4 +129,4 @@ export default compose(
withDialogActions, withDialogActions,
withDrawerActions, withDrawerActions,
withAlertsActions, withAlertsActions,
)(PaymentReceiveActionsBar); )(PaymentsReceivedActionsBar);

View File

@@ -35,13 +35,13 @@ function PaymentReceiveDetailProvider({ paymentReceiveId, ...props }) {
return ( return (
<DrawerLoading loading={isPaymentLoading}> <DrawerLoading loading={isPaymentLoading}>
<DrawerHeaderContent <DrawerHeaderContent
name={DRAWERS.PAYMENT_RECEIVE_DETAILS} name={DRAWERS.PAYMENT_RECEIVED_DETAILS}
title={intl.get('payment_receive.drawer.title', { title={intl.get('payment_received.drawer.title', {
number: paymentReceive.payment_receive_no, number: paymentReceive.payment_receive_no,
})} })}
subTitle={ subTitle={
featureCan(Features.Branches) featureCan(Features.Branches)
? intl.get('payment_receive.drawer.subtitle', { ? intl.get('payment_received.drawer.subtitle', {
value: paymentReceive.branch?.name, value: paymentReceive.branch?.name,
}) })
: null : null

View File

@@ -5,14 +5,16 @@ import {
DrawerBody, DrawerBody,
FormattedMessage as T, FormattedMessage as T,
} from '@/components'; } from '@/components';
import QuickCustomerFormDrawer from './QuickCustomerFormDrawer'; import QuickCustomerFormDrawer from './QuickCustomerFormDrawer';
import { DRAWERS } from '@/constants/drawers'; import { DRAWERS } from '@/constants/drawers';
/** /**
* Quick create/edit customer drawer. * Quick create/edit customer drawer.
*/ */
export default function QuickCreateCustomerDrawerContent({ displayName }) { export default function QuickCreateCustomerDrawerContent({
displayName,
autofillRef,
}) {
return ( return (
<React.Fragment> <React.Fragment>
<DrawerHeaderContent <DrawerHeaderContent
@@ -20,7 +22,10 @@ export default function QuickCreateCustomerDrawerContent({ displayName }) {
title={<T id={'create_a_new_customer'} />} title={<T id={'create_a_new_customer'} />}
/> />
<DrawerBody> <DrawerBody>
<QuickCustomerFormDrawer displayName={displayName} /> <QuickCustomerFormDrawer
displayName={displayName}
autofillRef={autofillRef}
/>
</DrawerBody> </DrawerBody>
</React.Fragment> </React.Fragment>
); );

View File

@@ -14,6 +14,7 @@ import CustomerFormFormik, {
import withDrawerActions from '@/containers/Drawer/withDrawerActions'; import withDrawerActions from '@/containers/Drawer/withDrawerActions';
import { DRAWERS } from '@/constants/drawers'; import { DRAWERS } from '@/constants/drawers';
import { useAddAutofillRef } from '@/hooks/state/autofill';
/** /**
* Drawer customer form loading wrapper. * Drawer customer form loading wrapper.
@@ -28,9 +29,22 @@ function DrawerCustomerFormLoading({ children }) {
/** /**
* Quick customer form of the drawer. * Quick customer form of the drawer.
*/ */
function QuickCustomerFormDrawer({ displayName, closeDrawer, customerId }) { function QuickCustomerFormDrawer({
displayName,
autofillRef,
closeDrawer,
customerId,
}) {
const addAutofillRef = useAddAutofillRef();
// Handle the form submit request success. // Handle the form submit request success.
const handleSubmitSuccess = () => { const handleSubmitSuccess = (values, formArgs, submitPayload, res) => {
if (autofillRef) {
addAutofillRef(autofillRef, {
displayName: values.display_name,
customerId: res.id,
});
}
closeDrawer(DRAWERS.QUICK_CREATE_CUSTOMER); closeDrawer(DRAWERS.QUICK_CREATE_CUSTOMER);
}; };
// Handle the form cancel action. // Handle the form cancel action.
@@ -43,7 +57,7 @@ function QuickCustomerFormDrawer({ displayName, closeDrawer, customerId }) {
<DrawerCustomerFormLoading> <DrawerCustomerFormLoading>
<CustomerFormCard> <CustomerFormCard>
<CustomerFormFormik <CustomerFormFormik
initialValues={{ display_name: displayName }} initialValues={{ first_name: displayName }}
onSubmitSuccess={handleSubmitSuccess} onSubmitSuccess={handleSubmitSuccess}
onCancel={handleCancelForm} onCancel={handleCancelForm}
/> />

View File

@@ -2,11 +2,10 @@
import React from 'react'; import React from 'react';
import { Drawer, DrawerSuspense } from '@/components'; import { Drawer, DrawerSuspense } from '@/components';
import withDrawers from '@/containers/Drawer/withDrawers'; import withDrawers from '@/containers/Drawer/withDrawers';
import { compose } from '@/utils'; import { compose } from '@/utils';
const QuickCreateCustomerDrawerContent = React.lazy(() => const QuickCreateCustomerDrawerContent = React.lazy(
import('./QuickCreateCustomerDrawerContent'), () => import('./QuickCreateCustomerDrawerContent'),
); );
/** /**
@@ -17,7 +16,7 @@ function QuickCreateCustomerDrawer({
// #withDrawer // #withDrawer
isOpen, isOpen,
payload, payload: { autofillRef, displayName },
}) { }) {
return ( return (
<Drawer <Drawer
@@ -27,7 +26,10 @@ function QuickCreateCustomerDrawer({
size={'80%'} size={'80%'}
> >
<DrawerSuspense> <DrawerSuspense>
<QuickCreateCustomerDrawerContent displayName={payload.displayName} /> <QuickCreateCustomerDrawerContent
displayName={displayName}
autofillRef={autofillRef}
/>
</DrawerSuspense> </DrawerSuspense>
</Drawer> </Drawer>
); );

View File

@@ -16,6 +16,7 @@ import withDrawerActions from '@/containers/Drawer/withDrawerActions';
import withDashboardActions from '@/containers/Dashboard/withDashboardActions'; import withDashboardActions from '@/containers/Dashboard/withDashboardActions';
import { useDrawerContext } from '@/components/Drawer/DrawerProvider'; import { useDrawerContext } from '@/components/Drawer/DrawerProvider';
import { useAddAutofillRef } from '@/hooks/state/autofill';
import { DRAWERS } from '@/constants/drawers'; import { DRAWERS } from '@/constants/drawers';
/** /**
@@ -36,17 +37,20 @@ function QuickVendorFormDrawer({
closeDrawer, closeDrawer,
vendorId, vendorId,
addQuickActionEvent, addQuickActionEvent,
autofillRef,
}) { }) {
const { payload } = useDrawerContext(); const { payload } = useDrawerContext();
const addAutofillRef = useAddAutofillRef();
// Handle the form submit request success. // Handle the form submit request success.
const handleSubmitSuccess = (values, form, submitPayload, response) => { const handleSubmitSuccess = (values, form, submitPayload, res) => {
if (!submitPayload.noRedirect) { if (!submitPayload.noRedirect) {
closeDrawer(DRAWERS.QUICK_WRITE_VENDOR); closeDrawer(DRAWERS.QUICK_WRITE_VENDOR);
} }
if (payload.quickActionEvent) { if (autofillRef) {
addQuickActionEvent(payload.quickActionEvent, { addAutofillRef(autofillRef, {
vendorId: response.data.id, displayName: values.display_name,
vendorId: res.id,
}); });
} }
}; };
@@ -60,7 +64,7 @@ function QuickVendorFormDrawer({
<DrawerVendorFormLoading> <DrawerVendorFormLoading>
<VendorFormCard> <VendorFormCard>
<VendorFormFormik <VendorFormFormik
initialValues={{ display_name: displayName }} initialValues={{ first_name: displayName }}
onSubmitSuccess={handleSubmitSuccess} onSubmitSuccess={handleSubmitSuccess}
onCancel={handleCancelForm} onCancel={handleCancelForm}
/> />

View File

@@ -12,7 +12,7 @@ import { DRAWERS } from '@/constants/drawers';
/** /**
* Quick create/edit vendor drawer. * Quick create/edit vendor drawer.
*/ */
export default function QuickWriteVendorDrawerContent({ displayName }) { export default function QuickWriteVendorDrawerContent({ displayName, autofillRef }) {
return ( return (
<React.Fragment> <React.Fragment>
<DrawerHeaderContent <DrawerHeaderContent
@@ -21,7 +21,7 @@ export default function QuickWriteVendorDrawerContent({ displayName }) {
/> />
<DrawerBody> <DrawerBody>
<QuickVendorFormDrawer displayName={displayName} /> <QuickVendorFormDrawer displayName={displayName} autofillRef={autofillRef} />
</DrawerBody> </DrawerBody>
</React.Fragment> </React.Fragment>
); );

View File

@@ -17,7 +17,7 @@ function QuickWriteVendorDrawer({
// #withDrawer // #withDrawer
isOpen, isOpen,
payload, payload: { displayName, autofillRef },
}) { }) {
return ( return (
<Drawer <Drawer
@@ -25,10 +25,9 @@ function QuickWriteVendorDrawer({
name={name} name={name}
style={{ minWidth: '700px', maxWidth: '900px' }} style={{ minWidth: '700px', maxWidth: '900px' }}
size={'80%'} size={'80%'}
payload={payload}
> >
<DrawerSuspense> <DrawerSuspense>
<QuickWriteVendorDrawerContent displayName={payload.displayName} /> <QuickWriteVendorDrawerContent displayName={displayName} autofillRef={autofillRef} />
</DrawerSuspense> </DrawerSuspense>
</Drawer> </Drawer>
); );

View File

@@ -71,7 +71,7 @@ function VendorDetailsActionsBar({
}; };
const handleNewPaymentClick = () => { const handleNewPaymentClick = () => {
history.push('/payment-mades/new'); history.push('/payments-made/new');
closeDrawer(DRAWERS.VENDOR_DETAILS); closeDrawer(DRAWERS.VENDOR_DETAILS);
}; };

Some files were not shown because too many files have changed in this diff Show More