This commit is contained in:
elforjani3
2020-10-17 18:13:36 +02:00
12 changed files with 97 additions and 47 deletions

View File

@@ -52,6 +52,7 @@ export default class ViewsController extends BaseController{
],
this.validationResult,
asyncMiddleware(this.getView.bind(this)),
this.handlerServiceErrors,
);
return router;
}
@@ -157,7 +158,10 @@ export default class ViewsController extends BaseController{
try {
const view = await this.viewsService.newView(tenantId, viewDTO);
return res.status(200).send({ id: view.id });
return res.status(200).send({
id: view.id,
message: 'The view has been created successfully.',
});
} catch (error) {
next(error);
}
@@ -176,7 +180,10 @@ export default class ViewsController extends BaseController{
try {
await this.viewsService.editView(tenantId, viewId, viewEditDTO);
return res.status(200).send({ id: viewId });
return res.status(200).send({
id: viewId,
message: 'The given view has been edited succcessfully.',
});
} catch (error) {
next(error);
}
@@ -194,7 +201,10 @@ export default class ViewsController extends BaseController{
try {
await this.viewsService.deleteView(tenantId, viewId);
return res.status(200).send();
return res.status(200).send({
id: viewId,
message: 'The view has been deleted successfully.',
});
} catch (error) {
next(error);
}

View File

@@ -19,19 +19,19 @@ exports.up = (knex) => {
{ id: 5, name: i18n.__('Expenses'), roles_logic_expression: '1', resource_model: 'Account', predefined: true },
// Items
// { id: 6, name: 'Services', roles_logic_expression: '1', resource_id: 2, predefined: true },
// { id: 7, name: 'Inventory', roles_logic_expression: '1', resource_id: 2, predefined: true },
// { id: 8, name: 'Non-Inventory', roles_logic_expression: '1', resource_id: 2, predefined: true },
{ id: 6, name: i18n.__('Services'), roles_logic_expression: '1', resource_model: 'Item', predefined: true },
{ id: 7, name: i18n.__('Inventory'), roles_logic_expression: '1', resource_model: 'Item', predefined: true },
{ id: 8, name: i18n.__('Non-Inventory'), roles_logic_expression: '1', resource_model: 'Item', predefined: true },
// // Manual Journals
// { id: 9, name: 'Journal', roles_logic_expression: '1', resource_id: 4, predefined: true },
// { id: 10, name: 'Credit', roles_logic_expression: '1', resource_id: 4, predefined: true },
// { id: 11, name: 'Reconciliation', roles_logic_expression: '1', resource_id: 4, predefined: true },
// Manual Journals
{ id: 9, name: i18n.__('Journal'), roles_logic_expression: '1', resource_model: 'ManualJournal', predefined: true },
{ id: 10, name: i18n.__('Credit'), roles_logic_expression: '1', resource_model: 'ManualJournal', predefined: true },
{ id: 11, name: i18n.__('Reconciliation'), roles_logic_expression: '1', resource_model: 'ManualJournal', predefined: true },
// // Expenses
// { id: 12, name: 'Interest', roles_logic_expression: '1', resource_id: 3, predefined: false, },
// { id: 13, name: 'Depreciation', roles_logic_expression: '1', resource_id: 3, predefined: false, },
// { id: 14, name: 'Payroll', roles_logic_expression: '1', resource_id: '3', predefined: false },
// Expenses
{ id: 12, name: i18n.__('Interest'), roles_logic_expression: '1', resource_model: 'Expense', predefined: false, },
{ id: 13, name: i18n.__('Depreciation'), roles_logic_expression: '1', resource_model: 'Expense', predefined: false, },
{ id: 14, name: i18n.__('Payroll'), roles_logic_expression: '1', resource_model: 'Expense', predefined: false },
]);
});
};

View File

