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, this.validationResult,
asyncMiddleware(this.getView.bind(this)), asyncMiddleware(this.getView.bind(this)),
this.handlerServiceErrors,
); );
return router; return router;
} }
@@ -157,7 +158,10 @@ export default class ViewsController extends BaseController{
try { try {
const view = await this.viewsService.newView(tenantId, viewDTO); 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) { } catch (error) {
next(error); next(error);
} }
@@ -176,7 +180,10 @@ export default class ViewsController extends BaseController{
try { try {
await this.viewsService.editView(tenantId, viewId, viewEditDTO); 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) { } catch (error) {
next(error); next(error);
} }
@@ -194,7 +201,10 @@ export default class ViewsController extends BaseController{
try { try {
await this.viewsService.deleteView(tenantId, viewId); 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) { } catch (error) {
next(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 }, { id: 5, name: i18n.__('Expenses'), roles_logic_expression: '1', resource_model: 'Account', predefined: true },
// Items // Items
// { id: 6, name: 'Services', 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: 'Inventory', roles_logic_expression: '1', resource_id: 2, predefined: true }, { id: 7, name: i18n.__('Inventory'), roles_logic_expression: '1', resource_model: 'Item', predefined: true },
// { id: 8, name: 'Non-Inventory', roles_logic_expression: '1', resource_id: 2, predefined: true }, { id: 8, name: i18n.__('Non-Inventory'), roles_logic_expression: '1', resource_model: 'Item', predefined: true },
// // Manual Journals // Manual Journals
// { id: 9, name: 'Journal', roles_logic_expression: '1', resource_id: 4, predefined: true }, { id: 9, name: i18n.__('Journal'), roles_logic_expression: '1', resource_model: 'ManualJournal', predefined: true },
// { id: 10, name: 'Credit', roles_logic_expression: '1', resource_id: 4, predefined: true }, { id: 10, name: i18n.__('Credit'), roles_logic_expression: '1', resource_model: 'ManualJournal', predefined: true },
// { id: 11, name: 'Reconciliation', roles_logic_expression: '1', resource_id: 4, predefined: true }, { id: 11, name: i18n.__('Reconciliation'), roles_logic_expression: '1', resource_model: 'ManualJournal', predefined: true },
// // Expenses // Expenses
// { id: 12, name: 'Interest', roles_logic_expression: '1', resource_id: 3, predefined: false, }, { id: 12, name: i18n.__('Interest'), roles_logic_expression: '1', resource_model: 'Expense', predefined: false, },
// { id: 13, name: 'Depreciation', roles_logic_expression: '1', resource_id: 3, predefined: false, }, { id: 13, name: i18n.__('Depreciation'), roles_logic_expression: '1', resource_model: 'Expense', predefined: false, },
// { id: 14, name: 'Payroll', roles_logic_expression: '1', resource_id: '3', 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 }, { id: 12, field_key: 'active', index: 1, comparator: 'is', value: 1, view_id: 15 },
// Items. // Items.
// { id: 6, field_id: 12, index: 1, comparator: 'equals', value: 'service', view_id: 6 }, { 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: 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: 8, field_id: 12, index: 1, comparator: 'equals', value: 'non-inventory', view_id: 8 },
// // Manual Journals. // Manual Journals.
// { id: 9, field_id: 26, index: 1, comparator: 'equals', value: 'Journal', view_id: 9 }, { 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: 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 }, { id: 11, field_id: 26, index: 1, comparator: 'equals', value: 'Reconciliation', view_id: 11 },
// Expenses
// { id: 12, field_id: index: }
]); ]);
}); });
}; };

View File

@@ -37,5 +37,11 @@
"Balance": "Balance", "Balance": "Balance",
"Active": "Active", "Active": "Active",
"Created at": "Created at", "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() { static get resourceable() {
return true; return true;

View File

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

View File

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

View File

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

View File

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

View File

