From 4d3cd250fdf3c97fc3bd0c5184c8fbd42efb26df Mon Sep 17 00:00:00 2001 From: Ahmed Bouhuolia Date: Mon, 26 Oct 2020 12:47:59 +0200 Subject: [PATCH] fix: sale invoices payment amount once invoice created, edited or deleted. --- server/src/models/SaleReceipt.js | 2 +- .../src/services/Contacts/CustomersService.ts | 10 +++-- server/src/services/Purchases/BillPayments.ts | 38 +++++++++++++++++-- server/src/services/Purchases/Bills.ts | 6 +-- server/src/services/Sales/PaymentsReceives.ts | 30 ++++++--------- server/src/services/Sales/SalesEstimate.ts | 6 +-- server/src/services/Sales/SalesInvoices.ts | 4 +- server/src/services/Sales/SalesReceipts.ts | 6 +-- server/src/subscribers/bills.ts | 12 +++--- server/src/subscribers/events.ts | 12 +++--- server/src/subscribers/paymentMades.ts | 12 +++--- server/src/subscribers/paymentReceives.ts | 22 +++++------ server/src/utils/index.js | 18 +++++++++ 13 files changed, 111 insertions(+), 67 deletions(-) diff --git a/server/src/models/SaleReceipt.js b/server/src/models/SaleReceipt.js index 9ec70b2ec..33a2b1e8c 100644 --- a/server/src/models/SaleReceipt.js +++ b/server/src/models/SaleReceipt.js @@ -34,7 +34,7 @@ export default class SaleReceipt extends TenantModel { to: 'contacts.id', }, filter(query) { - query.where('contact_type', 'Customer'); + query.where('contact_service', 'customer'); } }, diff --git a/server/src/services/Contacts/CustomersService.ts b/server/src/services/Contacts/CustomersService.ts index 8aee2c55f..bae4df453 100644 --- a/server/src/services/Contacts/CustomersService.ts +++ b/server/src/services/Contacts/CustomersService.ts @@ -66,7 +66,9 @@ export default class CustomersService { const customer = await this.contactService.newContact(tenantId, contactDTO, 'customer'); this.logger.info('[customer] created successfully.', { tenantId, customerDTO }); - await this.eventDispatcher.dispatch(events.customers.onCreated); + await this.eventDispatcher.dispatch(events.customers.onCreated, { + customer, tenantId, customerId: customer.id, + }); return customer; } @@ -89,7 +91,9 @@ export default class CustomersService { const customer = this.contactService.editContact(tenantId, customerId, contactDTO, 'customer'); this.eventDispatcher.dispatch(events.customers.onEdited); - this.logger.info('[customer] edited successfully.', { tenantId, customerId }); + this.logger.info('[customer] edited successfully.', { + tenantId, customerId, customer, + }); return customer; } @@ -109,7 +113,7 @@ export default class CustomersService { await Contact.query().findById(customerId).delete(); - await this.eventDispatcher.dispatch(events.customers.onDeleted); + await this.eventDispatcher.dispatch(events.customers.onDeleted, { tenantId, customerId }); this.logger.info('[customer] deleted successfully.', { tenantId, customerId }); } diff --git a/server/src/services/Purchases/BillPayments.ts b/server/src/services/Purchases/BillPayments.ts index 8fd3c6366..bd5a8bba9 100644 --- a/server/src/services/Purchases/BillPayments.ts +++ b/server/src/services/Purchases/BillPayments.ts @@ -23,7 +23,7 @@ import JournalCommands from 'services/Accounting/JournalCommands'; import JournalPosterService from 'services/Sales/JournalPosterService'; import TenancyService from 'services/Tenancy/TenancyService'; import DynamicListingService from 'services/DynamicListing/DynamicListService'; -import { formatDateFields } from 'utils'; +import { entriesAmountDiff, formatDateFields } from 'utils'; import { ServiceError } from 'exceptions'; const ERRORS = { @@ -271,7 +271,7 @@ export default class BillPaymentsService { entries: billPaymentDTO.entries, }); - await this.eventDispatcher.dispatch(events.billPayments.onCreated, { + await this.eventDispatcher.dispatch(events.billPayment.onCreated, { tenantId, billPayment, billPaymentId: billPayment.id, }); this.logger.info('[payment_made] inserted successfully.', { tenantId, billPaymentId: billPayment.id, }); @@ -332,7 +332,7 @@ export default class BillPaymentsService { ...omit(billPaymentObj, ['entries']), entries: billPaymentDTO.entries, }); - await this.eventDispatcher.dispatch(events.billPayments.onEdited, { + await this.eventDispatcher.dispatch(events.billPayment.onEdited, { tenantId, billPaymentId, billPayment, oldPaymentMade, }); this.logger.info('[bill_payment] edited successfully.', { tenantId, billPaymentId, billPayment, oldPaymentMade }); @@ -355,7 +355,7 @@ export default class BillPaymentsService { await BillPaymentEntry.query().where('bill_payment_id', billPaymentId).delete(); await BillPayment.query().where('id', billPaymentId).delete(); - await this.eventDispatcher.dispatch(events.billPayments.onDeleted, { tenantId, billPaymentId, oldPaymentMade }); + await this.eventDispatcher.dispatch(events.billPayment.onDeleted, { tenantId, billPaymentId, oldPaymentMade }); this.logger.info('[bill_payment] deleted successfully.', { tenantId, billPaymentId }); } @@ -477,4 +477,34 @@ export default class BillPaymentsService { } return billPayment; } + + /** + * Saves bills payment amount changes different. + * @param {number} tenantId - + * @param {IBillPaymentEntryDTO[]} paymentMadeEntries - + * @param {IBillPaymentEntryDTO[]} oldPaymentMadeEntries - + */ + public async saveChangeBillsPaymentAmount( + tenantId: number, + paymentMadeEntries: IBillPaymentEntryDTO[], + oldPaymentMadeEntries: IBillPaymentEntryDTO[], + ): Promise { + const { Bill } = this.tenancy.models(tenantId); + const opers: Promise[] = []; + + const diffEntries = entriesAmountDiff( + paymentMadeEntries, + oldPaymentMadeEntries, + 'paymentAmount', + 'billId', + ); + diffEntries.forEach((diffEntry: { paymentAmount: number, billId: number }) => { + const oper = Bill.changePaymentAmount( + diffEntry.billId, + diffEntry.paymentAmount, + ); + opers.push(oper); + }); + await Promise.all(opers); + } } diff --git a/server/src/services/Purchases/Bills.ts b/server/src/services/Purchases/Bills.ts index 4013891f4..9adc2ff60 100644 --- a/server/src/services/Purchases/Bills.ts +++ b/server/src/services/Purchases/Bills.ts @@ -201,7 +201,7 @@ export default class BillsService extends SalesInvoicesCost { }); // Triggers `onBillCreated` event. - await this.eventDispatcher.dispatch(events.bills.onCreated, { + await this.eventDispatcher.dispatch(events.bill.onCreated, { tenantId, bill, billId: bill.id, }); this.logger.info('[bill] bill inserted successfully.', { tenantId, billId: bill.id }); @@ -255,7 +255,7 @@ export default class BillsService extends SalesInvoicesCost { })) }); // Triggers event `onBillEdited`. - await this.eventDispatcher.dispatch(events.bills.onEdited, { tenantId, billId, oldBill, bill }); + await this.eventDispatcher.dispatch(events.bill.onEdited, { tenantId, billId, oldBill, bill }); this.logger.info('[bill] bill upserted successfully.', { tenantId, billId }); return bill; @@ -283,7 +283,7 @@ export default class BillsService extends SalesInvoicesCost { await Promise.all([deleteBillEntriesOper, deleteBillOper]); // Triggers `onBillDeleted` event. - await this.eventDispatcher.dispatch(events.bills.onDeleted, { tenantId, billId, oldBill }); + await this.eventDispatcher.dispatch(events.bill.onDeleted, { tenantId, billId, oldBill }); } /** diff --git a/server/src/services/Sales/PaymentsReceives.ts b/server/src/services/Sales/PaymentsReceives.ts index 9325599e9..dde2a195f 100644 --- a/server/src/services/Sales/PaymentsReceives.ts +++ b/server/src/services/Sales/PaymentsReceives.ts @@ -22,7 +22,7 @@ import JournalEntry from 'services/Accounting/JournalEntry'; import JournalPosterService from 'services/Sales/JournalPosterService'; import TenancyService from 'services/Tenancy/TenancyService'; import DynamicListingService from 'services/DynamicListing/DynamicListService'; -import { formatDateFields } from 'utils'; +import { formatDateFields, entriesAmountDiff } from 'utils'; import { ServiceError } from 'exceptions'; import CustomersService from 'services/Contacts/CustomersService'; import ItemsEntriesService from 'services/Items/ItemsEntriesService'; @@ -218,7 +218,7 @@ export default class PaymentReceiveService { })), }); - await this.eventDispatcher.dispatch(events.paymentReceipts.onCreated, { + await this.eventDispatcher.dispatch(events.paymentReceive.onCreated, { tenantId, paymentReceive, paymentReceiveId: paymentReceive.id, }); this.logger.info('[payment_receive] updated successfully.', { tenantId, paymentReceive }); @@ -282,7 +282,7 @@ export default class PaymentReceiveService { entries: paymentReceiveDTO.entries, }); - await this.eventDispatcher.dispatch(events.paymentReceipts.onEdited, { + await this.eventDispatcher.dispatch(events.paymentReceive.onEdited, { tenantId, paymentReceiveId, paymentReceive, oldPaymentReceive }); this.logger.info('[payment_receive] upserted successfully.', { tenantId, paymentReceiveId }); @@ -313,7 +313,7 @@ export default class PaymentReceiveService { // Deletes the payment receive transaction. await PaymentReceive.query().findById(paymentReceiveId).delete(); - await this.eventDispatcher.dispatch(events.paymentReceipts.onDeleted, { + await this.eventDispatcher.dispatch(events.paymentReceive.onDeleted, { tenantId, paymentReceiveId, oldPaymentReceive, }); this.logger.info('[payment_receive] deleted successfully.', { tenantId, paymentReceiveId }); @@ -457,21 +457,15 @@ export default class PaymentReceiveService { const { SaleInvoice } = this.tenancy.models(tenantId); const opers: Promise[] = []; - const oldEntriesTable = chain(oldPaymentReceiveEntries) - .groupBy('invoiceId') - .mapValues((group) => (sumBy(group, 'paymentAmount') || 0) * -1) - .value(); - - const diffEntries = chain(newPaymentReceiveEntries) - .groupBy('invoiceId') - .mapValues((group) => (sumBy(group, 'paymentAmount') || 0)) - .mapValues((value, key) => value - (oldEntriesTable[key] || 0)) - .mapValues((value, key) => ({ invoiceId: key, paymentAmount: value })) - .filter((entry) => entry.paymentAmount != 0) - .values() - .value(); - + const diffEntries = entriesAmountDiff( + newPaymentReceiveEntries, + oldPaymentReceiveEntries, + 'paymentAmount', + 'invoiceId', + ); diffEntries.forEach((diffEntry: any) => { + if (diffEntry.paymentAmount === 0) { return; } + const oper = SaleInvoice.changePaymentAmount( diffEntry.invoiceId, diffEntry.paymentAmount diff --git a/server/src/services/Sales/SalesEstimate.ts b/server/src/services/Sales/SalesEstimate.ts index 2dd3aa820..54146ea40 100644 --- a/server/src/services/Sales/SalesEstimate.ts +++ b/server/src/services/Sales/SalesEstimate.ts @@ -120,7 +120,7 @@ export default class SaleEstimateService { }); this.logger.info('[sale_estimate] insert sale estimated success.'); - await this.eventDispatcher.dispatch(events.saleEstimates.onCreated); + await this.eventDispatcher.dispatch(events.saleEstimate.onCreated); return saleEstimate; } @@ -169,7 +169,7 @@ export default class SaleEstimateService { })), }); - await this.eventDispatcher.dispatch(events.saleEstimates.onEdited, { + await this.eventDispatcher.dispatch(events.saleEstimate.onEdited, { tenantId, estimateId, saleEstimate, oldSaleEstimate, }); this.logger.info('[sale_estiamte] edited successfully', { tenantId, estimateId }); @@ -199,7 +199,7 @@ export default class SaleEstimateService { await SaleEstimate.query().where('id', estimateId).delete(); this.logger.info('[sale_estimate] deleted successfully.', { tenantId, estimateId }); - await this.eventDispatcher.dispatch(events.saleEstimates.onDeleted, { + await this.eventDispatcher.dispatch(events.saleEstimate.onDeleted, { tenantId, saleEstimateId: estimateId, oldSaleEstimate, }); } diff --git a/server/src/services/Sales/SalesInvoices.ts b/server/src/services/Sales/SalesInvoices.ts index e42ca0650..d7915cf08 100644 --- a/server/src/services/Sales/SalesInvoices.ts +++ b/server/src/services/Sales/SalesInvoices.ts @@ -137,7 +137,7 @@ export default class SaleInvoicesService extends SalesInvoicesCost { this.logger.info('[sale_invoice] inserting sale invoice to the storage.'); const saleInvoice = await SaleInvoice.query() - .insertGraph({ + .insertGraphAndFetch({ ...omit(saleInvoiceObj, ['entries']), entries: saleInvoiceObj.entries.map((entry) => ({ @@ -190,7 +190,7 @@ export default class SaleInvoicesService extends SalesInvoicesCost { this.logger.info('[sale_invoice] trying to update sale invoice.'); const saleInvoice: ISaleInvoice = await SaleInvoice.query() - .upsertGraph({ + .upsertGraphAndFetch({ id: saleInvoiceId, ...omit(saleInvoiceObj, ['entries', 'invLotNumber']), diff --git a/server/src/services/Sales/SalesReceipts.ts b/server/src/services/Sales/SalesReceipts.ts index f45995f44..3d665d8a2 100644 --- a/server/src/services/Sales/SalesReceipts.ts +++ b/server/src/services/Sales/SalesReceipts.ts @@ -105,7 +105,7 @@ export default class SalesReceiptService { ...omit(entry, ['id', 'amount']), })) }); - await this.eventDispatcher.dispatch(events.saleReceipts.onCreated, { tenantId, saleReceipt }); + await this.eventDispatcher.dispatch(events.saleReceipt.onCreated, { tenantId, saleReceipt }); this.logger.info('[sale_receipt] sale receipt inserted successfully.', { tenantId }); @@ -144,7 +144,7 @@ export default class SalesReceiptService { }); this.logger.info('[sale_receipt] edited successfully.', { tenantId, saleReceiptId }); - await this.eventDispatcher.dispatch(events.saleReceipts.onEdited, { + await this.eventDispatcher.dispatch(events.saleReceipt.onEdited, { oldSaleReceipt, tenantId, saleReceiptId, saleReceipt, }); return saleReceipt; @@ -166,7 +166,7 @@ export default class SalesReceiptService { await SaleReceipt.query().where('id', saleReceiptId).delete(); this.logger.info('[sale_receipt] deleted successfully.', { tenantId, saleReceiptId }); - await this.eventDispatcher.dispatch(events.saleReceipts.onDeleted); + await this.eventDispatcher.dispatch(events.saleReceipt.onDeleted); } /** diff --git a/server/src/subscribers/bills.ts b/server/src/subscribers/bills.ts index aa0c1f767..080b7588d 100644 --- a/server/src/subscribers/bills.ts +++ b/server/src/subscribers/bills.ts @@ -24,7 +24,7 @@ export default class BillSubscriber { /** * Handles vendor balance increment once bill created. */ - @On(events.bills.onCreated) + @On(events.bill.onCreated) async handleVendorBalanceIncrement({ tenantId, billId, bill }) { const { vendorRepository } = this.tenancy.repositories(tenantId); @@ -36,8 +36,8 @@ export default class BillSubscriber { /** * Handles writing journal entries once bill created. */ - @On(events.bills.onCreated) - @On(events.bills.onEdited) + @On(events.bill.onCreated) + @On(events.bill.onEdited) async handlerWriteJournalEntries({ tenantId, billId, bill }) { // Writes the journal entries for the given bill transaction. this.logger.info('[bill] writing bill journal entries.', { tenantId }); @@ -47,7 +47,7 @@ export default class BillSubscriber { /** * Handles vendor balance decrement once bill deleted. */ - @On(events.bills.onDeleted) + @On(events.bill.onDeleted) async handleVendorBalanceDecrement({ tenantId, billId, oldBill }) { const { vendorRepository } = this.tenancy.repositories(tenantId); @@ -59,7 +59,7 @@ export default class BillSubscriber { /** * Handles revert journal entries on bill deleted. */ - @On(events.bills.onDeleted) + @On(events.bill.onDeleted) async handlerDeleteJournalEntries({ tenantId, billId }) { // Delete associated bill journal transactions. this.logger.info('[bill] trying to delete journal entries.', { tenantId, billId }); @@ -69,7 +69,7 @@ export default class BillSubscriber { /** * Handles vendor balance difference change. */ - @On(events.bills.onEdited) + @On(events.bill.onEdited) async handleVendorBalanceDiffChange({ tenantId, billId, oldBill, bill }) { const { vendorRepository } = this.tenancy.repositories(tenantId); diff --git a/server/src/subscribers/events.ts b/server/src/subscribers/events.ts index c12e58303..0bd55d059 100644 --- a/server/src/subscribers/events.ts +++ b/server/src/subscribers/events.ts @@ -87,7 +87,7 @@ export default { /** * Sales estimates service. */ - saleEstimates: { + saleEstimate: { onCreated: 'onSaleEstimateCreated', onEdited: 'onSaleEstimateEdited', onDeleted: 'onSaleEstimatedDeleted', @@ -98,7 +98,7 @@ export default { /** * Sales receipts service. */ - saleReceipts: { + saleReceipt: { onCreated: 'onSaleReceiptsCreated', onEdited: 'onSaleReceiptsEdited', onDeleted: 'onSaleReceiptsDeleted', @@ -109,17 +109,17 @@ export default { /** * Payment receipts service. */ - paymentReceipts: { + paymentReceive: { onCreated: 'onPaymentReceiveCreated', onEdited: 'onPaymentReceiveEdited', onDeleted: 'onPaymentReceiveDeleted', - onPublished: 'onPaymentReceiptPublished', + onPublished: 'onPaymentReceivePublished', }, /** * Bills service. */ - bills: { + bill: { onCreated: 'onBillCreated', onEdited: 'onBillEdited', onDeleted: 'onBillDeleted', @@ -130,7 +130,7 @@ export default { /** * Bill payments service. */ - billPayments: { + billPayment: { onCreated: 'onBillPaymentCreated', onEdited: 'onBillPaymentEdited', onDeleted: 'onBillPaymentDeleted', diff --git a/server/src/subscribers/paymentMades.ts b/server/src/subscribers/paymentMades.ts index 1a3e51727..073786576 100644 --- a/server/src/subscribers/paymentMades.ts +++ b/server/src/subscribers/paymentMades.ts @@ -19,7 +19,7 @@ export default class PaymentMadesSubscriber { /** * Handles bills payment amount increment once payment made created. */ - @On(events.billPayments.onCreated) + @On(events.billPayment.onCreated) async handleBillsIncrementPaymentAmount({ tenantId, billPayment, billPaymentId }) { const { Bill } = this.tenancy.models(tenantId); const storeOpers = []; @@ -43,7 +43,7 @@ export default class PaymentMadesSubscriber { /** * Handle vendor balance increment once payment made created. */ - @On(events.billPayments.onCreated) + @On(events.billPayment.onCreated) async handleVendorIncrement({ tenantId, billPayment, billPaymentId }) { const { vendorRepository } = this.tenancy.repositories(tenantId); @@ -58,7 +58,7 @@ export default class PaymentMadesSubscriber { /** * Handle bill payment writing journal entries once created. */ - @On(events.billPayments.onCreated) + @On(events.billPayment.onCreated) async handleWriteJournalEntries({ tenantId, billPayment }) { // Records the journal transactions after bills payment // and change diff acoount balance. @@ -69,7 +69,7 @@ export default class PaymentMadesSubscriber { /** * Decrements the vendor balance once bill payment deleted. */ - @On(events.billPayments.onDeleted) + @On(events.billPayment.onDeleted) async handleVendorDecrement({ tenantId, paymentMadeId, oldPaymentMade }) { const { vendorRepository } = this.tenancy.repositories(tenantId); @@ -82,7 +82,7 @@ export default class PaymentMadesSubscriber { /** * Reverts journal entries once bill payment deleted. */ - @On(events.billPayments.onDeleted) + @On(events.billPayment.onDeleted) async handleRevertJournalEntries({ tenantId, billPaymentId }) { await this.billPaymentsService.revertJournalEntries( tenantId, billPaymentId, @@ -93,7 +93,7 @@ export default class PaymentMadesSubscriber { * Change the vendor balance different between old and new once * bill payment edited. */ - @On(events.billPayments.onEdited) + @On(events.billPayment.onEdited) async handleVendorChangeDiffBalance({ tenantId, paymentMadeId, billPayment, oldBillPayment }) { const { vendorRepository } = this.tenancy.repositories(tenantId); diff --git a/server/src/subscribers/paymentReceives.ts b/server/src/subscribers/paymentReceives.ts index b279a4796..ba19bd4fb 100644 --- a/server/src/subscribers/paymentReceives.ts +++ b/server/src/subscribers/paymentReceives.ts @@ -19,7 +19,7 @@ export default class PaymentReceivesSubscriber { /** * Handle customer balance decrement once payment receive created. */ - @On(events.paymentReceipts.onCreated) + @On(events.paymentReceive.onCreated) async handleCustomerBalanceDecrement({ tenantId, paymentReceiveId, paymentReceive }) { const { customerRepository } = this.tenancy.repositories(tenantId); @@ -30,8 +30,8 @@ export default class PaymentReceivesSubscriber { /** * Handle sale invoice increment/decrement payment amount once created, edited or deleted. */ - @On(events.paymentReceipts.onCreated) - @On(events.paymentReceipts.onEdited) + @On(events.paymentReceive.onCreated) + @On(events.paymentReceive.onEdited) async handleInvoiceIncrementPaymentAmount({ tenantId, paymentReceiveId, paymentReceive, oldPaymentReceive }) { this.logger.info('[payment_receive] trying to change sale invoice payment amount.', { tenantId }); @@ -43,25 +43,23 @@ export default class PaymentReceivesSubscriber { } /** - * Handle sale invoice diff payment amount change on payment receive edited. + * Handle */ - @On(events.paymentReceipts.onEdited) - async handleInvoiceDecrementPaymentAmount({ tenantId, paymentReceiveId, paymentReceive, oldPaymentReceive }) { + @On(events.paymentReceive.onDeleted) + async handleInvoiceDecrementPaymentAmount({ tenantId, paymentReceiveId, oldPaymentReceive }) { this.logger.info('[payment_receive] trying to decrement sale invoice payment amount.'); await this.paymentReceivesService.saveChangeInvoicePaymentAmount( tenantId, - paymentReceive.entries.map((entry) => ({ - ...entry, - paymentAmount: entry.paymentAmount * -1, - })), + oldPaymentReceive.entries.map((entry) => ({ ...entry, paymentAmount: 0 })), + oldPaymentReceive.entries, ); } /** * Handle customer balance increment once payment receive deleted. */ - @On(events.paymentReceipts.onDeleted) + @On(events.paymentReceive.onDeleted) async handleCustomerBalanceIncrement({ tenantId, paymentReceiveId, oldPaymentReceive }) { const { customerRepository } = this.tenancy.repositories(tenantId); @@ -75,7 +73,7 @@ export default class PaymentReceivesSubscriber { /** * Handles customer balance diff balance change once payment receive edited. */ - @On(events.paymentReceipts.onEdited) + @On(events.paymentReceive.onEdited) async handleCustomerBalanceDiffChange({ tenantId, paymentReceiveId, paymentReceive, oldPaymentReceive }) { const { customerRepository } = this.tenancy.repositories(tenantId); diff --git a/server/src/utils/index.js b/server/src/utils/index.js index 8c03e6041..d2e08dfca 100644 --- a/server/src/utils/index.js +++ b/server/src/utils/index.js @@ -179,6 +179,22 @@ const isDefinedOptionConfigurable = (key, group) => { return definedOption?.config || false; }; +const entriesAmountDiff = (newEntries, oldEntries, amountAttribute, idAttribute) => { + const oldEntriesTable = _.chain(oldEntries) + .groupBy(idAttribute) + .mapValues((group) => (_.sumBy(group, amountAttribute) || 0)) + .value(); + + return _.chain(newEntries) + .groupBy(idAttribute) + .mapValues((group) => (_.sumBy(group, amountAttribute) || 0)) + .mapValues((value, key) => value - (oldEntriesTable[key] || 0)) + .mapValues((value, key) => ({ [idAttribute]: key, [amountAttribute]: value })) + .filter((entry) => entry[amountAttribute] != 0) + .values() + .value(); +}; + export { hashPassword, origin, @@ -196,4 +212,6 @@ export { isDefinedOptionConfigurable, getDefinedOption, getDefinedOptions, + + entriesAmountDiff, };