feat: seed customers and vendors views.

This commit is contained in:
a.bouhuolia
2020-12-21 14:07:58 +02:00
parent 2cd6553075
commit 1f76c08262
6 changed files with 179 additions and 2 deletions

View File

@@ -253,7 +253,7 @@ export default class VendorsController extends ContactsController {
const { tenantId } = req;
const vendorsFilter: IVendorsFilter = {
filterRoles: [],
...this.matchedBodyData(req),
...this.matchedQueryData(req),
};
try {

View File

@@ -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 },
]);
});
};

View File

@@ -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 },
]);
});
};

View File

@@ -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',
}

View File

@@ -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',
}

View File

@@ -69,7 +69,6 @@ export default class CustomersService {
}
private transformContactToCustomer(contactModel: IContact) {
console.log(contactModel);
return {
...omit(contactModel.toJSON(), ['contactService', 'contactType']),
customerType: contactModel.contactType,