@@ -15,15 +15,6 @@ export default class AccountsTypesService implements IAccountsTypesService{
*/ */
async getAccountsTypes(tenantId: number): Promise<IAccountType> { async getAccountsTypes(tenantId: number): Promise<IAccountType> {
const { accountTypeRepository } = this.tenancy.repositories(tenantId); const { accountTypeRepository } = this.tenancy.repositories(tenantId);
const { AccountType } = this.tenancy.models(tenantId); return accountTypeRepository.all();
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']),
}));
} }
} }

View File

@@ -11,6 +11,7 @@ import {
IItemCategoriesService, IItemCategoriesService,
IItemCategoriesFilter, IItemCategoriesFilter,
ISystemUser, ISystemUser,
IFilterMeta,
} from "interfaces"; } from "interfaces";
import DynamicListingService from 'services/DynamicListing/DynamicListService'; import DynamicListingService from 'services/DynamicListing/DynamicListService';
import TenancyService from 'services/Tenancy/TenancyService'; import TenancyService from 'services/Tenancy/TenancyService';
@@ -245,7 +246,11 @@ export default class ItemCategoriesService implements IItemCategoriesService {
* @param {number} tenantId * @param {number} tenantId
* @param filter * @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 { ItemCategory } = this.tenancy.models(tenantId);
const dynamicList = await this.dynamicListService.dynamicList(tenantId, ItemCategory, filter); 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. * - Store view roles/conditions to the storage.
* --------- * ---------
* @param {number} tenantId - Tenant id. * @param {number} tenantId - Tenant id.
* @param {IViewDTO} viewDTO - View DTO. * @param {IViewDTO} viewDTO - New view DTO.
* *
* @return {Promise<IView>} * @return {Promise<IView>}
*/ */
@@ -195,7 +195,7 @@ export default class ViewsService implements IViewsService {
predefined: false, predefined: false,
name: viewDTO.name, name: viewDTO.name,
rolesLogicExpression: viewDTO.logicExpression, rolesLogicExpression: viewDTO.logicExpression,
resourceModel: viewDTO.resourceModel, resourceModel: ResourceModel.name,
roles: viewDTO.roles, roles: viewDTO.roles,
columns: viewDTO.columns, columns: viewDTO.columns,
}); });
@@ -215,22 +215,23 @@ export default class ViewsService implements IViewsService {
* - Delete old view columns and roles. * - Delete old view columns and roles.
* - Re-save view columns and roles. * - Re-save view columns and roles.
* *
* @param {number} tenantId * @param {number} tenantId -
* @param {number} viewId * @param {number} viewId -
* @param {IViewEditDTO} * @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); const { viewRepository } = this.tenancy.repositories(tenantId);
this.logger.info('[view] trying to edit custom view.', { tenantId, viewId }); this.logger.info('[view] trying to edit custom view.', { tenantId, viewId });
// Retrieve view details or throw not found error. // 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. // 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. // 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. // Validate the given fields keys exist on the storage.
this.validateResourceRolesFieldsExistance(ResourceModel, viewEditDTO.roles); this.validateResourceRolesFieldsExistance(ResourceModel, viewEditDTO.roles);
@@ -243,7 +244,8 @@ export default class ViewsService implements IViewsService {
throw new ServiceError(ERRORS.LOGIC_EXPRESSION_INVALID); throw new ServiceError(ERRORS.LOGIC_EXPRESSION_INVALID);
} }
// Update view details. // 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, predefined: false,
name: viewEditDTO.name, name: viewEditDTO.name,
rolesLogicExpression: viewEditDTO.logicExpression, rolesLogicExpression: viewEditDTO.logicExpression,
@@ -251,6 +253,8 @@ export default class ViewsService implements IViewsService {
columns: viewEditDTO.columns, columns: viewEditDTO.columns,
}) })
this.logger.info('[view] edited successfully.', { tenantId, viewId }); this.logger.info('[view] edited successfully.', { tenantId, viewId });
return view;
} }
/** /**