Compare commits
47 Commits
multi-line
...
v0.19.5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1989887b25 | ||
|
|
e4fb126d39 | ||
|
|
5fcb2d9cc9 | ||
|
|
06ea631732 | ||
|
|
2f21107a43 | ||
|
|
fb8118bea8 | ||
|
|
4ba1c0aa22 | ||
|
|
169f115fa0 | ||
|
|
61ab2b78d9 | ||
|
|
93732430fc | ||
|
|
0215206220 | ||
|
|
3c8956fedf | ||
|
|
4477ada1ad | ||
|
|
fde9ccc5ca | ||
|
|
bbbd96f159 | ||
|
|
9f4de8115f | ||
|
|
d9f241a2f8 | ||
|
|
ee96dc68cc | ||
|
|
b12f090d13 | ||
|
|
f6ce761a27 | ||
|
|
8c89e04f54 | ||
|
|
f97b127a69 | ||
|
|
5c1fa8f5cd | ||
|
|
64c4d7b5a4 | ||
|
|
ea2fad648b | ||
|
|
9b8b51cb91 | ||
|
|
09b7e74d65 | ||
|
|
7137e06d99 | ||
|
|
fc29b765f7 | ||
|
|
2946475f89 | ||
|
|
d2193fdac0 | ||
|
|
ec2b7e332e | ||
|
|
a3704df6dd | ||
|
|
c3c784e52c | ||
|
|
bbcf695a6c | ||
|
|
038d4dd5a7 | ||
|
|
961e4b99e8 | ||
|
|
9991eebaaf | ||
|
|
cd90fede54 | ||
|
|
a2d28648bd | ||
|
|
3097d05eda | ||
|
|
ff94d8d9b2 | ||
|
|
79cc09fad9 | ||
|
|
c1b29c3f23 | ||
|
|
cf4bb3007e | ||
|
|
193a86cf30 | ||
|
|
7a81f14eb2 |
@@ -150,6 +150,15 @@
|
||||
"contributions": [
|
||||
"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,
|
||||
|
||||
@@ -129,6 +129,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
|
||||
<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://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>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -69,9 +69,8 @@
|
||||
"is-my-json-valid": "^2.20.5",
|
||||
"js-money": "^0.6.3",
|
||||
"jsonwebtoken": "^8.5.1",
|
||||
"knex": "^0.95.15",
|
||||
"knex": "^3.1.0",
|
||||
"knex-cleaner": "^1.3.0",
|
||||
"knex-db-manager": "^0.6.1",
|
||||
"libphonenumber-js": "^1.9.6",
|
||||
"lodash": "^4.17.15",
|
||||
"lru-cache": "^6.0.0",
|
||||
|
||||
@@ -33,7 +33,16 @@ export class BankingRulesController extends BaseController {
|
||||
body('conditions.*.field').exists().isIn(['description', 'amount']),
|
||||
body('conditions.*.comparator')
|
||||
.exists()
|
||||
.isIn(['equals', 'contains', 'not_contain'])
|
||||
.isIn([
|
||||
'equals',
|
||||
'equal',
|
||||
'contains',
|
||||
'not_contain',
|
||||
'bigger',
|
||||
'bigger_or_equal',
|
||||
'smaller',
|
||||
'smaller_or_equal',
|
||||
])
|
||||
.default('contain')
|
||||
.trim(),
|
||||
body('conditions.*.value').exists().trim(),
|
||||
|
||||
@@ -9,9 +9,9 @@ import {
|
||||
} from '@/interfaces';
|
||||
import BaseController from '@/api/controllers/BaseController';
|
||||
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 { PaymentReceivesApplication } from '@/services/Sales/PaymentReceives/PaymentReceivesApplication';
|
||||
import CheckPolicies from '@/api/middleware/CheckPolicies';
|
||||
import { ServiceError } from '@/exceptions';
|
||||
import { ACCEPT_TYPE } from '@/interfaces/Http';
|
||||
@@ -22,7 +22,7 @@ export default class PaymentReceivesController extends BaseController {
|
||||
private paymentReceiveApplication: PaymentReceivesApplication;
|
||||
|
||||
@Inject()
|
||||
private PaymentReceivesPages: PaymentReceivesPages;
|
||||
private PaymentsReceivedPages: PaymentsReceivedPages;
|
||||
|
||||
@Inject()
|
||||
private dynamicListService: DynamicListingService;
|
||||
@@ -229,7 +229,7 @@ export default class PaymentReceivesController extends BaseController {
|
||||
|
||||
try {
|
||||
const storedPaymentReceive =
|
||||
await this.paymentReceiveApplication.createPaymentReceive(
|
||||
await this.paymentReceiveApplication.createPaymentReceived(
|
||||
tenantId,
|
||||
paymentReceive,
|
||||
user
|
||||
@@ -376,7 +376,7 @@ export default class PaymentReceivesController extends BaseController {
|
||||
const { customerId } = this.matchedQueryData(req);
|
||||
|
||||
try {
|
||||
const entries = await this.PaymentReceivesPages.getNewPageEntries(
|
||||
const entries = await this.PaymentsReceivedPages.getNewPageEntries(
|
||||
tenantId,
|
||||
customerId
|
||||
);
|
||||
@@ -404,7 +404,7 @@ export default class PaymentReceivesController extends BaseController {
|
||||
|
||||
try {
|
||||
const { paymentReceive, entries } =
|
||||
await this.PaymentReceivesPages.getPaymentReceiveEditPage(
|
||||
await this.PaymentsReceivedPages.getPaymentReceiveEditPage(
|
||||
tenantId,
|
||||
paymentReceiveId,
|
||||
user
|
||||
|
||||
@@ -32,7 +32,7 @@ module.exports = {
|
||||
*/
|
||||
tenant: {
|
||||
db_client: process.env.TENANT_DB_CLIENT || process.env.DB_CLIENT || 'mysql',
|
||||
db_name_prefix: process.env.TENANT_DB_NAME_PERFIX,
|
||||
db_name_prefix: process.env.TENANT_DB_NAME_PERFIX || 'bigcapital_tenant_',
|
||||
db_host: process.env.TENANT_DB_HOST || process.env.DB_HOST,
|
||||
db_user: process.env.TENANT_DB_USER || process.env.DB_USER,
|
||||
db_password: process.env.TENANT_DB_PASSWORD || process.env.DB_PASSWORD,
|
||||
|
||||
@@ -30,7 +30,7 @@ export interface IGeneralLedgerSheetAccountTransaction {
|
||||
currencyCode: string;
|
||||
note?: string;
|
||||
|
||||
transactionType?: string;
|
||||
transactionTypeFormatted: string;
|
||||
transactionNumber: string;
|
||||
|
||||
referenceId?: number;
|
||||
|
||||
@@ -8,7 +8,7 @@ import { ILedgerEntry } from './Ledger';
|
||||
import { ISaleInvoice } from './SaleInvoice';
|
||||
import { AttachmentLinkDTO } from './Attachments';
|
||||
|
||||
export interface IPaymentReceive {
|
||||
export interface IPaymentReceived {
|
||||
id?: number;
|
||||
customerId: number;
|
||||
paymentDate: Date;
|
||||
@@ -19,14 +19,14 @@ export interface IPaymentReceive {
|
||||
depositAccountId: number;
|
||||
paymentReceiveNo: string;
|
||||
statement: string;
|
||||
entries: IPaymentReceiveEntry[];
|
||||
entries: IPaymentReceivedEntry[];
|
||||
userId: number;
|
||||
createdAt: Date;
|
||||
updatedAt: Date;
|
||||
localAmount?: number;
|
||||
branchId?: number;
|
||||
}
|
||||
export interface IPaymentReceiveCreateDTO {
|
||||
export interface IPaymentReceivedCreateDTO {
|
||||
customerId: number;
|
||||
paymentDate: Date;
|
||||
amount: number;
|
||||
@@ -35,13 +35,13 @@ export interface IPaymentReceiveCreateDTO {
|
||||
depositAccountId: number;
|
||||
paymentReceiveNo?: string;
|
||||
statement: string;
|
||||
entries: IPaymentReceiveEntryDTO[];
|
||||
entries: IPaymentReceivedEntryDTO[];
|
||||
|
||||
branchId?: number;
|
||||
attachments?: AttachmentLinkDTO[];
|
||||
}
|
||||
|
||||
export interface IPaymentReceiveEditDTO {
|
||||
export interface IPaymentReceivedEditDTO {
|
||||
customerId: number;
|
||||
paymentDate: Date;
|
||||
amount: number;
|
||||
@@ -50,12 +50,12 @@ export interface IPaymentReceiveEditDTO {
|
||||
depositAccountId: number;
|
||||
paymentReceiveNo?: string;
|
||||
statement: string;
|
||||
entries: IPaymentReceiveEntryDTO[];
|
||||
entries: IPaymentReceivedEntryDTO[];
|
||||
branchId?: number;
|
||||
attachments?: AttachmentLinkDTO[];
|
||||
}
|
||||
|
||||
export interface IPaymentReceiveEntry {
|
||||
export interface IPaymentReceivedEntry {
|
||||
id?: number;
|
||||
paymentReceiveId: number;
|
||||
invoiceId: number;
|
||||
@@ -64,15 +64,15 @@ export interface IPaymentReceiveEntry {
|
||||
invoice?: ISaleInvoice;
|
||||
}
|
||||
|
||||
export interface IPaymentReceiveEntryDTO {
|
||||
export interface IPaymentReceivedEntryDTO {
|
||||
id?: number;
|
||||
index: number;
|
||||
paymentReceiveId: number;
|
||||
paymentReceiveId?: number;
|
||||
invoiceId: number;
|
||||
paymentAmount: number;
|
||||
}
|
||||
|
||||
export interface IPaymentReceivesFilter extends IDynamicListFilterDTO {
|
||||
export interface IPaymentsReceivedFilter extends IDynamicListFilterDTO {
|
||||
stringifiedFilterRoles?: string;
|
||||
}
|
||||
|
||||
@@ -88,65 +88,65 @@ export interface IPaymentReceivePageEntry {
|
||||
date: Date | string;
|
||||
}
|
||||
|
||||
export interface IPaymentReceiveEditPage {
|
||||
paymentReceive: IPaymentReceive;
|
||||
export interface IPaymentReceivedEditPage {
|
||||
paymentReceive: IPaymentReceived;
|
||||
entries: IPaymentReceivePageEntry[];
|
||||
}
|
||||
|
||||
export interface IPaymentsReceiveService {
|
||||
export interface IPaymentsReceivedService {
|
||||
validateCustomerHasNoPayments(
|
||||
tenantId: number,
|
||||
customerId: number
|
||||
): Promise<void>;
|
||||
}
|
||||
|
||||
export interface IPaymentReceiveSmsDetails {
|
||||
export interface IPaymentReceivedSmsDetails {
|
||||
customerName: string;
|
||||
customerPhoneNumber: string;
|
||||
smsMessage: string;
|
||||
}
|
||||
|
||||
export interface IPaymentReceiveCreatingPayload {
|
||||
export interface IPaymentReceivedCreatingPayload {
|
||||
tenantId: number;
|
||||
paymentReceiveDTO: IPaymentReceiveCreateDTO;
|
||||
paymentReceiveDTO: IPaymentReceivedCreateDTO;
|
||||
trx: Knex.Transaction;
|
||||
}
|
||||
|
||||
export interface IPaymentReceiveCreatedPayload {
|
||||
export interface IPaymentReceivedCreatedPayload {
|
||||
tenantId: number;
|
||||
paymentReceive: IPaymentReceive;
|
||||
paymentReceive: IPaymentReceived;
|
||||
paymentReceiveId: number;
|
||||
authorizedUser: ISystemUser;
|
||||
paymentReceiveDTO: IPaymentReceiveCreateDTO;
|
||||
paymentReceiveDTO: IPaymentReceivedCreateDTO;
|
||||
trx: Knex.Transaction;
|
||||
}
|
||||
|
||||
export interface IPaymentReceiveEditedPayload {
|
||||
export interface IPaymentReceivedEditedPayload {
|
||||
tenantId: number;
|
||||
paymentReceiveId: number;
|
||||
paymentReceive: IPaymentReceive;
|
||||
oldPaymentReceive: IPaymentReceive;
|
||||
paymentReceiveDTO: IPaymentReceiveEditDTO;
|
||||
paymentReceive: IPaymentReceived;
|
||||
oldPaymentReceive: IPaymentReceived;
|
||||
paymentReceiveDTO: IPaymentReceivedEditDTO;
|
||||
authorizedUser: ISystemUser;
|
||||
trx: Knex.Transaction;
|
||||
}
|
||||
|
||||
export interface IPaymentReceiveEditingPayload {
|
||||
export interface IPaymentReceivedEditingPayload {
|
||||
tenantId: number;
|
||||
oldPaymentReceive: IPaymentReceive;
|
||||
paymentReceiveDTO: IPaymentReceiveEditDTO;
|
||||
oldPaymentReceive: IPaymentReceived;
|
||||
paymentReceiveDTO: IPaymentReceivedEditDTO;
|
||||
trx: Knex.Transaction;
|
||||
}
|
||||
|
||||
export interface IPaymentReceiveDeletingPayload {
|
||||
export interface IPaymentReceivedDeletingPayload {
|
||||
tenantId: number;
|
||||
oldPaymentReceive: IPaymentReceive;
|
||||
oldPaymentReceive: IPaymentReceived;
|
||||
trx: Knex.Transaction;
|
||||
}
|
||||
export interface IPaymentReceiveDeletedPayload {
|
||||
export interface IPaymentReceivedDeletedPayload {
|
||||
tenantId: number;
|
||||
paymentReceiveId: number;
|
||||
oldPaymentReceive: IPaymentReceive;
|
||||
oldPaymentReceive: IPaymentReceived;
|
||||
authorizedUser: ISystemUser;
|
||||
trx: Knex.Transaction;
|
||||
}
|
||||
|
||||
@@ -51,5 +51,4 @@ export interface ISystemService {
|
||||
cache();
|
||||
repositories();
|
||||
knex();
|
||||
dbManager();
|
||||
}
|
||||
@@ -21,7 +21,7 @@ export default class ComputeItemCostJob {
|
||||
|
||||
agenda.define(
|
||||
'compute-item-cost',
|
||||
{ priority: 'high', concurrency: 1 },
|
||||
{ priority: 'high', concurrency: 20 },
|
||||
this.handler.bind(this)
|
||||
);
|
||||
this.agenda.on('start:compute-item-cost', this.onJobStart.bind(this));
|
||||
|
||||
@@ -8,7 +8,7 @@ export default class OrganizationSetupJob {
|
||||
constructor(agenda) {
|
||||
agenda.define(
|
||||
'organization-setup',
|
||||
{ priority: 'high', concurrency: 1 },
|
||||
{ priority: 'high', concurrency: 20 },
|
||||
this.handler
|
||||
);
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ export default class WriteInvoicesJournalEntries {
|
||||
|
||||
agenda.define(
|
||||
eventName,
|
||||
{ priority: 'normal', concurrency: 1 },
|
||||
{ priority: 'normal', concurrency: 20 },
|
||||
this.handler.bind(this)
|
||||
);
|
||||
agenda.on(`complete:${eventName}`, this.onJobCompleted.bind(this));
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
import knexManager from 'knex-db-manager';
|
||||
import { systemKnexConfig, systemDbManager } from 'config/knexConfig';
|
||||
|
||||
export default () => knexManager.databaseManagerFactory({
|
||||
knex: systemKnexConfig,
|
||||
dbManager: systemDbManager,
|
||||
});
|
||||
@@ -3,7 +3,6 @@ import LoggerInstance from '@/loaders/logger';
|
||||
import agendaFactory from '@/loaders/agenda';
|
||||
import SmsClientLoader from '@/loaders/smsClient';
|
||||
import mailInstance from '@/loaders/mail';
|
||||
import dbManagerFactory from '@/loaders/dbManager';
|
||||
import i18n from '@/loaders/i18n';
|
||||
import repositoriesLoader from '@/loaders/systemRepositories';
|
||||
import Cache from '@/services/Cache';
|
||||
@@ -16,7 +15,6 @@ export default ({ mongoConnection, knex }) => {
|
||||
try {
|
||||
const agendaInstance = agendaFactory({ mongoConnection });
|
||||
const smsClientInstance = SmsClientLoader(config.easySMSGateway.api_key);
|
||||
const dbManager = dbManagerFactory(knex);
|
||||
const cacheInstance = new Cache();
|
||||
|
||||
Container.set('logger', LoggerInstance);
|
||||
@@ -24,7 +22,6 @@ export default ({ mongoConnection, knex }) => {
|
||||
Container.set('SMSClient', smsClientInstance);
|
||||
Container.set('mail', mailInstance);
|
||||
|
||||
Container.set('dbManager', dbManager);
|
||||
LoggerInstance.info(
|
||||
'[DI] Database manager has been injected into container.'
|
||||
);
|
||||
|
||||
@@ -115,6 +115,7 @@ import { DecrementUncategorizedTransactionOnExclude } from '@/services/Banking/E
|
||||
import { DecrementUncategorizedTransactionOnCategorize } from '@/services/Cashflow/subscribers/DecrementUncategorizedTransactionOnCategorize';
|
||||
import { DisconnectPlaidItemOnAccountDeleted } from '@/services/Banking/BankAccounts/events/DisconnectPlaidItemOnAccountDeleted';
|
||||
import { LoopsEventsSubscriber } from '@/services/Loops/LoopsEventsSubscriber';
|
||||
import { DeleteUncategorizedTransactionsOnAccountDeleting } from '@/services/Banking/BankAccounts/events/DeleteUncategorizedTransactionsOnAccountDeleting';
|
||||
|
||||
export default () => {
|
||||
return new EventPublisher();
|
||||
@@ -277,6 +278,7 @@ export const susbcribers = () => {
|
||||
// Plaid
|
||||
RecognizeSyncedBankTranasctions,
|
||||
DisconnectPlaidItemOnAccountDeleted,
|
||||
DeleteUncategorizedTransactionsOnAccountDeleting,
|
||||
|
||||
// Loops
|
||||
LoopsEventsSubscriber
|
||||
|
||||
@@ -34,4 +34,4 @@
|
||||
// import 'services/Sales/SaleInvoiceWriteoffSubscriber';
|
||||
// import 'subscribers/SaleInvoices/SendSmsNotificationToCustomer';
|
||||
// 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 { SendSaleEstimateMailJob } from '@/services/Sales/Estimates/SendSaleEstimateMailJob';
|
||||
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 { ImportDeleteExpiredFilesJobs } from '@/services/Import/jobs/ImportDeleteExpiredFilesJob';
|
||||
import { SendVerifyMailJob } from '@/services/Authentication/jobs/SendVerifyMailJob';
|
||||
@@ -28,7 +28,7 @@ export default ({ agenda }: { agenda: Agenda }) => {
|
||||
new SendSaleInvoiceReminderMailJob(agenda);
|
||||
new SendSaleEstimateMailJob(agenda);
|
||||
new SaleReceiptMailNotificationJob(agenda);
|
||||
new PaymentReceiveMailNotificationJob(agenda);
|
||||
new PaymentReceivedMailNotificationJob(agenda);
|
||||
new PlaidFetchTransactionsJob(agenda);
|
||||
new ImportDeleteExpiredFilesJobs(agenda);
|
||||
new SendVerifyMailJob(agenda);
|
||||
|
||||
@@ -3,7 +3,7 @@ import TenantModel from 'models/TenantModel';
|
||||
import ModelSetting from './ModelSetting';
|
||||
import BillPaymentSettings from './BillPayment.Settings';
|
||||
import CustomViewBaseModel from './CustomViewBaseModel';
|
||||
import { DEFAULT_VIEWS } from '@/services/Sales/PaymentReceives/constants';
|
||||
import { DEFAULT_VIEWS } from '@/services/Sales/PaymentReceived/constants';
|
||||
import ModelSearchable from './ModelSearchable';
|
||||
|
||||
export default class BillPayment extends mixin(TenantModel, [
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { Model } from 'objection';
|
||||
import { castArray, omit, pick } from 'lodash';
|
||||
import { isEmpty } from 'lodash';
|
||||
import { ServiceError } from '@/exceptions';
|
||||
|
||||
@@ -16,7 +17,15 @@ export default class PaginationQueryBuilder extends Model.QueryBuilder {
|
||||
});
|
||||
}
|
||||
|
||||
queryAndThrowIfHasRelations = ({ type, message }) => {
|
||||
queryAndThrowIfHasRelations = ({
|
||||
type,
|
||||
message,
|
||||
excludeRelations = [],
|
||||
includedRelations = [],
|
||||
}) => {
|
||||
const _excludeRelations = castArray(excludeRelations);
|
||||
const _includedRelations = castArray(includedRelations);
|
||||
|
||||
const model = this.modelClass();
|
||||
const modelRelations = Object.keys(model.relationMappings).filter(
|
||||
(relation) =>
|
||||
@@ -25,9 +34,20 @@ export default class PaginationQueryBuilder extends Model.QueryBuilder {
|
||||
) !== -1
|
||||
);
|
||||
const relations = model.secureDeleteRelations || modelRelations;
|
||||
const filteredByIncluded = relations.filter((r) =>
|
||||
_includedRelations.includes(r)
|
||||
);
|
||||
const filteredByExcluded = relations.filter(
|
||||
(r) => !excludeRelations.includes(r)
|
||||
);
|
||||
const filteredRelations = !isEmpty(_includedRelations)
|
||||
? filteredByIncluded
|
||||
: !isEmpty(_excludeRelations)
|
||||
? filteredByExcluded
|
||||
: relations;
|
||||
|
||||
this.runAfter((model, query) => {
|
||||
const nonEmptyRelations = relations.filter(
|
||||
const nonEmptyRelations = filteredRelations.filter(
|
||||
(relation) => !isEmpty(model[relation])
|
||||
);
|
||||
if (nonEmptyRelations.length > 0) {
|
||||
@@ -36,7 +56,7 @@ export default class PaginationQueryBuilder extends Model.QueryBuilder {
|
||||
return model;
|
||||
});
|
||||
return this.onBuild((query) => {
|
||||
relations.forEach((relation) => {
|
||||
filteredRelations.forEach((relation) => {
|
||||
query.withGraphFetched(`${relation}(selectId)`).modifiers({
|
||||
selectId(builder) {
|
||||
builder.select('id');
|
||||
|
||||
@@ -3,7 +3,7 @@ import TenantModel from 'models/TenantModel';
|
||||
import ModelSetting from './ModelSetting';
|
||||
import PaymentReceiveSettings from './PaymentReceive.Settings';
|
||||
import CustomViewBaseModel from './CustomViewBaseModel';
|
||||
import { DEFAULT_VIEWS } from '@/services/Sales/PaymentReceives/constants';
|
||||
import { DEFAULT_VIEWS } from '@/services/Sales/PaymentReceived/constants';
|
||||
import ModelSearchable from './ModelSearchable';
|
||||
|
||||
export default class PaymentReceive extends mixin(TenantModel, [
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/* eslint-disable global-require */
|
||||
import * as R from 'ramda';
|
||||
import { Model, ModelOptions, QueryContext, mixin } from 'objection';
|
||||
import { Model, mixin } from 'objection';
|
||||
import TenantModel from 'models/TenantModel';
|
||||
import ModelSettings from './ModelSetting';
|
||||
import Account from './Account';
|
||||
|
||||
@@ -249,6 +249,7 @@ export default class Ledger implements ILedger {
|
||||
|
||||
transactionId: entry.referenceId,
|
||||
transactionType: entry.referenceType,
|
||||
transactionSubType: entry.transactionType,
|
||||
|
||||
transactionNumber: entry.transactionNumber,
|
||||
referenceNumber: entry.referenceNumber,
|
||||
@@ -262,6 +263,8 @@ export default class Ledger implements ILedger {
|
||||
|
||||
taxRateId: entry.taxRateId,
|
||||
taxRate: entry.taxRate,
|
||||
|
||||
note: entry.note,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -43,8 +43,8 @@ export class AccountsApplication {
|
||||
|
||||
/**
|
||||
* Creates a new account.
|
||||
* @param {number} tenantId
|
||||
* @param {IAccountCreateDTO} accountDTO
|
||||
* @param {number} tenantId
|
||||
* @param {IAccountCreateDTO} accountDTO
|
||||
* @returns {Promise<IAccount>}
|
||||
*/
|
||||
public createAccount = (
|
||||
@@ -108,8 +108,8 @@ export class AccountsApplication {
|
||||
|
||||
/**
|
||||
* Retrieves the account details.
|
||||
* @param {number} tenantId
|
||||
* @param {number} accountId
|
||||
* @param {number} tenantId
|
||||
* @param {number} accountId
|
||||
* @returns {Promise<IAccount>}
|
||||
*/
|
||||
public getAccount = (tenantId: number, accountId: number) => {
|
||||
|
||||
@@ -73,6 +73,7 @@ export class DeleteAccount {
|
||||
.throwIfNotFound()
|
||||
.queryAndThrowIfHasRelations({
|
||||
type: ERRORS.ACCOUNT_HAS_ASSOCIATED_TRANSACTIONS,
|
||||
excludeRelations: ['uncategorizedTransactions', 'plaidItem']
|
||||
});
|
||||
// Authorize before delete account.
|
||||
await this.authorize(tenantId, accountId, oldAccount);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import { isEmpty } from 'lodash';
|
||||
import {
|
||||
IPaymentReceiveCreatedPayload,
|
||||
IPaymentReceiveCreatingPayload,
|
||||
IPaymentReceiveDeletingPayload,
|
||||
IPaymentReceiveEditedPayload,
|
||||
IPaymentReceivedCreatedPayload,
|
||||
IPaymentReceivedCreatingPayload,
|
||||
IPaymentReceivedDeletingPayload,
|
||||
IPaymentReceivedEditedPayload,
|
||||
} from '@/interfaces';
|
||||
import events from '@/subscribers/events';
|
||||
import { LinkAttachment } from '../LinkAttachment';
|
||||
@@ -50,13 +50,13 @@ export class AttachmentsOnPaymentsReceived {
|
||||
|
||||
/**
|
||||
* Validates the attachment keys on creating payment.
|
||||
* @param {IPaymentReceiveCreatingPayload}
|
||||
* @param {IPaymentReceivedCreatingPayload}
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
private async validateAttachmentsOnPaymentCreate({
|
||||
paymentReceiveDTO,
|
||||
tenantId,
|
||||
}: IPaymentReceiveCreatingPayload): Promise<void> {
|
||||
}: IPaymentReceivedCreatingPayload): Promise<void> {
|
||||
if (isEmpty(paymentReceiveDTO.attachments)) {
|
||||
return;
|
||||
}
|
||||
@@ -67,7 +67,7 @@ export class AttachmentsOnPaymentsReceived {
|
||||
|
||||
/**
|
||||
* Handles linking the attachments of the created payment.
|
||||
* @param {IPaymentReceiveCreatedPayload}
|
||||
* @param {IPaymentReceivedCreatedPayload}
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
private async handleAttachmentsOnPaymentCreated({
|
||||
@@ -75,7 +75,7 @@ export class AttachmentsOnPaymentsReceived {
|
||||
paymentReceiveDTO,
|
||||
paymentReceive,
|
||||
trx,
|
||||
}: IPaymentReceiveCreatedPayload): Promise<void> {
|
||||
}: IPaymentReceivedCreatedPayload): Promise<void> {
|
||||
if (isEmpty(paymentReceiveDTO.attachments)) return;
|
||||
|
||||
const keys = paymentReceiveDTO.attachments?.map(
|
||||
@@ -92,14 +92,14 @@ export class AttachmentsOnPaymentsReceived {
|
||||
|
||||
/**
|
||||
* Handles unlinking all the unpresented keys of the edited payment.
|
||||
* @param {IPaymentReceiveEditedPayload}
|
||||
* @param {IPaymentReceivedEditedPayload}
|
||||
*/
|
||||
private async handleUnlinkUnpresentedKeysOnPaymentEdited({
|
||||
tenantId,
|
||||
paymentReceiveDTO,
|
||||
oldPaymentReceive,
|
||||
trx,
|
||||
}: IPaymentReceiveEditedPayload) {
|
||||
}: IPaymentReceivedEditedPayload) {
|
||||
const keys = paymentReceiveDTO.attachments?.map(
|
||||
(attachment) => attachment.key
|
||||
);
|
||||
@@ -114,7 +114,7 @@ export class AttachmentsOnPaymentsReceived {
|
||||
|
||||
/**
|
||||
* Handles linking all the presented keys of the edited payment.
|
||||
* @param {IPaymentReceiveEditedPayload}
|
||||
* @param {IPaymentReceivedEditedPayload}
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
private async handleLinkPresentedKeysOnPaymentEdited({
|
||||
@@ -122,7 +122,7 @@ export class AttachmentsOnPaymentsReceived {
|
||||
paymentReceiveDTO,
|
||||
oldPaymentReceive,
|
||||
trx,
|
||||
}: IPaymentReceiveEditedPayload) {
|
||||
}: IPaymentReceivedEditedPayload) {
|
||||
if (isEmpty(paymentReceiveDTO.attachments)) return;
|
||||
|
||||
const keys = paymentReceiveDTO.attachments?.map(
|
||||
@@ -146,7 +146,7 @@ export class AttachmentsOnPaymentsReceived {
|
||||
tenantId,
|
||||
oldPaymentReceive,
|
||||
trx,
|
||||
}: IPaymentReceiveDeletingPayload) {
|
||||
}: IPaymentReceivedDeletingPayload) {
|
||||
await this.unlinkAttachmentService.unlinkAllModelKeys(
|
||||
tenantId,
|
||||
'PaymentReceive',
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import { initialize } from 'objection';
|
||||
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||
import events from '@/subscribers/events';
|
||||
import { IAccountEventDeletePayload } from '@/interfaces';
|
||||
import { DeleteBankRulesService } from '../../Rules/DeleteBankRules';
|
||||
import { RevertRecognizedTransactions } from '../../RegonizeTranasctions/RevertRecognizedTransactions';
|
||||
|
||||
@Service()
|
||||
export class DeleteUncategorizedTransactionsOnAccountDeleting {
|
||||
@Inject()
|
||||
private tenancy: HasTenancyService;
|
||||
|
||||
@Inject()
|
||||
private deleteBankRules: DeleteBankRulesService;
|
||||
|
||||
@Inject()
|
||||
private revertRecognizedTransactins: RevertRecognizedTransactions;
|
||||
|
||||
/**
|
||||
* Constructor method.
|
||||
*/
|
||||
public attach(bus) {
|
||||
bus.subscribe(
|
||||
events.accounts.onDelete,
|
||||
this.handleDeleteBankRulesOnAccountDeleting.bind(this)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles revert the recognized transactions and delete all the bank rules
|
||||
* associated to the deleted bank account.
|
||||
* @param {IAccountEventDeletePayload}
|
||||
*/
|
||||
private async handleDeleteBankRulesOnAccountDeleting({
|
||||
tenantId,
|
||||
oldAccount,
|
||||
trx,
|
||||
}: IAccountEventDeletePayload) {
|
||||
const knex = this.tenancy.knex(tenantId);
|
||||
const {
|
||||
BankRule,
|
||||
UncategorizedCashflowTransaction,
|
||||
MatchedBankTransaction,
|
||||
RecognizedBankTransaction,
|
||||
} = this.tenancy.models(tenantId);
|
||||
|
||||
const foundAssociatedRules = await BankRule.query(trx).where(
|
||||
'applyIfAccountId',
|
||||
oldAccount.id
|
||||
);
|
||||
const foundAssociatedRulesIds = foundAssociatedRules.map((rule) => rule.id);
|
||||
|
||||
await initialize(knex, [
|
||||
UncategorizedCashflowTransaction,
|
||||
RecognizedBankTransaction,
|
||||
MatchedBankTransaction,
|
||||
]);
|
||||
// Revert the recognized transactions of the given bank rules.
|
||||
await this.revertRecognizedTransactins.revertRecognizedTransactions(
|
||||
tenantId,
|
||||
foundAssociatedRulesIds,
|
||||
null,
|
||||
trx
|
||||
);
|
||||
// Delete the associated uncategorized transactions.
|
||||
await UncategorizedCashflowTransaction.query(trx)
|
||||
.where('accountId', oldAccount.id)
|
||||
.delete();
|
||||
|
||||
// Delete the given bank rules.
|
||||
await this.deleteBankRules.deleteBankRules(
|
||||
tenantId,
|
||||
foundAssociatedRulesIds,
|
||||
trx
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -51,6 +51,7 @@ export class DisconnectPlaidItemOnAccountDeleted {
|
||||
.findOne('plaidItemId', oldAccount.plaidItemId)
|
||||
.delete();
|
||||
|
||||
// Remove Plaid item once the transaction resolve.
|
||||
if (oldPlaidItem) {
|
||||
const plaidInstance = PlaidClientWrapper.getClient();
|
||||
|
||||
|
||||
@@ -1,18 +1,25 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import { initialize } from 'objection';
|
||||
import { Knex } from 'knex';
|
||||
import { first } from 'lodash';
|
||||
import { TransformerInjectable } from '@/lib/Transformer/TransformerInjectable';
|
||||
import { GetMatchedTransactionBillsTransformer } from './GetMatchedTransactionBillsTransformer';
|
||||
import { GetMatchedTransactionsFilter, MatchedTransactionPOJO } from './types';
|
||||
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||
import {
|
||||
GetMatchedTransactionsFilter,
|
||||
IMatchTransactionDTO,
|
||||
MatchedTransactionPOJO,
|
||||
} from './types';
|
||||
import { GetMatchedTransactionsByType } from './GetMatchedTransactionsByType';
|
||||
import { CreateBillPayment } from '@/services/Purchases/BillPayments/CreateBillPayment';
|
||||
import { IBillPaymentDTO } from '@/interfaces';
|
||||
|
||||
@Service()
|
||||
export class GetMatchedTransactionsByBills extends GetMatchedTransactionsByType {
|
||||
@Inject()
|
||||
private tenancy: HasTenancyService;
|
||||
private transformer: TransformerInjectable;
|
||||
|
||||
@Inject()
|
||||
private transformer: TransformerInjectable;
|
||||
private createPaymentMadeService: CreateBillPayment;
|
||||
|
||||
/**
|
||||
* Retrieves the matched transactions.
|
||||
@@ -71,4 +78,62 @@ export class GetMatchedTransactionsByBills extends GetMatchedTransactionsByType
|
||||
new GetMatchedTransactionBillsTransformer()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the common matched transaction.
|
||||
* @param {number} tenantId
|
||||
* @param {Array<number>} uncategorizedTransactionIds
|
||||
* @param {IMatchTransactionDTO} matchTransactionDTO
|
||||
* @param {Knex.Transaction} trx
|
||||
*/
|
||||
public async createMatchedTransaction(
|
||||
tenantId: number,
|
||||
uncategorizedTransactionIds: Array<number>,
|
||||
matchTransactionDTO: IMatchTransactionDTO,
|
||||
trx?: Knex.Transaction
|
||||
): Promise<void> {
|
||||
await super.createMatchedTransaction(
|
||||
tenantId,
|
||||
uncategorizedTransactionIds,
|
||||
matchTransactionDTO,
|
||||
trx
|
||||
);
|
||||
const { Bill, UncategorizedCashflowTransaction, MatchedBankTransaction } =
|
||||
this.tenancy.models(tenantId);
|
||||
|
||||
const uncategorizedTransactionId = first(uncategorizedTransactionIds);
|
||||
const uncategorizedTransaction =
|
||||
await UncategorizedCashflowTransaction.query(trx)
|
||||
.findById(uncategorizedTransactionId)
|
||||
.throwIfNotFound();
|
||||
|
||||
const bill = await Bill.query(trx)
|
||||
.findById(matchTransactionDTO.referenceId)
|
||||
.throwIfNotFound();
|
||||
|
||||
const createPaymentMadeDTO: IBillPaymentDTO = {
|
||||
vendorId: bill.vendorId,
|
||||
paymentAccountId: uncategorizedTransaction.accountId,
|
||||
paymentDate: uncategorizedTransaction.date,
|
||||
exchangeRate: 1,
|
||||
entries: [
|
||||
{
|
||||
paymentAmount: bill.dueAmount,
|
||||
billId: bill.id,
|
||||
},
|
||||
],
|
||||
branchId: bill.branchId,
|
||||
};
|
||||
// Create a new bill payment associated to the matched bill.
|
||||
const billPayment = await this.createPaymentMadeService.createBillPayment(
|
||||
tenantId,
|
||||
createPaymentMadeDTO,
|
||||
trx
|
||||
);
|
||||
// Link the create bill payment with matched transaction.
|
||||
await super.createMatchedTransaction(tenantId, uncategorizedTransactionIds, {
|
||||
referenceType: 'BillPayment',
|
||||
referenceId: billPayment.id,
|
||||
}, trx);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,22 +1,26 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import { initialize } from 'objection';
|
||||
import { Knex } from 'knex';
|
||||
import { first } from 'lodash';
|
||||
import { TransformerInjectable } from '@/lib/Transformer/TransformerInjectable';
|
||||
import { GetMatchedTransactionInvoicesTransformer } from './GetMatchedTransactionInvoicesTransformer';
|
||||
import {
|
||||
GetMatchedTransactionsFilter,
|
||||
IMatchTransactionDTO,
|
||||
MatchedTransactionPOJO,
|
||||
MatchedTransactionsPOJO,
|
||||
} from './types';
|
||||
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||
import { GetMatchedTransactionsByType } from './GetMatchedTransactionsByType';
|
||||
import { CreatePaymentReceived } from '@/services/Sales/PaymentReceived/CreatePaymentReceived';
|
||||
import { IPaymentReceivedCreateDTO } from '@/interfaces';
|
||||
|
||||
@Service()
|
||||
export class GetMatchedTransactionsByInvoices extends GetMatchedTransactionsByType {
|
||||
@Inject()
|
||||
protected tenancy: HasTenancyService;
|
||||
protected transformer: TransformerInjectable;
|
||||
|
||||
@Inject()
|
||||
protected transformer: TransformerInjectable;
|
||||
protected createPaymentReceivedService: CreatePaymentReceived;
|
||||
|
||||
/**
|
||||
* Retrieves the matched transactions.
|
||||
@@ -78,4 +82,64 @@ export class GetMatchedTransactionsByInvoices extends GetMatchedTransactionsByTy
|
||||
new GetMatchedTransactionInvoicesTransformer()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the common matched transaction.
|
||||
* @param {number} tenantId
|
||||
* @param {Array<number>} uncategorizedTransactionIds
|
||||
* @param {IMatchTransactionDTO} matchTransactionDTO
|
||||
* @param {Knex.Transaction} trx
|
||||
*/
|
||||
public async createMatchedTransaction(
|
||||
tenantId: number,
|
||||
uncategorizedTransactionIds: Array<number>,
|
||||
matchTransactionDTO: IMatchTransactionDTO,
|
||||
trx?: Knex.Transaction
|
||||
) {
|
||||
await super.createMatchedTransaction(
|
||||
tenantId,
|
||||
uncategorizedTransactionIds,
|
||||
matchTransactionDTO,
|
||||
trx
|
||||
);
|
||||
const { SaleInvoice, UncategorizedCashflowTransaction, MatchedBankTransaction } =
|
||||
this.tenancy.models(tenantId);
|
||||
|
||||
const uncategorizedTransactionId = first(uncategorizedTransactionIds);
|
||||
const uncategorizedTransaction =
|
||||
await UncategorizedCashflowTransaction.query(trx)
|
||||
.findById(uncategorizedTransactionId)
|
||||
.throwIfNotFound();
|
||||
|
||||
const invoice = await SaleInvoice.query(trx)
|
||||
.findById(matchTransactionDTO.referenceId)
|
||||
.throwIfNotFound();
|
||||
|
||||
const createPaymentReceivedDTO: IPaymentReceivedCreateDTO = {
|
||||
customerId: invoice.customerId,
|
||||
paymentDate: uncategorizedTransaction.date,
|
||||
amount: invoice.dueAmount,
|
||||
depositAccountId: uncategorizedTransaction.accountId,
|
||||
entries: [
|
||||
{
|
||||
index: 1,
|
||||
invoiceId: invoice.id,
|
||||
paymentAmount: invoice.dueAmount,
|
||||
},
|
||||
],
|
||||
branchId: invoice.branchId,
|
||||
};
|
||||
// Create a payment received associated to the matched invoice.
|
||||
const paymentReceived = await this.createPaymentReceivedService.createPaymentReceived(
|
||||
tenantId,
|
||||
createPaymentReceivedDTO,
|
||||
{},
|
||||
trx
|
||||
);
|
||||
// Link the create payment received with matched invoice transaction.
|
||||
await super.createMatchedTransaction(tenantId, uncategorizedTransactionIds, {
|
||||
referenceType: 'PaymentReceive',
|
||||
referenceId: paymentReceived.id,
|
||||
}, trx)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import {
|
||||
IBillPaymentEventDeletedPayload,
|
||||
IPaymentReceiveDeletedPayload,
|
||||
IPaymentReceivedDeletedPayload,
|
||||
} from '@/interfaces';
|
||||
import { ValidateTransactionMatched } from '../ValidateTransactionsMatched';
|
||||
import events from '@/subscribers/events';
|
||||
@@ -23,7 +23,7 @@ export class ValidateMatchingOnPaymentMadeDelete {
|
||||
|
||||
/**
|
||||
* Validates the payment made transaction whether matched with bank transaction on deleting.
|
||||
* @param {IPaymentReceiveDeletedPayload}
|
||||
* @param {IPaymentReceivedDeletedPayload}
|
||||
*/
|
||||
public async validateMatchingOnPaymentMadeDeleting({
|
||||
tenantId,
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import { IPaymentReceiveDeletedPayload } from '@/interfaces';
|
||||
import { IPaymentReceivedDeletedPayload } from '@/interfaces';
|
||||
import { ValidateTransactionMatched } from '../ValidateTransactionsMatched';
|
||||
import events from '@/subscribers/events';
|
||||
|
||||
@@ -20,13 +20,13 @@ export class ValidateMatchingOnPaymentReceivedDelete {
|
||||
|
||||
/**
|
||||
* Validates the payment received transaction whether matched with bank transaction on deleting.
|
||||
* @param {IPaymentReceiveDeletedPayload}
|
||||
* @param {IPaymentReceivedDeletedPayload}
|
||||
*/
|
||||
public async validateMatchingOnPaymentReceivedDeleting({
|
||||
tenantId,
|
||||
oldPaymentReceive,
|
||||
trx,
|
||||
}: IPaymentReceiveDeletedPayload) {
|
||||
}: IPaymentReceivedDeletedPayload) {
|
||||
await this.validateNoMatchingLinkedService.validateTransactionNoMatchLinking(
|
||||
tenantId,
|
||||
'PaymentReceive',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||
import { Knex } from 'knex';
|
||||
import { Inject, Service } from 'typedi';
|
||||
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||
import { PlaidClientWrapper } from '@/lib/Plaid/Plaid';
|
||||
import { PlaidSyncDb } from './PlaidSyncDB';
|
||||
import { PlaidFetchedTransactionsUpdates } from '@/interfaces';
|
||||
import UnitOfWork from '@/services/UnitOfWork';
|
||||
import { Knex } from 'knex';
|
||||
|
||||
@Service()
|
||||
export class PlaidUpdateTransactions {
|
||||
@@ -19,9 +19,9 @@ export class PlaidUpdateTransactions {
|
||||
|
||||
/**
|
||||
* Handles sync the Plaid item to Bigcaptial under UOW.
|
||||
* @param {number} tenantId
|
||||
* @param {number} plaidItemId
|
||||
* @returns {Promise<{ addedCount: number; modifiedCount: number; removedCount: number; }>}
|
||||
* @param {number} tenantId - Tenant id.
|
||||
* @param {number} plaidItemId - Plaid item id.
|
||||
* @returns {Promise<{ addedCount: number; modifiedCount: number; removedCount: number; }>}
|
||||
*/
|
||||
public async updateTransactions(tenantId: number, plaidItemId: string) {
|
||||
return this.uow.withTransaction(tenantId, (trx: Knex.Transaction) => {
|
||||
|
||||
@@ -33,17 +33,29 @@ const matchNumberCondition = (
|
||||
transaction: UncategorizedCashflowTransaction,
|
||||
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) {
|
||||
case BankRuleConditionComparator.Equals:
|
||||
return transaction[condition.field] === condition.value;
|
||||
case BankRuleConditionComparator.Contains:
|
||||
return transaction[condition.field]
|
||||
?.toString()
|
||||
.includes(condition.value.toString());
|
||||
case BankRuleConditionComparator.NotContain:
|
||||
return !transaction[condition.field]
|
||||
?.toString()
|
||||
.includes(condition.value.toString());
|
||||
case BankRuleConditionComparator.Equal:
|
||||
return transactionAmount === conditionValue;
|
||||
|
||||
case BankRuleConditionComparator.BiggerOrEqual:
|
||||
return transactionAmount >= conditionValue;
|
||||
|
||||
case BankRuleConditionComparator.Bigger:
|
||||
return transactionAmount > conditionValue;
|
||||
|
||||
case BankRuleConditionComparator.Smaller:
|
||||
return transactionAmount < conditionValue;
|
||||
|
||||
case BankRuleConditionComparator.SmallerOrEqual:
|
||||
return transactionAmount <= conditionValue;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
@@ -53,18 +65,19 @@ const matchTextCondition = (
|
||||
transaction: UncategorizedCashflowTransaction,
|
||||
condition: IBankRuleCondition
|
||||
): boolean => {
|
||||
const transactionValue = transaction[condition.field] as string;
|
||||
|
||||
switch (condition.comparator) {
|
||||
case BankRuleConditionComparator.Equals:
|
||||
return transaction[condition.field] === condition.value;
|
||||
case BankRuleConditionComparator.Equal:
|
||||
return transactionValue === condition.value;
|
||||
case BankRuleConditionComparator.Contains:
|
||||
const fieldValue = lowerCase(transaction[condition.field]);
|
||||
const fieldValue = lowerCase(transactionValue);
|
||||
const conditionValue = lowerCase(condition.value);
|
||||
|
||||
return fieldValue.includes(conditionValue);
|
||||
case BankRuleConditionComparator.NotContain:
|
||||
return !transaction[condition.field]?.includes(
|
||||
condition.value.toString()
|
||||
);
|
||||
return !transactionValue?.includes(condition.value.toString());
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
@@ -101,8 +114,8 @@ const determineFieldType = (field: string): string => {
|
||||
case 'amount':
|
||||
return 'number';
|
||||
case 'description':
|
||||
return 'text';
|
||||
case 'payee':
|
||||
default:
|
||||
return 'unknown';
|
||||
return 'text';
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import { isEqual, omit } from 'lodash';
|
||||
import events from '@/subscribers/events';
|
||||
import {
|
||||
IBankRuleEventCreatedPayload,
|
||||
@@ -55,10 +56,22 @@ export class TriggerRecognizedTransactions {
|
||||
private async recognizedTransactionsOnRuleEdited({
|
||||
tenantId,
|
||||
editRuleDTO,
|
||||
oldBankRule,
|
||||
bankRule,
|
||||
ruleId,
|
||||
}: IBankRuleEventEditedPayload) {
|
||||
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(
|
||||
'rerecognize-uncategorized-transactions-job',
|
||||
payload
|
||||
|
||||
@@ -26,31 +26,39 @@ export class DeleteBankRuleSerivce {
|
||||
* @param {number} ruleId
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
public async deleteBankRule(tenantId: number, ruleId: number): Promise<void> {
|
||||
public async deleteBankRule(
|
||||
tenantId: number,
|
||||
ruleId: number,
|
||||
trx?: Knex.Transaction
|
||||
): Promise<void> {
|
||||
const { BankRule, BankRuleCondition } = this.tenancy.models(tenantId);
|
||||
|
||||
const oldBankRule = await BankRule.query()
|
||||
.findById(ruleId)
|
||||
.throwIfNotFound();
|
||||
|
||||
return this.uow.withTransaction(tenantId, async (trx: Knex.Transaction) => {
|
||||
// Triggers `onBankRuleDeleting` event.
|
||||
await this.eventPublisher.emitAsync(events.bankRules.onDeleting, {
|
||||
tenantId,
|
||||
oldBankRule,
|
||||
ruleId,
|
||||
trx,
|
||||
} as IBankRuleEventDeletingPayload);
|
||||
return this.uow.withTransaction(
|
||||
tenantId,
|
||||
async (trx: Knex.Transaction) => {
|
||||
// Triggers `onBankRuleDeleting` event.
|
||||
await this.eventPublisher.emitAsync(events.bankRules.onDeleting, {
|
||||
tenantId,
|
||||
oldBankRule,
|
||||
ruleId,
|
||||
trx,
|
||||
} as IBankRuleEventDeletingPayload);
|
||||
|
||||
await BankRuleCondition.query(trx).where('ruleId', ruleId).delete();
|
||||
await BankRule.query(trx).findById(ruleId).delete();
|
||||
await BankRuleCondition.query(trx).where('ruleId', ruleId).delete()
|
||||
await BankRule.query(trx).findById(ruleId).delete();
|
||||
|
||||
// Triggers `onBankRuleDeleted` event.
|
||||
await await this.eventPublisher.emitAsync(events.bankRules.onDeleted, {
|
||||
tenantId,
|
||||
ruleId,
|
||||
trx,
|
||||
} as IBankRuleEventDeletedPayload);
|
||||
});
|
||||
// Triggers `onBankRuleDeleted` event.
|
||||
await await this.eventPublisher.emitAsync(events.bankRules.onDeleted, {
|
||||
tenantId,
|
||||
ruleId,
|
||||
trx,
|
||||
} as IBankRuleEventDeletedPayload);
|
||||
},
|
||||
trx
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
import { Knex } from 'knex';
|
||||
import { Inject, Service } from 'typedi';
|
||||
import PromisePool from '@supercharge/promise-pool';
|
||||
import { castArray, uniq } from 'lodash';
|
||||
import { DeleteBankRuleSerivce } from './DeleteBankRule';
|
||||
|
||||
@Service()
|
||||
export class DeleteBankRulesService {
|
||||
@Inject()
|
||||
private deleteBankRuleService: DeleteBankRuleSerivce;
|
||||
|
||||
/**
|
||||
* Delete bank rules.
|
||||
* @param {number} tenantId
|
||||
* @param {number | Array<number>} bankRuleId
|
||||
*/
|
||||
async deleteBankRules(
|
||||
tenantId: number,
|
||||
bankRuleId: number | Array<number>,
|
||||
trx?: Knex.Transaction
|
||||
) {
|
||||
const bankRulesIds = uniq(castArray(bankRuleId));
|
||||
|
||||
const results = await PromisePool.withConcurrency(1)
|
||||
.for(bankRulesIds)
|
||||
.process(async (bankRuleId: number) => {
|
||||
await this.deleteBankRuleService.deleteBankRule(
|
||||
tenantId,
|
||||
bankRuleId,
|
||||
trx
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -47,6 +47,7 @@ export class EditBankRuleService {
|
||||
|
||||
const oldBankRule = await BankRule.query()
|
||||
.findById(ruleId)
|
||||
.withGraphFetched('conditions')
|
||||
.throwIfNotFound();
|
||||
|
||||
const tranformDTO = this.transformDTO(editRuleDTO);
|
||||
@@ -64,15 +65,15 @@ export class EditBankRuleService {
|
||||
} as IBankRuleEventEditingPayload);
|
||||
|
||||
// Updates the given bank rule.
|
||||
await BankRule.query(trx).upsertGraphAndFetch({
|
||||
const bankRule = await BankRule.query(trx).upsertGraphAndFetch({
|
||||
...tranformDTO,
|
||||
id: ruleId,
|
||||
});
|
||||
|
||||
// Triggers `onBankRuleEdited` event.
|
||||
await this.eventPublisher.emitAsync(events.bankRules.onEdited, {
|
||||
tenantId,
|
||||
oldBankRule,
|
||||
bankRule,
|
||||
ruleId,
|
||||
editRuleDTO,
|
||||
trx,
|
||||
|
||||
@@ -1,15 +1,20 @@
|
||||
import { Knex } from 'knex';
|
||||
|
||||
export enum BankRuleConditionField {
|
||||
Amount = 'Amount',
|
||||
Description = 'Description',
|
||||
Payee = 'Payee',
|
||||
Amount = 'amount',
|
||||
Description = 'description',
|
||||
Payee = 'payee',
|
||||
}
|
||||
|
||||
export enum BankRuleConditionComparator {
|
||||
Contains = 'contains',
|
||||
Equals = 'equals',
|
||||
Equal = 'equal',
|
||||
NotContain = 'not_contain',
|
||||
Bigger = 'bigger',
|
||||
BiggerOrEqual = 'bigger_or_equal',
|
||||
Smaller = 'smaller',
|
||||
SmallerOrEqual = 'smaller_or_equal',
|
||||
}
|
||||
|
||||
export interface IBankRuleCondition {
|
||||
@@ -56,7 +61,15 @@ export enum BankRuleAssignCategory {
|
||||
export interface IBankRuleConditionDTO {
|
||||
id?: number;
|
||||
field: string;
|
||||
comparator: string;
|
||||
comparator:
|
||||
| 'contains'
|
||||
| 'equals'
|
||||
| 'not_contains'
|
||||
| 'equal'
|
||||
| 'bigger'
|
||||
| 'bigger_or_equal'
|
||||
| 'smaller'
|
||||
| 'smaller_or_equal';
|
||||
value: number;
|
||||
}
|
||||
|
||||
@@ -99,6 +112,8 @@ export interface IBankRuleEventEditingPayload {
|
||||
export interface IBankRuleEventEditedPayload {
|
||||
tenantId: number;
|
||||
ruleId: number;
|
||||
oldBankRule: IBankRule;
|
||||
bankRule: IBankRule;
|
||||
editRuleDTO: IEditBankRuleDTO;
|
||||
trx?: Knex.Transaction;
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import events from '@/subscribers/events';
|
||||
import {
|
||||
IPaymentReceiveCreatingPayload,
|
||||
IPaymentReceiveEditingPayload,
|
||||
IPaymentReceivedCreatingPayload,
|
||||
IPaymentReceivedEditingPayload,
|
||||
} from '@/interfaces';
|
||||
import { ValidateBranchExistance } from '../../Integrations/ValidateBranchExistance';
|
||||
|
||||
@@ -28,12 +28,12 @@ export class PaymentReceiveBranchValidateSubscriber {
|
||||
|
||||
/**
|
||||
* Validate branch existance on estimate creating.
|
||||
* @param {IPaymentReceiveCreatingPayload} payload
|
||||
* @param {IPaymentReceivedCreatingPayload} payload
|
||||
*/
|
||||
private validateBranchExistanceOnPaymentCreating = async ({
|
||||
tenantId,
|
||||
paymentReceiveDTO,
|
||||
}: IPaymentReceiveCreatingPayload) => {
|
||||
}: IPaymentReceivedCreatingPayload) => {
|
||||
await this.validateBranchExistance.validateTransactionBranchWhenActive(
|
||||
tenantId,
|
||||
paymentReceiveDTO.branchId
|
||||
@@ -42,12 +42,12 @@ export class PaymentReceiveBranchValidateSubscriber {
|
||||
|
||||
/**
|
||||
* Validate branch existance once estimate editing.
|
||||
* @param {IPaymentReceiveEditingPayload} payload
|
||||
* @param {IPaymentReceivedEditingPayload} payload
|
||||
*/
|
||||
private validateBranchExistanceOnPaymentEditing = async ({
|
||||
paymentReceiveDTO,
|
||||
tenantId,
|
||||
}: IPaymentReceiveEditingPayload) => {
|
||||
}: IPaymentReceivedEditingPayload) => {
|
||||
await this.validateBranchExistance.validateTransactionBranchWhenActive(
|
||||
tenantId,
|
||||
paymentReceiveDTO.branchId
|
||||
|
||||
@@ -9,7 +9,7 @@ import {
|
||||
} from '@/interfaces';
|
||||
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
|
||||
import UnitOfWork from '@/services/UnitOfWork';
|
||||
import { PaymentReceiveValidators } from '../Sales/PaymentReceives/PaymentReceiveValidators';
|
||||
import { PaymentReceivedValidators } from '../Sales/PaymentReceived/PaymentReceivedValidators';
|
||||
import BaseCreditNotes from './CreditNotes';
|
||||
import {
|
||||
IApplyCreditToInvoicesDTO,
|
||||
@@ -26,7 +26,7 @@ export default class CreditNoteApplyToInvoices extends BaseCreditNotes {
|
||||
private tenancy: HasTenancyService;
|
||||
|
||||
@Inject()
|
||||
private paymentReceiveValidators: PaymentReceiveValidators;
|
||||
private paymentReceiveValidators: PaymentReceivedValidators;
|
||||
|
||||
@Inject()
|
||||
private uow: UnitOfWork;
|
||||
|
||||
@@ -16,6 +16,7 @@ export class ExpenseTransfromer extends Transformer {
|
||||
'formattedAllocatedCostAmount',
|
||||
'formattedDate',
|
||||
'formattedCreatedAt',
|
||||
'formattedPublishedAt',
|
||||
'categories',
|
||||
'attachments',
|
||||
];
|
||||
@@ -91,4 +92,13 @@ export class ExpenseTransfromer extends Transformer {
|
||||
protected attachments = (expense: IExpense) => {
|
||||
return this.item(expense.attachments, new AttachmentTransformer());
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieve formatted published at date.
|
||||
* @param {IExpense} expense
|
||||
* @returns {string}
|
||||
*/
|
||||
protected formattedPublishedAt = (expense: IExpense): string => {
|
||||
return this.formatDate(expense.publishedAt);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import { SaleInvoicesExportable } from '../Sales/Invoices/SaleInvoicesExportable
|
||||
import { SaleEstimatesExportable } from '../Sales/Estimates/SaleEstimatesExportable';
|
||||
import { SaleReceiptsExportable } from '../Sales/Receipts/SaleReceiptsExportable';
|
||||
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 { ManualJournalsExportable } from '../ManualJournals/ManualJournalExportable';
|
||||
import { CreditNotesExportable } from '../CreditNotes/CreditNotesExportable';
|
||||
|
||||
@@ -15,6 +15,7 @@ import { FinancialSheetStructure } from '../FinancialSheetStructure';
|
||||
import { flatToNestedArray } from '@/utils';
|
||||
import Ledger from '@/services/Accounting/Ledger';
|
||||
import { calculateRunningBalance } from './_utils';
|
||||
import { getTransactionTypeLabel } from '@/utils/transactions-types';
|
||||
|
||||
/**
|
||||
* General ledger sheet.
|
||||
@@ -90,11 +91,13 @@ export default class GeneralLedgerSheet extends R.compose(
|
||||
date: entry.date,
|
||||
dateFormatted: moment(entry.date).format('YYYY MMM DD'),
|
||||
|
||||
transactionNumber: entry.transactionNumber,
|
||||
referenceType: entry.referenceType,
|
||||
referenceId: entry.referenceId,
|
||||
referenceTypeFormatted: this.i18n.__(entry.referenceTypeFormatted),
|
||||
referenceType: entry.transactionType,
|
||||
referenceId: entry.transactionId,
|
||||
|
||||
transactionNumber: entry.transactionNumber,
|
||||
transactionTypeFormatted: this.i18n.__(
|
||||
getTransactionTypeLabel(entry.transactionType, entry.transactionSubType)
|
||||
),
|
||||
contactName: get(contact, 'displayName'),
|
||||
contactType: get(contact, 'contactService'),
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ export class GeneralLedgerTable extends R.compose(
|
||||
return [
|
||||
{ key: 'date', accessor: 'dateFormatted' },
|
||||
{ key: 'account_name', accessor: 'account.name' },
|
||||
{ key: 'reference_type', accessor: 'referenceTypeFormatted' },
|
||||
{ key: 'reference_type', accessor: 'transactionTypeFormatted' },
|
||||
{ key: 'reference_number', accessor: 'transactionNumber' },
|
||||
{ key: 'description', accessor: 'note' },
|
||||
{ key: 'credit', accessor: 'formattedCredit' },
|
||||
|
||||
@@ -13,7 +13,7 @@ import { SaleInvoicesImportable } from '../Sales/Invoices/SaleInvoicesImportable
|
||||
import { SaleEstimatesImportable } from '../Sales/Estimates/SaleEstimatesImportable';
|
||||
import { BillPaymentsImportable } from '../Purchases/BillPayments/BillPaymentsImportable';
|
||||
import { VendorCreditsImportable } from '../Purchases/VendorCredits/VendorCreditsImportable';
|
||||
import { PaymentReceivesImportable } from '../Sales/PaymentReceives/PaymentReceivesImportable';
|
||||
import { PaymentsReceivedImportable } from '../Sales/PaymentReceived/PaymentsReceivedImportable';
|
||||
import { CreditNotesImportable } from '../CreditNotes/CreditNotesImportable';
|
||||
import { SaleReceiptsImportable } from '../Sales/Receipts/SaleReceiptsImportable';
|
||||
import { TaxRatesImportable } from '../TaxRates/TaxRatesImportable';
|
||||
@@ -45,7 +45,7 @@ export class ImportableResources {
|
||||
{ resource: 'SaleInvoice', importable: SaleInvoicesImportable },
|
||||
{ resource: 'SaleEstimate', importable: SaleEstimatesImportable },
|
||||
{ resource: 'BillPayment', importable: BillPaymentsImportable },
|
||||
{ resource: 'PaymentReceive', importable: PaymentReceivesImportable },
|
||||
{ resource: 'PaymentReceive', importable: PaymentsReceivedImportable },
|
||||
{ resource: 'VendorCredit', importable: VendorCreditsImportable },
|
||||
{ resource: 'CreditNote', importable: CreditNotesImportable },
|
||||
{ resource: 'SaleReceipt', importable: SaleReceiptsImportable },
|
||||
|
||||
@@ -6,7 +6,7 @@ import SaleNotifyBySms from '../SaleNotifyBySms';
|
||||
import SmsNotificationsSettingsService from '@/services/Settings/SmsNotificationsSettings';
|
||||
import {
|
||||
ICustomer,
|
||||
IPaymentReceiveSmsDetails,
|
||||
IPaymentReceivedSmsDetails,
|
||||
ISaleEstimate,
|
||||
SMS_NOTIFICATION_KEY,
|
||||
} from '@/interfaces';
|
||||
@@ -173,12 +173,12 @@ export class SaleEstimateNotifyBySms {
|
||||
* Retrieve the SMS details of the given payment receive transaction.
|
||||
* @param {number} tenantId
|
||||
* @param {number} saleEstimateId
|
||||
* @returns {Promise<IPaymentReceiveSmsDetails>}
|
||||
* @returns {Promise<IPaymentReceivedSmsDetails>}
|
||||
*/
|
||||
public smsDetails = async (
|
||||
tenantId: number,
|
||||
saleEstimateId: number
|
||||
): Promise<IPaymentReceiveSmsDetails> => {
|
||||
): Promise<IPaymentReceivedSmsDetails> => {
|
||||
const { SaleEstimate } = this.tenancy.models(tenantId);
|
||||
|
||||
// Retrieve the sale invoice or throw not found service error.
|
||||
|
||||
@@ -3,7 +3,7 @@ import { CreateSaleEstimate } from './CreateSaleEstimate';
|
||||
import {
|
||||
IFilterMeta,
|
||||
IPaginationMeta,
|
||||
IPaymentReceiveSmsDetails,
|
||||
IPaymentReceivedSmsDetails,
|
||||
ISaleEstimate,
|
||||
ISaleEstimateDTO,
|
||||
ISalesEstimatesFilter,
|
||||
@@ -191,12 +191,12 @@ export class SaleEstimatesApplication {
|
||||
* Retrieve the SMS details of the given payment receive transaction.
|
||||
* @param {number} tenantId
|
||||
* @param {number} saleEstimateId
|
||||
* @returns {Promise<IPaymentReceiveSmsDetails>}
|
||||
* @returns {Promise<IPaymentReceivedSmsDetails>}
|
||||
*/
|
||||
public getSaleEstimateSmsDetails = (
|
||||
tenantId: number,
|
||||
saleEstimateId: number
|
||||
): Promise<IPaymentReceiveSmsDetails> => {
|
||||
): Promise<IPaymentReceivedSmsDetails> => {
|
||||
return this.saleEstimateNotifyBySmsService.smsDetails(
|
||||
tenantId,
|
||||
saleEstimateId
|
||||
|
||||
@@ -2,7 +2,7 @@ import { Knex } from 'knex';
|
||||
import async from 'async';
|
||||
import { Inject, Service } from 'typedi';
|
||||
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||
import { PaymentReceiveGLEntries } from '../PaymentReceives/PaymentReceiveGLEntries';
|
||||
import { PaymentReceivedGLEntries } from '../PaymentReceived/PaymentReceivedGLEntries';
|
||||
|
||||
@Service()
|
||||
export class InvoicePaymentsGLEntriesRewrite {
|
||||
@@ -10,7 +10,7 @@ export class InvoicePaymentsGLEntriesRewrite {
|
||||
public tenancy: HasTenancyService;
|
||||
|
||||
@Inject()
|
||||
public paymentGLEntries: PaymentReceiveGLEntries;
|
||||
public paymentGLEntries: PaymentReceivedGLEntries;
|
||||
|
||||
/**
|
||||
* Rewrites the payment GL entries task.
|
||||
|
||||
@@ -2,23 +2,23 @@ import { Inject, Service } from 'typedi';
|
||||
import { Knex } from 'knex';
|
||||
import {
|
||||
ICustomer,
|
||||
IPaymentReceiveCreateDTO,
|
||||
IPaymentReceiveCreatedPayload,
|
||||
IPaymentReceiveCreatingPayload,
|
||||
IPaymentReceivedCreateDTO,
|
||||
IPaymentReceivedCreatedPayload,
|
||||
IPaymentReceivedCreatingPayload,
|
||||
ISystemUser,
|
||||
} from '@/interfaces';
|
||||
import { PaymentReceiveValidators } from './PaymentReceiveValidators';
|
||||
import { PaymentReceivedValidators } from './PaymentReceivedValidators';
|
||||
import events from '@/subscribers/events';
|
||||
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||
import UnitOfWork from '@/services/UnitOfWork';
|
||||
import { PaymentReceiveDTOTransformer } from './PaymentReceiveDTOTransformer';
|
||||
import { PaymentReceiveDTOTransformer } from './PaymentReceivedDTOTransformer';
|
||||
import { TenantMetadata } from '@/system/models';
|
||||
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
|
||||
|
||||
@Service()
|
||||
export class CreatePaymentReceive {
|
||||
export class CreatePaymentReceived {
|
||||
@Inject()
|
||||
private validators: PaymentReceiveValidators;
|
||||
private validators: PaymentReceivedValidators;
|
||||
|
||||
@Inject()
|
||||
private eventPublisher: EventPublisher;
|
||||
@@ -37,11 +37,11 @@ export class CreatePaymentReceive {
|
||||
* with associated invoices payment and journal transactions.
|
||||
* @async
|
||||
* @param {number} tenantId - Tenant id.
|
||||
* @param {IPaymentReceive} paymentReceive
|
||||
* @param {IPaymentReceived} paymentReceive
|
||||
*/
|
||||
public async createPaymentReceive(
|
||||
public async createPaymentReceived(
|
||||
tenantId: number,
|
||||
paymentReceiveDTO: IPaymentReceiveCreateDTO,
|
||||
paymentReceiveDTO: IPaymentReceivedCreateDTO,
|
||||
authorizedUser: ISystemUser,
|
||||
trx?: Knex.Transaction
|
||||
) {
|
||||
@@ -97,7 +97,7 @@ export class CreatePaymentReceive {
|
||||
trx,
|
||||
paymentReceiveDTO,
|
||||
tenantId,
|
||||
} as IPaymentReceiveCreatingPayload);
|
||||
} as IPaymentReceivedCreatingPayload);
|
||||
|
||||
// Inserts the payment receive transaction.
|
||||
const paymentReceive = await PaymentReceive.query(
|
||||
@@ -113,7 +113,7 @@ export class CreatePaymentReceive {
|
||||
paymentReceiveDTO,
|
||||
authorizedUser,
|
||||
trx,
|
||||
} as IPaymentReceiveCreatedPayload);
|
||||
} as IPaymentReceivedCreatedPayload);
|
||||
|
||||
return paymentReceive;
|
||||
},
|
||||
@@ -125,13 +125,13 @@ export class CreatePaymentReceive {
|
||||
* Transform the create payment receive DTO.
|
||||
* @param {number} tenantId
|
||||
* @param {ICustomer} customer
|
||||
* @param {IPaymentReceiveCreateDTO} paymentReceiveDTO
|
||||
* @param {IPaymentReceivedCreateDTO} paymentReceiveDTO
|
||||
* @returns
|
||||
*/
|
||||
private transformCreateDTOToModel = async (
|
||||
tenantId: number,
|
||||
customer: ICustomer,
|
||||
paymentReceiveDTO: IPaymentReceiveCreateDTO
|
||||
paymentReceiveDTO: IPaymentReceivedCreateDTO
|
||||
) => {
|
||||
return this.transformer.transformPaymentReceiveDTOToModel(
|
||||
tenantId,
|
||||
@@ -1,8 +1,8 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import { Knex } from 'knex';
|
||||
import {
|
||||
IPaymentReceiveDeletedPayload,
|
||||
IPaymentReceiveDeletingPayload,
|
||||
IPaymentReceivedDeletedPayload,
|
||||
IPaymentReceivedDeletingPayload,
|
||||
ISystemUser,
|
||||
} from '@/interfaces';
|
||||
import UnitOfWork from '@/services/UnitOfWork';
|
||||
@@ -11,7 +11,7 @@ import events from '@/subscribers/events';
|
||||
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
|
||||
|
||||
@Service()
|
||||
export class DeletePaymentReceive {
|
||||
export class DeletePaymentReceived {
|
||||
@Inject()
|
||||
private eventPublisher: EventPublisher;
|
||||
|
||||
@@ -33,7 +33,7 @@ export class DeletePaymentReceive {
|
||||
* @async
|
||||
* @param {number} tenantId - Tenant id.
|
||||
* @param {Integer} paymentReceiveId - Payment receive id.
|
||||
* @param {IPaymentReceive} paymentReceive - Payment receive object.
|
||||
* @param {IPaymentReceived} paymentReceive - Payment receive object.
|
||||
*/
|
||||
public async deletePaymentReceive(
|
||||
tenantId: number,
|
||||
@@ -56,7 +56,7 @@ export class DeletePaymentReceive {
|
||||
tenantId,
|
||||
oldPaymentReceive,
|
||||
trx,
|
||||
} as IPaymentReceiveDeletingPayload);
|
||||
} as IPaymentReceivedDeletingPayload);
|
||||
|
||||
// Deletes the payment receive associated entries.
|
||||
await PaymentReceiveEntry.query(trx)
|
||||
@@ -73,7 +73,7 @@ export class DeletePaymentReceive {
|
||||
oldPaymentReceive,
|
||||
authorizedUser,
|
||||
trx,
|
||||
} as IPaymentReceiveDeletedPayload);
|
||||
} as IPaymentReceivedDeletedPayload);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -2,14 +2,14 @@ import { Inject, Service } from 'typedi';
|
||||
import { Knex } from 'knex';
|
||||
import {
|
||||
ICustomer,
|
||||
IPaymentReceive,
|
||||
IPaymentReceiveEditDTO,
|
||||
IPaymentReceiveEditedPayload,
|
||||
IPaymentReceiveEditingPayload,
|
||||
IPaymentReceived,
|
||||
IPaymentReceivedEditDTO,
|
||||
IPaymentReceivedEditedPayload,
|
||||
IPaymentReceivedEditingPayload,
|
||||
ISystemUser,
|
||||
} from '@/interfaces';
|
||||
import { PaymentReceiveDTOTransformer } from './PaymentReceiveDTOTransformer';
|
||||
import { PaymentReceiveValidators } from './PaymentReceiveValidators';
|
||||
import { PaymentReceiveDTOTransformer } from './PaymentReceivedDTOTransformer';
|
||||
import { PaymentReceivedValidators } from './PaymentReceivedValidators';
|
||||
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
|
||||
import events from '@/subscribers/events';
|
||||
import UnitOfWork from '@/services/UnitOfWork';
|
||||
@@ -17,12 +17,12 @@ import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||
import { TenantMetadata } from '@/system/models';
|
||||
|
||||
@Service()
|
||||
export class EditPaymentReceive {
|
||||
export class EditPaymentReceived {
|
||||
@Inject()
|
||||
private transformer: PaymentReceiveDTOTransformer;
|
||||
|
||||
@Inject()
|
||||
private validators: PaymentReceiveValidators;
|
||||
private validators: PaymentReceivedValidators;
|
||||
|
||||
@Inject()
|
||||
private eventPublisher: EventPublisher;
|
||||
@@ -46,12 +46,12 @@ export class EditPaymentReceive {
|
||||
* @async
|
||||
* @param {number} tenantId -
|
||||
* @param {Integer} paymentReceiveId -
|
||||
* @param {IPaymentReceive} paymentReceive -
|
||||
* @param {IPaymentReceived} paymentReceive -
|
||||
*/
|
||||
public async editPaymentReceive(
|
||||
tenantId: number,
|
||||
paymentReceiveId: number,
|
||||
paymentReceiveDTO: IPaymentReceiveEditDTO,
|
||||
paymentReceiveDTO: IPaymentReceivedEditDTO,
|
||||
authorizedUser: ISystemUser
|
||||
) {
|
||||
const { PaymentReceive, Contact } = this.tenancy.models(tenantId);
|
||||
@@ -131,7 +131,7 @@ export class EditPaymentReceive {
|
||||
tenantId,
|
||||
oldPaymentReceive,
|
||||
paymentReceiveDTO,
|
||||
} as IPaymentReceiveEditingPayload);
|
||||
} as IPaymentReceivedEditingPayload);
|
||||
|
||||
// Update the payment receive transaction.
|
||||
const paymentReceive = await PaymentReceive.query(
|
||||
@@ -149,7 +149,7 @@ export class EditPaymentReceive {
|
||||
paymentReceiveDTO,
|
||||
authorizedUser,
|
||||
trx,
|
||||
} as IPaymentReceiveEditedPayload);
|
||||
} as IPaymentReceivedEditedPayload);
|
||||
|
||||
return paymentReceive;
|
||||
});
|
||||
@@ -159,15 +159,15 @@ export class EditPaymentReceive {
|
||||
* Transform the edit payment receive DTO.
|
||||
* @param {number} tenantId
|
||||
* @param {ICustomer} customer
|
||||
* @param {IPaymentReceiveEditDTO} paymentReceiveDTO
|
||||
* @param {IPaymentReceive} oldPaymentReceive
|
||||
* @param {IPaymentReceivedEditDTO} paymentReceiveDTO
|
||||
* @param {IPaymentReceived} oldPaymentReceive
|
||||
* @returns
|
||||
*/
|
||||
private transformEditDTOToModel = async (
|
||||
tenantId: number,
|
||||
customer: ICustomer,
|
||||
paymentReceiveDTO: IPaymentReceiveEditDTO,
|
||||
oldPaymentReceive: IPaymentReceive
|
||||
paymentReceiveDTO: IPaymentReceivedEditDTO,
|
||||
oldPaymentReceive: IPaymentReceived
|
||||
) => {
|
||||
return this.transformer.transformPaymentReceiveDTOToModel(
|
||||
tenantId,
|
||||
@@ -1,13 +1,13 @@
|
||||
import { ServiceError } from '@/exceptions';
|
||||
import { IPaymentReceive } from '@/interfaces';
|
||||
import { IPaymentReceived } from '@/interfaces';
|
||||
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||
import { Inject, Service } from 'typedi';
|
||||
import { ERRORS } from './constants';
|
||||
import { PaymentReceiveTransfromer } from './PaymentReceiveTransformer';
|
||||
import { PaymentReceiveTransfromer } from './PaymentReceivedTransformer';
|
||||
import { TransformerInjectable } from '@/lib/Transformer/TransformerInjectable';
|
||||
|
||||
@Service()
|
||||
export class GetPaymentReceive {
|
||||
export class GetPaymentReceived {
|
||||
@Inject()
|
||||
private tenancy: HasTenancyService;
|
||||
|
||||
@@ -18,12 +18,12 @@ export class GetPaymentReceive {
|
||||
* Retrieve payment receive details.
|
||||
* @param {number} tenantId - Tenant id.
|
||||
* @param {number} paymentReceiveId - Payment receive id.
|
||||
* @return {Promise<IPaymentReceive>}
|
||||
* @return {Promise<IPaymentReceived>}
|
||||
*/
|
||||
public async getPaymentReceive(
|
||||
tenantId: number,
|
||||
paymentReceiveId: number
|
||||
): Promise<IPaymentReceive> {
|
||||
): Promise<IPaymentReceived> {
|
||||
const { PaymentReceive } = this.tenancy.models(tenantId);
|
||||
|
||||
const paymentReceive = await PaymentReceive.query()
|
||||
@@ -1,14 +1,14 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||
import { PaymentReceiveValidators } from './PaymentReceiveValidators';
|
||||
import { PaymentReceivedValidators } from './PaymentReceivedValidators';
|
||||
|
||||
@Service()
|
||||
export class GetPaymentReceiveInvoices {
|
||||
export class GetPaymentReceivedInvoices {
|
||||
@Inject()
|
||||
private tenancy: HasTenancyService;
|
||||
|
||||
@Inject()
|
||||
private validators: PaymentReceiveValidators;
|
||||
private validators: PaymentReceivedValidators;
|
||||
|
||||
/**
|
||||
* Retrieve sale invoices that assocaited to the given payment receive.
|
||||
@@ -1,10 +1,10 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import { ChromiumlyTenancy } from '@/services/ChromiumlyTenancy/ChromiumlyTenancy';
|
||||
import { TemplateInjectable } from '@/services/TemplateInjectable/TemplateInjectable';
|
||||
import { GetPaymentReceive } from './GetPaymentReceive';
|
||||
import { GetPaymentReceived } from './GetPaymentReceived';
|
||||
|
||||
@Service()
|
||||
export default class GetPaymentReceivePdf {
|
||||
export default class GetPaymentReceivedPdf {
|
||||
@Inject()
|
||||
private chromiumlyTenancy: ChromiumlyTenancy;
|
||||
|
||||
@@ -12,12 +12,12 @@ export default class GetPaymentReceivePdf {
|
||||
private templateInjectable: TemplateInjectable;
|
||||
|
||||
@Inject()
|
||||
private getPaymentService: GetPaymentReceive;
|
||||
private getPaymentService: GetPaymentReceived;
|
||||
|
||||
/**
|
||||
* Retrieve sale invoice pdf content.
|
||||
* @param {number} tenantId -
|
||||
* @param {IPaymentReceive} paymentReceive -
|
||||
* @param {IPaymentReceived} paymentReceive -
|
||||
* @returns {Promise<Buffer>}
|
||||
*/
|
||||
async getPaymentReceivePdf(
|
||||
@@ -3,10 +3,10 @@ import * as R from 'ramda';
|
||||
import {
|
||||
IFilterMeta,
|
||||
IPaginationMeta,
|
||||
IPaymentReceive,
|
||||
IPaymentReceivesFilter,
|
||||
IPaymentReceived,
|
||||
IPaymentsReceivedFilter,
|
||||
} from '@/interfaces';
|
||||
import { PaymentReceiveTransfromer } from './PaymentReceiveTransformer';
|
||||
import { PaymentReceiveTransfromer } from './PaymentReceivedTransformer';
|
||||
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||
import { TransformerInjectable } from '@/lib/Transformer/TransformerInjectable';
|
||||
import DynamicListingService from '@/services/DynamicListing/DynamicListService';
|
||||
@@ -25,13 +25,13 @@ export class GetPaymentReceives {
|
||||
/**
|
||||
* Retrieve payment receives paginated and filterable list.
|
||||
* @param {number} tenantId
|
||||
* @param {IPaymentReceivesFilter} paymentReceivesFilter
|
||||
* @param {IPaymentsReceivedFilter} paymentReceivesFilter
|
||||
*/
|
||||
public async getPaymentReceives(
|
||||
tenantId: number,
|
||||
filterDTO: IPaymentReceivesFilter
|
||||
filterDTO: IPaymentsReceivedFilter
|
||||
): Promise<{
|
||||
paymentReceives: IPaymentReceive[];
|
||||
paymentReceives: IPaymentReceived[];
|
||||
pagination: IPaginationMeta;
|
||||
filterMeta: IFilterMeta;
|
||||
}> {
|
||||
@@ -1,44 +1,44 @@
|
||||
import {
|
||||
IFilterMeta,
|
||||
IPaginationMeta,
|
||||
IPaymentReceive,
|
||||
IPaymentReceiveCreateDTO,
|
||||
IPaymentReceiveEditDTO,
|
||||
IPaymentReceiveSmsDetails,
|
||||
IPaymentReceivesFilter,
|
||||
IPaymentReceived,
|
||||
IPaymentReceivedCreateDTO,
|
||||
IPaymentReceivedEditDTO,
|
||||
IPaymentReceivedSmsDetails,
|
||||
IPaymentsReceivedFilter,
|
||||
ISystemUser,
|
||||
PaymentReceiveMailOptsDTO,
|
||||
} from '@/interfaces';
|
||||
import { Inject, Service } from 'typedi';
|
||||
import { CreatePaymentReceive } from './CreatePaymentReceive';
|
||||
import { EditPaymentReceive } from './EditPaymentReceive';
|
||||
import { DeletePaymentReceive } from './DeletePaymentReceive';
|
||||
import { GetPaymentReceives } from './GetPaymentReceives';
|
||||
import { GetPaymentReceive } from './GetPaymentReceive';
|
||||
import { GetPaymentReceiveInvoices } from './GetPaymentReceiveInvoices';
|
||||
import { PaymentReceiveNotifyBySms } from './PaymentReceiveSmsNotify';
|
||||
import GetPaymentReceivePdf from './GetPaymentReeceivePdf';
|
||||
import { SendPaymentReceiveMailNotification } from './PaymentReceiveMailNotification';
|
||||
import { CreatePaymentReceived } from './CreatePaymentReceived';
|
||||
import { EditPaymentReceived } from './EditPaymentReceived';
|
||||
import { DeletePaymentReceived } from './DeletePaymentReceived';
|
||||
import { GetPaymentReceives } from './GetPaymentsReceived';
|
||||
import { GetPaymentReceived } from './GetPaymentReceived';
|
||||
import { GetPaymentReceivedInvoices } from './GetPaymentReceivedInvoices';
|
||||
import { PaymentReceiveNotifyBySms } from './PaymentReceivedSmsNotify';
|
||||
import GetPaymentReceivedPdf from './GetPaymentReceivedPdf';
|
||||
import { SendPaymentReceiveMailNotification } from './PaymentReceivedMailNotification';
|
||||
|
||||
@Service()
|
||||
export class PaymentReceivesApplication {
|
||||
@Inject()
|
||||
private createPaymentReceiveService: CreatePaymentReceive;
|
||||
private createPaymentReceivedService: CreatePaymentReceived;
|
||||
|
||||
@Inject()
|
||||
private editPaymentReceiveService: EditPaymentReceive;
|
||||
private editPaymentReceivedService: EditPaymentReceived;
|
||||
|
||||
@Inject()
|
||||
private deletePaymentReceiveService: DeletePaymentReceive;
|
||||
private deletePaymentReceivedService: DeletePaymentReceived;
|
||||
|
||||
@Inject()
|
||||
private getPaymentReceivesService: GetPaymentReceives;
|
||||
private getPaymentsReceivedService: GetPaymentReceives;
|
||||
|
||||
@Inject()
|
||||
private getPaymentReceiveService: GetPaymentReceive;
|
||||
private getPaymentReceivedService: GetPaymentReceived;
|
||||
|
||||
@Inject()
|
||||
private getPaymentReceiveInvoicesService: GetPaymentReceiveInvoices;
|
||||
private getPaymentReceiveInvoicesService: GetPaymentReceivedInvoices;
|
||||
|
||||
@Inject()
|
||||
private paymentSmsNotify: PaymentReceiveNotifyBySms;
|
||||
@@ -47,21 +47,21 @@ export class PaymentReceivesApplication {
|
||||
private paymentMailNotify: SendPaymentReceiveMailNotification;
|
||||
|
||||
@Inject()
|
||||
private getPaymentReceivePdfService: GetPaymentReceivePdf;
|
||||
private getPaymentReceivePdfService: GetPaymentReceivedPdf;
|
||||
|
||||
/**
|
||||
* Creates a new payment receive.
|
||||
* @param {number} tenantId
|
||||
* @param {IPaymentReceiveCreateDTO} paymentReceiveDTO
|
||||
* @param {IPaymentReceivedCreateDTO} paymentReceiveDTO
|
||||
* @param {ISystemUser} authorizedUser
|
||||
* @returns
|
||||
*/
|
||||
public createPaymentReceive(
|
||||
public createPaymentReceived(
|
||||
tenantId: number,
|
||||
paymentReceiveDTO: IPaymentReceiveCreateDTO,
|
||||
paymentReceiveDTO: IPaymentReceivedCreateDTO,
|
||||
authorizedUser: ISystemUser
|
||||
) {
|
||||
return this.createPaymentReceiveService.createPaymentReceive(
|
||||
return this.createPaymentReceivedService.createPaymentReceived(
|
||||
tenantId,
|
||||
paymentReceiveDTO,
|
||||
authorizedUser
|
||||
@@ -72,17 +72,17 @@ export class PaymentReceivesApplication {
|
||||
* Edit details the given payment receive with associated entries.
|
||||
* @param {number} tenantId
|
||||
* @param {number} paymentReceiveId
|
||||
* @param {IPaymentReceiveEditDTO} paymentReceiveDTO
|
||||
* @param {IPaymentReceivedEditDTO} paymentReceiveDTO
|
||||
* @param {ISystemUser} authorizedUser
|
||||
* @returns
|
||||
*/
|
||||
public editPaymentReceive(
|
||||
tenantId: number,
|
||||
paymentReceiveId: number,
|
||||
paymentReceiveDTO: IPaymentReceiveEditDTO,
|
||||
paymentReceiveDTO: IPaymentReceivedEditDTO,
|
||||
authorizedUser: ISystemUser
|
||||
) {
|
||||
return this.editPaymentReceiveService.editPaymentReceive(
|
||||
return this.editPaymentReceivedService.editPaymentReceive(
|
||||
tenantId,
|
||||
paymentReceiveId,
|
||||
paymentReceiveDTO,
|
||||
@@ -102,7 +102,7 @@ export class PaymentReceivesApplication {
|
||||
paymentReceiveId: number,
|
||||
authorizedUser: ISystemUser
|
||||
) {
|
||||
return this.deletePaymentReceiveService.deletePaymentReceive(
|
||||
return this.deletePaymentReceivedService.deletePaymentReceive(
|
||||
tenantId,
|
||||
paymentReceiveId,
|
||||
authorizedUser
|
||||
@@ -112,18 +112,18 @@ export class PaymentReceivesApplication {
|
||||
/**
|
||||
* Retrieve payment receives paginated and filterable.
|
||||
* @param {number} tenantId
|
||||
* @param {IPaymentReceivesFilter} filterDTO
|
||||
* @param {IPaymentsReceivedFilter} filterDTO
|
||||
* @returns
|
||||
*/
|
||||
public async getPaymentReceives(
|
||||
tenantId: number,
|
||||
filterDTO: IPaymentReceivesFilter
|
||||
filterDTO: IPaymentsReceivedFilter
|
||||
): Promise<{
|
||||
paymentReceives: IPaymentReceive[];
|
||||
paymentReceives: IPaymentReceived[];
|
||||
pagination: IPaginationMeta;
|
||||
filterMeta: IFilterMeta;
|
||||
}> {
|
||||
return this.getPaymentReceivesService.getPaymentReceives(
|
||||
return this.getPaymentsReceivedService.getPaymentReceives(
|
||||
tenantId,
|
||||
filterDTO
|
||||
);
|
||||
@@ -133,13 +133,13 @@ export class PaymentReceivesApplication {
|
||||
* Retrieves the given payment receive.
|
||||
* @param {number} tenantId
|
||||
* @param {number} paymentReceiveId
|
||||
* @returns {Promise<IPaymentReceive>}
|
||||
* @returns {Promise<IPaymentReceived>}
|
||||
*/
|
||||
public async getPaymentReceive(
|
||||
tenantId: number,
|
||||
paymentReceiveId: number
|
||||
): Promise<IPaymentReceive> {
|
||||
return this.getPaymentReceiveService.getPaymentReceive(
|
||||
): Promise<IPaymentReceived> {
|
||||
return this.getPaymentReceivedService.getPaymentReceive(
|
||||
tenantId,
|
||||
paymentReceiveId
|
||||
);
|
||||
@@ -175,7 +175,7 @@ export class PaymentReceivesApplication {
|
||||
public getPaymentSmsDetails = async (
|
||||
tenantId: number,
|
||||
paymentReceiveId: number
|
||||
): Promise<IPaymentReceiveSmsDetails> => {
|
||||
): Promise<IPaymentReceivedSmsDetails> => {
|
||||
return this.paymentSmsNotify.smsDetails(tenantId, paymentReceiveId);
|
||||
};
|
||||
|
||||
@@ -3,22 +3,22 @@ import { Inject, Service } from 'typedi';
|
||||
import { omit, sumBy } from 'lodash';
|
||||
import {
|
||||
ICustomer,
|
||||
IPaymentReceive,
|
||||
IPaymentReceiveCreateDTO,
|
||||
IPaymentReceiveEditDTO,
|
||||
IPaymentReceived,
|
||||
IPaymentReceivedCreateDTO,
|
||||
IPaymentReceivedEditDTO,
|
||||
} from '@/interfaces';
|
||||
import { PaymentReceiveValidators } from './PaymentReceiveValidators';
|
||||
import { PaymentReceiveIncrement } from './PaymentReceiveIncrement';
|
||||
import { PaymentReceivedValidators } from './PaymentReceivedValidators';
|
||||
import { PaymentReceivedIncrement } from './PaymentReceivedIncrement';
|
||||
import { BranchTransactionDTOTransform } from '@/services/Branches/Integrations/BranchTransactionDTOTransform';
|
||||
import { formatDateFields } from '@/utils';
|
||||
|
||||
@Service()
|
||||
export class PaymentReceiveDTOTransformer {
|
||||
@Inject()
|
||||
private validators: PaymentReceiveValidators;
|
||||
private validators: PaymentReceivedValidators;
|
||||
|
||||
@Inject()
|
||||
private increments: PaymentReceiveIncrement;
|
||||
private increments: PaymentReceivedIncrement;
|
||||
|
||||
@Inject()
|
||||
private branchDTOTransform: BranchTransactionDTOTransform;
|
||||
@@ -26,16 +26,16 @@ export class PaymentReceiveDTOTransformer {
|
||||
/**
|
||||
* Transformes the create payment receive DTO to model object.
|
||||
* @param {number} tenantId
|
||||
* @param {IPaymentReceiveCreateDTO|IPaymentReceiveEditDTO} paymentReceiveDTO - Payment receive DTO.
|
||||
* @param {IPaymentReceive} oldPaymentReceive -
|
||||
* @return {IPaymentReceive}
|
||||
* @param {IPaymentReceivedCreateDTO|IPaymentReceivedEditDTO} paymentReceiveDTO - Payment receive DTO.
|
||||
* @param {IPaymentReceived} oldPaymentReceive -
|
||||
* @return {IPaymentReceived}
|
||||
*/
|
||||
public async transformPaymentReceiveDTOToModel(
|
||||
tenantId: number,
|
||||
customer: ICustomer,
|
||||
paymentReceiveDTO: IPaymentReceiveCreateDTO | IPaymentReceiveEditDTO,
|
||||
oldPaymentReceive?: IPaymentReceive
|
||||
): Promise<IPaymentReceive> {
|
||||
paymentReceiveDTO: IPaymentReceivedCreateDTO | IPaymentReceivedEditDTO,
|
||||
oldPaymentReceive?: IPaymentReceived
|
||||
): Promise<IPaymentReceived> {
|
||||
const amount =
|
||||
paymentReceiveDTO.amount ??
|
||||
sumBy(paymentReceiveDTO.entries, 'paymentAmount');
|
||||
@@ -65,7 +65,7 @@ export class PaymentReceiveDTOTransformer {
|
||||
})),
|
||||
};
|
||||
return R.compose(
|
||||
this.branchDTOTransform.transformDTO<IPaymentReceive>(tenantId)
|
||||
this.branchDTOTransform.transformDTO<IPaymentReceived>(tenantId)
|
||||
)(initialDTO);
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@ import { Transformer } from '@/lib/Transformer/Transformer';
|
||||
import { SaleInvoiceTransformer } from '../Invoices/SaleInvoiceTransformer';
|
||||
import { formatNumber } from '@/utils';
|
||||
|
||||
export class PaymentReceiveEntryTransfromer extends Transformer {
|
||||
export class PaymentReceivedEntryTransfromer extends Transformer {
|
||||
/**
|
||||
* Include these attributes to payment receive entry object.
|
||||
* @returns {Array}
|
||||
@@ -4,7 +4,7 @@ import { Knex } from 'knex';
|
||||
import Ledger from '@/services/Accounting/Ledger';
|
||||
import TenancyService from '@/services/Tenancy/TenancyService';
|
||||
import {
|
||||
IPaymentReceive,
|
||||
IPaymentReceived,
|
||||
ILedgerEntry,
|
||||
AccountNormal,
|
||||
IPaymentReceiveGLCommonEntry,
|
||||
@@ -13,7 +13,7 @@ import LedgerStorageService from '@/services/Accounting/LedgerStorageService';
|
||||
import { TenantMetadata } from '@/system/models';
|
||||
|
||||
@Service()
|
||||
export class PaymentReceiveGLEntries {
|
||||
export class PaymentReceivedGLEntries {
|
||||
@Inject()
|
||||
private tenancy: TenancyService;
|
||||
|
||||
@@ -93,14 +93,14 @@ export class PaymentReceiveGLEntries {
|
||||
/**
|
||||
* Retrieves the payment receive general ledger.
|
||||
* @param {number} tenantId -
|
||||
* @param {IPaymentReceive} paymentReceive -
|
||||
* @param {IPaymentReceived} paymentReceive -
|
||||
* @param {string} baseCurrencyCode -
|
||||
* @param {Knex.Transaction} trx -
|
||||
* @returns {Ledger}
|
||||
*/
|
||||
public getPaymentReceiveGLedger = async (
|
||||
tenantId: number,
|
||||
paymentReceive: IPaymentReceive,
|
||||
paymentReceive: IPaymentReceived,
|
||||
baseCurrencyCode: string,
|
||||
trx?: Knex.Transaction
|
||||
): Promise<Ledger> => {
|
||||
@@ -132,7 +132,7 @@ export class PaymentReceiveGLEntries {
|
||||
* @returns {number}
|
||||
*/
|
||||
private getPaymentExGainOrLoss = (
|
||||
paymentReceive: IPaymentReceive
|
||||
paymentReceive: IPaymentReceived
|
||||
): number => {
|
||||
return sumBy(paymentReceive.entries, (entry) => {
|
||||
const paymentLocalAmount =
|
||||
@@ -145,11 +145,11 @@ export class PaymentReceiveGLEntries {
|
||||
|
||||
/**
|
||||
* Retrieves the common entry of payment receive.
|
||||
* @param {IPaymentReceive} paymentReceive
|
||||
* @param {IPaymentReceived} paymentReceive
|
||||
* @returns {}
|
||||
*/
|
||||
private getPaymentReceiveCommonEntry = (
|
||||
paymentReceive: IPaymentReceive
|
||||
paymentReceive: IPaymentReceived
|
||||
): IPaymentReceiveGLCommonEntry => {
|
||||
return {
|
||||
debit: 0,
|
||||
@@ -174,14 +174,14 @@ export class PaymentReceiveGLEntries {
|
||||
|
||||
/**
|
||||
* Retrieves the payment exchange gain/loss entry.
|
||||
* @param {IPaymentReceive} paymentReceive -
|
||||
* @param {IPaymentReceived} paymentReceive -
|
||||
* @param {number} ARAccountId -
|
||||
* @param {number} exchangeGainOrLossAccountId -
|
||||
* @param {string} baseCurrencyCode -
|
||||
* @returns {ILedgerEntry[]}
|
||||
*/
|
||||
private getPaymentExchangeGainLossEntry = (
|
||||
paymentReceive: IPaymentReceive,
|
||||
paymentReceive: IPaymentReceived,
|
||||
ARAccountId: number,
|
||||
exchangeGainOrLossAccountId: number,
|
||||
baseCurrencyCode: string
|
||||
@@ -219,11 +219,11 @@ export class PaymentReceiveGLEntries {
|
||||
|
||||
/**
|
||||
* Retrieves the payment deposit GL entry.
|
||||
* @param {IPaymentReceive} paymentReceive
|
||||
* @param {IPaymentReceived} paymentReceive
|
||||
* @returns {ILedgerEntry}
|
||||
*/
|
||||
private getPaymentDepositGLEntry = (
|
||||
paymentReceive: IPaymentReceive
|
||||
paymentReceive: IPaymentReceived
|
||||
): ILedgerEntry => {
|
||||
const commonJournal = this.getPaymentReceiveCommonEntry(paymentReceive);
|
||||
|
||||
@@ -238,12 +238,12 @@ export class PaymentReceiveGLEntries {
|
||||
|
||||
/**
|
||||
* Retrieves the payment receivable entry.
|
||||
* @param {IPaymentReceive} paymentReceive
|
||||
* @param {IPaymentReceived} paymentReceive
|
||||
* @param {number} ARAccountId
|
||||
* @returns {ILedgerEntry}
|
||||
*/
|
||||
private getPaymentReceivableEntry = (
|
||||
paymentReceive: IPaymentReceive,
|
||||
paymentReceive: IPaymentReceived,
|
||||
ARAccountId: number
|
||||
): ILedgerEntry => {
|
||||
const commonJournal = this.getPaymentReceiveCommonEntry(paymentReceive);
|
||||
@@ -267,14 +267,14 @@ export class PaymentReceiveGLEntries {
|
||||
* - Payment account [current asset] -> Credit
|
||||
*
|
||||
* @param {number} tenantId
|
||||
* @param {IPaymentReceive} paymentRecieve - Payment receive model.
|
||||
* @param {IPaymentReceived} paymentRecieve - Payment receive model.
|
||||
* @param {number} ARAccountId - A/R account id.
|
||||
* @param {number} exGainOrLossAccountId - Exchange gain/loss account id.
|
||||
* @param {string} baseCurrency - Base currency code.
|
||||
* @returns {Promise<ILedgerEntry>}
|
||||
*/
|
||||
public getPaymentReceiveGLEntries = (
|
||||
paymentReceive: IPaymentReceive,
|
||||
paymentReceive: IPaymentReceived,
|
||||
ARAccountId: number,
|
||||
exGainOrLossAccountId: number,
|
||||
baseCurrency: string
|
||||
@@ -2,7 +2,7 @@ import { Inject, Service } from 'typedi';
|
||||
import AutoIncrementOrdersService from '../AutoIncrementOrdersService';
|
||||
|
||||
@Service()
|
||||
export class PaymentReceiveIncrement {
|
||||
export class PaymentReceivedIncrement {
|
||||
@Inject()
|
||||
private autoIncrementOrdersService: AutoIncrementOrdersService;
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import { Knex } from 'knex';
|
||||
import { IPaymentReceiveEntryDTO } from '@/interfaces';
|
||||
import { IPaymentReceivedEntryDTO } from '@/interfaces';
|
||||
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||
import { entriesAmountDiff } from '@/utils';
|
||||
|
||||
@Service()
|
||||
export class PaymentReceiveInvoiceSync {
|
||||
export class PaymentReceivedInvoiceSync {
|
||||
@Inject()
|
||||
private tenancy: HasTenancyService;
|
||||
|
||||
@@ -19,8 +19,8 @@ export class PaymentReceiveInvoiceSync {
|
||||
*/
|
||||
public async saveChangeInvoicePaymentAmount(
|
||||
tenantId: number,
|
||||
newPaymentReceiveEntries: IPaymentReceiveEntryDTO[],
|
||||
oldPaymentReceiveEntries?: IPaymentReceiveEntryDTO[],
|
||||
newPaymentReceiveEntries: IPaymentReceivedEntryDTO[],
|
||||
oldPaymentReceiveEntries?: IPaymentReceivedEntryDTO[],
|
||||
trx?: Knex.Transaction
|
||||
): Promise<void> {
|
||||
const { SaleInvoice } = this.tenancy.models(tenantId);
|
||||
@@ -11,7 +11,7 @@ import {
|
||||
DEFAULT_PAYMENT_MAIL_CONTENT,
|
||||
DEFAULT_PAYMENT_MAIL_SUBJECT,
|
||||
} from './constants';
|
||||
import { GetPaymentReceive } from './GetPaymentReceive';
|
||||
import { GetPaymentReceived } from './GetPaymentReceived';
|
||||
import { ContactMailNotification } from '@/services/MailNotification/ContactMailNotification';
|
||||
import { parseAndValidateMailOptions } from '@/services/MailNotification/utils';
|
||||
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
|
||||
@@ -23,7 +23,7 @@ export class SendPaymentReceiveMailNotification {
|
||||
private tenancy: HasTenancyService;
|
||||
|
||||
@Inject()
|
||||
private getPaymentService: GetPaymentReceive;
|
||||
private getPaymentService: GetPaymentReceived;
|
||||
|
||||
@Inject()
|
||||
private contactMailNotification: ContactMailNotification;
|
||||
@@ -1,8 +1,8 @@
|
||||
import Container, { Service } from 'typedi';
|
||||
import { SendPaymentReceiveMailNotification } from './PaymentReceiveMailNotification';
|
||||
import { SendPaymentReceiveMailNotification } from './PaymentReceivedMailNotification';
|
||||
|
||||
@Service()
|
||||
export class PaymentReceiveMailNotificationJob {
|
||||
export class PaymentReceivedMailNotificationJob {
|
||||
/**
|
||||
* Constructor method.
|
||||
*/
|
||||
@@ -2,17 +2,17 @@ import { Service, Inject } from 'typedi';
|
||||
import HasTenancyService from '@/services/Tenancy/TenancyService';
|
||||
import events from '@/subscribers/events';
|
||||
import {
|
||||
IPaymentReceiveSmsDetails,
|
||||
IPaymentReceivedSmsDetails,
|
||||
SMS_NOTIFICATION_KEY,
|
||||
IPaymentReceive,
|
||||
IPaymentReceiveEntry,
|
||||
IPaymentReceived,
|
||||
IPaymentReceivedEntry,
|
||||
} from '@/interfaces';
|
||||
import SmsNotificationsSettingsService from '@/services/Settings/SmsNotificationsSettings';
|
||||
import { formatNumber, formatSmsMessage } from 'utils';
|
||||
import { TenantMetadata } from '@/system/models';
|
||||
import SaleNotifyBySms from '../SaleNotifyBySms';
|
||||
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
|
||||
import { PaymentReceiveValidators } from './PaymentReceiveValidators';
|
||||
import { PaymentReceivedValidators } from './PaymentReceivedValidators';
|
||||
|
||||
@Service()
|
||||
export class PaymentReceiveNotifyBySms {
|
||||
@@ -29,7 +29,7 @@ export class PaymentReceiveNotifyBySms {
|
||||
private saleSmsNotification: SaleNotifyBySms;
|
||||
|
||||
@Inject()
|
||||
private validators: PaymentReceiveValidators;
|
||||
private validators: PaymentReceivedValidators;
|
||||
|
||||
/**
|
||||
* 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.
|
||||
* @param {number} tenantId
|
||||
* @param {IPaymentReceive} paymentReceive
|
||||
* @param {IPaymentReceived} paymentReceive
|
||||
* @param {ICustomer} customer
|
||||
*/
|
||||
private sendSmsNotification = async (
|
||||
tenantId: number,
|
||||
paymentReceive: IPaymentReceive
|
||||
paymentReceive: IPaymentReceived
|
||||
) => {
|
||||
const smsClient = this.tenancy.smsClient(tenantId);
|
||||
const tenantMetadata = await TenantMetadata.query().findOne({ tenantId });
|
||||
@@ -116,12 +116,12 @@ export class PaymentReceiveNotifyBySms {
|
||||
/**
|
||||
* Formates the payment receive details sms message.
|
||||
* @param {number} tenantId -
|
||||
* @param {IPaymentReceive} payment -
|
||||
* @param {IPaymentReceived} payment -
|
||||
* @param {ICustomer} customer -
|
||||
*/
|
||||
private formattedPaymentDetailsMessage = (
|
||||
tenantId: number,
|
||||
payment: IPaymentReceive,
|
||||
payment: IPaymentReceived,
|
||||
tenantMetadata: TenantMetadata
|
||||
) => {
|
||||
const notification = this.smsNotificationsSettings.getSmsNotificationMeta(
|
||||
@@ -138,14 +138,14 @@ export class PaymentReceiveNotifyBySms {
|
||||
/**
|
||||
* Formattes the payment details sms notification messafge.
|
||||
* @param {string} smsMessage
|
||||
* @param {IPaymentReceive} payment
|
||||
* @param {IPaymentReceived} payment
|
||||
* @param {ICustomer} customer
|
||||
* @param {TenantMetadata} tenantMetadata
|
||||
* @returns {string}
|
||||
*/
|
||||
private formatPaymentDetailsMessage = (
|
||||
smsMessage: string,
|
||||
payment: IPaymentReceive,
|
||||
payment: IPaymentReceived,
|
||||
tenantMetadata: any
|
||||
): string => {
|
||||
const invoiceNumbers = this.stringifyPaymentInvoicesNumber(payment);
|
||||
@@ -167,12 +167,12 @@ export class PaymentReceiveNotifyBySms {
|
||||
|
||||
/**
|
||||
* Stringify payment receive invoices to numbers as string.
|
||||
* @param {IPaymentReceive} payment
|
||||
* @param {IPaymentReceived} payment
|
||||
* @returns {string}
|
||||
*/
|
||||
private stringifyPaymentInvoicesNumber(payment: IPaymentReceive) {
|
||||
private stringifyPaymentInvoicesNumber(payment: IPaymentReceived) {
|
||||
const invoicesNumberes = payment.entries.map(
|
||||
(entry: IPaymentReceiveEntry) => entry.invoice.invoiceNo
|
||||
(entry: IPaymentReceivedEntry) => entry.invoice.invoiceNo
|
||||
);
|
||||
return invoicesNumberes.join(', ');
|
||||
}
|
||||
@@ -185,7 +185,7 @@ export class PaymentReceiveNotifyBySms {
|
||||
public smsDetails = async (
|
||||
tenantId: number,
|
||||
paymentReceiveid: number
|
||||
): Promise<IPaymentReceiveSmsDetails> => {
|
||||
): Promise<IPaymentReceivedSmsDetails> => {
|
||||
const { PaymentReceive } = this.tenancy.models(tenantId);
|
||||
|
||||
// Retrieve the payment receive or throw not found service error.
|
||||
@@ -1,8 +1,7 @@
|
||||
import { Container } from 'typedi';
|
||||
import { On, EventSubscriber } from 'event-dispatch';
|
||||
import events from '@/subscribers/events';
|
||||
import SaleReceiptNotifyBySms from '@/services/Sales/SaleReceiptNotifyBySms';
|
||||
import PaymentReceiveNotifyBySms from './PaymentReceiveSmsNotify';
|
||||
import { PaymentReceiveNotifyBySms } from './PaymentReceivedSmsNotify';
|
||||
|
||||
@EventSubscriber()
|
||||
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 { formatNumber } from 'utils';
|
||||
import { PaymentReceiveEntryTransfromer } from './PaymentReceiveEntryTransformer';
|
||||
import { PaymentReceivedEntryTransfromer } from './PaymentReceivedEntryTransformer';
|
||||
|
||||
export class PaymentReceiveTransfromer extends Transformer {
|
||||
/**
|
||||
@@ -24,25 +24,25 @@ export class PaymentReceiveTransfromer extends Transformer {
|
||||
* @param {ISaleInvoice} invoice
|
||||
* @returns {String}
|
||||
*/
|
||||
protected formattedPaymentDate = (payment: IPaymentReceive): string => {
|
||||
protected formattedPaymentDate = (payment: IPaymentReceived): string => {
|
||||
return this.formatDate(payment.paymentDate);
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieves the formatted created at date.
|
||||
* @param {IPaymentReceive} payment
|
||||
* @param {IPaymentReceived} payment
|
||||
* @returns {string}
|
||||
*/
|
||||
protected formattedCreatedAt = (payment: IPaymentReceive): string => {
|
||||
protected formattedCreatedAt = (payment: IPaymentReceived): string => {
|
||||
return this.formatDate(payment.createdAt);
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieve the formatted payment subtotal.
|
||||
* @param {IPaymentReceive} payment
|
||||
* @param {IPaymentReceived} payment
|
||||
* @returns {string}
|
||||
*/
|
||||
protected subtotalFormatted = (payment: IPaymentReceive): string => {
|
||||
protected subtotalFormatted = (payment: IPaymentReceived): string => {
|
||||
return formatNumber(payment.amount, {
|
||||
currencyCode: payment.currencyCode,
|
||||
money: false,
|
||||
@@ -54,25 +54,25 @@ export class PaymentReceiveTransfromer extends Transformer {
|
||||
* @param {ISaleInvoice} invoice
|
||||
* @returns {string}
|
||||
*/
|
||||
protected formattedAmount = (payment: IPaymentReceive): string => {
|
||||
protected formattedAmount = (payment: IPaymentReceived): string => {
|
||||
return formatNumber(payment.amount, { currencyCode: payment.currencyCode });
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieve the formatted exchange rate.
|
||||
* @param {IPaymentReceive} payment
|
||||
* @param {IPaymentReceived} payment
|
||||
* @returns {string}
|
||||
*/
|
||||
protected formattedExchangeRate = (payment: IPaymentReceive): string => {
|
||||
protected formattedExchangeRate = (payment: IPaymentReceived): string => {
|
||||
return formatNumber(payment.exchangeRate, { money: false });
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieves the payment entries.
|
||||
* @param {IPaymentReceive} payment
|
||||
* @returns {IPaymentReceiveEntry[]}
|
||||
* @param {IPaymentReceived} payment
|
||||
* @returns {IPaymentReceivedEntry[]}
|
||||
*/
|
||||
protected entries = (payment: IPaymentReceive): IPaymentReceiveEntry[] => {
|
||||
return this.item(payment.entries, new PaymentReceiveEntryTransfromer());
|
||||
protected entries = (payment: IPaymentReceived): IPaymentReceivedEntry[] => {
|
||||
return this.item(payment.entries, new PaymentReceivedEntryTransfromer());
|
||||
};
|
||||
}
|
||||
@@ -2,10 +2,10 @@ import { Inject, Service } from 'typedi';
|
||||
import { difference, sumBy } from 'lodash';
|
||||
import {
|
||||
IAccount,
|
||||
IPaymentReceive,
|
||||
IPaymentReceiveEditDTO,
|
||||
IPaymentReceiveEntry,
|
||||
IPaymentReceiveEntryDTO,
|
||||
IPaymentReceived,
|
||||
IPaymentReceivedEditDTO,
|
||||
IPaymentReceivedEntry,
|
||||
IPaymentReceivedEntryDTO,
|
||||
ISaleInvoice,
|
||||
} from '@/interfaces';
|
||||
import { ServiceError } from '@/exceptions';
|
||||
@@ -15,7 +15,7 @@ import { ACCOUNT_TYPE } from '@/data/AccountTypes';
|
||||
import { PaymentReceive } from '@/models';
|
||||
|
||||
@Service()
|
||||
export class PaymentReceiveValidators {
|
||||
export class PaymentReceivedValidators {
|
||||
@Inject()
|
||||
private tenancy: HasTenancyService;
|
||||
|
||||
@@ -58,7 +58,7 @@ export class PaymentReceiveValidators {
|
||||
* Validates the invoices IDs existance.
|
||||
* @param {number} tenantId -
|
||||
* @param {number} customerId -
|
||||
* @param {IPaymentReceiveEntryDTO[]} paymentReceiveEntries -
|
||||
* @param {IPaymentReceivedEntryDTO[]} paymentReceiveEntries -
|
||||
*/
|
||||
public async validateInvoicesIDsExistance(
|
||||
tenantId: number,
|
||||
@@ -100,12 +100,12 @@ export class PaymentReceiveValidators {
|
||||
*/
|
||||
public async validateInvoicesPaymentsAmount(
|
||||
tenantId: number,
|
||||
paymentReceiveEntries: IPaymentReceiveEntryDTO[],
|
||||
oldPaymentEntries: IPaymentReceiveEntry[] = []
|
||||
paymentReceiveEntries: IPaymentReceivedEntryDTO[],
|
||||
oldPaymentEntries: IPaymentReceivedEntry[] = []
|
||||
) {
|
||||
const { SaleInvoice } = this.tenancy.models(tenantId);
|
||||
const invoicesIds = paymentReceiveEntries.map(
|
||||
(e: IPaymentReceiveEntryDTO) => e.invoiceId
|
||||
(e: IPaymentReceivedEntryDTO) => e.invoiceId
|
||||
);
|
||||
|
||||
const storedInvoices = await SaleInvoice.query().whereIn('id', invoicesIds);
|
||||
@@ -124,7 +124,7 @@ export class PaymentReceiveValidators {
|
||||
const hasWrongPaymentAmount: any[] = [];
|
||||
|
||||
paymentReceiveEntries.forEach(
|
||||
(entry: IPaymentReceiveEntryDTO, index: number) => {
|
||||
(entry: IPaymentReceivedEntryDTO, index: number) => {
|
||||
const entryInvoice = storedInvoicesMap.get(entry.invoiceId);
|
||||
const { dueAmount } = entryInvoice;
|
||||
|
||||
@@ -140,9 +140,9 @@ export class PaymentReceiveValidators {
|
||||
|
||||
/**
|
||||
* Validate the payment receive number require.
|
||||
* @param {IPaymentReceive} paymentReceiveObj
|
||||
* @param {IPaymentReceived} paymentReceiveObj
|
||||
*/
|
||||
public validatePaymentReceiveNoRequire(paymentReceiveObj: IPaymentReceive) {
|
||||
public validatePaymentReceiveNoRequire(paymentReceiveObj: IPaymentReceived) {
|
||||
if (!paymentReceiveObj.paymentReceiveNo) {
|
||||
throw new ServiceError(ERRORS.PAYMENT_RECEIVE_NO_IS_REQUIRED);
|
||||
}
|
||||
@@ -152,12 +152,12 @@ export class PaymentReceiveValidators {
|
||||
* Validate the payment receive entries IDs existance.
|
||||
* @param {number} tenantId
|
||||
* @param {number} paymentReceiveId
|
||||
* @param {IPaymentReceiveEntryDTO[]} paymentReceiveEntries
|
||||
* @param {IPaymentReceivedEntryDTO[]} paymentReceiveEntries
|
||||
*/
|
||||
public async validateEntriesIdsExistance(
|
||||
tenantId: number,
|
||||
paymentReceiveId: number,
|
||||
paymentReceiveEntries: IPaymentReceiveEntryDTO[]
|
||||
paymentReceiveEntries: IPaymentReceivedEntryDTO[]
|
||||
) {
|
||||
const { PaymentReceiveEntry } = this.tenancy.models(tenantId);
|
||||
|
||||
@@ -189,12 +189,12 @@ export class PaymentReceiveValidators {
|
||||
|
||||
/**
|
||||
* Validate the payment customer whether modified.
|
||||
* @param {IPaymentReceiveEditDTO} paymentReceiveDTO
|
||||
* @param {IPaymentReceive} oldPaymentReceive
|
||||
* @param {IPaymentReceivedEditDTO} paymentReceiveDTO
|
||||
* @param {IPaymentReceived} oldPaymentReceive
|
||||
*/
|
||||
public validateCustomerNotModified(
|
||||
paymentReceiveDTO: IPaymentReceiveEditDTO,
|
||||
oldPaymentReceive: IPaymentReceive
|
||||
paymentReceiveDTO: IPaymentReceivedEditDTO,
|
||||
oldPaymentReceive: IPaymentReceived
|
||||
) {
|
||||
if (paymentReceiveDTO.customerId !== oldPaymentReceive.customerId) {
|
||||
throw new ServiceError(ERRORS.PAYMENT_CUSTOMER_SHOULD_NOT_UPDATE);
|
||||
@@ -230,7 +230,7 @@ export class PaymentReceiveValidators {
|
||||
async getPaymentReceiveOrThrowError(
|
||||
tenantId: number,
|
||||
paymentReceiveId: number
|
||||
): Promise<IPaymentReceive> {
|
||||
): Promise<IPaymentReceived> {
|
||||
const { PaymentReceive } = this.tenancy.models(tenantId);
|
||||
const paymentReceive = await PaymentReceive.query()
|
||||
.withGraphFetched('entries')
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import { IAccountsStructureType, IPaymentReceivesFilter } from '@/interfaces';
|
||||
import { IAccountsStructureType, IPaymentsReceivedFilter } from '@/interfaces';
|
||||
import { Exportable } from '@/services/Export/Exportable';
|
||||
import { PaymentReceivesApplication } from './PaymentReceivesApplication';
|
||||
import { PaymentReceivesApplication } from './PaymentReceivedApplication';
|
||||
|
||||
@Service()
|
||||
export class PaymentsReceivedExportable extends Exportable {
|
||||
@@ -11,17 +11,17 @@ export class PaymentsReceivedExportable extends Exportable {
|
||||
/**
|
||||
* Retrieves the accounts data to exportable sheet.
|
||||
* @param {number} tenantId
|
||||
* @param {IPaymentReceivesFilter} query -
|
||||
* @param {IPaymentsReceivedFilter} query -
|
||||
* @returns
|
||||
*/
|
||||
public exportable(tenantId: number, query: IPaymentReceivesFilter) {
|
||||
public exportable(tenantId: number, query: IPaymentsReceivedFilter) {
|
||||
const parsedQuery = {
|
||||
sortOrder: 'desc',
|
||||
columnSortBy: 'created_at',
|
||||
inactiveMode: false,
|
||||
...query,
|
||||
structure: IAccountsStructureType.Flat,
|
||||
} as IPaymentReceivesFilter;
|
||||
} as IPaymentsReceivedFilter;
|
||||
|
||||
return this.paymentReceivedApp
|
||||
.getPaymentReceives(tenantId, parsedQuery)
|
||||
@@ -1,14 +1,14 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import { Knex } from 'knex';
|
||||
import { IPaymentReceiveCreateDTO } from '@/interfaces';
|
||||
import { IPaymentReceivedCreateDTO } from '@/interfaces';
|
||||
import { Importable } from '@/services/Import/Importable';
|
||||
import { CreatePaymentReceive } from './CreatePaymentReceive';
|
||||
import { CreatePaymentReceived } from './CreatePaymentReceived';
|
||||
import { PaymentsReceiveSampleData } from './constants';
|
||||
|
||||
@Service()
|
||||
export class PaymentReceivesImportable extends Importable {
|
||||
export class PaymentsReceivedImportable extends Importable {
|
||||
@Inject()
|
||||
private createPaymentReceiveService: CreatePaymentReceive;
|
||||
private createPaymentReceiveService: CreatePaymentReceived;
|
||||
|
||||
/**
|
||||
* Importing to account service.
|
||||
@@ -18,10 +18,10 @@ export class PaymentReceivesImportable extends Importable {
|
||||
*/
|
||||
public importable(
|
||||
tenantId: number,
|
||||
createPaymentDTO: IPaymentReceiveCreateDTO,
|
||||
createPaymentDTO: IPaymentReceivedCreateDTO,
|
||||
trx?: Knex.Transaction
|
||||
) {
|
||||
return this.createPaymentReceiveService.createPaymentReceive(
|
||||
return this.createPaymentReceiveService.createPaymentReceived(
|
||||
tenantId,
|
||||
createPaymentDTO,
|
||||
{},
|
||||
@@ -3,7 +3,7 @@ import { omit } from 'lodash';
|
||||
import {
|
||||
ISaleInvoice,
|
||||
IPaymentReceivePageEntry,
|
||||
IPaymentReceive,
|
||||
IPaymentReceived,
|
||||
ISystemUser,
|
||||
} from '@/interfaces';
|
||||
import TenancyService from '@/services/Tenancy/TenancyService';
|
||||
@@ -14,12 +14,9 @@ import { ERRORS } from './constants';
|
||||
* Payment receives edit/new pages service.
|
||||
*/
|
||||
@Service()
|
||||
export default class PaymentReceivesPages {
|
||||
export default class PaymentsReceivedPages {
|
||||
@Inject()
|
||||
tenancy: TenancyService;
|
||||
|
||||
@Inject('logger')
|
||||
logger: any;
|
||||
private tenancy: TenancyService;
|
||||
|
||||
/**
|
||||
* Retrive page invoices entries from the given sale invoices models.
|
||||
@@ -68,7 +65,7 @@ export default class PaymentReceivesPages {
|
||||
tenantId: number,
|
||||
paymentReceiveId: number
|
||||
): Promise<{
|
||||
paymentReceive: Omit<IPaymentReceive, 'entries'>;
|
||||
paymentReceive: Omit<IPaymentReceived, 'entries'>;
|
||||
entries: IPaymentReceivePageEntry[];
|
||||
}> {
|
||||
const { PaymentReceive, SaleInvoice } = this.tenancy.models(tenantId);
|
||||
@@ -18,8 +18,4 @@ export default class HasSystemService implements SystemService {
|
||||
cache() {
|
||||
return this.container('cache');
|
||||
}
|
||||
|
||||
dbManager() {
|
||||
return this.container('dbManager');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +1,16 @@
|
||||
import { Container } from 'typedi';
|
||||
import Knex from 'knex';
|
||||
import { Knex, knex } from 'knex';
|
||||
import { knexSnakeCaseMappers } from 'objection';
|
||||
import { tenantKnexConfig, tenantSeedConfig } from '@/config/knexConfig';
|
||||
import config from '@/config';
|
||||
import { ITenant, ITenantDBManager } from '@/interfaces';
|
||||
import SystemService from '@/services/Tenancy/SystemService';
|
||||
import { TenantDBAlreadyExists } from '@/exceptions';
|
||||
import { sanitizeDatabaseName } from '@/utils/sanitizers';
|
||||
|
||||
export default class TenantDBManager implements ITenantDBManager {
|
||||
static knexCache: { [key: string]: Knex } = {};
|
||||
|
||||
// System database manager.
|
||||
dbManager: any;
|
||||
|
||||
// System knex instance.
|
||||
sysKnex: Knex;
|
||||
|
||||
@@ -23,7 +21,6 @@ export default class TenantDBManager implements ITenantDBManager {
|
||||
constructor() {
|
||||
const systemService = Container.get(SystemService);
|
||||
|
||||
this.dbManager = systemService.dbManager();
|
||||
this.sysKnex = systemService.knex();
|
||||
}
|
||||
|
||||
@@ -32,7 +29,9 @@ export default class TenantDBManager implements ITenantDBManager {
|
||||
* @return {string}
|
||||
*/
|
||||
private getDatabaseName(tenant: ITenant) {
|
||||
return `${config.tenant.db_name_prefix}${tenant.organizationId}`;
|
||||
return sanitizeDatabaseName(
|
||||
`${config.tenant.db_name_prefix}${tenant.organizationId}`
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -59,7 +58,9 @@ export default class TenantDBManager implements ITenantDBManager {
|
||||
await this.throwErrorIfTenantDBExists(tenant);
|
||||
|
||||
const databaseName = this.getDatabaseName(tenant);
|
||||
await this.dbManager.createDb(databaseName);
|
||||
await this.sysKnex.raw(
|
||||
`CREATE DATABASE ${databaseName} DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci`
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -72,7 +73,6 @@ export default class TenantDBManager implements ITenantDBManager {
|
||||
if (!isExists) {
|
||||
return;
|
||||
}
|
||||
|
||||
await this.dropDatabase(tenant);
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@ export default class TenantDBManager implements ITenantDBManager {
|
||||
public async dropDatabase(tenant: ITenant) {
|
||||
const databaseName = this.getDatabaseName(tenant);
|
||||
|
||||
await this.dbManager.dropDb(databaseName);
|
||||
await this.sysKnex.raw(`DROP DATABASE IF EXISTS ${databaseName}`);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -118,7 +118,7 @@ export default class TenantDBManager implements ITenantDBManager {
|
||||
let knexInstance = TenantDBManager.knexCache[key];
|
||||
|
||||
if (!knexInstance) {
|
||||
knexInstance = Knex({
|
||||
knexInstance = knex({
|
||||
...tenantKnexConfig(tenant),
|
||||
...knexSnakeCaseMappers({ upperCase: true }),
|
||||
});
|
||||
|
||||
@@ -5,9 +5,9 @@ import {
|
||||
ISaleInvoiceCreatingPaylaod,
|
||||
ISaleReceiptDeletingPayload,
|
||||
ICreditNoteDeletingPayload,
|
||||
IPaymentReceiveCreatingPayload,
|
||||
IPaymentReceivedCreatingPayload,
|
||||
IRefundCreditNoteDeletingPayload,
|
||||
IPaymentReceiveDeletingPayload,
|
||||
IPaymentReceivedDeletingPayload,
|
||||
ISaleEstimateDeletingPayload,
|
||||
ISaleEstimateCreatingPayload,
|
||||
ISaleEstimateEditingPayload,
|
||||
@@ -17,7 +17,7 @@ import {
|
||||
ISaleInvoiceWrittenOffCancelPayload,
|
||||
ICreditNoteEditingPayload,
|
||||
ISaleReceiptEditingPayload,
|
||||
IPaymentReceiveEditingPayload,
|
||||
IPaymentReceivedEditingPayload,
|
||||
ISaleReceiptEventClosingPayload,
|
||||
ICreditNoteCreatingPayload,
|
||||
} from '@/interfaces';
|
||||
@@ -454,13 +454,13 @@ export default class SalesTransactionLockingGuardSubscriber {
|
||||
|
||||
/**
|
||||
* Transaction locking guard on payment receive editing.
|
||||
* @param {IPaymentReceiveEditingPayload}
|
||||
* @param {IPaymentReceivedEditingPayload}
|
||||
*/
|
||||
private transactionLockingGuardOnPaymentEditing = async ({
|
||||
tenantId,
|
||||
oldPaymentReceive,
|
||||
paymentReceiveDTO,
|
||||
}: IPaymentReceiveEditingPayload) => {
|
||||
}: IPaymentReceivedEditingPayload) => {
|
||||
// Validate the old payment date.
|
||||
await this.salesLockingGuard.transactionLockingGuard(
|
||||
tenantId,
|
||||
@@ -475,12 +475,12 @@ export default class SalesTransactionLockingGuardSubscriber {
|
||||
|
||||
/**
|
||||
* Transaction locking guard on payment creating.
|
||||
* @param {IPaymentReceiveCreatingPayload}
|
||||
* @param {IPaymentReceivedCreatingPayload}
|
||||
*/
|
||||
private transactionLockingGuardOnPaymentCreating = async ({
|
||||
tenantId,
|
||||
paymentReceiveDTO,
|
||||
}: IPaymentReceiveCreatingPayload) => {
|
||||
}: IPaymentReceivedCreatingPayload) => {
|
||||
await this.salesLockingGuard.transactionLockingGuard(
|
||||
tenantId,
|
||||
paymentReceiveDTO.paymentDate
|
||||
@@ -489,12 +489,12 @@ export default class SalesTransactionLockingGuardSubscriber {
|
||||
|
||||
/**
|
||||
* Transaction locking guard on payment deleting.
|
||||
* @param {IPaymentReceiveDeletingPayload} payload -
|
||||
* @param {IPaymentReceivedDeletingPayload} payload -
|
||||
*/
|
||||
private transactionLockingGuardPaymentDeleting = async ({
|
||||
oldPaymentReceive,
|
||||
tenantId,
|
||||
}: IPaymentReceiveDeletingPayload) => {
|
||||
}: IPaymentReceivedDeletingPayload) => {
|
||||
await this.salesLockingGuard.transactionLockingGuard(
|
||||
tenantId,
|
||||
oldPaymentReceive.paymentDate
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
import { Service, Inject } from 'typedi';
|
||||
import events from '@/subscribers/events';
|
||||
import { EventSubscriber } from '@/lib/EventPublisher/EventPublisher';
|
||||
import { PaymentReceiveIncrement } from '@/services/Sales/PaymentReceives/PaymentReceiveIncrement';
|
||||
import { IPaymentReceiveCreatedPayload } from '@/interfaces';
|
||||
import { PaymentReceivedIncrement } from '@/services/Sales/PaymentReceived/PaymentReceivedIncrement';
|
||||
import { IPaymentReceivedCreatedPayload } from '@/interfaces';
|
||||
|
||||
@Service()
|
||||
export default class PaymentReceiveAutoSerialSubscriber extends EventSubscriber {
|
||||
@Inject()
|
||||
private paymentIncrement: PaymentReceiveIncrement;
|
||||
private paymentIncrement: PaymentReceivedIncrement;
|
||||
|
||||
/**
|
||||
* 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.
|
||||
* @param {IPaymentReceiveCreatedPayload} payload -
|
||||
* @param {IPaymentReceivedCreatedPayload} payload -
|
||||
*/
|
||||
private handlePaymentNextNumberIncrement = async ({
|
||||
tenantId,
|
||||
paymentReceiveId,
|
||||
trx,
|
||||
}: IPaymentReceiveCreatedPayload) => {
|
||||
}: IPaymentReceivedCreatedPayload) => {
|
||||
await this.paymentIncrement.incrementNextPaymentReceiveNumber(tenantId);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import events from '@/subscribers/events';
|
||||
import { PaymentReceiveInvoiceSync } from '@/services/Sales/PaymentReceives/PaymentReceiveInvoiceSync';
|
||||
import { PaymentReceivedInvoiceSync } from '@/services/Sales/PaymentReceived/PaymentReceivedInvoiceSync';
|
||||
import {
|
||||
IPaymentReceiveCreatedPayload,
|
||||
IPaymentReceiveDeletedPayload,
|
||||
IPaymentReceiveEditedPayload,
|
||||
IPaymentReceivedCreatedPayload,
|
||||
IPaymentReceivedDeletedPayload,
|
||||
IPaymentReceivedEditedPayload,
|
||||
} from '@/interfaces';
|
||||
|
||||
@Service()
|
||||
export default class PaymentReceiveSyncInvoicesSubscriber {
|
||||
@Inject()
|
||||
private paymentSyncInvoice: PaymentReceiveInvoiceSync;
|
||||
private paymentSyncInvoice: PaymentReceivedInvoiceSync;
|
||||
|
||||
/**
|
||||
* Attaches the events to handles.
|
||||
@@ -39,7 +39,7 @@ export default class PaymentReceiveSyncInvoicesSubscriber {
|
||||
tenantId,
|
||||
paymentReceive,
|
||||
trx,
|
||||
}: IPaymentReceiveCreatedPayload) => {
|
||||
}: IPaymentReceivedCreatedPayload) => {
|
||||
await this.paymentSyncInvoice.saveChangeInvoicePaymentAmount(
|
||||
tenantId,
|
||||
paymentReceive.entries,
|
||||
@@ -57,7 +57,7 @@ export default class PaymentReceiveSyncInvoicesSubscriber {
|
||||
paymentReceive,
|
||||
oldPaymentReceive,
|
||||
trx,
|
||||
}: IPaymentReceiveEditedPayload) => {
|
||||
}: IPaymentReceivedEditedPayload) => {
|
||||
await this.paymentSyncInvoice.saveChangeInvoicePaymentAmount(
|
||||
tenantId,
|
||||
paymentReceive.entries,
|
||||
@@ -74,7 +74,7 @@ export default class PaymentReceiveSyncInvoicesSubscriber {
|
||||
paymentReceiveId,
|
||||
oldPaymentReceive,
|
||||
trx,
|
||||
}: IPaymentReceiveDeletedPayload) => {
|
||||
}: IPaymentReceivedDeletedPayload) => {
|
||||
await this.paymentSyncInvoice.saveChangeInvoicePaymentAmount(
|
||||
tenantId,
|
||||
oldPaymentReceive.entries.map((entry) => ({
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { Service, Inject } from 'typedi';
|
||||
import events from '@/subscribers/events';
|
||||
import { PaymentReceiveNotifyBySms } from '@/services/Sales/PaymentReceives/PaymentReceiveSmsNotify';
|
||||
import { IPaymentReceiveCreatedPayload } from '@/interfaces';
|
||||
import { PaymentReceiveNotifyBySms } from '@/services/Sales/PaymentReceived/PaymentReceivedSmsNotify';
|
||||
import { IPaymentReceivedCreatedPayload } from '@/interfaces';
|
||||
import { runAfterTransaction } from '@/services/UnitOfWork/TransactionsHooks';
|
||||
|
||||
@Service()
|
||||
@@ -26,7 +26,7 @@ export default class SendSmsNotificationPaymentReceive {
|
||||
tenantId,
|
||||
paymentReceiveId,
|
||||
trx,
|
||||
}: IPaymentReceiveCreatedPayload) => {
|
||||
}: IPaymentReceivedCreatedPayload) => {
|
||||
// Notify via Sms after transactions complete running.
|
||||
runAfterTransaction(trx, async () => {
|
||||
try {
|
||||
@@ -34,7 +34,7 @@ export default class SendSmsNotificationPaymentReceive {
|
||||
tenantId,
|
||||
paymentReceiveId
|
||||
);
|
||||
} catch (error) {}
|
||||
} catch (error) { }
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
import { Inject, Service } from 'typedi';
|
||||
import {
|
||||
IPaymentReceiveCreatedPayload,
|
||||
IPaymentReceiveDeletedPayload,
|
||||
IPaymentReceiveEditedPayload,
|
||||
IPaymentReceivedCreatedPayload,
|
||||
IPaymentReceivedDeletedPayload,
|
||||
IPaymentReceivedEditedPayload,
|
||||
} from '@/interfaces';
|
||||
import events from '@/subscribers/events';
|
||||
import { PaymentReceiveGLEntries } from '@/services/Sales/PaymentReceives/PaymentReceiveGLEntries';
|
||||
import { PaymentReceivedGLEntries } from '@/services/Sales/PaymentReceived/PaymentReceivedGLEntries';
|
||||
|
||||
@Service()
|
||||
export default class PaymentReceivesWriteGLEntriesSubscriber {
|
||||
@Inject()
|
||||
private paymentReceiveGLEntries: PaymentReceiveGLEntries;
|
||||
private paymentReceiveGLEntries: PaymentReceivedGLEntries;
|
||||
|
||||
/**
|
||||
* Attaches events with handlers.
|
||||
@@ -37,7 +37,7 @@ export default class PaymentReceivesWriteGLEntriesSubscriber {
|
||||
tenantId,
|
||||
paymentReceiveId,
|
||||
trx,
|
||||
}: IPaymentReceiveCreatedPayload) => {
|
||||
}: IPaymentReceivedCreatedPayload) => {
|
||||
await this.paymentReceiveGLEntries.writePaymentGLEntries(
|
||||
tenantId,
|
||||
paymentReceiveId,
|
||||
@@ -52,7 +52,7 @@ export default class PaymentReceivesWriteGLEntriesSubscriber {
|
||||
tenantId,
|
||||
paymentReceive,
|
||||
trx,
|
||||
}: IPaymentReceiveEditedPayload) => {
|
||||
}: IPaymentReceivedEditedPayload) => {
|
||||
await this.paymentReceiveGLEntries.rewritePaymentGLEntries(
|
||||
tenantId,
|
||||
paymentReceive.id,
|
||||
@@ -67,7 +67,7 @@ export default class PaymentReceivesWriteGLEntriesSubscriber {
|
||||
tenantId,
|
||||
paymentReceiveId,
|
||||
trx,
|
||||
}: IPaymentReceiveDeletedPayload) => {
|
||||
}: IPaymentReceivedDeletedPayload) => {
|
||||
await this.paymentReceiveGLEntries.revertPaymentGLEntries(
|
||||
tenantId,
|
||||
paymentReceiveId,
|
||||
|
||||
4
packages/server/src/utils/sanitizers.ts
Normal file
4
packages/server/src/utils/sanitizers.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
export function sanitizeDatabaseName(dbName: string) {
|
||||
// Replace any character that is not alphanumeric or an underscore with an underscore
|
||||
return dbName.replace(/[^a-zA-Z0-9_]/g, '');
|
||||
}
|
||||
@@ -1,9 +1,11 @@
|
||||
// @ts-nocheck
|
||||
import React from 'react';
|
||||
import * as R from 'ramda';
|
||||
import { useFormikContext } from 'formik';
|
||||
import { createNewItemFromQuery, createNewItemRenderer } from './utils';
|
||||
import { FSelect } from '../Forms';
|
||||
import withDrawerActions from '@/containers/Drawer/withDrawerActions';
|
||||
import { useCreateAutofillListener } from '@/hooks/state/autofill';
|
||||
import { DRAWERS } from '@/constants/drawers';
|
||||
|
||||
/**
|
||||
@@ -17,6 +19,7 @@ function CustomerSelectRoot({
|
||||
// #ownProps
|
||||
items,
|
||||
allowCreate,
|
||||
name,
|
||||
...props
|
||||
}) {
|
||||
// Maybe inject create new item props to suggest component.
|
||||
@@ -24,14 +27,21 @@ function CustomerSelectRoot({
|
||||
const maybeCreateNewItemFromQuery = allowCreate
|
||||
? createNewItemFromQuery
|
||||
: 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.
|
||||
const handleCreateItemClick = () => {
|
||||
openDrawer(DRAWERS.QUICK_CREATE_CUSTOMER);
|
||||
const handleCreateItemClick = (item) => {
|
||||
const displayName = item.name;
|
||||
openDrawer(DRAWERS.QUICK_CREATE_CUSTOMER, { autofillRef, displayName });
|
||||
};
|
||||
|
||||
return (
|
||||
<FSelect
|
||||
name={name}
|
||||
items={items}
|
||||
textAccessor={'display_name'}
|
||||
labelAccessor={'formatted_balance'}
|
||||
|
||||
@@ -60,7 +60,7 @@ export function DataTable(props) {
|
||||
|
||||
// Pagination props.
|
||||
initialPageIndex = 0,
|
||||
initialPageSize = 10,
|
||||
initialPageSize = 20,
|
||||
|
||||
updateDebounceTime = 200,
|
||||
selectionColumnWidth = 42,
|
||||
|
||||
@@ -4,7 +4,6 @@ import UserFormDialog from '@/containers/Dialogs/UserFormDialog';
|
||||
import ItemCategoryDialog from '@/containers/Dialogs/ItemCategoryDialog';
|
||||
import CurrencyFormDialog from '@/containers/Dialogs/CurrencyFormDialog';
|
||||
import InventoryAdjustmentDialog from '@/containers/Dialogs/InventoryAdjustmentFormDialog';
|
||||
import PaymentViaVoucherDialog from '@/containers/Dialogs/PaymentViaVoucherDialog';
|
||||
import KeyboardShortcutsDialog from '@/containers/Dialogs/keyboardShortcutsDialog';
|
||||
import ContactDuplicateDialog from '@/containers/Dialogs/ContactDuplicateDialog';
|
||||
import QuickPaymentReceiveFormDialog from '@/containers/Dialogs/QuickPaymentReceiveFormDialog';
|
||||
@@ -49,7 +48,7 @@ import InvoiceExchangeRateChangeDialog from '@/containers/Sales/Invoices/Invoice
|
||||
import InvoiceMailDialog from '@/containers/Sales/Invoices/InvoiceMailDialog/InvoiceMailDialog';
|
||||
import EstimateMailDialog from '@/containers/Sales/Estimates/EstimateMailDialog/EstimateMailDialog';
|
||||
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 { RuleFormDialog } from '@/containers/Banking/Rules/RuleFormDialog/RuleFormDialog';
|
||||
import { DisconnectBankAccountDialog } from '@/containers/CashFlow/AccountTransactions/dialogs/DisconnectBankAccountDialog/DisconnectBankAccountDialog';
|
||||
@@ -68,7 +67,6 @@ export default function DialogsContainer() {
|
||||
<InventoryAdjustmentDialog
|
||||
dialogName={DialogsName.InventoryAdjustmentForm}
|
||||
/>
|
||||
<PaymentViaVoucherDialog dialogName={DialogsName.PaymentViaVoucherForm} />
|
||||
<KeyboardShortcutsDialog dialogName={DialogsName.KeyboardShortcutForm} />
|
||||
<ContactDuplicateDialog dialogName={DialogsName.ContactDuplicateForm} />
|
||||
<QuickPaymentReceiveFormDialog
|
||||
|
||||
@@ -39,7 +39,7 @@ export default function DrawersContainer() {
|
||||
<InvoiceDetailDrawer name={DRAWERS.INVOICE_DETAILS} />
|
||||
<EstimateDetailDrawer name={DRAWERS.ESTIMATE_DETAILS} />
|
||||
<ReceiptDetailDrawer name={DRAWERS.RECEIPT_DETAILS} />
|
||||
<PaymentReceiveDetailDrawer name={DRAWERS.PAYMENT_RECEIVE_DETAILS} />
|
||||
<PaymentReceiveDetailDrawer name={DRAWERS.PAYMENT_RECEIVED_DETAILS} />
|
||||
<PaymentMadeDetailDrawer name={DRAWERS.PAYMENT_MADE_DETAILS} />
|
||||
<ItemDetailDrawer name={DRAWERS.ITEM_DETAILS} />
|
||||
<CustomerDetailsDrawer name={DRAWERS.CUSTOMER_DETAILS} />
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
|
||||
|
||||
.root {
|
||||
padding: 20px;
|
||||
border: 2px dotted #c5cbd3;
|
||||
@@ -9,4 +7,14 @@
|
||||
flex-direction: column;
|
||||
background: #fff;
|
||||
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
|
||||
{...getRootProps({
|
||||
className: clsx(styles.root, classNames?.root),
|
||||
className: clsx(
|
||||
styles.root,
|
||||
{
|
||||
[styles.dropzoneAccept]: isDragAccept,
|
||||
[styles.dropzoneReject]: isDragReject
|
||||
},
|
||||
classNames?.root
|
||||
),
|
||||
})}
|
||||
// {...getStyles('root', { focusable: true })}
|
||||
{...others}
|
||||
@@ -253,7 +260,7 @@ export const Dropzone = (_props: DropzoneProps) => {
|
||||
<input {...getInputProps(inputProps)} name={name} />
|
||||
<div
|
||||
data-enable-pointer-events={enablePointerEvents || undefined}
|
||||
className={classNames?.content}
|
||||
className={clsx(styles.content, classNames?.content)}
|
||||
>
|
||||
{children}
|
||||
</div>
|
||||
@@ -268,8 +275,6 @@ Dropzone.Idle = DropzoneIdle;
|
||||
Dropzone.Reject = DropzoneReject;
|
||||
|
||||
|
||||
|
||||
|
||||
type PossibleRef<T> = Ref<T> | undefined;
|
||||
|
||||
export function assignRef<T>(ref: PossibleRef<T>, value: T) {
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
// @ts-nocheck
|
||||
import React from 'react';
|
||||
import * as R from 'ramda';
|
||||
import { useFormikContext } from 'formik';
|
||||
import withDrawerActions from '@/containers/Drawer/withDrawerActions';
|
||||
import { createNewItemFromQuery, createNewItemRenderer } from './utils';
|
||||
import { FSelect } from '../Forms';
|
||||
import { useCreateAutofillListener } from '@/hooks/state/autofill';
|
||||
import { DRAWERS } from '@/constants/drawers';
|
||||
|
||||
/**
|
||||
@@ -15,6 +17,7 @@ function VendorsSelectRoot({
|
||||
openDrawer,
|
||||
|
||||
// #ownProps
|
||||
name,
|
||||
items,
|
||||
allowCreate,
|
||||
|
||||
@@ -25,14 +28,24 @@ function VendorsSelectRoot({
|
||||
const maybeCreateNewItemFromQuery = allowCreate
|
||||
? createNewItemFromQuery
|
||||
: 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.
|
||||
const handleCreateItemClick = () => {
|
||||
openDrawer(DRAWERS.QUICK_WRITE_VENDOR);
|
||||
const handleCreateItemClick = (item) => {
|
||||
openDrawer(DRAWERS.QUICK_WRITE_VENDOR, {
|
||||
autofillRef,
|
||||
displayName: item.name,
|
||||
});
|
||||
};
|
||||
|
||||
return (
|
||||
<FSelect
|
||||
name={name}
|
||||
items={items}
|
||||
textAccessor={'display_name'}
|
||||
labelAccessor={'formatted_balance'}
|
||||
|
||||
@@ -6,7 +6,7 @@ export enum DRAWERS {
|
||||
BILL_DETAILS = 'bill-drawer',
|
||||
INVOICE_DETAILS = 'invoice-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',
|
||||
ESTIMATE_DETAILS = 'estimate-detail-drawer',
|
||||
ITEM_DETAILS = 'item-detail-drawer',
|
||||
|
||||
@@ -55,7 +55,7 @@ export const accountsReceivable = [
|
||||
description: (
|
||||
<T id={'manage_payment_transactions_from_your_customers'} />
|
||||
),
|
||||
link: '/payment-receives',
|
||||
link: '/payments-received',
|
||||
subject: AbilitySubject.PaymentReceive,
|
||||
ability: PaymentReceiveAction.View,
|
||||
},
|
||||
@@ -88,7 +88,7 @@ export const accountsPayable = [
|
||||
{
|
||||
title: <T id={'vendors_payments'} />,
|
||||
description: <T id={'manage_payments_transactions_to_your_vendors'} />,
|
||||
link: '/payment-mades',
|
||||
link: '/payments-made',
|
||||
subject: AbilitySubject.PaymentMade,
|
||||
ability: PaymentMadeAction.View,
|
||||
},
|
||||
|
||||
@@ -74,7 +74,7 @@ export const SidebarMenu = [
|
||||
},
|
||||
},
|
||||
{
|
||||
text: <T id={'category_list'} />,
|
||||
text: <T id={'categories_list'} />,
|
||||
href: '/items/categories',
|
||||
type: ISidebarMenuItemType.Link,
|
||||
permission: {
|
||||
@@ -179,8 +179,8 @@ export const SidebarMenu = [
|
||||
type: ISidebarMenuItemType.Link,
|
||||
},
|
||||
{
|
||||
text: <T id={'sidebar.payment_receives'} />,
|
||||
href: '/payment-receives',
|
||||
text: <T id={'sidebar.payments_received'} />,
|
||||
href: '/payments-received',
|
||||
type: ISidebarMenuItemType.Link,
|
||||
permission: {
|
||||
subject: AbilitySubject.PaymentReceive,
|
||||
@@ -226,8 +226,8 @@ export const SidebarMenu = [
|
||||
type: ISidebarMenuItemType.Link,
|
||||
},
|
||||
{
|
||||
text: <T id={'sidebar.new_payment_receive'} />,
|
||||
href: '/payment-receives/new',
|
||||
text: <T id={'sidebar.new_payment_received'} />,
|
||||
href: '/payment-received/new',
|
||||
type: ISidebarMenuItemType.Link,
|
||||
permission: {
|
||||
subject: AbilitySubject.PaymentReceive,
|
||||
@@ -265,8 +265,8 @@ export const SidebarMenu = [
|
||||
type: ISidebarMenuItemType.Link,
|
||||
},
|
||||
{
|
||||
text: <T id={'payment_mades'} />,
|
||||
href: '/payment-mades',
|
||||
text: <T id={'payments_made'} />,
|
||||
href: '/payments-made',
|
||||
type: ISidebarMenuItemType.Link,
|
||||
permission: {
|
||||
subject: AbilitySubject.PaymentMade,
|
||||
@@ -299,7 +299,7 @@ export const SidebarMenu = [
|
||||
},
|
||||
{
|
||||
text: <T id={'sidebar.new_payment_made'} />,
|
||||
href: '/payment-mades/new',
|
||||
href: '/payments-made/new',
|
||||
type: ISidebarMenuItemType.Link,
|
||||
permission: {
|
||||
subject: AbilitySubject.PaymentMade,
|
||||
|
||||
@@ -125,8 +125,9 @@ function ManualJournalsDataTable({
|
||||
loading={isManualJournalsLoading}
|
||||
headerLoading={isManualJournalsLoading}
|
||||
progressBarLoading={isManualJournalsFetching}
|
||||
pagesCount={pagination.pagesCount}
|
||||
pagination={true}
|
||||
initialPageSize={manualJournalsTableState.pageSize}
|
||||
pagesCount={pagination.pagesCount}
|
||||
autoResetSortBy={false}
|
||||
autoResetPage={false}
|
||||
TableLoadingRenderer={TableSkeletonRows}
|
||||
|
||||
@@ -27,7 +27,7 @@ export const accountNameAccessor = (account) => {
|
||||
export const handleDeleteErrors = (errors) => {
|
||||
if (errors.find((e) => e.type === 'ACCOUNT.PREDEFINED')) {
|
||||
AppToaster.show({
|
||||
message: intl.get('you_could_not_delete_predefined_accounts'),
|
||||
message: intl.get('cannot_delete_predefined_accounts'),
|
||||
intent: Intent.DANGER,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,73 +0,0 @@
|
||||
// @ts-nocheck
|
||||
import React, { useState } from 'react';
|
||||
import { FormattedMessage as T } from '@/components';
|
||||
import intl from 'react-intl-universal';
|
||||
import { Intent, Alert } from '@blueprintjs/core';
|
||||
import { size } from 'lodash';
|
||||
import { AppToaster } from '@/components';
|
||||
|
||||
import withAlertStoreConnect from '@/containers/Alert/withAlertStoreConnect';
|
||||
import withAlertActions from '@/containers/Alert/withAlertActions';
|
||||
|
||||
import { compose } from '@/utils';
|
||||
|
||||
/**
|
||||
* Exchange rate bulk delete alert.
|
||||
*/
|
||||
function ExchangeRateBulkDeleteAlert({
|
||||
name,
|
||||
|
||||
// #withAlertStoreConnect
|
||||
isOpen,
|
||||
payload: { exchangeRatesIds },
|
||||
|
||||
// #withAlertActions
|
||||
closeAlert,
|
||||
}) {
|
||||
// handle cancel item bulk delete alert.
|
||||
const handleCancelBulkDelete = () => {
|
||||
closeAlert(name);
|
||||
};
|
||||
|
||||
// handle confirm Exchange Rates bulk delete.
|
||||
// const handleConfirmBulkDelete = () => {
|
||||
// bulkDeleteExchangeRate(exchangeRatesIds)
|
||||
// .then(() => {
|
||||
// AppToaster.show({
|
||||
// message: formatMessage({
|
||||
// id: 'the_exchange_rates_has_been_successfully_deleted',
|
||||
// }),
|
||||
// intent: Intent.SUCCESS,
|
||||
// });
|
||||
// })
|
||||
// .catch(({ errors }) => {
|
||||
// handleDeleteErrors(errors);
|
||||
// });
|
||||
// };
|
||||
|
||||
return (
|
||||
<Alert
|
||||
cancelButtonText={<T id={'cancel'} />}
|
||||
confirmButtonText={
|
||||
<T id={'delete_count'} values={{ count: size(exchangeRatesIds) }} />
|
||||
}
|
||||
icon="trash"
|
||||
intent={Intent.DANGER}
|
||||
isOpen={isOpen}
|
||||
onCancel={handleCancelBulkDelete}
|
||||
// onConfirm={}
|
||||
// loading={isLoading}
|
||||
>
|
||||
<p>
|
||||
<T
|
||||
id={'once_delete_these_exchange_rates_you_will_not_able_restore_them'}
|
||||
/>
|
||||
</p>
|
||||
</Alert>
|
||||
);
|
||||
}
|
||||
|
||||
export default compose(
|
||||
withAlertStoreConnect(),
|
||||
withAlertActions,
|
||||
)(ExchangeRateBulkDeleteAlert);
|
||||
@@ -1,72 +0,0 @@
|
||||
// @ts-nocheck
|
||||
import React from 'react';
|
||||
import intl from 'react-intl-universal';
|
||||
import {
|
||||
AppToaster,
|
||||
FormattedMessage as T,
|
||||
FormattedHTMLMessage,
|
||||
} from '@/components';
|
||||
import { Intent, Alert } from '@blueprintjs/core';
|
||||
|
||||
import { useDeleteExchangeRate } from '@/hooks/query';
|
||||
import withAlertStoreConnect from '@/containers/Alert/withAlertStoreConnect';
|
||||
import withAlertActions from '@/containers/Alert/withAlertActions';
|
||||
|
||||
import { compose } from '@/utils';
|
||||
|
||||
/**
|
||||
* exchange rate delete alerts.
|
||||
*/
|
||||
function ExchangeRateDeleteAlert({
|
||||
name,
|
||||
|
||||
// #withAlertStoreConnect
|
||||
isOpen,
|
||||
payload: { exchangeRateId },
|
||||
|
||||
// #withAlertActions
|
||||
closeAlert,
|
||||
}) {
|
||||
const { mutateAsync: deleteExchangeRate, isLoading } =
|
||||
useDeleteExchangeRate();
|
||||
|
||||
// Handle cancel delete exchange rate alert.
|
||||
const handleCancelExchangeRateDelete = () => closeAlert(name);
|
||||
|
||||
const handelConfirmExchangeRateDelete = () => {
|
||||
deleteExchangeRate(exchangeRateId)
|
||||
.then((response) => {
|
||||
AppToaster.show({
|
||||
message: intl.get('the_exchange_rates_has_been_deleted_successfully'),
|
||||
intent: Intent.SUCCESS,
|
||||
});
|
||||
closeAlert(name);
|
||||
})
|
||||
.catch(() => {
|
||||
closeAlert(name);
|
||||
});
|
||||
};
|
||||
|
||||
return (
|
||||
<Alert
|
||||
cancelButtonText={<T id={'cancel'} />}
|
||||
confirmButtonText={<T id={'delete'} />}
|
||||
intent={Intent.DANGER}
|
||||
isOpen={isOpen}
|
||||
onCancel={handleCancelExchangeRateDelete}
|
||||
onConfirm={handelConfirmExchangeRateDelete}
|
||||
loading={isLoading}
|
||||
>
|
||||
<p>
|
||||
<FormattedHTMLMessage
|
||||
id={'once_delete_this_exchange_rate_you_will_able_to_restore_it'}
|
||||
/>
|
||||
</p>
|
||||
</Alert>
|
||||
);
|
||||
}
|
||||
|
||||
export default compose(
|
||||
withAlertStoreConnect(),
|
||||
withAlertActions,
|
||||
)(ExchangeRateDeleteAlert);
|
||||
@@ -21,7 +21,7 @@ import { DRAWERS } from '@/constants/drawers';
|
||||
/**
|
||||
* Payment receive delete alert.
|
||||
*/
|
||||
function PaymentReceiveDeleteAlert({
|
||||
function PaymentReceivedDeleteAlert({
|
||||
name,
|
||||
|
||||
// #withAlertStoreConnect
|
||||
@@ -48,11 +48,11 @@ function PaymentReceiveDeleteAlert({
|
||||
.then(() => {
|
||||
AppToaster.show({
|
||||
message: intl.get(
|
||||
'the_payment_receive_has_been_deleted_successfully',
|
||||
'the_payment_received_has_been_deleted_successfully',
|
||||
),
|
||||
intent: Intent.SUCCESS,
|
||||
});
|
||||
closeDrawer(DRAWERS.PAYMENT_RECEIVE_DETAILS);
|
||||
closeDrawer(DRAWERS.PAYMENT_RECEIVED_DETAILS);
|
||||
})
|
||||
.catch(
|
||||
({
|
||||
@@ -81,7 +81,7 @@ function PaymentReceiveDeleteAlert({
|
||||
>
|
||||
<p>
|
||||
<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>
|
||||
</Alert>
|
||||
@@ -92,4 +92,4 @@ export default compose(
|
||||
withAlertStoreConnect(),
|
||||
withAlertActions,
|
||||
withDrawerActions,
|
||||
)(PaymentReceiveDeleteAlert);
|
||||
)(PaymentReceivedDeleteAlert);
|
||||
@@ -6,9 +6,9 @@ import InventoryAdjustmentsAlerts from '@/containers/InventoryAdjustments/Invent
|
||||
import EstimatesAlerts from '@/containers/Sales/Estimates/EstimatesAlerts';
|
||||
import InvoicesAlerts from '@/containers/Sales/Invoices/InvoicesAlerts';
|
||||
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 PaymentMadesAlerts from '@/containers/Purchases/PaymentMades/PaymentMadesAlerts';
|
||||
import PaymentsMadeAlerts from '@/containers/Purchases/PaymentsMade/PaymentsMadeAlerts';
|
||||
import CustomersAlerts from '@/containers/Customers/CustomersAlerts';
|
||||
import VendorsAlerts from '@/containers/Vendors/VendorsAlerts';
|
||||
import ManualJournalsAlerts from '@/containers/Accounting/JournalsLanding/ManualJournalsAlerts';
|
||||
@@ -38,9 +38,9 @@ export default [
|
||||
...EstimatesAlerts,
|
||||
...InvoicesAlerts,
|
||||
...ReceiptsAlerts,
|
||||
...PaymentReceiveAlerts,
|
||||
...PaymentsReceivedAlerts,
|
||||
...BillsAlerts,
|
||||
...PaymentMadesAlerts,
|
||||
...PaymentsMadeAlerts,
|
||||
...CustomersAlerts,
|
||||
...VendorsAlerts,
|
||||
...ManualJournalsAlerts,
|
||||
|
||||
@@ -120,6 +120,7 @@ export function UploadAttachmentsPopoverContent({
|
||||
uploadIcon={null}
|
||||
value={null}
|
||||
title={''}
|
||||
subtitle={'Drag and drop file here or choose file'}
|
||||
classNames={{ root: styles.dropzoneRoot }}
|
||||
onChange={handleChangeDropzone}
|
||||
dropzoneProps={{
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// @ts-nocheck
|
||||
import { useCallback, useMemo } from 'react';
|
||||
import { Form, Formik, FormikHelpers, useFormikContext } from 'formik';
|
||||
import { get } from 'lodash';
|
||||
import { Button, Classes, Intent, Radio, Tag } from '@blueprintjs/core';
|
||||
import * as R from 'ramda';
|
||||
import { CreateRuleFormSchema } from './RuleFormContentForm.schema';
|
||||
@@ -17,11 +18,12 @@ import {
|
||||
} from '@/components';
|
||||
import { useCreateBankRule, useEditBankRule } from '@/hooks/query/bank-rules';
|
||||
import {
|
||||
FieldCondition,
|
||||
Fields,
|
||||
RuleFormValues,
|
||||
TransactionTypeOptions,
|
||||
getAccountRootFromMoneyCategory,
|
||||
getDefaultFieldConditionByFieldKey,
|
||||
getFieldConditionsByFieldKey,
|
||||
initialValues,
|
||||
} from './_utils';
|
||||
import { useRuleFormDialogBoot } from './RuleFormBoot';
|
||||
@@ -175,6 +177,13 @@ function RuleFormConditions() {
|
||||
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 (
|
||||
<Box style={{ marginBottom: 15 }}>
|
||||
<Stack spacing={15}>
|
||||
@@ -190,6 +199,7 @@ function RuleFormConditions() {
|
||||
name={`conditions[${index}].field`}
|
||||
items={Fields}
|
||||
popoverProps={{ minimal: true, inline: false }}
|
||||
onItemChange={handleConditionFieldChange(index)}
|
||||
fastField
|
||||
/>
|
||||
</FFormGroup>
|
||||
@@ -202,8 +212,13 @@ function RuleFormConditions() {
|
||||
>
|
||||
<FSelect
|
||||
name={`conditions[${index}].comparator`}
|
||||
items={FieldCondition}
|
||||
items={getFieldConditionsByFieldKey(
|
||||
get(values, `conditions[${index}].field`),
|
||||
)}
|
||||
popoverProps={{ minimal: true, inline: false }}
|
||||
shouldUpdateDeps={{
|
||||
fieldKey: get(values, `conditions[${index}].field`),
|
||||
}}
|
||||
fastField
|
||||
/>
|
||||
</FFormGroup>
|
||||
|
||||
@@ -42,11 +42,25 @@ export const Fields = [
|
||||
{ value: 'amount', text: 'Amount' },
|
||||
{ value: 'payee', text: 'Payee' },
|
||||
];
|
||||
export const FieldCondition = [
|
||||
|
||||
export const TextFieldConditions = [
|
||||
{ value: 'contains', text: 'Contains' },
|
||||
{ value: 'equals', text: 'Equals' },
|
||||
{ value: 'not_contains', text: 'Not Contains' },
|
||||
];
|
||||
export const NumberFieldConditions = [
|
||||
{ value: 'equal', text: 'Equal' },
|
||||
{ value: 'bigger', text: 'Bigger' },
|
||||
{ value: 'bigger_or_equal', text: 'Bigger or Equal' },
|
||||
{ value: 'smaller', text: 'Smaller' },
|
||||
{ value: 'smaller_or_equal', text: 'Smaller or Equal' },
|
||||
];
|
||||
|
||||
export const FieldCondition = [
|
||||
...TextFieldConditions,
|
||||
...NumberFieldConditions,
|
||||
];
|
||||
|
||||
export const AssignTransactionTypeOptions = [
|
||||
{ value: 'expense', text: 'Expense' },
|
||||
];
|
||||
@@ -56,3 +70,21 @@ export const getAccountRootFromMoneyCategory = (category: string): string[] => {
|
||||
|
||||
return get(MoneyCategoryPerCreditAccountRootType, _category) || [];
|
||||
};
|
||||
|
||||
export const getFieldConditionsByFieldKey = (fieldKey?: string) => {
|
||||
switch (fieldKey) {
|
||||
case 'amount':
|
||||
return NumberFieldConditions;
|
||||
default:
|
||||
return TextFieldConditions;
|
||||
}
|
||||
};
|
||||
|
||||
export const getDefaultFieldConditionByFieldKey = (fieldKey?: string) => {
|
||||
switch (fieldKey) {
|
||||
case 'amount':
|
||||
return 'bigger_or_equal';
|
||||
default:
|
||||
return 'contains';
|
||||
}
|
||||
};
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user