feat: licenses administration basic authentication.

feat: accounts slug.
feat: duplicate accounts_balance table and merge balance with accounts table.
feat: refactoring customers and vendors.
feat: system user soft deleting.
feat: preventing build tenant database without any subscription.
feat: remove 'password' property from 'req.user' object.
feat: refactoring JournalPoster class.
feat: delete duplicated directories and files.
This commit is contained in:
Ahmed Bouhuolia
2020-09-09 21:30:19 +02:00
parent 98bba3d3a0
commit ad00f140d1
77 changed files with 2431 additions and 1848 deletions

View File

@@ -1,17 +1,15 @@
/* eslint-disable global-require */
import { Model, mixin } from 'objection';
import { Model } from 'objection';
import { flatten } from 'lodash';
import TenantModel from '@/models/TenantModel';
import {
buildFilterQuery,
buildSortColumnQuery,
} from '@/lib/ViewRolesBuilder';
import CachableQueryBuilder from '@/lib/Cachable/CachableQueryBuilder';
import CachableModel from '@/lib/Cachable/CachableModel';
import { flatToNestedArray } from '@/utils';
import DependencyGraph from '@/lib/DependencyGraph';
export default class Account extends mixin(TenantModel, [CachableModel]) {
export default class Account extends TenantModel {
/**
* Table name
*/
@@ -26,36 +24,6 @@ export default class Account extends mixin(TenantModel, [CachableModel]) {
return ['createdAt', 'updatedAt'];
}
/**
* Extend query builder model.
*/
static get QueryBuilder() {
return CachableQueryBuilder;
}
/**
* Query return override.
* @param {...any} args
*/
static query(...args) {
return super.query(...args).runAfter((result) => {
if (Array.isArray(result)) {
return this.isDepGraph ?
Account.toDependencyGraph(result) :
this.collection.from(result);
}
return result;
});
}
/**
* Convert the array result to dependency graph.
*/
static depGraph() {
this.isDepGraph = true;
return this;
}
/**
* Model modifiers.
*/
@@ -87,7 +55,6 @@ export default class Account extends mixin(TenantModel, [CachableModel]) {
*/
static get relationMappings() {
const AccountType = require('@/models/AccountType');
const AccountBalance = require('@/models/AccountBalance');
const AccountTransaction = require('@/models/AccountTransaction');
return {
@@ -103,18 +70,6 @@ export default class Account extends mixin(TenantModel, [CachableModel]) {
},
},
/**
* Account model may has many balances accounts.
*/
balance: {
relation: Model.HasOneRelation,
modelClass: this.relationBindKnex(AccountBalance.default),
join: {
from: 'accounts.id',
to: 'account_balances.accountId',
},
},
/**
* Account model may has many transactions.
*/

View File

@@ -1,29 +0,0 @@
import { Model } from 'objection';
import TenantModel from '@/models/TenantModel';
export default class AccountBalance extends TenantModel {
/**
* Table name
*/
static get tableName() {
return 'account_balances';
}
/**
* Relationship mapping.
*/
static get relationMappings() {
const Account = require('@/models/Account');
return {
account: {
relation: Model.BelongsToOneRelation,
modelClass: this.relationBindKnex(Account.default),
join: {
from: 'account_balances.account_id',
to: 'accounts.id',
},
},
};
}
}

View File

@@ -1,11 +1,8 @@
import { Model, mixin } from 'objection';
import { Model } from 'objection';
import moment from 'moment';
import TenantModel from '@/models/TenantModel';
import CachableQueryBuilder from '@/lib/Cachable/CachableQueryBuilder';
import CachableModel from '@/lib/Cachable/CachableModel';
export default class AccountTransaction extends mixin(TenantModel, [CachableModel]) {
export default class AccountTransaction extends TenantModel {
/**
* Table name
*/
@@ -20,13 +17,6 @@ export default class AccountTransaction extends mixin(TenantModel, [CachableMode
return ['createdAt'];
}
/**
* Extend query builder model.
*/
static get QueryBuilder() {
return CachableQueryBuilder;
}
/**
* Model modifiers.
*/

View File

@@ -1,9 +1,8 @@
// import path from 'path';
import { Model, mixin } from 'objection';
import TenantModel from '@/models/TenantModel';
import CachableModel from '@/lib/Cachable/CachableModel';
export default class AccountType extends mixin(TenantModel, [CachableModel]) {
export default class AccountType extends TenantModel {
/**
* Table name
*/

View File

@@ -1,12 +1,8 @@
import { Model, mixin } from 'objection';
import moment from 'moment';
import { Model } from 'objection';
import { difference } from 'lodash';
import TenantModel from '@/models/TenantModel';
import CachableQueryBuilder from '@/lib/Cachable/CachableQueryBuilder';
import CachableModel from '@/lib/Cachable/CachableModel';
export default class Bill extends mixin(TenantModel, [CachableModel]) {
export default class Bill extends TenantModel {
/**
* Virtual attributes.
*/

View File

@@ -1,10 +1,7 @@
import { Model, mixin } from 'objection';
import { Model } from 'objection';
import TenantModel from '@/models/TenantModel';
import CachableQueryBuilder from '@/lib/Cachable/CachableQueryBuilder';
import CachableModel from '@/lib/Cachable/CachableModel';
export default class BillPayment extends mixin(TenantModel, [CachableModel]) {
export default class BillPayment extends TenantModel {
/**
* Table name
*/

View File

@@ -0,0 +1,124 @@
import { Model } from 'objection';
import TenantModel from '@/models/TenantModel';
export default class Contact extends TenantModel {
/**
* Table name
*/
static get tableName() {
return 'contacts';
}
/**
* Model timestamps.
*/
get timestamps() {
return ['createdAt', 'updatedAt'];
}
/**
* Model modifiers.
*/
static get modifiers() {
return {
filterContactIds(query, customerIds) {
query.whereIn('id', customerIds);
},
customer(query) {
query.where('contact_service', 'customer');
},
vendor(query){
query.where('contact_service', 'vendor');
}
};
}
/**
* Relationship mapping.
*/
static get relationMappings() {
const SaleInvoice = require('@/models/SaleInvoice');
const Bill = require('@/models/Bill');
return {
salesInvoices: {
relation: Model.HasManyRelation,
modelClass: this.relationBindKnex(SaleInvoice.default),
join: {
from: 'contacts.id',
to: 'sales_invoices.customerId',
},
},
bills: {
relation: Model.HasManyRelation,
modelClass: this.relationBindKnex(Bill.default),
join: {
from: 'contacts.id',
to: 'bills.vendorId',
},
}
};
}
/**
* Change vendor balance.
* @param {Integer} customerId
* @param {Numeric} amount
*/
static async changeBalance(customerId, amount) {
const changeMethod = (amount > 0) ? 'increment' : 'decrement';
return this.query()
.where('id', customerId)
[changeMethod]('balance', Math.abs(amount));
}
/**
* Increment the given customer balance.
* @param {Integer} customerId
* @param {Integer} amount
*/
static async incrementBalance(customerId, amount) {
return this.query()
.where('id', customerId)
.increment('balance', amount);
}
/**
* Decrement the given customer balance.
* @param {integer} customerId -
* @param {integer} amount -
*/
static async decrementBalance(customerId, amount) {
await this.query()
.where('id', customerId)
.decrement('balance', amount);
}
/**
*
* @param {number} customerId
* @param {number} oldCustomerId
* @param {number} amount
* @param {number} oldAmount
*/
static changeDiffBalance(customerId, oldCustomerId, amount, oldAmount) {
const diffAmount = amount - oldAmount;
const asyncOpers = [];
if (customerId != oldCustomerId) {
const oldCustomerOper = this.changeBalance(oldCustomerId, (oldAmount * -1));
const customerOper = this.changeBalance(customerId, amount);
asyncOpers.push(customerOper);
asyncOpers.push(oldCustomerOper);
} else {
const balanceChangeOper = this.changeBalance(customerId, diffAmount);
asyncOpers.push(balanceChangeOper);
}
return Promise.all(asyncOpers);
}
}

View File

@@ -1,10 +1,7 @@
import { Model, mixin } from 'objection';
import moment from 'moment';
import { Model } from 'objection';
import TenantModel from '@/models/TenantModel';
import CachableQueryBuilder from '@/lib/Cachable/CachableQueryBuilder';
import CachableModel from '@/lib/Cachable/CachableModel';
export default class PaymentReceive extends mixin(TenantModel, [CachableModel]) {
export default class PaymentReceive extends TenantModel {
/**
* Table name
*/

View File

@@ -1,9 +1,7 @@
import { Model, mixin } from 'objection';
import TenantModel from '@/models/TenantModel';
import CachableQueryBuilder from '@/lib/Cachable/CachableQueryBuilder';
import CachableModel from '@/lib/Cachable/CachableModel';
export default class PaymentReceiveEntry extends mixin(TenantModel, [CachableModel]) {
export default class PaymentReceiveEntry extends TenantModel {
/**
* Table name
*/
@@ -18,13 +16,6 @@ export default class PaymentReceiveEntry extends mixin(TenantModel, [CachableMod
return [];
}
/**
* Extend query builder model.
*/
static get QueryBuilder() {
return CachableQueryBuilder;
}
/**
* Relationship mapping.
*/
@@ -34,7 +25,6 @@ export default class PaymentReceiveEntry extends mixin(TenantModel, [CachableMod
return {
/**
*
*/
entries: {
relation: Model.HasManyRelation,

View File

@@ -1,9 +1,7 @@
import { Model, mixin } from 'objection';
import { Model } from 'objection';
import TenantModel from '@/models/TenantModel';
import CachableQueryBuilder from '@/lib/Cachable/CachableQueryBuilder';
import CachableModel from '@/lib/Cachable/CachableModel';
export default class Resource extends mixin(TenantModel, [CachableModel]) {
export default class Resource extends TenantModel {
/**
* Table name.
*/
@@ -11,13 +9,6 @@ export default class Resource extends mixin(TenantModel, [CachableModel]) {
return 'resources';
}
/**
* Extend query builder model.
*/
static get QueryBuilder() {
return CachableQueryBuilder;
}
/**
* Timestamp columns.
*/

View File

@@ -1,9 +1,7 @@
import { Model, mixin } from 'objection';
import TenantModel from '@/models/TenantModel';
import CachableQueryBuilder from '@/lib/Cachable/CachableQueryBuilder';
import CachableModel from '@/lib/Cachable/CachableModel';
export default class SaleEstimate extends mixin(TenantModel, [CachableModel]) {
export default class SaleEstimate extends TenantModel {
/**
* Table name
*/

View File

@@ -1,9 +1,8 @@
import { Model, mixin } from 'objection';
import { Model } from 'objection';
import TenantModel from '@/models/TenantModel';
import CachableQueryBuilder from '@/lib/Cachable/CachableQueryBuilder';
import CachableModel from '@/lib/Cachable/CachableModel';
export default class SaleEstimateEntry extends mixin(TenantModel, [CachableModel]) {
export default class SaleEstimateEntry extends TenantModel {
/**
* Table name
*/
@@ -11,20 +10,6 @@ export default class SaleEstimateEntry extends mixin(TenantModel, [CachableModel
return 'sales_estimate_entries';
}
/**
* Timestamps columns.
*/
get timestamps() {
return [];
}
/**
* Extend query builder model.
*/
static get QueryBuilder() {
return CachableQueryBuilder;
}
/**
* Relationship mapping.
*/

View File

@@ -1,11 +1,8 @@
import { Model, mixin } from 'objection';
import moment from 'moment';
import TenantModel from '@/models/TenantModel';
import CachableQueryBuilder from '@/lib/Cachable/CachableQueryBuilder';
import CachableModel from '@/lib/Cachable/CachableModel';
import InventoryCostLotTracker from './InventoryCostLotTracker';
export default class SaleInvoice extends mixin(TenantModel, [CachableModel]) {
export default class SaleInvoice extends TenantModel {
/**
* Virtual attributes.
*/

View File

@@ -1,10 +1,7 @@
import { Model, mixin } from 'objection';
import moment from 'moment';
import { Model } from 'objection';
import TenantModel from '@/models/TenantModel';
import CachableQueryBuilder from '@/lib/Cachable/CachableQueryBuilder';
import CachableModel from '@/lib/Cachable/CachableModel';
export default class SaleInvoiceEntry extends mixin(TenantModel, [CachableModel]) {
export default class SaleInvoiceEntry extends TenantModel {
/**
* Table name
*/
@@ -12,20 +9,6 @@ export default class SaleInvoiceEntry extends mixin(TenantModel, [CachableModel]
return 'sales_invoices_entries';
}
/**
* Timestamps columns.
*/
get timestamps() {
return [];
}
/**
* Extend query builder model.
*/
static get QueryBuilder() {
return CachableQueryBuilder;
}
/**
* Relationship mapping.
*/

View File

@@ -1,10 +1,7 @@
import { Model, mixin } from 'objection';
import moment from 'moment';
import TenantModel from '@/models/TenantModel';
import CachableQueryBuilder from '@/lib/Cachable/CachableQueryBuilder';
import CachableModel from '@/lib/Cachable/CachableModel';
export default class SaleReceipt extends mixin(TenantModel, [CachableModel]) {
export default class SaleReceipt extends TenantModel {
/**
* Table name
*/

View File

@@ -1,9 +1,7 @@
import { Model, mixin } from 'objection';
import { Model } from 'objection';
import TenantModel from '@/models/TenantModel';
import CachableQueryBuilder from '@/lib/Cachable/CachableQueryBuilder';
import CachableModel from '@/lib/Cachable/CachableModel';
export default class SaleReceiptEntry extends mixin(TenantModel, [CachableModel]) {
export default class SaleReceiptEntry extends TenantModel {
/**
* Table name
*/
@@ -11,20 +9,6 @@ export default class SaleReceiptEntry extends mixin(TenantModel, [CachableModel]
return 'sales_receipt_entries';
}
/**
* Timestamps columns.
*/
get timestamps() {
return [];
}
/**
* Extend query builder model.
*/
static get QueryBuilder() {
return CachableQueryBuilder;
}
/**
* Relationship mapping.
*/

View File

@@ -9,13 +9,6 @@ export default class Setting extends TenantModel {
return 'settings';
}
/**
* Timestamp columns.
*/
static get hasTimestamps() {
return false;
}
/**
* Extra metadata query to query with the current authenticate user.
* @param {Object} query

View File

@@ -1,17 +1,5 @@
import BaseModel from '@/models/Model';
export default class TenantModel extends BaseModel {
static tenant() {
if (!this.knexBinded) {
throw new Error('Tenant knex is not binded yet.');
}
return super.bindKnex(this.knexBinded);
}
/**
* Allow to embed models to express request.
*/
static requestModel() {
return true;
}
}

View File

@@ -12,7 +12,7 @@ export default class Vendor extends TenantModel {
/**
* Model timestamps.
*/
static get timestamps() {
get timestamps() {
return ['createdAt', 'updatedAt'];
}

View File

@@ -1,9 +1,7 @@
import { Model, mixin } from 'objection';
import TenantModel from '@/models/TenantModel';
import CachableQueryBuilder from '@/lib/Cachable/CachableQueryBuilder';
import CachableModel from '@/lib/Cachable/CachableModel';
export default class View extends mixin(TenantModel, [CachableModel]) {
export default class View extends TenantModel {
/**
* Table name.
*/
@@ -18,13 +16,6 @@ export default class View extends mixin(TenantModel, [CachableModel]) {
return ['createdAt', 'updatedAt'];
}
/**
* Extend query builder model.
*/
static get QueryBuilder() {
return CachableQueryBuilder;
}
static get modifiers() {
const TABLE_NAME = View.tableName;

View File

@@ -9,14 +9,6 @@ export default class ViewColumn extends TenantModel {
return 'view_has_columns';
}
/**
* Timestamp columns.
*/
static get hasTimestamps() {
return false;
}
/**
* Relationship mapping.
*/

View File

@@ -23,13 +23,6 @@ export default class ViewRole extends TenantModel {
return 'view_roles';
}
/**
* Timestamp columns.
*/
static get hasTimestamps() {
return false;
}
/**
* Relationship mapping.
*/