mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-21 07:10:33 +00:00
feat: seed customers and vendors views.
This commit is contained in:
@@ -253,7 +253,7 @@ export default class VendorsController extends ContactsController {
|
|||||||
const { tenantId } = req;
|
const { tenantId } = req;
|
||||||
const vendorsFilter: IVendorsFilter = {
|
const vendorsFilter: IVendorsFilter = {
|
||||||
filterRoles: [],
|
filterRoles: [],
|
||||||
...this.matchedBodyData(req),
|
...this.matchedQueryData(req),
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -60,6 +60,18 @@ exports.up = (knex) => {
|
|||||||
// Sale receipts.
|
// Sale receipts.
|
||||||
{ id: 34, name: 'Draft', slug: 'draft', roles_logic_expression: '1', resource_model: 'SaleReceipt', predefined: true },
|
{ 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 },
|
{ 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 },
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -50,6 +50,18 @@ exports.up = (knex) => {
|
|||||||
// Sale receipts.
|
// Sale receipts.
|
||||||
{ field_key: 'status', index: 1, comparator: 'is', value: 'draft', view_id: 34 },
|
{ field_key: 'status', index: 1, comparator: 'is', value: 'draft', view_id: 34 },
|
||||||
{ field_key: 'status', index: 1, comparator: 'is', value: 'closed', view_id: 35 },
|
{ 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 },
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { Model } from 'objection';
|
import { Model } from 'objection';
|
||||||
import TenantModel from 'models/TenantModel';
|
import TenantModel from 'models/TenantModel';
|
||||||
import PaginationQueryBuilder from './Pagination';
|
import PaginationQueryBuilder from './Pagination';
|
||||||
|
import QueryParser from 'lib/LogicEvaluation/QueryParser';
|
||||||
|
|
||||||
class CustomerQueryBuilder extends PaginationQueryBuilder {
|
class CustomerQueryBuilder extends PaginationQueryBuilder {
|
||||||
constructor(...args) {
|
constructor(...args) {
|
||||||
@@ -50,6 +51,45 @@ export default class Customer extends TenantModel {
|
|||||||
return this.openingBalance + this.balance;
|
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.
|
* Relationship mapping.
|
||||||
*/
|
*/
|
||||||
@@ -65,11 +105,48 @@ export default class Customer extends TenantModel {
|
|||||||
to: 'sales_invoices.customerId',
|
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() {
|
static get fields() {
|
||||||
return {
|
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: {
|
created_at: {
|
||||||
column: 'created_at',
|
column: 'created_at',
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,45 @@ export default class Vendor extends TenantModel {
|
|||||||
return this.openingBalance + this.balance;
|
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.
|
* Relationship mapping.
|
||||||
*/
|
*/
|
||||||
@@ -64,12 +103,50 @@ export default class Vendor extends TenantModel {
|
|||||||
from: 'contacts.id',
|
from: 'contacts.id',
|
||||||
to: 'bills.vendorId',
|
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() {
|
static get fields() {
|
||||||
return {
|
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: {
|
created_at: {
|
||||||
column: 'created_at',
|
column: 'created_at',
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,7 +69,6 @@ export default class CustomersService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private transformContactToCustomer(contactModel: IContact) {
|
private transformContactToCustomer(contactModel: IContact) {
|
||||||
console.log(contactModel);
|
|
||||||
return {
|
return {
|
||||||
...omit(contactModel.toJSON(), ['contactService', 'contactType']),
|
...omit(contactModel.toJSON(), ['contactService', 'contactType']),
|
||||||
customerType: contactModel.contactType,
|
customerType: contactModel.contactType,
|
||||||
|
|||||||
Reference in New Issue
Block a user