From 1f76c08262e92c7b3fbd4b78f83d456000a62de6 Mon Sep 17 00:00:00 2001 From: "a.bouhuolia" Date: Mon, 21 Dec 2020 14:07:58 +0200 Subject: [PATCH] feat: seed customers and vendors views. --- .../src/api/controllers/Contacts/Vendors.ts | 2 +- .../seeds/core/20200810121807_seed_views.js | 12 +++ .../core/20200810121808_seed_views_roles.js | 12 +++ server/src/models/Customer.js | 77 +++++++++++++++++++ server/src/models/Vendor.js | 77 +++++++++++++++++++ .../src/services/Contacts/CustomersService.ts | 1 - 6 files changed, 179 insertions(+), 2 deletions(-) diff --git a/server/src/api/controllers/Contacts/Vendors.ts b/server/src/api/controllers/Contacts/Vendors.ts index d8c80dee2..685638c74 100644 --- a/server/src/api/controllers/Contacts/Vendors.ts +++ b/server/src/api/controllers/Contacts/Vendors.ts @@ -253,7 +253,7 @@ export default class VendorsController extends ContactsController { const { tenantId } = req; const vendorsFilter: IVendorsFilter = { filterRoles: [], - ...this.matchedBodyData(req), + ...this.matchedQueryData(req), }; try { diff --git a/server/src/database/seeds/core/20200810121807_seed_views.js b/server/src/database/seeds/core/20200810121807_seed_views.js index c8d9df040..481cb125f 100644 --- a/server/src/database/seeds/core/20200810121807_seed_views.js +++ b/server/src/database/seeds/core/20200810121807_seed_views.js @@ -60,6 +60,18 @@ exports.up = (knex) => { // Sale receipts. { id: 34, name: 'Draft', slug: 'draft', roles_logic_expression: '1', resource_model: 'SaleReceipt', predefined: true }, { id: 35, name: 'Closed', slug: 'closed', roles_logic_expression: '1', resource_model: 'SaleReceipt', predefined: true }, + + // Customers + { id: 36, name: 'Active', slug: 'active', roles_logic_expression: '1', resource_model: 'Customer', predefined: true }, + { id: 37, name: 'Inactive', slug: 'inactive', roles_logic_expression: '1', resource_model: 'Customer', predefined: true }, + { id: 38, name: 'Overdue', slug: 'overdue', roles_logic_expression: '1', resource_model: 'Customer', predefined: true }, + { id: 39, name: 'Unpaid', slug: 'inpaid', roles_logic_expression: '1', resource_model: 'Customer', predefined: true }, + + // Vendors + { id: 40, name: 'Active', slug: 'active', roles_logic_expression: '1', resource_model: 'Vendor', predefined: true }, + { id: 41, name: 'Inactive', slug: 'inactive', roles_logic_expression: '1', resource_model: 'Vendor', predefined: true }, + { id: 42, name: 'Overdue', slug: 'overdue', roles_logic_expression: '1', resource_model: 'Vendor', predefined: true }, + { id: 43, name: 'Unpaid', slug: 'overdue', roles_logic_expression: '1', resource_model: 'Vendor', predefined: true }, ]); }); }; diff --git a/server/src/database/seeds/core/20200810121808_seed_views_roles.js b/server/src/database/seeds/core/20200810121808_seed_views_roles.js index 03634749f..b4c1ba5c7 100644 --- a/server/src/database/seeds/core/20200810121808_seed_views_roles.js +++ b/server/src/database/seeds/core/20200810121808_seed_views_roles.js @@ -50,6 +50,18 @@ exports.up = (knex) => { // Sale receipts. { field_key: 'status', index: 1, comparator: 'is', value: 'draft', view_id: 34 }, { field_key: 'status', index: 1, comparator: 'is', value: 'closed', view_id: 35 }, + + // Customers + { field_key: 'status', index: 1, comparator: 'is', value: 'active', view_id: 36 }, + { field_key: 'status', index: 1, comparator: 'is', value: 'inactive', view_id: 37 }, + { field_key: 'status', index: 1, comparator: 'is', value: 'overdue', view_id: 38 }, + { field_key: 'status', index: 1, comparator: 'is', value: 'unpaid', view_id: 39 }, + + // Vendors + { field_key: 'status', index: 1, comparator: 'is', value: 'active', view_id: 40 }, + { field_key: 'status', index: 1, comparator: 'is', value: 'inactive', view_id: 41 }, + { field_key: 'status', index: 1, comparator: 'is', value: 'overdue', view_id: 42 }, + { field_key: 'status', index: 1, comparator: 'is', value: 'unpaid', view_id: 43 }, ]); }); }; diff --git a/server/src/models/Customer.js b/server/src/models/Customer.js index 64b33c213..65137b63f 100644 --- a/server/src/models/Customer.js +++ b/server/src/models/Customer.js @@ -1,6 +1,7 @@ import { Model } from 'objection'; import TenantModel from 'models/TenantModel'; import PaginationQueryBuilder from './Pagination'; +import QueryParser from 'lib/LogicEvaluation/QueryParser'; class CustomerQueryBuilder extends PaginationQueryBuilder { constructor(...args) { @@ -50,6 +51,45 @@ export default class Customer extends TenantModel { return this.openingBalance + this.balance; } + /** + * Model modifiers. + */ + static get modifiers() { + return { + /** + * Filters the active customers. + */ + active(query) { + query.where('active', 1); + }, + /** + * Filters the inactive customers. + */ + inactive(query) { + query.where('active', 0); + }, + /** + * Filters the customers that have overdue invoices. + */ + overdue(query) { + query.select( + '*', + Customer + .relatedQuery('overDueInvoices', query.knex()) + .count() + .as('countOverdue'), + ); + query.having('countOverdue', '>', 0); + }, + /** + * Filters the unpaid customers. + */ + unpaid(query) { + query.whereRaw('`BALANCE` + `OPENING_BALANCE` <> 0'); + } + }; + } + /** * Relationship mapping. */ @@ -65,11 +105,48 @@ export default class Customer extends TenantModel { to: 'sales_invoices.customerId', }, }, + + overDueInvoices: { + relation: Model.HasManyRelation, + modelClass: SaleInvoice.default, + join: { + from: 'contacts.id', + to: 'sales_invoices.customerId', + }, + filter: (query) => { + query.modify('overdue'); + } + } }; } static get fields() { return { + status: { + label: 'Status', + options: [ + { key: 'active', label: 'Active' }, + { key: 'inactive', label: 'Inactive' }, + { key: 'overdue', label: 'Overdue' }, + { key: 'unpaid', label: 'Unpaid' }, + ], + query: (query, role) => { + switch(role.value) { + case 'active': + query.modify('active'); + break; + case 'inactive': + query.modify('inactive'); + break; + case 'overdue': + query.modify('overdue'); + break; + case 'unpaid': + query.modify('unpaid'); + break; + } + }, + }, created_at: { column: 'created_at', } diff --git a/server/src/models/Vendor.js b/server/src/models/Vendor.js index a7d432972..f62c8d3eb 100644 --- a/server/src/models/Vendor.js +++ b/server/src/models/Vendor.js @@ -50,6 +50,45 @@ export default class Vendor extends TenantModel { return this.openingBalance + this.balance; } + /** + * Model modifiers. + */ + static get modifiers() { + return { + /** + * Filters the active customers. + */ + active(query) { + query.where('active', 1); + }, + /** + * Filters the inactive customers. + */ + inactive(query) { + query.where('active', 0); + }, + /** + * Filters the vendors that have overdue invoices. + */ + overdue(query) { + query.select( + '*', + Vendor + .relatedQuery('overdueBills', query.knex()) + .count() + .as('countOverdue'), + ); + query.having('countOverdue', '>', 0); + }, + /** + * Filters the unpaid customers. + */ + unpaid(query) { + query.whereRaw('`BALANCE` + `OPENING_BALANCE` <> 0'); + } + }; + } + /** * Relationship mapping. */ @@ -64,12 +103,50 @@ export default class Vendor extends TenantModel { from: 'contacts.id', to: 'bills.vendorId', }, + }, + overdueBills: { + relation: Model.HasManyRelation, + modelClass: Bill.default, + join: { + from: 'contacts.id', + to: 'bills.vendorId', + }, + filter: (query) => { + query.modify('overdue'); + } } }; } static get fields() { return { + status: { + label: 'Status', + options: [ + { key: 'active', label: 'Active' }, + { key: 'inactive', label: 'Inactive' }, + { key: 'overdue', label: 'Overdue' }, + { key: 'unpaid', label: 'Unpaid' }, + ], + query: (query, role) => { + console.log(role); + + switch(role.value) { + case 'active': + query.modify('active'); + break; + case 'inactive': + query.modify('inactive'); + break; + case 'overdue': + query.modify('overdue'); + break; + case 'unpaid': + query.modify('unpaid'); + break; + } + }, + }, created_at: { column: 'created_at', } diff --git a/server/src/services/Contacts/CustomersService.ts b/server/src/services/Contacts/CustomersService.ts index f91ce01aa..e24644be7 100644 --- a/server/src/services/Contacts/CustomersService.ts +++ b/server/src/services/Contacts/CustomersService.ts @@ -69,7 +69,6 @@ export default class CustomersService { } private transformContactToCustomer(contactModel: IContact) { - console.log(contactModel); return { ...omit(contactModel.toJSON(), ['contactService', 'contactType']), customerType: contactModel.contactType,