mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-18 13:50:31 +00:00
fix: retrieve bills and bills payments list.
This commit is contained in:
@@ -7,6 +7,7 @@ import BillsService from 'services/Purchases/Bills';
|
||||
import BaseController from 'api/controllers/BaseController';
|
||||
import ItemsService from 'services/Items/ItemsService';
|
||||
import TenancyService from 'services/Tenancy/TenancyService';
|
||||
import DynamicListingService from 'services/DynamicListing/DynamicListService';
|
||||
import { ServiceError } from 'exceptions';
|
||||
|
||||
@Service()
|
||||
@@ -20,6 +21,9 @@ export default class BillsController extends BaseController {
|
||||
@Inject()
|
||||
tenancy: TenancyService;
|
||||
|
||||
@Inject()
|
||||
dynamicListService: DynamicListingService;
|
||||
|
||||
/**
|
||||
* Router constructor.
|
||||
*/
|
||||
@@ -28,7 +32,7 @@ export default class BillsController extends BaseController {
|
||||
|
||||
router.post(
|
||||
'/', [
|
||||
...this.billValidationSchema
|
||||
...this.billValidationSchema,
|
||||
],
|
||||
this.validationResult,
|
||||
asyncMiddleware(this.newBill.bind(this)),
|
||||
@@ -44,29 +48,25 @@ export default class BillsController extends BaseController {
|
||||
);
|
||||
router.get(
|
||||
'/:id', [
|
||||
...this.specificBillValidationSchema
|
||||
...this.specificBillValidationSchema,
|
||||
],
|
||||
this.validationResult,
|
||||
asyncMiddleware(this.getBill.bind(this)),
|
||||
this.handleServiceError,
|
||||
);
|
||||
router.get(
|
||||
'/', [
|
||||
...this.billsListingValidationSchema,
|
||||
],
|
||||
this.validationResult,
|
||||
asyncMiddleware(this.billsList.bind(this)),
|
||||
this.handleServiceError,
|
||||
this.dynamicListService.handlerErrorsToResponse,
|
||||
);
|
||||
|
||||
// router.get(
|
||||
// '/:id',
|
||||
// [...this.specificBillValidationSchema],
|
||||
// this.validationResult,
|
||||
// asyncMiddleware(this.getBill.bind(this)),
|
||||
// this.handleServiceError,
|
||||
// );
|
||||
// router.get(
|
||||
// '/',
|
||||
// [...this.billsListingValidationSchema],
|
||||
// this.validationResult,
|
||||
// asyncMiddleware(this.listingBills.bind(this)),
|
||||
// this.handleServiceError,
|
||||
// );
|
||||
router.delete(
|
||||
'/:id',
|
||||
[...this.specificBillValidationSchema],
|
||||
'/:id', [
|
||||
...this.specificBillValidationSchema
|
||||
],
|
||||
this.validationResult,
|
||||
asyncMiddleware(this.deleteBill.bind(this)),
|
||||
this.handleServiceError,
|
||||
@@ -221,8 +221,30 @@ export default class BillsController extends BaseController {
|
||||
* @param {Response} res -
|
||||
* @return {Response}
|
||||
*/
|
||||
async billsList(req: Request, res: Response) {
|
||||
|
||||
public async billsList(req: Request, res: Response, next: NextFunction) {
|
||||
const { tenantId } = req;
|
||||
const filter = {
|
||||
page: 1,
|
||||
pageSize: 12,
|
||||
filterRoles: [],
|
||||
sortOrder: 'asc',
|
||||
columnSortBy: 'created_at',
|
||||
...this.matchedQueryData(req),
|
||||
};
|
||||
if (filter.stringifiedFilterRoles) {
|
||||
filter.filterRoles = JSON.parse(filter.stringifiedFilterRoles);
|
||||
}
|
||||
try {
|
||||
const { bills, pagination, filterMeta } = await this.billsService.getBills(tenantId, filter);
|
||||
|
||||
return res.status(200).send({
|
||||
bills,
|
||||
pagination: this.transfromToResponse(pagination),
|
||||
filter_meta: this.transfromToResponse(filterMeta),
|
||||
});
|
||||
} catch (error) {
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -6,6 +6,7 @@ import asyncMiddleware from 'api/middleware/asyncMiddleware';
|
||||
import { ServiceError } from 'exceptions';
|
||||
import BaseController from 'api/controllers/BaseController';
|
||||
import BillPaymentsService from 'services/Purchases/BillPayments';
|
||||
import DynamicListingService from 'services/DynamicListing/DynamicListService';
|
||||
import AccountsService from 'services/Accounts/AccountsService';
|
||||
|
||||
/**
|
||||
@@ -20,6 +21,9 @@ export default class BillsPayments extends BaseController {
|
||||
@Inject()
|
||||
accountsService: AccountsService;
|
||||
|
||||
@Inject()
|
||||
dynamicListService: DynamicListingService;
|
||||
|
||||
/**
|
||||
* Router constructor.
|
||||
*/
|
||||
@@ -48,16 +52,19 @@ export default class BillsPayments extends BaseController {
|
||||
asyncMiddleware(this.deleteBillPayment.bind(this)),
|
||||
this.handleServiceError,
|
||||
);
|
||||
// router.get('/:id',
|
||||
// this.specificBillPaymentValidateSchema,
|
||||
// this.validationResult,
|
||||
// asyncMiddleware(this.getBillPayment.bind(this)),
|
||||
// );
|
||||
// router.get('/',
|
||||
// this.listingValidationSchema,
|
||||
// this.validationResult,
|
||||
// asyncMiddleware(this.getBillsPayments.bind(this))
|
||||
// );
|
||||
router.get('/:id',
|
||||
this.specificBillPaymentValidateSchema,
|
||||
this.validationResult,
|
||||
asyncMiddleware(this.getBillPayment.bind(this)),
|
||||
this.handleServiceError,
|
||||
);
|
||||
router.get('/',
|
||||
this.listingValidationSchema,
|
||||
this.validationResult,
|
||||
asyncMiddleware(this.getBillsPayments.bind(this)),
|
||||
this.handleServiceError,
|
||||
this.dynamicListService.handlerErrorsToResponse,
|
||||
);
|
||||
return router;
|
||||
}
|
||||
|
||||
@@ -183,10 +190,9 @@ export default class BillsPayments extends BaseController {
|
||||
const { tenantId } = req;
|
||||
const { id: billPaymentId } = req.params;
|
||||
|
||||
const billPayment = await this.billPaymentService
|
||||
.getBillPaymentWithMetadata(tenantId, billPaymentId);
|
||||
const billPayment = await this.billPaymentService.getBillPayment(tenantId, billPaymentId);
|
||||
|
||||
return res.status(200).send({ bill_payment: { ...billPayment } });
|
||||
return res.status(200).send({ bill_payment: billPayment });
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -196,13 +202,19 @@ export default class BillsPayments extends BaseController {
|
||||
* @return {Response}
|
||||
*/
|
||||
async getBillsPayments(req: Request, res: Response, next: NextFunction) {
|
||||
const { tenantId } = req.params;
|
||||
const billPaymentsFilter = this.matchedQueryData(req);
|
||||
const { tenantId } = req;
|
||||
const billPaymentsFilter = {
|
||||
page: 1,
|
||||
pageSize: 12,
|
||||
filterRoles: [],
|
||||
sortOrder: 'asc',
|
||||
columnSortBy: 'created_at',
|
||||
...this.matchedQueryData(req),
|
||||
};
|
||||
|
||||
try {
|
||||
const { billPayments, pagination, filterMeta } = await this.billPaymentService
|
||||
.listBillPayments(tenantId, billPaymentsFilter);
|
||||
|
||||
const { billPayments, pagination, filterMeta } = await this.billPaymentService.listBillPayments(tenantId, billPaymentsFilter);
|
||||
|
||||
return res.status(200).send({
|
||||
bill_payments: billPayments,
|
||||
pagination: this.transfromToResponse(pagination),
|
||||
@@ -273,7 +285,6 @@ export default class BillsPayments extends BaseController {
|
||||
})
|
||||
}
|
||||
}
|
||||
console.log(error);
|
||||
next(error);
|
||||
}
|
||||
}
|
||||
@@ -41,4 +41,8 @@ export interface IBill {
|
||||
|
||||
entries: IItemEntry[],
|
||||
};
|
||||
|
||||
|
||||
export interface IBillsFilter {
|
||||
page: number,
|
||||
pageSize: number,
|
||||
}
|
||||
@@ -17,6 +17,10 @@ export default class Bill extends TenantModel {
|
||||
return 'bills';
|
||||
}
|
||||
|
||||
static get resourceable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Timestamps columns.
|
||||
*/
|
||||
@@ -48,7 +52,7 @@ export default class Bill extends TenantModel {
|
||||
to: 'contacts.id',
|
||||
},
|
||||
filter(query) {
|
||||
query.where('contact_type', 'Vendor');
|
||||
query.where('contact_service', 'vendor');
|
||||
}
|
||||
},
|
||||
|
||||
@@ -97,4 +101,14 @@ export default class Bill extends TenantModel {
|
||||
.where('id', billId)
|
||||
[changeMethod]('payment_amount', Math.abs(amount));
|
||||
}
|
||||
|
||||
static get fields() {
|
||||
return {
|
||||
created_at: {
|
||||
label: 'Created at',
|
||||
column: 'created_at',
|
||||
columnType: 'date',
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,10 @@ export default class BillPayment extends TenantModel {
|
||||
return ['createdAt', 'updatedAt'];
|
||||
}
|
||||
|
||||
static get resourceable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Relationship mapping.
|
||||
*/
|
||||
@@ -43,7 +47,7 @@ export default class BillPayment extends TenantModel {
|
||||
to: 'contacts.id',
|
||||
},
|
||||
filter(query) {
|
||||
query.where('contact_type', 'Vendor');
|
||||
query.where('contact_service', 'vendor');
|
||||
}
|
||||
},
|
||||
|
||||
@@ -69,4 +73,15 @@ export default class BillPayment extends TenantModel {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
static get fields() {
|
||||
return {
|
||||
created_at: {
|
||||
label: 'Created at',
|
||||
column: 'created_at',
|
||||
columnType: 'date',
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -423,7 +423,7 @@ export default class BillPaymentsService {
|
||||
const dynamicFilter = await this.dynamicListService.dynamicList(tenantId, BillPayment, billPaymentsFilter);
|
||||
|
||||
this.logger.info('[bill_payment] try to get bill payments list.', { tenantId });
|
||||
const { results, pagination } = await BillPayment.query().onBuild(builder => {
|
||||
const { results, pagination } = await BillPayment.query().onBuild((builder) => {
|
||||
builder.withGraphFetched('vendor');
|
||||
builder.withGraphFetched('paymentAccount');
|
||||
dynamicFilter.buildQuery()(builder);
|
||||
@@ -444,15 +444,17 @@ export default class BillPaymentsService {
|
||||
* @param {number} billPaymentId - The bill payment id.
|
||||
* @return {object}
|
||||
*/
|
||||
async getBillPaymentWithMetadata(tenantId: number, billPaymentId: number) {
|
||||
public async getBillPayment(tenantId: number, billPaymentId: number) {
|
||||
const { BillPayment } = this.tenancy.models(tenantId);
|
||||
const billPayment = await BillPayment.query()
|
||||
.where('id', billPaymentId)
|
||||
.findById(billPaymentId)
|
||||
.withGraphFetched('entries')
|
||||
.withGraphFetched('vendor')
|
||||
.withGraphFetched('paymentAccount')
|
||||
.first();
|
||||
|
||||
.withGraphFetched('paymentAccount');
|
||||
|
||||
if (!billPayment) {
|
||||
throw new ServiceError(ERRORS.PAYMENT_MADE_NOT_FOUND);
|
||||
}
|
||||
return billPayment;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import AccountsService from 'services/Accounts/AccountsService';
|
||||
import InventoryService from 'services/Inventory/Inventory';
|
||||
import SalesInvoicesCost from 'services/Sales/SalesInvoicesCost';
|
||||
import TenancyService from 'services/Tenancy/TenancyService';
|
||||
import DynamicListingService from 'services/DynamicListing/DynamicListService';
|
||||
import { formatDateFields } from 'utils';
|
||||
import {
|
||||
IBillDTO,
|
||||
@@ -21,6 +22,9 @@ import {
|
||||
IItemEntry,
|
||||
IItemEntryDTO,
|
||||
IBillEditDTO,
|
||||
IPaginationMeta,
|
||||
IFilterMeta,
|
||||
IBillsFilter,
|
||||
} from 'interfaces';
|
||||
import { ServiceError } from 'exceptions';
|
||||
import ItemsService from 'services/Items/ItemsService';
|
||||
@@ -59,6 +63,9 @@ export default class BillsService extends SalesInvoicesCost {
|
||||
@Inject('logger')
|
||||
logger: any;
|
||||
|
||||
@Inject()
|
||||
dynamicListService: DynamicListingService;
|
||||
|
||||
/**
|
||||
* Validates whether the vendor is exist.
|
||||
* @async
|
||||
@@ -423,6 +430,30 @@ export default class BillsService extends SalesInvoicesCost {
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve bills data table list.
|
||||
* @param {number} tenantId -
|
||||
* @param {IBillsFilter} billsFilter -
|
||||
*/
|
||||
public async getBills(
|
||||
tenantId: number,
|
||||
billsFilter: IBillsFilter,
|
||||
): Promise<{ bills: IBill, pagination: IPaginationMeta, filterMeta: IFilterMeta }> {
|
||||
const { Bill } = this.tenancy.models(tenantId);
|
||||
const dynamicFilter = await this.dynamicListService.dynamicList(tenantId, Bill, billsFilter);
|
||||
|
||||
this.logger.info('[bills] trying to get bills data table.', { tenantId, billsFilter });
|
||||
const { results, pagination } = await Bill.query().onBuild((builder) => {
|
||||
builder.withGraphFetched('vendor');
|
||||
dynamicFilter.buildQuery()(builder);
|
||||
}).pagination(billsFilter.page - 1, billsFilter.pageSize);
|
||||
|
||||
return {
|
||||
bills: results,
|
||||
pagination,
|
||||
filterMeta: dynamicFilter.getResponseMeta(),
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the given bill details with associated items entries.
|
||||
|
||||
Reference in New Issue
Block a user