mirror of
https://github.com/frappe/books.git
synced 2024-11-10 15:50:56 +00:00
161 lines
5.0 KiB
TypeScript
161 lines
5.0 KiB
TypeScript
import { t } from 'fyo';
|
|
import { Doc } from 'fyo/model/doc';
|
|
import { FormulaMap, ListsMap, ValidationMap } from 'fyo/model/types';
|
|
import { validateEmail } from 'fyo/model/validationFunction';
|
|
import { DateTime } from 'luxon';
|
|
import { getCountryInfo, getFiscalYear } from 'utils/misc';
|
|
|
|
function getCurrencyList(): { countryCode: string; name: string }[] {
|
|
const result: { countryCode: string; name: string }[] = [];
|
|
const countryInfo = getCountryInfo();
|
|
for (const info of Object.values(countryInfo)) {
|
|
const { currency, code } = info ?? {};
|
|
if (typeof currency !== 'string' || typeof code !== 'string') {
|
|
continue;
|
|
}
|
|
|
|
result.push({ name: currency, countryCode: code });
|
|
}
|
|
return result;
|
|
}
|
|
|
|
export function getCOAList() {
|
|
return [
|
|
{ name: t`Standard Chart of Accounts`, countryCode: '' },
|
|
|
|
{ countryCode: 'ae', name: 'U.A.E - Chart of Accounts' },
|
|
{
|
|
countryCode: 'ca',
|
|
name: 'Canada - Plan comptable pour les provinces francophones',
|
|
},
|
|
{ countryCode: 'gt', name: 'Guatemala - Cuentas' },
|
|
{ countryCode: 'hu', name: 'Hungary - Chart of Accounts' },
|
|
{ countryCode: 'id', name: 'Indonesia - Chart of Accounts' },
|
|
{ countryCode: 'in', name: 'India - Chart of Accounts' },
|
|
{ countryCode: 'mx', name: 'Mexico - Plan de Cuentas' },
|
|
{ countryCode: 'ni', name: 'Nicaragua - Catalogo de Cuentas' },
|
|
{ countryCode: 'nl', name: 'Netherlands - Grootboekschema' },
|
|
{ countryCode: 'sg', name: 'Singapore - Chart of Accounts' },
|
|
{ countryCode: 'fr', name: 'France - Plan comptable' },
|
|
/*
|
|
{ countryCode: 'th', name: 'Thailand - Chart of Accounts' },
|
|
{ countryCode: 'us', name: 'United States - Chart of Accounts' },
|
|
{ countryCode: 've', name: 'Venezuela - Plan de Cuentas' },
|
|
{ countryCode: 'za', name: 'South Africa - Chart of Accounts' },
|
|
{ countryCode: 'de', name: 'Germany - Kontenplan' },
|
|
{ countryCode: 'it', name: 'Italy - Piano dei Conti' },
|
|
{ countryCode: 'es', name: 'Spain - Plan de Cuentas' },
|
|
{ countryCode: 'pt', name: 'Portugal - Plan de Contas' },
|
|
{ countryCode: 'pl', name: 'Poland - Rejestr Kont' },
|
|
{ countryCode: 'ro', name: 'Romania - Contabilitate' },
|
|
{ countryCode: 'ru', name: 'Russia - Chart of Accounts' },
|
|
{ countryCode: 'se', name: 'Sweden - Kontoplan' },
|
|
{ countryCode: 'ch', name: 'Switzerland - Kontenplan' },
|
|
{ countryCode: 'tr', name: 'Turkey - Chart of Accounts' },*/
|
|
];
|
|
}
|
|
|
|
export class SetupWizard extends Doc {
|
|
fiscalYearEnd?: Date;
|
|
fiscalYearStart?: Date;
|
|
|
|
formulas: FormulaMap = {
|
|
fiscalYearStart: {
|
|
formula: async (fieldname?: string) => {
|
|
if (
|
|
fieldname === 'fiscalYearEnd' &&
|
|
this.fiscalYearEnd &&
|
|
!this.fiscalYearStart
|
|
) {
|
|
return DateTime.fromJSDate(this.fiscalYearEnd)
|
|
.minus({ years: 1 })
|
|
.plus({ days: 1 })
|
|
.toJSDate();
|
|
}
|
|
|
|
if (!this.country) {
|
|
return;
|
|
}
|
|
|
|
const countryInfo = getCountryInfo();
|
|
const fyStart =
|
|
countryInfo[this.country as string]?.fiscal_year_start ?? '';
|
|
return getFiscalYear(fyStart, true);
|
|
},
|
|
dependsOn: ['country', 'fiscalYearEnd'],
|
|
},
|
|
fiscalYearEnd: {
|
|
formula: async (fieldname?: string) => {
|
|
if (
|
|
fieldname === 'fiscalYearStart' &&
|
|
this.fiscalYearStart &&
|
|
!this.fiscalYearEnd
|
|
) {
|
|
return DateTime.fromJSDate(this.fiscalYearStart)
|
|
.plus({ years: 1 })
|
|
.minus({ days: 1 })
|
|
.toJSDate();
|
|
}
|
|
|
|
if (!this.country) {
|
|
return;
|
|
}
|
|
|
|
const countryInfo = getCountryInfo();
|
|
const fyEnd =
|
|
countryInfo[this.country as string]?.fiscal_year_end ?? '';
|
|
return getFiscalYear(fyEnd, false);
|
|
},
|
|
dependsOn: ['country', 'fiscalYearStart'],
|
|
},
|
|
currency: {
|
|
formula: async () => {
|
|
const country = this.get('country');
|
|
if (typeof country !== 'string') {
|
|
return;
|
|
}
|
|
|
|
const countryInfo = getCountryInfo();
|
|
const { code } = countryInfo[country] ?? {};
|
|
if (!code) {
|
|
return;
|
|
}
|
|
|
|
const currencyList = getCurrencyList();
|
|
const currency = currencyList.find(
|
|
({ countryCode }) => countryCode === code
|
|
);
|
|
|
|
if (currency === undefined) {
|
|
return currencyList[0].name;
|
|
}
|
|
|
|
return currency.name;
|
|
},
|
|
dependsOn: ['country'],
|
|
},
|
|
chartOfAccounts: {
|
|
formula: async () => {
|
|
const country = this.get('country') as string | undefined;
|
|
if (country === undefined) {
|
|
return;
|
|
}
|
|
|
|
const countryInfo = getCountryInfo();
|
|
return countryInfo[country]?.currency;
|
|
},
|
|
dependsOn: ['country'],
|
|
},
|
|
};
|
|
|
|
validations: ValidationMap = {
|
|
email: validateEmail,
|
|
};
|
|
|
|
static lists: ListsMap = {
|
|
country: () => Object.keys(getCountryInfo()),
|
|
currency: () => getCurrencyList().map(({ name }) => name),
|
|
chartOfAccounts: () => getCOAList().map(({ name }) => name),
|
|
};
|
|
}
|