@@ -14,17 +14,14 @@ exports.up = (knex) => {
{ id: 12, field_key: 'active', index: 1, comparator: 'is', value: 1, view_id: 15 },
// Items.
// { id: 6, field_id: 12, index: 1, comparator: 'equals', value: 'service', view_id: 6 },
// { id: 7, field_id: 12, index: 1, comparator: 'equals', value: 'inventory', view_id: 7 },
// { id: 8, field_id: 12, index: 1, comparator: 'equals', value: 'non-inventory', view_id: 8 },
{ id: 6, field_id: 12, index: 1, comparator: 'equals', value: 'service', view_id: 6 },
{ id: 7, field_id: 12, index: 1, comparator: 'equals', value: 'inventory', view_id: 7 },
{ id: 8, field_id: 12, index: 1, comparator: 'equals', value: 'non-inventory', view_id: 8 },
// // Manual Journals.
// { id: 9, field_id: 26, index: 1, comparator: 'equals', value: 'Journal', view_id: 9 },
// { id: 10, field_id: 26, index: 1, comparator: 'equals', value: 'CreditNote', view_id: 10 },
// { id: 11, field_id: 26, index: 1, comparator: 'equals', value: 'Reconciliation', view_id: 11 },
// Expenses
// { id: 12, field_id: index: }
// Manual Journals.
{ id: 9, field_id: 26, index: 1, comparator: 'equals', value: 'Journal', view_id: 9 },
{ id: 10, field_id: 26, index: 1, comparator: 'equals', value: 'CreditNote', view_id: 10 },
{ id: 11, field_id: 26, index: 1, comparator: 'equals', value: 'Reconciliation', view_id: 11 },
]);
});
};

View File

@@ -37,5 +37,11 @@
"Balance": "Balance",
"Active": "Active",
"Created at": "Created at",
"fixed_asset": "Fixed asset"
"fixed_asset": "Fixed asset",
"Journal": "Journal",
"Reconciliation": "Reconciliation",
"Credit": "Credit",
"Interest": "Interest",
"Depreciation": "Depreciation",
"Payroll": "Payroll"
}

View File

