mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-23 16:19:49 +00:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
64a10053e3 | ||
|
|
ce9f2a238f | ||
|
|
80e545072d | ||
|
|
de3d4698ea |
@@ -9,5 +9,10 @@
|
||||
"net_cash_financing": "Net cash provided by financing activities",
|
||||
"cash_beginning_period": "Cash at beginning of period",
|
||||
"net_cash_increase": "NET CASH INCREASE FOR PERIOD",
|
||||
"cash_end_period": "CASH AT END OF PERIOD"
|
||||
"cash_end_period": "CASH AT END OF PERIOD",
|
||||
"account_name": "Account name",
|
||||
"total": "Total",
|
||||
"sheet_name": "Statement of Cash Flow",
|
||||
"from_date": "From",
|
||||
"to_date": "To"
|
||||
}
|
||||
|
||||
5
packages/server/src/i18n/en/contact_summary_balance.json
Normal file
5
packages/server/src/i18n/en/contact_summary_balance.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"account_name": "Account name",
|
||||
"total": "Total",
|
||||
"percentage_column": "% of Column"
|
||||
}
|
||||
14
packages/server/src/i18n/en/inventory_item_details.json
Normal file
14
packages/server/src/i18n/en/inventory_item_details.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"opening_balance": "Opening balance",
|
||||
"closing_balance": "Closing balance",
|
||||
"date": "Date",
|
||||
"transaction_type": "Transaction type",
|
||||
"transaction_number": "Transaction #",
|
||||
"quantity": "Quantity",
|
||||
"rate": "Rate",
|
||||
"total": "Total",
|
||||
"value": "Value",
|
||||
"profit_margin": "Profit Margin",
|
||||
"running_quantity": "Running quantity",
|
||||
"running_value": "Running Value"
|
||||
}
|
||||
4
packages/server/src/i18n/en/transactions_by_contact.json
Normal file
4
packages/server/src/i18n/en/transactions_by_contact.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"opening_balance": "Opening balance",
|
||||
"closing_balance": "Closing balance"
|
||||
}
|
||||
6
packages/server/src/i18n/en/trial_balance_sheet.json
Normal file
6
packages/server/src/i18n/en/trial_balance_sheet.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"account": "Account",
|
||||
"debit": "Debit",
|
||||
"credit": "Credit",
|
||||
"total": "Total"
|
||||
}
|
||||
@@ -65,7 +65,7 @@ export class AuthController {
|
||||
return this.authApp.signUp(signupDto);
|
||||
}
|
||||
|
||||
@Post('/signup/confirm')
|
||||
@Post('/signup/verify')
|
||||
@ApiOperation({ summary: 'Confirm user signup' })
|
||||
@ApiBody({
|
||||
schema: {
|
||||
|
||||
@@ -7,17 +7,13 @@ import {
|
||||
import { GetAuthenticatedAccount } from './queries/GetAuthedAccount.service';
|
||||
import { Controller, Get, Post } from '@nestjs/common';
|
||||
import { Throttle } from '@nestjs/throttler';
|
||||
import { IgnoreTenantSeededRoute } from '../Tenancy/EnsureTenantIsSeeded.guards';
|
||||
import { IgnoreTenantInitializedRoute } from '../Tenancy/EnsureTenantIsInitialized.guard';
|
||||
import { TenantAgnosticRoute } from '../Tenancy/TenancyGlobal.guard';
|
||||
import { AuthenticationApplication } from './AuthApplication.sevice';
|
||||
import { TenancyContext } from '../Tenancy/TenancyContext.service';
|
||||
import { IgnoreUserVerifiedRoute } from './guards/EnsureUserVerified.guard';
|
||||
|
||||
@Controller('/auth')
|
||||
@ApiTags('Auth')
|
||||
@ApiExcludeController()
|
||||
@IgnoreTenantSeededRoute()
|
||||
@IgnoreTenantInitializedRoute()
|
||||
@TenantAgnosticRoute()
|
||||
@IgnoreUserVerifiedRoute()
|
||||
@Throttle({ auth: {} })
|
||||
export class AuthedController {
|
||||
|
||||
@@ -13,7 +13,6 @@ import {
|
||||
IAuthSignedUpEventPayload,
|
||||
IAuthSigningUpEventPayload,
|
||||
} from '../Auth.interfaces';
|
||||
import { defaultTo } from 'ramda';
|
||||
import { ERRORS } from '../Auth.constants';
|
||||
import { hashPassword } from '../Auth.utils';
|
||||
import { ClsService } from 'nestjs-cls';
|
||||
@@ -51,10 +50,10 @@ export class AuthSignupService {
|
||||
const signupConfirmation = this.configService.get('signupConfirmation');
|
||||
|
||||
const verifyTokenCrypto = crypto.randomBytes(64).toString('hex');
|
||||
const verifiedEnabed = defaultTo(signupConfirmation.enabled, false);
|
||||
const verifiedEnabed = signupConfirmation.enabled ?? false;
|
||||
const verifyToken = verifiedEnabed ? verifyTokenCrypto : '';
|
||||
const verified = !verifiedEnabed;
|
||||
|
||||
|
||||
const inviteAcceptedAt = moment().format('YYYY-MM-DD');
|
||||
|
||||
// Triggers signin up event.
|
||||
|
||||
@@ -4,7 +4,6 @@ import { SystemUser } from '@/modules/System/models/SystemUser';
|
||||
import { ServiceError } from '@/modules/Items/ServiceError';
|
||||
import { ERRORS } from '../Auth.constants';
|
||||
import { events } from '@/common/events/events';
|
||||
import { ModelObject } from 'objection';
|
||||
import { ISignUpConfigmResendedEventPayload } from '../Auth.interfaces';
|
||||
import { TenancyContext } from '@/modules/Tenancy/TenancyContext.service';
|
||||
|
||||
|
||||
@@ -239,7 +239,7 @@ export class CashFlowTable {
|
||||
section: ICashFlowStatementSection,
|
||||
): ICashFlowStatementSection => {
|
||||
const label = section.footerLabel
|
||||
? section.footerLabel
|
||||
? this.i18n.t(section.footerLabel)
|
||||
: this.i18n.t('financial_sheet.total_row', {
|
||||
args: { value: section.label },
|
||||
});
|
||||
@@ -302,7 +302,7 @@ export class CashFlowTable {
|
||||
* @returns {ITableColumn}
|
||||
*/
|
||||
private totalColumns = (): ITableColumn[] => {
|
||||
return [{ key: 'total', label: this.i18n.t('Total') }];
|
||||
return [{ key: 'total', label: this.i18n.t('cash_flow_statement.total') }];
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -366,7 +366,7 @@ export class CashFlowTable {
|
||||
*/
|
||||
public tableColumns = (): ITableColumn[] => {
|
||||
return R.compose(
|
||||
R.concat([{ key: 'name', label: this.i18n.t('Account name') }]),
|
||||
R.concat([{ key: 'name', label: this.i18n.t('cash_flow_statement.account_name') }]),
|
||||
R.when(
|
||||
R.always(this.isDisplayColumnsBy(DISPLAY_COLUMNS_BY.DATE_PERIODS)),
|
||||
R.concat(this.datePeriodsColumns()),
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import * as moment from 'moment';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { I18nService } from 'nestjs-i18n';
|
||||
import { FinancialSheetMeta } from '../../common/FinancialSheetMeta';
|
||||
import {
|
||||
ICashFlowStatementMeta,
|
||||
@@ -8,7 +9,10 @@ import {
|
||||
|
||||
@Injectable()
|
||||
export class CashflowSheetMeta {
|
||||
constructor(private readonly financialSheetMeta: FinancialSheetMeta) {}
|
||||
constructor(
|
||||
private readonly financialSheetMeta: FinancialSheetMeta,
|
||||
private readonly i18n: I18nService,
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Cashflow sheet meta.
|
||||
@@ -21,9 +25,11 @@ export class CashflowSheetMeta {
|
||||
const meta = await this.financialSheetMeta.meta();
|
||||
const formattedToDate = moment(query.toDate).format('YYYY/MM/DD');
|
||||
const formattedFromDate = moment(query.fromDate).format('YYYY/MM/DD');
|
||||
const formattedDateRange = `From ${formattedFromDate} | To ${formattedToDate}`;
|
||||
const fromLabel = this.i18n.t('cash_flow_statement.from_date');
|
||||
const toLabel = this.i18n.t('cash_flow_statement.to_date');
|
||||
const formattedDateRange = `${fromLabel} ${formattedFromDate} | ${toLabel} ${formattedToDate}`;
|
||||
|
||||
const sheetName = 'Statement of Cash Flow';
|
||||
const sheetName = this.i18n.t('cash_flow_statement.sheet_name');
|
||||
|
||||
return {
|
||||
...meta,
|
||||
|
||||
@@ -91,7 +91,7 @@ export class CustomerBalanceSummaryTable {
|
||||
*/
|
||||
private getTotalColumnsAccessor = (): IColumnMapperMeta[] => {
|
||||
const columns = [
|
||||
{ key: 'name', value: this.i18n.t('Total') },
|
||||
{ key: 'name', value: this.i18n.t('contact_summary_balance.total') },
|
||||
{ key: 'total', accessor: 'total.formattedAmount' },
|
||||
];
|
||||
// @ts-ignore
|
||||
|
||||
@@ -93,7 +93,7 @@ export class InventoryItemDetailsTable {
|
||||
): ITableRow => {
|
||||
const columns: Array<IColumnMapperMeta> = [
|
||||
{ key: 'date', accessor: 'date.formattedDate' },
|
||||
{ key: 'closing', value: this.i18n.t('Opening balance') },
|
||||
{ key: 'closing', value: this.i18n.t('inventory_item_details.opening_balance') },
|
||||
{ key: 'empty', value: '' },
|
||||
{ key: 'quantity', accessor: 'quantity.formattedNumber' },
|
||||
{ key: 'empty', value: '' },
|
||||
@@ -115,7 +115,7 @@ export class InventoryItemDetailsTable {
|
||||
): ITableRow => {
|
||||
const columns: Array<IColumnMapperMeta> = [
|
||||
{ key: 'date', accessor: 'date.formattedDate' },
|
||||
{ key: 'closing', value: this.i18n.t('Closing balance') },
|
||||
{ key: 'closing', value: this.i18n.t('inventory_item_details.closing_balance') },
|
||||
{ key: 'empty', value: '' },
|
||||
{ key: 'quantity', accessor: 'quantity.formattedNumber' },
|
||||
{ key: 'empty', value: '' },
|
||||
@@ -193,16 +193,16 @@ export class InventoryItemDetailsTable {
|
||||
*/
|
||||
public tableColumns = (): ITableColumn[] => {
|
||||
return [
|
||||
{ key: 'date', label: this.i18n.t('Date') },
|
||||
{ key: 'transaction_type', label: this.i18n.t('Transaction type') },
|
||||
{ key: 'transaction_id', label: this.i18n.t('Transaction #') },
|
||||
{ key: 'quantity', label: this.i18n.t('Quantity') },
|
||||
{ key: 'rate', label: this.i18n.t('Rate') },
|
||||
{ key: 'total', label: this.i18n.t('Total') },
|
||||
{ key: 'value', label: this.i18n.t('Value') },
|
||||
{ key: 'profit_margin', label: this.i18n.t('Profit Margin') },
|
||||
{ key: 'running_quantity', label: this.i18n.t('Running quantity') },
|
||||
{ key: 'running_value', label: this.i18n.t('Running Value') },
|
||||
{ key: 'date', label: this.i18n.t('inventory_item_details.date') },
|
||||
{ key: 'transaction_type', label: this.i18n.t('inventory_item_details.transaction_type') },
|
||||
{ key: 'transaction_id', label: this.i18n.t('inventory_item_details.transaction_number') },
|
||||
{ key: 'quantity', label: this.i18n.t('inventory_item_details.quantity') },
|
||||
{ key: 'rate', label: this.i18n.t('inventory_item_details.rate') },
|
||||
{ key: 'total', label: this.i18n.t('inventory_item_details.total') },
|
||||
{ key: 'value', label: this.i18n.t('inventory_item_details.value') },
|
||||
{ key: 'profit_margin', label: this.i18n.t('inventory_item_details.profit_margin') },
|
||||
{ key: 'running_quantity', label: this.i18n.t('inventory_item_details.running_quantity') },
|
||||
{ key: 'running_value', label: this.i18n.t('inventory_item_details.running_value') },
|
||||
];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ export class TransactionsByContactsTableRows {
|
||||
const columns = [
|
||||
{
|
||||
key: 'openingBalanceLabel',
|
||||
value: this.i18n.t('Opening balance') as string,
|
||||
value: this.i18n.t('transactions_by_contact.opening_balance') as string,
|
||||
},
|
||||
...R.repeat({ key: 'empty', value: '' }, 5),
|
||||
{
|
||||
@@ -76,7 +76,7 @@ export class TransactionsByContactsTableRows {
|
||||
const columns = [
|
||||
{
|
||||
key: 'closingBalanceLabel',
|
||||
value: this.i18n.t('Closing balance') as string,
|
||||
value: this.i18n.t('transactions_by_contact.closing_balance') as string,
|
||||
},
|
||||
...R.repeat({ key: 'empty', value: '' }, 5),
|
||||
{
|
||||
|
||||
@@ -141,10 +141,10 @@ export class TrialBalanceSheetTable extends R.compose(
|
||||
return R.compose(
|
||||
this.tableColumnsCellIndexing,
|
||||
R.concat([
|
||||
{ key: 'account', label: 'Account' },
|
||||
{ key: 'debit', label: 'Debit' },
|
||||
{ key: 'credit', label: 'Credit' },
|
||||
{ key: 'total', label: 'Total' },
|
||||
{ key: 'account', label: this.i18n.t('trial_balance_sheet.account') },
|
||||
{ key: 'debit', label: this.i18n.t('trial_balance_sheet.debit') },
|
||||
{ key: 'credit', label: this.i18n.t('trial_balance_sheet.credit') },
|
||||
{ key: 'total', label: this.i18n.t('trial_balance_sheet.total') },
|
||||
]),
|
||||
)([]);
|
||||
};
|
||||
|
||||
@@ -91,7 +91,7 @@ export class VendorBalanceSummaryTable {
|
||||
*/
|
||||
private getTotalColumnsAccessor = (): IColumnMapperMeta[] => {
|
||||
const columns = [
|
||||
{ key: 'name', value: this.i18n.t('Total') },
|
||||
{ key: 'name', value: this.i18n.t('contact_summary_balance.total') },
|
||||
{ key: 'total', accessor: 'total.formattedAmount' },
|
||||
];
|
||||
return R.compose(
|
||||
|
||||
@@ -28,6 +28,7 @@ import { UpdateOrganizationService } from './commands/UpdateOrganization.service
|
||||
import { IgnoreTenantInitializedRoute } from '../Tenancy/EnsureTenantIsInitialized.guard';
|
||||
import { IgnoreTenantSeededRoute } from '../Tenancy/EnsureTenantIsSeeded.guards';
|
||||
import { IgnoreTenantModelsInitialize } from '../Tenancy/TenancyInitializeModels.guard';
|
||||
import { IgnoreUserVerifiedRoute } from '../Auth/guards/EnsureUserVerified.guard';
|
||||
import { GetBuildOrganizationBuildJob } from './commands/GetBuildOrganizationJob.service';
|
||||
import { OrganizationBaseCurrencyLocking } from './Organization/OrganizationBaseCurrencyLocking.service';
|
||||
import {
|
||||
@@ -93,6 +94,7 @@ export class OrganizationController {
|
||||
|
||||
@Get('current')
|
||||
@HttpCode(200)
|
||||
@IgnoreUserVerifiedRoute()
|
||||
@ApiOperation({ summary: 'Get current organization' })
|
||||
@ApiResponse({
|
||||
status: 200,
|
||||
|
||||
@@ -8,6 +8,7 @@ import {
|
||||
import { TenancyContext } from './TenancyContext.service';
|
||||
import { Reflector } from '@nestjs/core';
|
||||
import { IS_PUBLIC_ROUTE } from '../Auth/Auth.constants';
|
||||
import { IS_TENANT_AGNOSTIC } from './TenancyGlobal.guard';
|
||||
|
||||
export const IS_IGNORE_TENANT_INITIALIZED = 'IS_IGNORE_TENANT_INITIALIZED';
|
||||
export const IgnoreTenantInitializedRoute = () =>
|
||||
@@ -35,8 +36,12 @@ export class EnsureTenantIsInitializedGuard implements CanActivate {
|
||||
IS_PUBLIC_ROUTE,
|
||||
[context.getHandler(), context.getClass()],
|
||||
);
|
||||
const isTenantAgnostic = this.reflector.getAllAndOverride<boolean>(
|
||||
IS_TENANT_AGNOSTIC,
|
||||
[context.getHandler(), context.getClass()],
|
||||
);
|
||||
// Skip the guard early if the route marked as public or ignored.
|
||||
if (isPublic || isIgnoreEnsureTenantInitialized) {
|
||||
if (isPublic || isIgnoreEnsureTenantInitialized || isTenantAgnostic) {
|
||||
return true;
|
||||
}
|
||||
const tenant = await this.tenancyContext.getTenant();
|
||||
|
||||
@@ -9,6 +9,7 @@ import {
|
||||
import { TenancyContext } from './TenancyContext.service';
|
||||
import { Reflector } from '@nestjs/core';
|
||||
import { IS_PUBLIC_ROUTE } from '../Auth/Auth.constants';
|
||||
import { IS_TENANT_AGNOSTIC } from './TenancyGlobal.guard';
|
||||
|
||||
export const IS_IGNORE_TENANT_SEEDED = 'IS_IGNORE_TENANT_SEEDED';
|
||||
export const IgnoreTenantSeededRoute = () =>
|
||||
@@ -36,7 +37,12 @@ export class EnsureTenantIsSeededGuard implements CanActivate {
|
||||
context.getHandler(),
|
||||
context.getClass(),
|
||||
]);
|
||||
if (isPublic || isIgnoreEnsureTenantSeeded) {
|
||||
const isTenantAgnostic = this.reflector.getAllAndOverride<boolean>(
|
||||
IS_TENANT_AGNOSTIC,
|
||||
[context.getHandler(), context.getClass()],
|
||||
);
|
||||
// Skip the guard early if the route marked as public, tenant agnostic or ignored.
|
||||
if (isPublic || isIgnoreEnsureTenantSeeded || isTenantAgnostic) {
|
||||
return true;
|
||||
}
|
||||
const tenant = await this.tenancyContext.getTenant();
|
||||
|
||||
@@ -128,7 +128,7 @@ export const useAuthMetadata = (props = {}) => {
|
||||
* Resend the mail of signup verification.
|
||||
*/
|
||||
export const useAuthSignUpVerifyResendMail = (props) => {
|
||||
const apiRequest = useAuthApiRequest();
|
||||
const apiRequest = useApiRequest();
|
||||
|
||||
return useMutation(
|
||||
() => apiRequest.post(AuthRoute.SignupVerifyResend),
|
||||
|
||||
Reference in New Issue
Block a user