feat(FinancialReports): compute journal cost is running state.

This commit is contained in:
a.bouhuolia
2021-03-13 19:49:15 +02:00
parent 828f4bb32e
commit 88eaaa3968
27 changed files with 411 additions and 106 deletions

View File

@@ -1,6 +1,6 @@
import moment from 'moment';
import { Inject, Service } from 'typedi';
import { IAPAgingSummaryQuery } from 'interfaces';
import { IAPAgingSummaryQuery, IARAgingSummaryMeta } from 'interfaces';
import TenancyService from 'services/Tenancy/TenancyService';
import APAgingSummarySheet from './APAgingSummarySheet';
@@ -25,13 +25,36 @@ export default class PayableAgingSummaryService {
divideOn1000: false,
showZero: false,
formatMoney: 'total',
negativeFormat: 'mines'
negativeFormat: 'mines',
},
vendorsIds: [],
noneZero: false,
};
}
/**
* Retrieve the balance sheet meta.
* @param {number} tenantId -
* @returns {IBalanceSheetMeta}
*/
reportMetadata(tenantId: number): IARAgingSummaryMeta {
const settings = this.tenancy.settings(tenantId);
const organizationName = settings.get({
group: 'organization',
key: 'name',
});
const baseCurrency = settings.get({
group: 'organization',
key: 'base_currency',
});
return {
organizationName,
baseCurrency,
};
}
/**
* Retrieve A/P aging summary report.
* @param {number} tenantId -
@@ -81,6 +104,11 @@ export default class PayableAgingSummaryService {
const data = APAgingSummaryReport.reportData();
const columns = APAgingSummaryReport.reportColumns();
return { data, columns, query: filter };
return {
data,
columns,
query: filter,
meta: this.reportMetadata(tenantId),
};
}
}

View File

@@ -1,6 +1,6 @@
import moment from 'moment';
import { Inject, Service } from 'typedi';
import { IARAgingSummaryQuery } from 'interfaces';
import { IARAgingSummaryQuery, IARAgingSummaryMeta } from 'interfaces';
import TenancyService from 'services/Tenancy/TenancyService';
import ARAgingSummarySheet from './ARAgingSummarySheet';
@@ -32,6 +32,29 @@ export default class ARAgingSummaryService {
};
}
/**
* Retrieve the balance sheet meta.
* @param {number} tenantId -
* @returns {IBalanceSheetMeta}
*/
reportMetadata(tenantId: number): IARAgingSummaryMeta {
const settings = this.tenancy.settings(tenantId);
const organizationName = settings.get({
group: 'organization',
key: 'name',
});
const baseCurrency = settings.get({
group: 'organization',
key: 'base_currency',
});
return {
organizationName,
baseCurrency,
};
}
/**
* Retrieve A/R aging summary report.
* @param {number} tenantId - Tenant id.
@@ -85,6 +108,11 @@ export default class ARAgingSummaryService {
const data = ARAgingSummaryReport.reportData();
const columns = ARAgingSummaryReport.reportColumns();
return { data, columns, query: filter };
return {
data,
columns,
query: filter,
meta: this.reportMetadata(tenantId),
};
}
}

View File

@@ -4,10 +4,13 @@ import {
IBalanceSheetStatementService,
IBalanceSheetQuery,
IBalanceSheetStatement,
IBalanceSheetMeta,
} from 'interfaces';
import TenancyService from 'services/Tenancy/TenancyService';
import Journal from 'services/Accounting/JournalPoster';
import BalanceSheetStatement from './BalanceSheet';
import InventoryService from 'services/Inventory/Inventory';
import { parseBoolean } from 'utils';
@Service()
export default class BalanceSheetStatementService
@@ -18,6 +21,9 @@ export default class BalanceSheetStatementService
@Inject('logger')
logger: any;
@Inject()
inventoryService: InventoryService;
/**
* Defaults balance sheet filter query.
* @return {IBalanceSheetQuery}
@@ -33,7 +39,7 @@ export default class BalanceSheetStatementService
divideOn1000: false,
showZero: false,
formatMoney: 'total',
negativeFormat: 'mines'
negativeFormat: 'mines',
},
noneZero: false,
noneTransactions: false,
@@ -42,6 +48,33 @@ export default class BalanceSheetStatementService
};
}
/**
* Retrieve the balance sheet meta.
* @param {number} tenantId -
* @returns {IBalanceSheetMeta}
*/
reportMetadata(tenantId: number): IBalanceSheetMeta {
const settings = this.tenancy.settings(tenantId);
const isCostComputeRunning = this.inventoryService
.isItemsCostComputeRunning(tenantId);
const organizationName = settings.get({
group: 'organization',
key: 'name',
});
const baseCurrency = settings.get({
group: 'organization',
key: 'base_currency',
});
return {
isCostComputeRunning: parseBoolean(isCostComputeRunning, false),
organizationName,
baseCurrency
};
}
/**
* Retrieve balance sheet statement.
* -------------
@@ -61,14 +94,19 @@ export default class BalanceSheetStatementService
// Settings tenant service.
const settings = this.tenancy.settings(tenantId);
const baseCurrency = settings.get({ group: 'organization', key: 'base_currency' });
const baseCurrency = settings.get({
group: 'organization',
key: 'base_currency',
});
const filter = {
...this.defaultQuery,
...query,
};
this.logger.info('[balance_sheet] trying to calculate the report.', { filter, tenantId });
this.logger.info('[balance_sheet] trying to calculate the report.', {
filter,
tenantId,
});
// Retrieve all accounts on the storage.
const accounts = await accountRepository.all();
const accountsGraph = await accountRepository.getDependencyGraph();
@@ -82,7 +120,7 @@ export default class BalanceSheetStatementService
const transactionsJournal = Journal.fromTransactions(
transactions,
tenantId,
accountsGraph,
accountsGraph
);
// Balance sheet report instance.
const balanceSheetInstanace = new BalanceSheetStatement(
@@ -102,6 +140,7 @@ export default class BalanceSheetStatementService
data: balanceSheetData,
columns: balanceSheetColumns,
query: filter,
meta: this.reportMetadata(tenantId),
};
}
}

View File

@@ -2,12 +2,12 @@ import { Service, Inject } from 'typedi';
import moment from 'moment';
import { ServiceError } from 'exceptions';
import { difference } from 'lodash';
import { IGeneralLedgerSheetQuery } from 'interfaces';
import { IGeneralLedgerSheetQuery, IGeneralLedgerMeta } from 'interfaces';
import TenancyService from 'services/Tenancy/TenancyService';
import Journal from 'services/Accounting/JournalPoster';
import GeneralLedgerSheet from 'services/FinancialStatements/GeneralLedger/GeneralLedger';
import { transformToMap } from 'utils';
import InventoryService from 'services/Inventory/Inventory';
import { transformToMap, parseBoolean } from 'utils';
const ERRORS = {
ACCOUNTS_NOT_FOUND: 'ACCOUNTS_NOT_FOUND',
@@ -18,6 +18,9 @@ export default class GeneralLedgerService {
@Inject()
tenancy: TenancyService;
@Inject()
inventoryService: InventoryService;
@Inject('logger')
logger: any;
@@ -55,6 +58,33 @@ export default class GeneralLedgerService {
}
}
/**
* Retrieve the balance sheet meta.
* @param {number} tenantId -
* @returns {IGeneralLedgerMeta}
*/
reportMetadata(tenantId: number): IGeneralLedgerMeta {
const settings = this.tenancy.settings(tenantId);
const isCostComputeRunning = this.inventoryService
.isItemsCostComputeRunning(tenantId);
const organizationName = settings.get({
group: 'organization',
key: 'name',
});
const baseCurrency = settings.get({
group: 'organization',
key: 'base_currency',
});
return {
isCostComputeRunning: parseBoolean(isCostComputeRunning, false),
organizationName,
baseCurrency
};
}
/**
* Retrieve general ledger report statement.
* ----------
@@ -68,6 +98,7 @@ export default class GeneralLedgerService {
): Promise<{
data: any;
query: IGeneralLedgerSheetQuery;
meta: IGeneralLedgerMeta
}> {
const {
accountRepository,
@@ -146,6 +177,7 @@ export default class GeneralLedgerService {
return {
data: reportData,
query: filter,
meta: this.reportMetadata(tenantId),
};
}
}

View File

@@ -1,18 +1,21 @@
import { Service, Inject } from 'typedi';
import { IJournalReportQuery } from 'interfaces';
import moment from 'moment';
import { IJournalReportQuery, IJournalSheetMeta } from 'interfaces';
import JournalSheet from './JournalSheet';
import TenancyService from 'services/Tenancy/TenancyService';
import Journal from 'services/Accounting/JournalPoster';
import { transformToMap } from 'utils';
import InventoryService from 'services/Inventory/Inventory';
import { parseBoolean, transformToMap } from 'utils';
@Service()
export default class JournalSheetService {
@Inject()
tenancy: TenancyService;
@Inject()
inventoryService: InventoryService;
@Inject('logger')
logger: any;
@@ -34,6 +37,33 @@ export default class JournalSheetService {
};
}
/**
* Retrieve the balance sheet meta.
* @param {number} tenantId -
* @returns {IBalanceSheetMeta}
*/
reportMetadata(tenantId: number): IJournalSheetMeta {
const settings = this.tenancy.settings(tenantId);
const isCostComputeRunning = this.inventoryService
.isItemsCostComputeRunning(tenantId);
const organizationName = settings.get({
group: 'organization',
key: 'name',
});
const baseCurrency = settings.get({
group: 'organization',
key: 'base_currency',
});
return {
isCostComputeRunning: parseBoolean(isCostComputeRunning, false),
organizationName,
baseCurrency
};
}
/**
* Journal sheet.
* @param {number} tenantId
@@ -96,6 +126,7 @@ export default class JournalSheetService {
return {
data: journalSheetData,
query: filter,
meta: this.reportMetadata(tenantId),
};
}
}

View File

@@ -1,10 +1,12 @@
import { Service, Inject } from 'typedi';
import moment from 'moment';
import Journal from 'services/Accounting/JournalPoster';
import { IProfitLossSheetQuery } from 'interfaces';
import { IProfitLossSheetQuery, IProfitLossSheetMeta } from 'interfaces';
import ProfitLossSheet from './ProfitLossSheet';
import TenancyService from 'services/Tenancy/TenancyService';
import AccountsService from 'services/Accounts/AccountsService';
import InventoryService from 'services/Inventory/Inventory';
import { parseBoolean } from 'utils';
// Profit/Loss sheet service.
@Service()
@@ -15,6 +17,9 @@ export default class ProfitLossSheetService {
@Inject('logger')
logger: any;
@Inject()
inventoryService: InventoryService;
@Inject()
accountsService: AccountsService;
@@ -42,6 +47,34 @@ export default class ProfitLossSheetService {
};
}
/**
* Retrieve the trial balance sheet meta.
* @param {number} tenantId - Tenant id.
* @returns {ITrialBalanceSheetMeta}
*/
reportMetadata(tenantId: number): IProfitLossSheetMeta {
const settings = this.tenancy.settings(tenantId);
const isCostComputeRunning = this.inventoryService.isItemsCostComputeRunning(
tenantId
);
const organizationName = settings.get({
group: 'organization',
key: 'name',
});
const baseCurrency = settings.get({
group: 'organization',
key: 'base_currency',
});
return {
isCostComputeRunning: parseBoolean(isCostComputeRunning, false),
organizationName,
baseCurrency,
};
}
/**
* Retrieve profit/loss sheet statement.
* @param {number} tenantId
@@ -107,6 +140,7 @@ export default class ProfitLossSheetService {
data: profitLossData,
columns: profitLossColumns,
query: filter,
meta: this.reportMetadata(tenantId),
};
}
}

View File

@@ -2,15 +2,20 @@ import { Service, Inject } from 'typedi';
import moment from 'moment';
import TenancyService from 'services/Tenancy/TenancyService';
import Journal from 'services/Accounting/JournalPoster';
import { INumberFormatQuery, ITrialBalanceSheetQuery, ITrialBalanceStatement } from 'interfaces';
import { ITrialBalanceSheetMeta, ITrialBalanceSheetQuery, ITrialBalanceStatement } from 'interfaces';
import TrialBalanceSheet from './TrialBalanceSheet';
import FinancialSheet from '../FinancialSheet';
import InventoryService from 'services/Inventory/Inventory';
import { parseBoolean } from 'utils';
@Service()
export default class TrialBalanceSheetService extends FinancialSheet {
@Inject()
tenancy: TenancyService;
@Inject()
inventoryService: InventoryService;
@Inject('logger')
logger: any;
@@ -36,6 +41,33 @@ export default class TrialBalanceSheetService extends FinancialSheet {
};
}
/**
* Retrieve the trial balance sheet meta.
* @param {number} tenantId - Tenant id.
* @returns {ITrialBalanceSheetMeta}
*/
reportMetadata(tenantId: number): ITrialBalanceSheetMeta {
const settings = this.tenancy.settings(tenantId);
const isCostComputeRunning = this.inventoryService.isItemsCostComputeRunning(
tenantId
);
const organizationName = settings.get({
group: 'organization',
key: 'name',
});
const baseCurrency = settings.get({
group: 'organization',
key: 'base_currency',
});
return {
isCostComputeRunning: parseBoolean(isCostComputeRunning, false),
organizationName,
baseCurrency,
};
}
/**
* Retrieve trial balance sheet statement.
* -------------
@@ -46,7 +78,7 @@ export default class TrialBalanceSheetService extends FinancialSheet {
*/
public async trialBalanceSheet(
tenantId: number,
query: ITrialBalanceSheetQuery,
query: ITrialBalanceSheetQuery
): Promise<ITrialBalanceStatement> {
const filter = {
...this.defaultQuery,
@@ -98,6 +130,7 @@ export default class TrialBalanceSheetService extends FinancialSheet {
return {
data: trialBalanceSheetData,
query: filter,
meta: this.reportMetadata(tenantId),
};
}
}

View File

@@ -17,6 +17,7 @@ import InventoryCostLotTracker from 'services/Inventory/InventoryCostLotTracker'
import TenancyService from 'services/Tenancy/TenancyService';
import events from 'subscribers/events';
import ItemsEntriesService from 'services/Items/ItemsEntriesService';
import SettingsMiddleware from 'api/middleware/SettingsMiddleware';
type TCostMethod = 'FIFO' | 'LIFO' | 'AVG';
@@ -346,4 +347,37 @@ export default class InventoryService {
return lotNumber;
}
/**
* Mark item cost computing is running.
* @param {number} tenantId -
* @param {boolean} isRunning -
*/
async markItemsCostComputeRunning(
tenantId: number,
isRunning: boolean = true
) {
const settings = this.tenancy.settings(tenantId);
settings.set({
key: 'cost_compute_running',
group: 'inventory',
value: isRunning,
});
await settings.save();
}
/**
*
* @param {number} tenantId
* @returns
*/
isItemsCostComputeRunning(tenantId) {
const settings = this.tenancy.settings(tenantId);
return settings.get({
key: 'cost_compute_running',
group: 'inventory'
});
}
}