mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-23 16:19:49 +00:00
Compare commits
47 Commits
v0.19.3
...
all-contri
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
55ba66205c | ||
|
|
291bf80135 | ||
|
|
8c89e04f54 | ||
|
|
f97b127a69 | ||
|
|
64c4d7b5a4 | ||
|
|
ea2fad648b | ||
|
|
9b8b51cb91 | ||
|
|
09b7e74d65 | ||
|
|
7137e06d99 | ||
|
|
fc29b765f7 | ||
|
|
2946475f89 | ||
|
|
d2193fdac0 | ||
|
|
ec2b7e332e | ||
|
|
a3704df6dd | ||
|
|
c3c784e52c | ||
|
|
bbcf695a6c | ||
|
|
038d4dd5a7 | ||
|
|
961e4b99e8 | ||
|
|
9991eebaaf | ||
|
|
cd90fede54 | ||
|
|
a2d28648bd | ||
|
|
3097d05eda | ||
|
|
ff94d8d9b2 | ||
|
|
79cc09fad9 | ||
|
|
c1b29c3f23 | ||
|
|
cf4bb3007e | ||
|
|
193a86cf30 | ||
|
|
7a81f14eb2 | ||
|
|
14d1f0bd1d | ||
|
|
82f8648c59 | ||
|
|
c928940d32 | ||
|
|
0a78d56015 | ||
|
|
1a5716873e | ||
|
|
01b7c86ab9 | ||
|
|
0ca209b195 | ||
|
|
be6f6e3c73 | ||
|
|
cb016be78c | ||
|
|
fc085f2328 | ||
|
|
9a34f3e283 | ||
|
|
7054e862d5 | ||
|
|
faa81abee4 | ||
|
|
6d01f2a323 | ||
|
|
72678bb936 | ||
|
|
9ae5644af9 | ||
|
|
e8830c5911 | ||
|
|
7699889bd6 | ||
|
|
35a061d188 |
@@ -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,
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import { Inject, Service } from 'typedi';
|
import { Inject, Service } from 'typedi';
|
||||||
import { NextFunction, Request, Response, Router } from 'express';
|
import { NextFunction, Request, Response, Router } from 'express';
|
||||||
|
import { param, query } from 'express-validator';
|
||||||
import BaseController from '@/api/controllers/BaseController';
|
import BaseController from '@/api/controllers/BaseController';
|
||||||
import { GetBankAccountSummary } from '@/services/Banking/BankAccounts/GetBankAccountSummary';
|
import { GetBankAccountSummary } from '@/services/Banking/BankAccounts/GetBankAccountSummary';
|
||||||
import { BankAccountsApplication } from '@/services/Banking/BankAccounts/BankAccountsApplication';
|
import { BankAccountsApplication } from '@/services/Banking/BankAccounts/BankAccountsApplication';
|
||||||
import { param } from 'express-validator';
|
import { GetPendingBankAccountTransactions } from '@/services/Cashflow/GetPendingBankAccountTransaction';
|
||||||
|
|
||||||
@Service()
|
@Service()
|
||||||
export class BankAccountsController extends BaseController {
|
export class BankAccountsController extends BaseController {
|
||||||
@@ -13,6 +14,9 @@ export class BankAccountsController extends BaseController {
|
|||||||
@Inject()
|
@Inject()
|
||||||
private bankAccountsApp: BankAccountsApplication;
|
private bankAccountsApp: BankAccountsApplication;
|
||||||
|
|
||||||
|
@Inject()
|
||||||
|
private getPendingTransactionsService: GetPendingBankAccountTransactions;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Router constructor.
|
* Router constructor.
|
||||||
*/
|
*/
|
||||||
@@ -20,6 +24,16 @@ export class BankAccountsController extends BaseController {
|
|||||||
const router = Router();
|
const router = Router();
|
||||||
|
|
||||||
router.get('/:bankAccountId/meta', this.getBankAccountSummary.bind(this));
|
router.get('/:bankAccountId/meta', this.getBankAccountSummary.bind(this));
|
||||||
|
router.get(
|
||||||
|
'/pending_transactions',
|
||||||
|
[
|
||||||
|
query('account_id').optional().isNumeric().toInt(),
|
||||||
|
query('page').optional().isNumeric().toInt(),
|
||||||
|
query('page_size').optional().isNumeric().toInt(),
|
||||||
|
],
|
||||||
|
this.validationResult,
|
||||||
|
this.getBankAccountsPendingTransactions.bind(this)
|
||||||
|
);
|
||||||
router.post(
|
router.post(
|
||||||
'/:bankAccountId/disconnect',
|
'/:bankAccountId/disconnect',
|
||||||
this.disconnectBankAccount.bind(this)
|
this.disconnectBankAccount.bind(this)
|
||||||
@@ -27,17 +41,13 @@ export class BankAccountsController extends BaseController {
|
|||||||
router.post('/:bankAccountId/update', this.refreshBankAccount.bind(this));
|
router.post('/:bankAccountId/update', this.refreshBankAccount.bind(this));
|
||||||
router.post(
|
router.post(
|
||||||
'/:bankAccountId/pause_feeds',
|
'/:bankAccountId/pause_feeds',
|
||||||
[
|
[param('bankAccountId').exists().isNumeric().toInt()],
|
||||||
param('bankAccountId').exists().isNumeric().toInt(),
|
|
||||||
],
|
|
||||||
this.validationResult,
|
this.validationResult,
|
||||||
this.pauseBankAccountFeeds.bind(this)
|
this.pauseBankAccountFeeds.bind(this)
|
||||||
);
|
);
|
||||||
router.post(
|
router.post(
|
||||||
'/:bankAccountId/resume_feeds',
|
'/:bankAccountId/resume_feeds',
|
||||||
[
|
[param('bankAccountId').exists().isNumeric().toInt()],
|
||||||
param('bankAccountId').exists().isNumeric().toInt(),
|
|
||||||
],
|
|
||||||
this.validationResult,
|
this.validationResult,
|
||||||
this.resumeBankAccountFeeds.bind(this)
|
this.resumeBankAccountFeeds.bind(this)
|
||||||
);
|
);
|
||||||
@@ -72,6 +82,32 @@ export class BankAccountsController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the bank account pending transactions.
|
||||||
|
* @param {Request} req
|
||||||
|
* @param {Response} res
|
||||||
|
* @param {NextFunction} next
|
||||||
|
*/
|
||||||
|
async getBankAccountsPendingTransactions(
|
||||||
|
req: Request,
|
||||||
|
res: Response,
|
||||||
|
next: NextFunction
|
||||||
|
) {
|
||||||
|
const { tenantId } = req;
|
||||||
|
const query = this.matchedQueryData(req);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const data =
|
||||||
|
await this.getPendingTransactionsService.getPendingTransactions(
|
||||||
|
tenantId,
|
||||||
|
query
|
||||||
|
);
|
||||||
|
return res.status(200).send(data);
|
||||||
|
} catch (error) {
|
||||||
|
next(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disonnect the given bank account.
|
* Disonnect the given bank account.
|
||||||
* @param {Request} req
|
* @param {Request} req
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Service, Inject } from 'typedi';
|
import { Service, Inject } from 'typedi';
|
||||||
import { ValidationChain, check, param, query } from 'express-validator';
|
import { ValidationChain, body, check, param, query } from 'express-validator';
|
||||||
import { Router, Request, Response, NextFunction } from 'express';
|
import { Router, Request, Response, NextFunction } from 'express';
|
||||||
import { omit } from 'lodash';
|
import { omit } from 'lodash';
|
||||||
import BaseController from '../BaseController';
|
import BaseController from '../BaseController';
|
||||||
@@ -43,6 +43,16 @@ export default class NewCashflowTransactionController extends BaseController {
|
|||||||
this.asyncMiddleware(this.newCashflowTransaction),
|
this.asyncMiddleware(this.newCashflowTransaction),
|
||||||
this.catchServiceErrors
|
this.catchServiceErrors
|
||||||
);
|
);
|
||||||
|
router.post(
|
||||||
|
'/transactions/uncategorize/bulk',
|
||||||
|
[
|
||||||
|
body('ids').isArray({ min: 1 }),
|
||||||
|
body('ids.*').exists().isNumeric().toInt(),
|
||||||
|
],
|
||||||
|
this.validationResult,
|
||||||
|
this.uncategorizeBulkTransactions.bind(this),
|
||||||
|
this.catchServiceErrors
|
||||||
|
);
|
||||||
router.post(
|
router.post(
|
||||||
'/transactions/:id/uncategorize',
|
'/transactions/:id/uncategorize',
|
||||||
this.revertCategorizedCashflowTransaction,
|
this.revertCategorizedCashflowTransaction,
|
||||||
@@ -184,6 +194,34 @@ export default class NewCashflowTransactionController extends BaseController {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uncategorize the given transactions in bulk.
|
||||||
|
* @param {Request<{}>} req
|
||||||
|
* @param {Response} res
|
||||||
|
* @param {NextFunction} next
|
||||||
|
* @returns {Promise<Response | null>}
|
||||||
|
*/
|
||||||
|
private uncategorizeBulkTransactions = async (
|
||||||
|
req: Request<{}>,
|
||||||
|
res: Response,
|
||||||
|
next: NextFunction
|
||||||
|
) => {
|
||||||
|
const { tenantId } = req;
|
||||||
|
const { ids: uncategorizedTransactionIds } = this.matchedBodyData(req);
|
||||||
|
|
||||||
|
try {
|
||||||
|
await this.cashflowApplication.uncategorizeTransactions(
|
||||||
|
tenantId,
|
||||||
|
uncategorizedTransactionIds
|
||||||
|
);
|
||||||
|
return res.status(200).send({
|
||||||
|
message: 'The given transactions have been uncategorized successfully.',
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
next(error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Categorize the cashflow transaction.
|
* Categorize the cashflow transaction.
|
||||||
* @param {Request} req
|
* @param {Request} req
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
exports.up = function (knex) {
|
||||||
|
return knex.schema.table('uncategorized_cashflow_transactions', (table) => {
|
||||||
|
table.boolean('pending').defaultTo(false);
|
||||||
|
table.string('pending_plaid_transaction_id').nullable();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.down = function (knex) {
|
||||||
|
return knex.schema.table('uncategorized_cashflow_transactions', (table) => {
|
||||||
|
table.dropColumn('pending');
|
||||||
|
table.dropColumn('pending_plaid_transaction_id');
|
||||||
|
});
|
||||||
|
};
|
||||||
@@ -268,6 +268,8 @@ export interface CreateUncategorizedTransactionDTO {
|
|||||||
description?: string;
|
description?: string;
|
||||||
referenceNo?: string | null;
|
referenceNo?: string | null;
|
||||||
plaidTransactionId?: string | null;
|
plaidTransactionId?: string | null;
|
||||||
|
pending?: boolean;
|
||||||
|
pendingPlaidTransactionId?: string | null;
|
||||||
batch?: string;
|
batch?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -283,3 +285,17 @@ export interface IUncategorizedTransactionCreatedEventPayload {
|
|||||||
createUncategorizedTransactionDTO: CreateUncategorizedTransactionDTO;
|
createUncategorizedTransactionDTO: CreateUncategorizedTransactionDTO;
|
||||||
trx: Knex.Transaction;
|
trx: Knex.Transaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IPendingTransactionRemovingEventPayload {
|
||||||
|
tenantId: number;
|
||||||
|
uncategorizedTransactionId: number;
|
||||||
|
pendingTransaction: IUncategorizedCashflowTransaction;
|
||||||
|
trx?: Knex.Transaction;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IPendingTransactionRemovedEventPayload {
|
||||||
|
tenantId: number;
|
||||||
|
uncategorizedTransactionId: number;
|
||||||
|
pendingTransaction: IUncategorizedCashflowTransaction;
|
||||||
|
trx?: Knex.Transaction;
|
||||||
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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';
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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, [
|
||||||
|
|||||||
@@ -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, [
|
||||||
|
|||||||
69
packages/server/src/models/TaxRate.settings.ts
Normal file
69
packages/server/src/models/TaxRate.settings.ts
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
export default {
|
||||||
|
defaultSort: {
|
||||||
|
sortOrder: 'DESC',
|
||||||
|
sortField: 'created_at',
|
||||||
|
},
|
||||||
|
exportable: true,
|
||||||
|
importable: true,
|
||||||
|
print: {
|
||||||
|
pageTitle: 'Tax Rates',
|
||||||
|
},
|
||||||
|
columns: {
|
||||||
|
name: {
|
||||||
|
name: 'Tax Rate Name',
|
||||||
|
type: 'text',
|
||||||
|
accessor: 'name',
|
||||||
|
},
|
||||||
|
code: {
|
||||||
|
name: 'Code',
|
||||||
|
type: 'text',
|
||||||
|
accessor: 'code',
|
||||||
|
},
|
||||||
|
rate: {
|
||||||
|
name: 'Rate',
|
||||||
|
type: 'text',
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
name: 'Description',
|
||||||
|
type: 'text',
|
||||||
|
},
|
||||||
|
isNonRecoverable: {
|
||||||
|
name: 'Is Non Recoverable',
|
||||||
|
type: 'boolean',
|
||||||
|
},
|
||||||
|
active: {
|
||||||
|
name: 'Active',
|
||||||
|
type: 'boolean',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
field: {},
|
||||||
|
fields2: {
|
||||||
|
name: {
|
||||||
|
name: 'Tax name',
|
||||||
|
fieldType: 'name',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
code: {
|
||||||
|
name: 'Code',
|
||||||
|
fieldType: 'code',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
rate: {
|
||||||
|
name: 'Rate',
|
||||||
|
fieldType: 'number',
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
name: 'Description',
|
||||||
|
fieldType: 'text',
|
||||||
|
},
|
||||||
|
isNonRecoverable: {
|
||||||
|
name: 'Is Non Recoverable',
|
||||||
|
fieldType: 'boolean',
|
||||||
|
},
|
||||||
|
active: {
|
||||||
|
name: 'Active',
|
||||||
|
fieldType: 'boolean',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -2,8 +2,13 @@ import { mixin, Model, raw } from 'objection';
|
|||||||
import TenantModel from 'models/TenantModel';
|
import TenantModel from 'models/TenantModel';
|
||||||
import ModelSearchable from './ModelSearchable';
|
import ModelSearchable from './ModelSearchable';
|
||||||
import SoftDeleteQueryBuilder from '@/collection/SoftDeleteQueryBuilder';
|
import SoftDeleteQueryBuilder from '@/collection/SoftDeleteQueryBuilder';
|
||||||
|
import TaxRateMeta from './TaxRate.settings';
|
||||||
|
import ModelSetting from './ModelSetting';
|
||||||
|
|
||||||
export default class TaxRate extends mixin(TenantModel, [ModelSearchable]) {
|
export default class TaxRate extends mixin(TenantModel, [
|
||||||
|
ModelSetting,
|
||||||
|
ModelSearchable,
|
||||||
|
]) {
|
||||||
/**
|
/**
|
||||||
* Table name
|
* Table name
|
||||||
*/
|
*/
|
||||||
@@ -25,6 +30,13 @@ export default class TaxRate extends mixin(TenantModel, [ModelSearchable]) {
|
|||||||
return ['createdAt', 'updatedAt'];
|
return ['createdAt', 'updatedAt'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the tax rate meta.
|
||||||
|
*/
|
||||||
|
static get meta() {
|
||||||
|
return TaxRateMeta;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Virtual attributes.
|
* Virtual attributes.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ export default class UncategorizedCashflowTransaction extends mixin(
|
|||||||
plaidTransactionId!: string;
|
plaidTransactionId!: string;
|
||||||
recognizedTransactionId!: number;
|
recognizedTransactionId!: number;
|
||||||
excludedAt: Date;
|
excludedAt: Date;
|
||||||
|
pending: boolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Table name.
|
* Table name.
|
||||||
@@ -46,7 +47,8 @@ export default class UncategorizedCashflowTransaction extends mixin(
|
|||||||
'isDepositTransaction',
|
'isDepositTransaction',
|
||||||
'isWithdrawalTransaction',
|
'isWithdrawalTransaction',
|
||||||
'isRecognized',
|
'isRecognized',
|
||||||
'isExcluded'
|
'isExcluded',
|
||||||
|
'isPending',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,6 +101,14 @@ export default class UncategorizedCashflowTransaction extends mixin(
|
|||||||
return !!this.excludedAt;
|
return !!this.excludedAt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Detarmines whether the transaction is pending.
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
public get isPending(): boolean {
|
||||||
|
return !!this.pending;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Model modifiers.
|
* Model modifiers.
|
||||||
*/
|
*/
|
||||||
@@ -143,6 +153,20 @@ export default class UncategorizedCashflowTransaction extends mixin(
|
|||||||
query.whereNull('categorizeRefType');
|
query.whereNull('categorizeRefType');
|
||||||
query.whereNull('categorizeRefId');
|
query.whereNull('categorizeRefId');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filters the not pending transactions.
|
||||||
|
*/
|
||||||
|
notPending(query) {
|
||||||
|
query.where('pending', false);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filters the pending transactions.
|
||||||
|
*/
|
||||||
|
pending(query) {
|
||||||
|
query.where('pending', true);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -52,6 +52,9 @@ export class GetBankAccountSummary {
|
|||||||
q.withGraphJoined('matchedBankTransactions');
|
q.withGraphJoined('matchedBankTransactions');
|
||||||
q.whereNull('matchedBankTransactions.id');
|
q.whereNull('matchedBankTransactions.id');
|
||||||
|
|
||||||
|
// Exclude the pending transactions.
|
||||||
|
q.modify('notPending');
|
||||||
|
|
||||||
// Count the results.
|
// Count the results.
|
||||||
q.count('uncategorized_cashflow_transactions.id as total');
|
q.count('uncategorized_cashflow_transactions.id as total');
|
||||||
q.first();
|
q.first();
|
||||||
@@ -65,16 +68,32 @@ export class GetBankAccountSummary {
|
|||||||
q.withGraphJoined('recognizedTransaction');
|
q.withGraphJoined('recognizedTransaction');
|
||||||
q.whereNotNull('recognizedTransaction.id');
|
q.whereNotNull('recognizedTransaction.id');
|
||||||
|
|
||||||
|
// Exclude the pending transactions.
|
||||||
|
q.modify('notPending');
|
||||||
|
|
||||||
// Count the results.
|
// Count the results.
|
||||||
q.count('uncategorized_cashflow_transactions.id as total');
|
q.count('uncategorized_cashflow_transactions.id as total');
|
||||||
q.first();
|
q.first();
|
||||||
});
|
});
|
||||||
|
// Retrieves excluded transactions count.
|
||||||
const excludedTransactionsCount =
|
const excludedTransactionsCount =
|
||||||
await UncategorizedCashflowTransaction.query().onBuild((q) => {
|
await UncategorizedCashflowTransaction.query().onBuild((q) => {
|
||||||
q.where('accountId', bankAccountId);
|
q.where('accountId', bankAccountId);
|
||||||
q.modify('excluded');
|
q.modify('excluded');
|
||||||
|
|
||||||
|
// Exclude the pending transactions.
|
||||||
|
q.modify('notPending');
|
||||||
|
|
||||||
|
// Count the results.
|
||||||
|
q.count('uncategorized_cashflow_transactions.id as total');
|
||||||
|
q.first();
|
||||||
|
});
|
||||||
|
// Retrieves the pending transactions count.
|
||||||
|
const pendingTransactionsCount =
|
||||||
|
await UncategorizedCashflowTransaction.query().onBuild((q) => {
|
||||||
|
q.where('accountId', bankAccountId);
|
||||||
|
q.modify('pending');
|
||||||
|
|
||||||
// Count the results.
|
// Count the results.
|
||||||
q.count('uncategorized_cashflow_transactions.id as total');
|
q.count('uncategorized_cashflow_transactions.id as total');
|
||||||
q.first();
|
q.first();
|
||||||
@@ -83,14 +102,15 @@ export class GetBankAccountSummary {
|
|||||||
const totalUncategorizedTransactions =
|
const totalUncategorizedTransactions =
|
||||||
uncategorizedTranasctionsCount?.total || 0;
|
uncategorizedTranasctionsCount?.total || 0;
|
||||||
const totalRecognizedTransactions = recognizedTransactionsCount?.total || 0;
|
const totalRecognizedTransactions = recognizedTransactionsCount?.total || 0;
|
||||||
|
|
||||||
const totalExcludedTransactions = excludedTransactionsCount?.total || 0;
|
const totalExcludedTransactions = excludedTransactionsCount?.total || 0;
|
||||||
|
const totalPendingTransactions = pendingTransactionsCount?.total || 0;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
name: bankAccount.name,
|
name: bankAccount.name,
|
||||||
totalUncategorizedTransactions,
|
totalUncategorizedTransactions,
|
||||||
totalRecognizedTransactions,
|
totalRecognizedTransactions,
|
||||||
totalExcludedTransactions,
|
totalExcludedTransactions,
|
||||||
|
totalPendingTransactions,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ export class GetMatchedTransactions {
|
|||||||
.whereIn('id', uncategorizedTransactionIds)
|
.whereIn('id', uncategorizedTransactionIds)
|
||||||
.throwIfNotFound();
|
.throwIfNotFound();
|
||||||
|
|
||||||
const totalPending = Math.abs(sumBy(uncategorizedTransactions, 'amount'));
|
const totalPending = sumBy(uncategorizedTransactions, 'amount');
|
||||||
|
|
||||||
const filtered = filter.transactionType
|
const filtered = filter.transactionType
|
||||||
? this.registered.filter((item) => item.type === filter.transactionType)
|
? this.registered.filter((item) => item.type === filter.transactionType)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import { Knex } from 'knex';
|
|||||||
import uniqid from 'uniqid';
|
import uniqid from 'uniqid';
|
||||||
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
|
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
|
||||||
import events from '@/subscribers/events';
|
import events from '@/subscribers/events';
|
||||||
|
import { RemovePendingUncategorizedTransaction } from '@/services/Cashflow/RemovePendingUncategorizedTransaction';
|
||||||
|
|
||||||
const CONCURRENCY_ASYNC = 10;
|
const CONCURRENCY_ASYNC = 10;
|
||||||
|
|
||||||
@@ -40,7 +41,7 @@ export class PlaidSyncDb {
|
|||||||
private cashflowApp: CashflowApplication;
|
private cashflowApp: CashflowApplication;
|
||||||
|
|
||||||
@Inject()
|
@Inject()
|
||||||
private deleteCashflowTransactionService: DeleteCashflowTransaction;
|
private removePendingTransaction: RemovePendingUncategorizedTransaction;
|
||||||
|
|
||||||
@Inject()
|
@Inject()
|
||||||
private eventPublisher: EventPublisher;
|
private eventPublisher: EventPublisher;
|
||||||
@@ -185,21 +186,22 @@ export class PlaidSyncDb {
|
|||||||
plaidTransactionsIds: string[],
|
plaidTransactionsIds: string[],
|
||||||
trx?: Knex.Transaction
|
trx?: Knex.Transaction
|
||||||
) {
|
) {
|
||||||
const { CashflowTransaction } = this.tenancy.models(tenantId);
|
const { UncategorizedCashflowTransaction } = this.tenancy.models(tenantId);
|
||||||
|
|
||||||
const cashflowTransactions = await CashflowTransaction.query(trx).whereIn(
|
const uncategorizedTransactions =
|
||||||
'plaidTransactionId',
|
await UncategorizedCashflowTransaction.query(trx).whereIn(
|
||||||
plaidTransactionsIds
|
'plaidTransactionId',
|
||||||
);
|
plaidTransactionsIds
|
||||||
const cashflowTransactionsIds = cashflowTransactions.map(
|
);
|
||||||
|
const uncategorizedTransactionsIds = uncategorizedTransactions.map(
|
||||||
(trans) => trans.id
|
(trans) => trans.id
|
||||||
);
|
);
|
||||||
await bluebird.map(
|
await bluebird.map(
|
||||||
cashflowTransactionsIds,
|
uncategorizedTransactionsIds,
|
||||||
(transactionId: number) =>
|
(uncategorizedTransactionId: number) =>
|
||||||
this.deleteCashflowTransactionService.deleteCashflowTransaction(
|
this.removePendingTransaction.removePendingTransaction(
|
||||||
tenantId,
|
tenantId,
|
||||||
transactionId,
|
uncategorizedTransactionId,
|
||||||
trx
|
trx
|
||||||
),
|
),
|
||||||
{ concurrency: CONCURRENCY_ASYNC }
|
{ concurrency: CONCURRENCY_ASYNC }
|
||||||
|
|||||||
@@ -73,6 +73,12 @@ export class PlaidUpdateTransactions {
|
|||||||
item,
|
item,
|
||||||
trx
|
trx
|
||||||
);
|
);
|
||||||
|
// Sync removed transactions.
|
||||||
|
await this.plaidSync.syncRemoveTransactions(
|
||||||
|
tenantId,
|
||||||
|
removed?.map((r) => r.transaction_id),
|
||||||
|
trx
|
||||||
|
);
|
||||||
// Sync bank account transactions.
|
// Sync bank account transactions.
|
||||||
await this.plaidSync.syncAccountsTransactions(
|
await this.plaidSync.syncAccountsTransactions(
|
||||||
tenantId,
|
tenantId,
|
||||||
|
|||||||
@@ -3,11 +3,11 @@ import {
|
|||||||
Item as PlaidItem,
|
Item as PlaidItem,
|
||||||
Institution as PlaidInstitution,
|
Institution as PlaidInstitution,
|
||||||
AccountBase as PlaidAccount,
|
AccountBase as PlaidAccount,
|
||||||
|
TransactionBase as PlaidTransactionBase,
|
||||||
} from 'plaid';
|
} from 'plaid';
|
||||||
import {
|
import {
|
||||||
CreateUncategorizedTransactionDTO,
|
CreateUncategorizedTransactionDTO,
|
||||||
IAccountCreateDTO,
|
IAccountCreateDTO,
|
||||||
PlaidTransaction,
|
|
||||||
} from '@/interfaces';
|
} from '@/interfaces';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -48,7 +48,7 @@ export const transformPlaidAccountToCreateAccount = R.curry(
|
|||||||
export const transformPlaidTrxsToCashflowCreate = R.curry(
|
export const transformPlaidTrxsToCashflowCreate = R.curry(
|
||||||
(
|
(
|
||||||
cashflowAccountId: number,
|
cashflowAccountId: number,
|
||||||
plaidTranasction: PlaidTransaction
|
plaidTranasction: PlaidTransactionBase
|
||||||
): CreateUncategorizedTransactionDTO => {
|
): CreateUncategorizedTransactionDTO => {
|
||||||
return {
|
return {
|
||||||
date: plaidTranasction.date,
|
date: plaidTranasction.date,
|
||||||
@@ -64,6 +64,8 @@ export const transformPlaidTrxsToCashflowCreate = R.curry(
|
|||||||
accountId: cashflowAccountId,
|
accountId: cashflowAccountId,
|
||||||
referenceNo: plaidTranasction.payment_meta?.reference_number,
|
referenceNo: plaidTranasction.payment_meta?.reference_number,
|
||||||
plaidTransactionId: plaidTranasction.transaction_id,
|
plaidTransactionId: plaidTranasction.transaction_id,
|
||||||
|
pending: plaidTranasction.pending,
|
||||||
|
pendingPlaidTransactionId: plaidTranasction.pending_transaction_id,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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';
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import GetCashflowAccountsService from './GetCashflowAccountsService';
|
|||||||
import { GetCashflowTransactionService } from './GetCashflowTransactionsService';
|
import { GetCashflowTransactionService } from './GetCashflowTransactionsService';
|
||||||
import { GetRecognizedTransactionsService } from './GetRecongizedTransactions';
|
import { GetRecognizedTransactionsService } from './GetRecongizedTransactions';
|
||||||
import { GetRecognizedTransactionService } from './GetRecognizedTransaction';
|
import { GetRecognizedTransactionService } from './GetRecognizedTransaction';
|
||||||
|
import { UncategorizeCashflowTransactionsBulk } from './UncategorizeCashflowTransactionsBulk';
|
||||||
|
|
||||||
@Service()
|
@Service()
|
||||||
export class CashflowApplication {
|
export class CashflowApplication {
|
||||||
@@ -39,6 +40,9 @@ export class CashflowApplication {
|
|||||||
@Inject()
|
@Inject()
|
||||||
private uncategorizeTransactionService: UncategorizeCashflowTransaction;
|
private uncategorizeTransactionService: UncategorizeCashflowTransaction;
|
||||||
|
|
||||||
|
@Inject()
|
||||||
|
private uncategorizeTransasctionsService: UncategorizeCashflowTransactionsBulk;
|
||||||
|
|
||||||
@Inject()
|
@Inject()
|
||||||
private categorizeTransactionService: CategorizeCashflowTransaction;
|
private categorizeTransactionService: CategorizeCashflowTransaction;
|
||||||
|
|
||||||
@@ -155,6 +159,22 @@ export class CashflowApplication {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uncategorize the given transactions in bulk.
|
||||||
|
* @param {number} tenantId
|
||||||
|
* @param {number | Array<number>} transactionId
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
public uncategorizeTransactions(
|
||||||
|
tenantId: number,
|
||||||
|
transactionId: number | Array<number>
|
||||||
|
) {
|
||||||
|
return this.uncategorizeTransasctionsService.uncategorizeBulk(
|
||||||
|
tenantId,
|
||||||
|
transactionId
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Categorize the given cashflow transaction.
|
* Categorize the given cashflow transaction.
|
||||||
* @param {number} tenantId
|
* @param {number} tenantId
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
import { Inject } from 'typedi';
|
||||||
|
import { TransformerInjectable } from '@/lib/Transformer/TransformerInjectable';
|
||||||
|
import HasTenancyService from '../Tenancy/TenancyService';
|
||||||
|
import { GetPendingBankAccountTransactionTransformer } from './GetPendingBankAccountTransactionTransformer';
|
||||||
|
|
||||||
|
export class GetPendingBankAccountTransactions {
|
||||||
|
@Inject()
|
||||||
|
private tenancy: HasTenancyService;
|
||||||
|
|
||||||
|
@Inject()
|
||||||
|
private transformer: TransformerInjectable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the given bank accounts pending transaction.
|
||||||
|
* @param {number} tenantId - Tenant id.
|
||||||
|
* @param {GetPendingTransactionsQuery} filter - Pending transactions query.
|
||||||
|
*/
|
||||||
|
async getPendingTransactions(
|
||||||
|
tenantId: number,
|
||||||
|
filter?: GetPendingTransactionsQuery
|
||||||
|
) {
|
||||||
|
const { UncategorizedCashflowTransaction } = this.tenancy.models(tenantId);
|
||||||
|
|
||||||
|
const _filter = {
|
||||||
|
page: 1,
|
||||||
|
pageSize: 20,
|
||||||
|
...filter,
|
||||||
|
};
|
||||||
|
const { results, pagination } =
|
||||||
|
await UncategorizedCashflowTransaction.query()
|
||||||
|
.onBuild((q) => {
|
||||||
|
q.modify('pending');
|
||||||
|
|
||||||
|
if (_filter?.accountId) {
|
||||||
|
q.where('accountId', _filter.accountId);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.pagination(_filter.page - 1, _filter.pageSize);
|
||||||
|
|
||||||
|
const data = await this.transformer.transform(
|
||||||
|
tenantId,
|
||||||
|
results,
|
||||||
|
new GetPendingBankAccountTransactionTransformer()
|
||||||
|
);
|
||||||
|
return { data, pagination };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface GetPendingTransactionsQuery {
|
||||||
|
page?: number;
|
||||||
|
pageSize?: number;
|
||||||
|
accountId?: number;
|
||||||
|
}
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
import { Transformer } from '@/lib/Transformer/Transformer';
|
||||||
|
import { formatNumber } from '@/utils';
|
||||||
|
|
||||||
|
export class GetPendingBankAccountTransactionTransformer extends Transformer {
|
||||||
|
/**
|
||||||
|
* Include these attributes to sale invoice object.
|
||||||
|
* @returns {string[]}
|
||||||
|
*/
|
||||||
|
public includeAttributes = (): string[] => {
|
||||||
|
return [
|
||||||
|
'formattedAmount',
|
||||||
|
'formattedDate',
|
||||||
|
'formattedDepositAmount',
|
||||||
|
'formattedWithdrawalAmount',
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exclude all attributes.
|
||||||
|
* @returns {Array<string>}
|
||||||
|
*/
|
||||||
|
public excludeAttributes = (): string[] => {
|
||||||
|
return [];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formattes the transaction date.
|
||||||
|
* @param transaction
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
public formattedDate(transaction) {
|
||||||
|
return this.formatDate(transaction.date);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formatted amount.
|
||||||
|
* @param transaction
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
public formattedAmount(transaction) {
|
||||||
|
return formatNumber(transaction.amount, {
|
||||||
|
currencyCode: transaction.currencyCode,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formatted deposit amount.
|
||||||
|
* @param transaction
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
protected formattedDepositAmount(transaction) {
|
||||||
|
if (transaction.isDepositTransaction) {
|
||||||
|
return formatNumber(transaction.deposit, {
|
||||||
|
currencyCode: transaction.currencyCode,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formatted withdrawal amount.
|
||||||
|
* @param transaction
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
protected formattedWithdrawalAmount(transaction) {
|
||||||
|
if (transaction.isWithdrawalTransaction) {
|
||||||
|
return formatNumber(transaction.withdrawal, {
|
||||||
|
currencyCode: transaction.currencyCode,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -34,8 +34,13 @@ export class GetRecognizedTransactionsService {
|
|||||||
q.withGraphFetched('recognizedTransaction.assignAccount');
|
q.withGraphFetched('recognizedTransaction.assignAccount');
|
||||||
q.withGraphFetched('recognizedTransaction.bankRule');
|
q.withGraphFetched('recognizedTransaction.bankRule');
|
||||||
q.whereNotNull('recognizedTransactionId');
|
q.whereNotNull('recognizedTransactionId');
|
||||||
|
|
||||||
|
// Exclude the excluded transactions.
|
||||||
q.modify('notExcluded');
|
q.modify('notExcluded');
|
||||||
|
|
||||||
|
// Exclude the pending transactions.
|
||||||
|
q.modify('notPending');
|
||||||
|
|
||||||
if (_filter.accountId) {
|
if (_filter.accountId) {
|
||||||
q.where('accountId', _filter.accountId);
|
q.where('accountId', _filter.accountId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,9 @@ export class GetUncategorizedTransactions {
|
|||||||
.onBuild((q) => {
|
.onBuild((q) => {
|
||||||
q.where('accountId', accountId);
|
q.where('accountId', accountId);
|
||||||
q.where('categorized', false);
|
q.where('categorized', false);
|
||||||
|
|
||||||
q.modify('notExcluded');
|
q.modify('notExcluded');
|
||||||
|
q.modify('notPending');
|
||||||
|
|
||||||
q.withGraphFetched('account');
|
q.withGraphFetched('account');
|
||||||
q.withGraphFetched('recognizedTransaction.assignAccount');
|
q.withGraphFetched('recognizedTransaction.assignAccount');
|
||||||
|
|||||||
@@ -0,0 +1,72 @@
|
|||||||
|
import { Knex } from 'knex';
|
||||||
|
import { Inject, Service } from 'typedi';
|
||||||
|
import HasTenancyService from '../Tenancy/TenancyService';
|
||||||
|
import UnitOfWork from '../UnitOfWork';
|
||||||
|
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
|
||||||
|
import events from '@/subscribers/events';
|
||||||
|
import { ServiceError } from '@/exceptions';
|
||||||
|
import { ERRORS } from './constants';
|
||||||
|
import {
|
||||||
|
IPendingTransactionRemovedEventPayload,
|
||||||
|
IPendingTransactionRemovingEventPayload,
|
||||||
|
} from '@/interfaces';
|
||||||
|
|
||||||
|
@Service()
|
||||||
|
export class RemovePendingUncategorizedTransaction {
|
||||||
|
@Inject()
|
||||||
|
private tenancy: HasTenancyService;
|
||||||
|
|
||||||
|
@Inject()
|
||||||
|
private uow: UnitOfWork;
|
||||||
|
|
||||||
|
@Inject()
|
||||||
|
private eventPublisher: EventPublisher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* REmoves the pending uncategorized transaction.
|
||||||
|
* @param {number} tenantId -
|
||||||
|
* @param {number} uncategorizedTransactionId -
|
||||||
|
* @param {Knex.Transaction} trx -
|
||||||
|
* @returns {Promise<void>}
|
||||||
|
*/
|
||||||
|
public async removePendingTransaction(
|
||||||
|
tenantId: number,
|
||||||
|
uncategorizedTransactionId: number,
|
||||||
|
trx?: Knex.Transaction
|
||||||
|
): Promise<void> {
|
||||||
|
const { UncategorizedCashflowTransaction } = this.tenancy.models(tenantId);
|
||||||
|
|
||||||
|
const pendingTransaction = await UncategorizedCashflowTransaction.query(trx)
|
||||||
|
.findById(uncategorizedTransactionId)
|
||||||
|
.throwIfNotFound();
|
||||||
|
|
||||||
|
if (!pendingTransaction.isPending) {
|
||||||
|
throw new ServiceError(ERRORS.TRANSACTION_NOT_PENDING);
|
||||||
|
}
|
||||||
|
return this.uow.withTransaction(tenantId, async (trx: Knex.Transaction) => {
|
||||||
|
await this.eventPublisher.emitAsync(
|
||||||
|
events.bankTransactions.onPendingRemoving,
|
||||||
|
{
|
||||||
|
tenantId,
|
||||||
|
uncategorizedTransactionId,
|
||||||
|
pendingTransaction,
|
||||||
|
trx,
|
||||||
|
} as IPendingTransactionRemovingEventPayload
|
||||||
|
);
|
||||||
|
// Removes the pending uncategorized transaction.
|
||||||
|
await UncategorizedCashflowTransaction.query(trx)
|
||||||
|
.findById(uncategorizedTransactionId)
|
||||||
|
.delete();
|
||||||
|
|
||||||
|
await this.eventPublisher.emitAsync(
|
||||||
|
events.bankTransactions.onPendingRemoved,
|
||||||
|
{
|
||||||
|
tenantId,
|
||||||
|
uncategorizedTransactionId,
|
||||||
|
pendingTransaction,
|
||||||
|
trx,
|
||||||
|
} as IPendingTransactionRemovedEventPayload
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import PromisePool from '@supercharge/promise-pool';
|
||||||
|
import { castArray } from 'lodash';
|
||||||
|
import { Service, Inject } from 'typedi';
|
||||||
|
import HasTenancyService from '../Tenancy/TenancyService';
|
||||||
|
import { UncategorizeCashflowTransaction } from './UncategorizeCashflowTransaction';
|
||||||
|
|
||||||
|
@Service()
|
||||||
|
export class UncategorizeCashflowTransactionsBulk {
|
||||||
|
@Inject()
|
||||||
|
private tenancy: HasTenancyService;
|
||||||
|
|
||||||
|
@Inject()
|
||||||
|
private uncategorizeTransaction: UncategorizeCashflowTransaction;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uncategorize the given bank transactions in bulk.
|
||||||
|
* @param {number} tenantId
|
||||||
|
* @param {number} uncategorizedTransactionId
|
||||||
|
*/
|
||||||
|
public async uncategorizeBulk(
|
||||||
|
tenantId: number,
|
||||||
|
uncategorizedTransactionId: number | Array<number>
|
||||||
|
) {
|
||||||
|
const uncategorizedTransactionIds = castArray(uncategorizedTransactionId);
|
||||||
|
|
||||||
|
const result = await PromisePool.withConcurrency(MIGRATION_CONCURRENCY)
|
||||||
|
.for(uncategorizedTransactionIds)
|
||||||
|
.process(async (_uncategorizedTransactionId: number, index, pool) => {
|
||||||
|
await this.uncategorizeTransaction.uncategorize(
|
||||||
|
tenantId,
|
||||||
|
_uncategorizedTransactionId
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const MIGRATION_CONCURRENCY = 1;
|
||||||
@@ -15,10 +15,10 @@ export const ERRORS = {
|
|||||||
'UNCATEGORIZED_TRANSACTION_TYPE_INVALID',
|
'UNCATEGORIZED_TRANSACTION_TYPE_INVALID',
|
||||||
CANNOT_DELETE_TRANSACTION_CONVERTED_FROM_UNCATEGORIZED:
|
CANNOT_DELETE_TRANSACTION_CONVERTED_FROM_UNCATEGORIZED:
|
||||||
'CANNOT_DELETE_TRANSACTION_CONVERTED_FROM_UNCATEGORIZED',
|
'CANNOT_DELETE_TRANSACTION_CONVERTED_FROM_UNCATEGORIZED',
|
||||||
|
CANNOT_CATEGORIZE_EXCLUDED_TRANSACTION:
|
||||||
CANNOT_CATEGORIZE_EXCLUDED_TRANSACTION: 'CANNOT_CATEGORIZE_EXCLUDED_TRANSACTION',
|
'CANNOT_CATEGORIZE_EXCLUDED_TRANSACTION',
|
||||||
TRANSACTION_NOT_CATEGORIZED: 'TRANSACTION_NOT_CATEGORIZED'
|
TRANSACTION_NOT_CATEGORIZED: 'TRANSACTION_NOT_CATEGORIZED',
|
||||||
|
TRANSACTION_NOT_PENDING: 'TRANSACTION_NOT_PENDING',
|
||||||
};
|
};
|
||||||
|
|
||||||
export enum CASHFLOW_DIRECTION {
|
export enum CASHFLOW_DIRECTION {
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { Inject, Service } from 'typedi';
|
import { Inject, Service } from 'typedi';
|
||||||
|
import PromisePool from '@supercharge/promise-pool';
|
||||||
import events from '@/subscribers/events';
|
import events from '@/subscribers/events';
|
||||||
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||||
import {
|
import {
|
||||||
ICashflowTransactionCategorizedPayload,
|
ICashflowTransactionCategorizedPayload,
|
||||||
ICashflowTransactionUncategorizedPayload,
|
ICashflowTransactionUncategorizedPayload,
|
||||||
} from '@/interfaces';
|
} from '@/interfaces';
|
||||||
import PromisePool from '@supercharge/promise-pool';
|
|
||||||
|
|
||||||
@Service()
|
@Service()
|
||||||
export class DecrementUncategorizedTransactionOnCategorize {
|
export class DecrementUncategorizedTransactionOnCategorize {
|
||||||
@@ -36,13 +36,17 @@ export class DecrementUncategorizedTransactionOnCategorize {
|
|||||||
public async decrementUnCategorizedTransactionsOnCategorized({
|
public async decrementUnCategorizedTransactionsOnCategorized({
|
||||||
tenantId,
|
tenantId,
|
||||||
uncategorizedTransactions,
|
uncategorizedTransactions,
|
||||||
trx
|
trx,
|
||||||
}: ICashflowTransactionCategorizedPayload) {
|
}: ICashflowTransactionCategorizedPayload) {
|
||||||
const { Account } = this.tenancy.models(tenantId);
|
const { Account } = this.tenancy.models(tenantId);
|
||||||
|
|
||||||
await PromisePool.withConcurrency(1)
|
await PromisePool.withConcurrency(1)
|
||||||
.for(uncategorizedTransactions)
|
.for(uncategorizedTransactions)
|
||||||
.process(async (uncategorizedTransaction) => {
|
.process(async (uncategorizedTransaction) => {
|
||||||
|
// Cannot continue if the transaction is still pending.
|
||||||
|
if (uncategorizedTransaction.isPending) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
await Account.query(trx)
|
await Account.query(trx)
|
||||||
.findById(uncategorizedTransaction.accountId)
|
.findById(uncategorizedTransaction.accountId)
|
||||||
.decrement('uncategorizedTransactions', 1);
|
.decrement('uncategorizedTransactions', 1);
|
||||||
@@ -56,13 +60,17 @@ export class DecrementUncategorizedTransactionOnCategorize {
|
|||||||
public async incrementUnCategorizedTransactionsOnUncategorized({
|
public async incrementUnCategorizedTransactionsOnUncategorized({
|
||||||
tenantId,
|
tenantId,
|
||||||
uncategorizedTransactions,
|
uncategorizedTransactions,
|
||||||
trx
|
trx,
|
||||||
}: ICashflowTransactionUncategorizedPayload) {
|
}: ICashflowTransactionUncategorizedPayload) {
|
||||||
const { Account } = this.tenancy.models(tenantId);
|
const { Account } = this.tenancy.models(tenantId);
|
||||||
|
|
||||||
await PromisePool.withConcurrency(1)
|
await PromisePool.withConcurrency(1)
|
||||||
.for(uncategorizedTransactions)
|
.for(uncategorizedTransactions)
|
||||||
.process(async (uncategorizedTransaction) => {
|
.process(async (uncategorizedTransaction) => {
|
||||||
|
// Cannot continue if the transaction is still pending.
|
||||||
|
if (uncategorizedTransaction.isPending) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
await Account.query(trx)
|
await Account.query(trx)
|
||||||
.findById(uncategorizedTransaction.accountId)
|
.findById(uncategorizedTransaction.accountId)
|
||||||
.increment('uncategorizedTransactions', 1);
|
.increment('uncategorizedTransactions', 1);
|
||||||
@@ -82,6 +90,9 @@ export class DecrementUncategorizedTransactionOnCategorize {
|
|||||||
|
|
||||||
if (!uncategorizedTransaction.accountId) return;
|
if (!uncategorizedTransaction.accountId) return;
|
||||||
|
|
||||||
|
// Cannot continue if the transaction is still pending.
|
||||||
|
if (uncategorizedTransaction.isPending) return;
|
||||||
|
|
||||||
await Account.query(trx)
|
await Account.query(trx)
|
||||||
.findById(uncategorizedTransaction.accountId)
|
.findById(uncategorizedTransaction.accountId)
|
||||||
.increment('uncategorizedTransactions', 1);
|
.increment('uncategorizedTransactions', 1);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -9,12 +9,13 @@ 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';
|
||||||
import { VendorCreditsExportable } from '../Purchases/VendorCredits/VendorCreditsExportable';
|
import { VendorCreditsExportable } from '../Purchases/VendorCredits/VendorCreditsExportable';
|
||||||
import { ItemCategoriesExportable } from '../ItemCategories/ItemCategoriesExportable';
|
import { ItemCategoriesExportable } from '../ItemCategories/ItemCategoriesExportable';
|
||||||
|
import { TaxRatesExportable } from '../TaxRates/TaxRatesExportable';
|
||||||
|
|
||||||
@Service()
|
@Service()
|
||||||
export class ExportableResources {
|
export class ExportableResources {
|
||||||
@@ -46,6 +47,7 @@ export class ExportableResources {
|
|||||||
{ resource: 'ManualJournal', exportable: ManualJournalsExportable },
|
{ resource: 'ManualJournal', exportable: ManualJournalsExportable },
|
||||||
{ resource: 'CreditNote', exportable: CreditNotesExportable },
|
{ resource: 'CreditNote', exportable: CreditNotesExportable },
|
||||||
{ resource: 'VendorCredit', exportable: VendorCreditsExportable },
|
{ resource: 'VendorCredit', exportable: VendorCreditsExportable },
|
||||||
|
{ resource: 'TaxRate', exportable: TaxRatesExportable },
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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'),
|
||||||
|
|
||||||
|
|||||||
@@ -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' },
|
||||||
|
|||||||
@@ -13,9 +13,10 @@ 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';
|
||||||
|
|
||||||
@Service()
|
@Service()
|
||||||
export class ImportableResources {
|
export class ImportableResources {
|
||||||
@@ -44,10 +45,11 @@ 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 },
|
||||||
|
{ resource: 'TaxRate', importable: TaxRatesImportable },
|
||||||
];
|
];
|
||||||
|
|
||||||
public get registry() {
|
public get registry() {
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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,
|
||||||
@@ -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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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,
|
||||||
@@ -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()
|
||||||
@@ -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.
|
||||||
@@ -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(
|
||||||
@@ -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;
|
||||||
}> {
|
}> {
|
||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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}
|
||||||
@@ -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
|
||||||
@@ -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;
|
||||||
|
|
||||||
@@ -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);
|
||||||
@@ -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;
|
||||||
@@ -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.
|
||||||
*/
|
*/
|
||||||
@@ -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.
|
||||||
@@ -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 {
|
||||||
@@ -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());
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -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')
|
||||||
@@ -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)
|
||||||
@@ -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,
|
||||||
{},
|
{},
|
||||||
@@ -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);
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
import { ServiceError } from '@/exceptions';
|
import { Knex } from 'knex';
|
||||||
import { Inject, Service } from 'typedi';
|
import { Inject, Service } from 'typedi';
|
||||||
|
import { difference } from 'lodash';
|
||||||
|
import { ServiceError } from '@/exceptions';
|
||||||
import HasTenancyService from '../Tenancy/TenancyService';
|
import HasTenancyService from '../Tenancy/TenancyService';
|
||||||
import { IItemEntryDTO, ITaxRate } from '@/interfaces';
|
import { IItemEntryDTO, ITaxRate } from '@/interfaces';
|
||||||
import { ERRORS } from './constants';
|
import { ERRORS } from './constants';
|
||||||
import { difference } from 'lodash';
|
|
||||||
|
|
||||||
@Service()
|
@Service()
|
||||||
export class CommandTaxRatesValidators {
|
export class CommandTaxRatesValidators {
|
||||||
@@ -44,11 +45,16 @@ export class CommandTaxRatesValidators {
|
|||||||
* Validates the tax code uniquiness.
|
* Validates the tax code uniquiness.
|
||||||
* @param {number} tenantId
|
* @param {number} tenantId
|
||||||
* @param {string} taxCode
|
* @param {string} taxCode
|
||||||
|
* @param {Knex.Transaction} trx -
|
||||||
*/
|
*/
|
||||||
public async validateTaxCodeUnique(tenantId: number, taxCode: string) {
|
public async validateTaxCodeUnique(
|
||||||
|
tenantId: number,
|
||||||
|
taxCode: string,
|
||||||
|
trx?: Knex.Transaction
|
||||||
|
) {
|
||||||
const { TaxRate } = this.tenancy.models(tenantId);
|
const { TaxRate } = this.tenancy.models(tenantId);
|
||||||
|
|
||||||
const foundTaxCode = await TaxRate.query().findOne({ code: taxCode });
|
const foundTaxCode = await TaxRate.query(trx).findOne({ code: taxCode });
|
||||||
|
|
||||||
if (foundTaxCode) {
|
if (foundTaxCode) {
|
||||||
throw new ServiceError(ERRORS.TAX_CODE_NOT_UNIQUE);
|
throw new ServiceError(ERRORS.TAX_CODE_NOT_UNIQUE);
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { Inject, Service } from 'typedi';
|
||||||
import { Knex } from 'knex';
|
import { Knex } from 'knex';
|
||||||
import {
|
import {
|
||||||
ICreateTaxRateDTO,
|
ICreateTaxRateDTO,
|
||||||
@@ -7,7 +8,6 @@ import {
|
|||||||
import UnitOfWork from '../UnitOfWork';
|
import UnitOfWork from '../UnitOfWork';
|
||||||
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
|
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
|
||||||
import HasTenancyService from '../Tenancy/TenancyService';
|
import HasTenancyService from '../Tenancy/TenancyService';
|
||||||
import { Inject, Service } from 'typedi';
|
|
||||||
import events from '@/subscribers/events';
|
import events from '@/subscribers/events';
|
||||||
import { CommandTaxRatesValidators } from './CommandTaxRatesValidators';
|
import { CommandTaxRatesValidators } from './CommandTaxRatesValidators';
|
||||||
|
|
||||||
@@ -32,36 +32,41 @@ export class CreateTaxRate {
|
|||||||
*/
|
*/
|
||||||
public async createTaxRate(
|
public async createTaxRate(
|
||||||
tenantId: number,
|
tenantId: number,
|
||||||
createTaxRateDTO: ICreateTaxRateDTO
|
createTaxRateDTO: ICreateTaxRateDTO,
|
||||||
|
trx?: Knex.Transaction
|
||||||
) {
|
) {
|
||||||
const { TaxRate } = this.tenancy.models(tenantId);
|
const { TaxRate } = this.tenancy.models(tenantId);
|
||||||
|
|
||||||
// Validates the tax code uniquiness.
|
// Validates the tax code uniquiness.
|
||||||
await this.validators.validateTaxCodeUnique(
|
await this.validators.validateTaxCodeUnique(
|
||||||
tenantId,
|
tenantId,
|
||||||
createTaxRateDTO.code
|
createTaxRateDTO.code,
|
||||||
|
trx
|
||||||
);
|
);
|
||||||
return this.uow.withTransaction(tenantId, async (trx: Knex.Transaction) => {
|
return this.uow.withTransaction(
|
||||||
// Triggers `onTaxRateCreating` event.
|
tenantId,
|
||||||
await this.eventPublisher.emitAsync(events.taxRates.onCreating, {
|
async (trx: Knex.Transaction) => {
|
||||||
createTaxRateDTO,
|
// Triggers `onTaxRateCreating` event.
|
||||||
tenantId,
|
await this.eventPublisher.emitAsync(events.taxRates.onCreating, {
|
||||||
trx,
|
createTaxRateDTO,
|
||||||
} as ITaxRateCreatingPayload);
|
tenantId,
|
||||||
|
trx,
|
||||||
|
} as ITaxRateCreatingPayload);
|
||||||
|
|
||||||
const taxRate = await TaxRate.query(trx).insertAndFetch({
|
const taxRate = await TaxRate.query(trx).insertAndFetch({
|
||||||
...createTaxRateDTO,
|
...createTaxRateDTO,
|
||||||
});
|
});
|
||||||
|
// Triggers `onTaxRateCreated` event.
|
||||||
|
await this.eventPublisher.emitAsync(events.taxRates.onCreated, {
|
||||||
|
createTaxRateDTO,
|
||||||
|
taxRate,
|
||||||
|
tenantId,
|
||||||
|
trx,
|
||||||
|
} as ITaxRateCreatedPayload);
|
||||||
|
|
||||||
// Triggers `onTaxRateCreated` event.
|
return taxRate;
|
||||||
await this.eventPublisher.emitAsync(events.taxRates.onCreated, {
|
},
|
||||||
createTaxRateDTO,
|
trx
|
||||||
taxRate,
|
);
|
||||||
tenantId,
|
|
||||||
trx,
|
|
||||||
} as ITaxRateCreatedPayload);
|
|
||||||
|
|
||||||
return taxRate;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
18
packages/server/src/services/TaxRates/TaxRatesExportable.ts
Normal file
18
packages/server/src/services/TaxRates/TaxRatesExportable.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import { Inject, Service } from 'typedi';
|
||||||
|
import { Exportable } from '../Export/Exportable';
|
||||||
|
import { TaxRatesApplication } from './TaxRatesApplication';
|
||||||
|
|
||||||
|
@Service()
|
||||||
|
export class TaxRatesExportable extends Exportable {
|
||||||
|
@Inject()
|
||||||
|
private taxRatesApplication: TaxRatesApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the accounts data to exportable sheet.
|
||||||
|
* @param {number} tenantId
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
public exportable(tenantId: number) {
|
||||||
|
return this.taxRatesApplication.getTaxRates(tenantId);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
export const TaxRatesSampleData = [
|
||||||
|
{
|
||||||
|
'Tax Name': 'Value Added Tax',
|
||||||
|
Code: 'VAT-STD',
|
||||||
|
Rate: '20',
|
||||||
|
Description: 'Standard VAT rate applied to most goods and services.',
|
||||||
|
'Is Non Recoverable': 'F',
|
||||||
|
Active: 'T',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'Tax Name': 'Luxury Goods Tax',
|
||||||
|
Code: 'TAX-LUXURY',
|
||||||
|
Rate: '25',
|
||||||
|
Description: 'Tax imposed on the sale of luxury items.',
|
||||||
|
'Is Non Recoverable': 'T',
|
||||||
|
Active: 'T',
|
||||||
|
},
|
||||||
|
];
|
||||||
46
packages/server/src/services/TaxRates/TaxRatesImportable.ts
Normal file
46
packages/server/src/services/TaxRates/TaxRatesImportable.ts
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
import { Inject, Service } from 'typedi';
|
||||||
|
import { Knex } from 'knex';
|
||||||
|
import { ICreateTaxRateDTO } from '@/interfaces';
|
||||||
|
import { CreateTaxRate } from './CreateTaxRate';
|
||||||
|
import { Importable } from '../Import/Importable';
|
||||||
|
import { TaxRatesSampleData } from './TaxRatesImportable.SampleData';
|
||||||
|
|
||||||
|
@Service()
|
||||||
|
export class TaxRatesImportable extends Importable {
|
||||||
|
@Inject()
|
||||||
|
private createTaxRateService: CreateTaxRate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Importing to tax rate creating service.
|
||||||
|
* @param {number} tenantId -
|
||||||
|
* @param {ICreateTaxRateDTO} ICreateTaxRateDTO -
|
||||||
|
* @param {Knex.Transaction} trx -
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
public importable(
|
||||||
|
tenantId: number,
|
||||||
|
createAccountDTO: ICreateTaxRateDTO,
|
||||||
|
trx?: Knex.Transaction
|
||||||
|
) {
|
||||||
|
return this.createTaxRateService.createTaxRate(
|
||||||
|
tenantId,
|
||||||
|
createAccountDTO,
|
||||||
|
trx
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Concurrrency controlling of the importing process.
|
||||||
|
* @returns {number}
|
||||||
|
*/
|
||||||
|
public get concurrency() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the sample data that used to download accounts sample sheet.
|
||||||
|
*/
|
||||||
|
public sampleData(): any[] {
|
||||||
|
return TaxRatesSampleData;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) => ({
|
||||||
|
|||||||
@@ -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) { }
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -659,6 +659,9 @@ export default {
|
|||||||
|
|
||||||
onUnexcluding: 'onBankTransactionUnexcluding',
|
onUnexcluding: 'onBankTransactionUnexcluding',
|
||||||
onUnexcluded: 'onBankTransactionUnexcluded',
|
onUnexcluded: 'onBankTransactionUnexcluded',
|
||||||
|
|
||||||
|
onPendingRemoving: 'onBankTransactionPendingRemoving',
|
||||||
|
onPendingRemoved: 'onBankTransactionPendingRemoved',
|
||||||
},
|
},
|
||||||
|
|
||||||
bankAccount: {
|
bankAccount: {
|
||||||
|
|||||||
@@ -121,7 +121,7 @@
|
|||||||
"yup": "^0.28.1"
|
"yup": "^0.28.1"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "PORT=4000 craco start",
|
"dev": "cross-env PORT=4000 craco start",
|
||||||
"build": "craco build",
|
"build": "craco build",
|
||||||
"test": "node scripts/test.js",
|
"test": "node scripts/test.js",
|
||||||
"storybook": "start-storybook -p 6006"
|
"storybook": "start-storybook -p 6006"
|
||||||
|
|||||||
@@ -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'}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// @ts-nocheck
|
// @ts-nocheck
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import classNames from 'classnames';
|
import clsx from 'classnames';
|
||||||
|
|
||||||
import '@/style/components/Details.scss';
|
import '@/style/components/Details.scss';
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ export function DetailsMenu({
|
|||||||
}) {
|
}) {
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={classNames(
|
className={clsx(
|
||||||
'details-menu',
|
'details-menu',
|
||||||
{
|
{
|
||||||
'details-menu--vertical': direction === DIRECTION.VERTICAL,
|
'details-menu--vertical': direction === DIRECTION.VERTICAL,
|
||||||
@@ -44,16 +44,24 @@ export function DetailsMenu({
|
|||||||
/**
|
/**
|
||||||
* Detail item.
|
* Detail item.
|
||||||
*/
|
*/
|
||||||
export function DetailItem({ label, children, name, align, className }) {
|
export function DetailItem({
|
||||||
|
label,
|
||||||
|
children,
|
||||||
|
name,
|
||||||
|
align,
|
||||||
|
multiline,
|
||||||
|
className,
|
||||||
|
}) {
|
||||||
const { minLabelSize } = useDetailsMenuContext();
|
const { minLabelSize } = useDetailsMenuContext();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={classNames(
|
className={clsx(
|
||||||
'detail-item',
|
'detail-item',
|
||||||
{
|
{
|
||||||
[`detail-item--${name}`]: name,
|
[`detail-item--${name}`]: name,
|
||||||
[`align-${align}`]: align,
|
[`align-${align}`]: align,
|
||||||
|
[`detail-item--multilines`]: multiline,
|
||||||
},
|
},
|
||||||
className,
|
className,
|
||||||
)}
|
)}
|
||||||
@@ -66,7 +74,7 @@ export function DetailItem({ label, children, name, align, className }) {
|
|||||||
>
|
>
|
||||||
{label}
|
{label}
|
||||||
</div>
|
</div>
|
||||||
<div>{children}</div>
|
<div className={clsx('detail-item__content')}>{children}</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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} />
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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'}
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -7,4 +7,7 @@ export const BANK_QUERY_KEY = {
|
|||||||
'RECOGNIZED_BANK_TRANSACTIONS_INFINITY',
|
'RECOGNIZED_BANK_TRANSACTIONS_INFINITY',
|
||||||
BANK_ACCOUNT_SUMMARY_META: 'BANK_ACCOUNT_SUMMARY_META',
|
BANK_ACCOUNT_SUMMARY_META: 'BANK_ACCOUNT_SUMMARY_META',
|
||||||
AUTOFILL_CATEGORIZE_BANK_TRANSACTION: 'AUTOFILL_CATEGORIZE_BANK_TRANSACTION',
|
AUTOFILL_CATEGORIZE_BANK_TRANSACTION: 'AUTOFILL_CATEGORIZE_BANK_TRANSACTION',
|
||||||
|
PENDING_BANK_ACCOUNT_TRANSACTIONS: 'PENDING_BANK_ACCOUNT_TRANSACTIONS',
|
||||||
|
PENDING_BANK_ACCOUNT_TRANSACTIONS_INFINITY:
|
||||||
|
'PENDING_BANK_ACCOUNT_TRANSACTIONS_INFINITY',
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -15,6 +15,8 @@ export function MakeJournalFormFooterLeft() {
|
|||||||
<FEditableText
|
<FEditableText
|
||||||
name={'description'}
|
name={'description'}
|
||||||
placeholder={intl.get('make_jorunal.decscrption.placeholder')}
|
placeholder={intl.get('make_jorunal.decscrption.placeholder')}
|
||||||
|
multiline
|
||||||
|
fastField
|
||||||
/>
|
/>
|
||||||
</DescriptionFormGroup>
|
</DescriptionFormGroup>
|
||||||
</React.Fragment>
|
</React.Fragment>
|
||||||
|
|||||||
@@ -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);
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user