@@ -26,7 +26,7 @@ export default class Account extends TenantModel {
}
/**
*
* Allows to mark model as resourceable to viewable and filterable.
*/
static get resourceable() {
return true;

View File

@@ -10,6 +10,20 @@ export default class AccountType extends TenantModel {
return 'account_types';
}
/**
* Virtaul attributes.
*/
static get virtualAttributes() {
return ['label'];
}
/**
* Translatable lable.
*/
label() {
return AccountType.labels[this.key] || '';
}
/**
* Relationship mapping.
*/

View File

@@ -25,7 +25,16 @@ export default class Expense extends TenantModel {
return ['createdAt', 'updatedAt'];
}
/**
* Allows to mark model as resourceable to viewable and filterable.
*/
static get resourceable() {
return true;
}
/**
*
*/
static get media () {
return true;
}

View File

@@ -19,6 +19,13 @@ export default class Item extends TenantModel {
return ['createdAt', 'updatedAt'];
}
/**
* Allows to mark model as resourceable to viewable and filterable.
*/
static get resourceable() {
return true;
}
/**
* Model modifiers.
*/

View File

@@ -17,6 +17,13 @@ export default class ManualJournal extends TenantModel {
return ['createdAt', 'updatedAt'];
}
/**
*
*/
static get resourceable() {
return true;
}
/**
* Relationship mapping.
*/

View File

@@ -15,15 +15,6 @@ export default class AccountsTypesService implements IAccountsTypesService{
*/
async getAccountsTypes(tenantId: number): Promise<IAccountType> {
const { accountTypeRepository } = this.tenancy.repositories(tenantId);
const { AccountType } = this.tenancy.models(tenantId);
const { __ } = this.tenancy.i18n(tenantId);
const allAccountsTypes = await accountTypeRepository.all();
return allAccountsTypes.map((_accountType: IAccountType) => ({
id: _accountType.id,
label: __(AccountType.labels[_accountType.key]),
...omit(_accountType, ['id']),
}));
return accountTypeRepository.all();
}
}

View File

@@ -11,6 +11,7 @@ import {
IItemCategoriesService,
IItemCategoriesFilter,
ISystemUser,
IFilterMeta,
} from "interfaces";
import DynamicListingService from 'services/DynamicListing/DynamicListService';
import TenancyService from 'services/Tenancy/TenancyService';
@@ -245,7 +246,11 @@ export default class ItemCategoriesService implements IItemCategoriesService {
* @param {number} tenantId
* @param filter
*/
public async getItemCategoriesList(tenantId: number, filter: IItemCategoriesFilter, authorizedUser: ISystemUser) {
public async getItemCategoriesList(
tenantId: number,
filter: IItemCategoriesFilter,
authorizedUser: ISystemUser
): Promise<{ itemCategories: IItemCategory[], filterMeta: IFilterMeta }> {
const { ItemCategory } = this.tenancy.models(tenantId);
const dynamicList = await this.dynamicListService.dynamicList(tenantId, ItemCategory, filter);

View File

@@ -165,7 +165,7 @@ export default class ViewsService implements IViewsService {
* - Store view roles/conditions to the storage.
* ---------
* @param {number} tenantId - Tenant id.
* @param {IViewDTO} viewDTO - View DTO.
* @param {IViewDTO} viewDTO - New view DTO.
*
* @return {Promise<IView>}
*/
@@ -195,7 +195,7 @@ export default class ViewsService implements IViewsService {
predefined: false,
name: viewDTO.name,
rolesLogicExpression: viewDTO.logicExpression,
resourceModel: viewDTO.resourceModel,
resourceModel: ResourceModel.name,
roles: viewDTO.roles,
columns: viewDTO.columns,
});
@@ -215,22 +215,23 @@ export default class ViewsService implements IViewsService {
* - Delete old view columns and roles.
* - Re-save view columns and roles.
*
* @param {number} tenantId
* @param {number} viewId
* @param {IViewEditDTO}
* @param {number} tenantId -
* @param {number} viewId -
* @param {IViewEditDTO} viewEditDTO -
* @return {Promise<IView>}
*/
public async editView(tenantId: number, viewId: number, viewEditDTO: IViewEditDTO): Promise<void> {
public async editView(tenantId: number, viewId: number, viewEditDTO: IViewEditDTO): Promise<IView> {
const { viewRepository } = this.tenancy.repositories(tenantId);
this.logger.info('[view] trying to edit custom view.', { tenantId, viewId });
// Retrieve view details or throw not found error.
const view = await this.getViewOrThrowError(tenantId, viewId);
const oldView = await this.getViewOrThrowError(tenantId, viewId);
// Validate the resource name is exists and resourcable.
const ResourceModel = this.getResourceModelOrThrowError(tenantId, view.resourceModel);
const ResourceModel = this.getResourceModelOrThrowError(tenantId, oldView.resourceModel);
// Validate view name uniquiness.
await this.validateViewNameUniquiness(tenantId, view.resourceModel, viewEditDTO.name, viewId);
await this.validateViewNameUniquiness(tenantId, oldView.resourceModel, viewEditDTO.name, viewId);
// Validate the given fields keys exist on the storage.
this.validateResourceRolesFieldsExistance(ResourceModel, viewEditDTO.roles);
@@ -243,7 +244,8 @@ export default class ViewsService implements IViewsService {
throw new ServiceError(ERRORS.LOGIC_EXPRESSION_INVALID);
}
// Update view details.
await viewRepository.update(tenantId, viewId, {
this.logger.info('[views] trying to update view details.', { tenantId, viewId });
const view = await viewRepository.update(viewId, {
predefined: false,
name: viewEditDTO.name,
rolesLogicExpression: viewEditDTO.logicExpression,
@@ -251,6 +253,8 @@ export default class ViewsService implements IViewsService {
columns: viewEditDTO.columns,
})
this.logger.info('[view] edited successfully.', { tenantId, viewId });
return view;
}
/**