fix bugs in sales and purchases API.

This commit is contained in:
Ahmed Bouhuolia
2020-08-04 23:00:15 +02:00
parent db28cd2aef
commit ad772cf247
31 changed files with 420 additions and 819 deletions

View File

@@ -1,15 +1,22 @@
import express from 'express';
import { check, param, query } from 'express-validator';
import { difference } from 'lodash';
import { PaymentReceiveEntry } from '@/models';
import BaseController from '@/http/controllers/BaseController';
import validateMiddleware from '@/http/middleware/validateMiddleware';
import asyncMiddleware from '@/http/middleware/asyncMiddleware';
import PaymentReceiveService from '@/services/Sales/PaymentReceive';
import PaymentReceiveService from '@/services/Sales/PaymentsReceives';
import CustomersService from '@/services/Customers/CustomersService';
import SaleInvoicesService from '@/services/Sales/SaleInvoice';
import SaleInvoicesService from '@/services/Sales/SalesInvoices';
import AccountsService from '@/services/Accounts/AccountsService';
import { PaymentReceiveEntry } from '@/models';
import DynamicListing from '@/services/DynamicListing/DynamicListing';
import DynamicListingBuilder from '@/services/DynamicListing/DynamicListingBuilder';
import { dynamicListingErrorsToResponse } from '@/services/DynamicListing/hasDynamicListing';
/**
* Payments receives controller.
* @controller
*/
export default class PaymentReceivesController extends BaseController {
/**
* Router constructor.
@@ -27,10 +34,11 @@ export default class PaymentReceivesController extends BaseController {
asyncMiddleware(this.validateDepositAccount),
asyncMiddleware(this.validateInvoicesIDs),
asyncMiddleware(this.validateEntriesIdsExistance),
asyncMiddleware(this.editPaymentReceive)
asyncMiddleware(this.validateInvoicesPaymentsAmount),
asyncMiddleware(this.editPaymentReceive),
);
router.post(
'/',
'/',
this.newPaymentReceiveValidation,
validateMiddleware,
asyncMiddleware(this.validatePaymentReceiveNoExistance),
@@ -38,7 +46,7 @@ export default class PaymentReceivesController extends BaseController {
asyncMiddleware(this.validateDepositAccount),
asyncMiddleware(this.validateInvoicesIDs),
asyncMiddleware(this.validateInvoicesPaymentsAmount),
asyncMiddleware(this.newPaymentReceive)
asyncMiddleware(this.newPaymentReceive),
);
router.get(
'/:id',
@@ -58,7 +66,7 @@ export default class PaymentReceivesController extends BaseController {
this.paymentReceiveValidation,
validateMiddleware,
asyncMiddleware(this.validatePaymentReceiveExistance),
asyncMiddleware(this.deletePaymentReceive)
asyncMiddleware(this.deletePaymentReceive),
);
return router;
}
@@ -340,7 +348,7 @@ export default class PaymentReceivesController extends BaseController {
/**
* Payment receive list validation schema.
*/
static async validatePaymentReceiveList() {
static get validatePaymentReceiveList() {
return [
query('custom_view_id').optional().isNumeric().toInt(),
query('stringified_filter_roles').optional().isJSON(),
@@ -407,7 +415,8 @@ export default class PaymentReceivesController extends BaseController {
const paymentReceives = await PaymentReceive.query().onBuild((builder) => {
dynamicListing.buildQuery()(builder);
return builder;
});
}).pagination(filter.page - 1, filter.page_size);
return res.status(200).send({
payment_receives: {
...paymentReceives,

View File

@@ -103,9 +103,10 @@ export default class SalesEstimatesController extends BaseController {
return [
query('custom_view_id').optional().isNumeric().toInt(),
query('stringified_filter_roles').optional().isJSON(),
query('column_sort_by').optional(),
query('sort_order').optional().isIn(['desc', 'asc']),
query('page').optional().isNumeric().toInt(),
query('page_size').optional().isNumeric().toInt(),
]
}
@@ -201,7 +202,7 @@ export default class SalesEstimatesController extends BaseController {
.filter(e => e.id)
.map((e) => e.id);
const foundEntries = await ItemEntry.query()
const foundEntries = await ItemEntry.tenant().query()
.whereIn('id', entriesIds)
.where('reference_type', 'SaleInvoice')
.where('reference_id', saleInvoiceId);
@@ -323,7 +324,7 @@ export default class SalesEstimatesController extends BaseController {
return res.status(400).send({ errors: errorReasons });
}
const salesEstimates = await SaleEstimate.query().onBuild((query) => {
const salesEstimates = await SaleEstimate.query().onBuild((builder) => {
dynamicListing.buildQuery()(builder);
return builder;
}).pagination(filter.page - 1, filter.page_size);

View File

@@ -1,16 +1,15 @@
import express from 'express';
import { check, param, query } from 'express-validator';
import { difference } from 'lodash';
import { ItemEntry } from '@/models';
import validateMiddleware from '@/http/middleware/validateMiddleware';
import asyncMiddleware from '@/http/middleware/asyncMiddleware';
import SaleInvoiceService from '@/services/Sales/SaleInvoice';
import SaleInvoiceService from '@/services/Sales/SalesInvoices';
import ItemsService from '@/services/Items/ItemsService';
import CustomersService from '@/services/Customers/CustomersService';
import DynamicListing from '@/services/DynamicListing/DynamicListing';
import DynamicListingBuilder from '@/services/DynamicListing/DynamicListingBuilder';
import { dynamicListingErrorsToResponse } from '@/services/DynamicListing/hasDynamicListing';
import { SaleInvoice } from '../../../models';
import { difference } from 'lodash';
export default class SaleInvoicesController {
/**
@@ -23,6 +22,7 @@ export default class SaleInvoicesController {
'/',
this.saleInvoiceValidationSchema,
validateMiddleware,
asyncMiddleware(this.validateInvoiceCustomerExistance),
asyncMiddleware(this.validateInvoiceNumberUnique),
asyncMiddleware(this.validateInvoiceItemsIdsExistance),
asyncMiddleware(this.newSaleInvoice)
@@ -35,6 +35,7 @@ export default class SaleInvoicesController {
],
validateMiddleware,
asyncMiddleware(this.validateInvoiceExistance),
asyncMiddleware(this.validateInvoiceCustomerExistance),
asyncMiddleware(this.validateInvoiceNumberUnique),
asyncMiddleware(this.validateInvoiceItemsIdsExistance),
asyncMiddleware(this.valdiateInvoiceEntriesIdsExistance),
@@ -96,12 +97,17 @@ export default class SaleInvoicesController {
return [param('id').exists().isNumeric().toInt()];
}
/**
* Sales invoices list validation schema.
*/
static get saleInvoiceListValidationSchema() {
return [
query('custom_view_id').optional().isNumeric().toInt(),
query('stringified_filter_roles').optional().isJSON(),
query('column_sort_by').optional(),
query('sort_order').optional().isIn(['desc', 'asc']),
query('page').optional().isNumeric().toInt(),
query('page_size').optional().isNumeric().toInt(),
];
}
@@ -145,6 +151,7 @@ export default class SaleInvoicesController {
}
/**
*
* Validate whether sale invoice number unqiue on the storage.
* @param {Request} req
* @param {Response} res
@@ -266,8 +273,13 @@ export default class SaleInvoicesController {
*/
static async editSaleInvoice(req, res) {
const { id: saleInvoiceId } = req.params;
const saleInvoice = { ...req.body };
const saleInvoice = {
...req.body,
entries: req.body.entries.map((entry) => ({
...entry,
amount: ItemEntry.calcAmount(entry),
})),
};
// Update the given sale invoice details.
await SaleInvoiceService.editSaleInvoice(saleInvoiceId, saleInvoice);
@@ -311,6 +323,8 @@ export default class SaleInvoicesController {
const filter = {
filter_roles: [],
sort_order: 'asc',
page: 1,
page_size: 10,
...req.query,
};
if (filter.stringified_filter_roles) {

View File

@@ -6,7 +6,7 @@ import asyncMiddleware from '@/http/middleware/asyncMiddleware';
import CustomersService from '@/services/Customers/CustomersService';
import AccountsService from '@/services/Accounts/AccountsService';
import ItemsService from '@/services/Items/ItemsService';
import SaleReceiptService from '@/services/Sales/SalesReceipt';
import SaleReceiptService from '@/services/Sales/SalesReceipts';
import DynamicListingBuilder from '@/services/DynamicListing/DynamicListingBuilder';
import DynamicListing from '@/services/DynamicListing/DynamicListing';
import {
@@ -51,7 +51,7 @@ export default class SalesReceiptsController {
);
router.get(
'/',
this.listingSalesReceipts,
this.listSalesReceiptsValidationSchema,
validateMiddleware,
asyncMiddleware(this.listingSalesReceipts)
);
@@ -103,6 +103,8 @@ export default class SalesReceiptsController {
query('stringified_filter_roles').optional().isJSON(),
query('column_sort_by').optional(),
query('sort_order').optional().isIn(['desc', 'asc']),
query('page').optional().isNumeric().toInt(),
query('page_size').optional().isNumeric().toInt(),
];
}
@@ -272,6 +274,7 @@ export default class SalesReceiptsController {
sort_order: 'asc',
page: 1,
page_size: 10,
...req.query,
};
if (filter.stringified_filter_roles) {
filter.filter_roles = JSON.parse(filter.stringified_filter_roles);
@@ -312,14 +315,17 @@ export default class SalesReceiptsController {
const salesReceipts = await SaleReceipt.query().onBuild((builder) => {
builder.withGraphFetched('entries');
dynamicListing.buildQuery()(builder);
return builder;
}).pagination(filter.page - 1, filter.page_size);
return res.status(200).send({
sales_receipts: salesReceipts,
...(viewMeta ? {
customViewId: viewMeta.id,
} : {}),
sales_receipts: {
...salesReceipts,
...(viewMeta ? {
view_meta: {
customViewId: viewMeta.id,
}
} : {}),
},
});
}
};

View File

@@ -1,6 +1,6 @@
import express from 'express';
import SalesEstimates from './SalesEstimates';
import SalesReceipts from './SalesReceipt';
import SalesReceipts from './SalesReceipts';
import SalesInvoices from './SalesInvoices'
import PaymentReceives from './PaymentReceives';