-
Notifications
You must be signed in to change notification settings - Fork 605
/
Account.ts
117 lines (101 loc) · 2.65 KB
/
Account.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import { Fyo } from 'fyo';
import { Doc } from 'fyo/model/doc';
import {
DefaultMap,
FiltersMap,
ListViewSettings,
RequiredMap,
TreeViewSettings,
ReadOnlyMap,
FormulaMap,
} from 'fyo/model/types';
import { ModelNameEnum } from 'models/types';
import { QueryFilter } from 'utils/db/types';
import { AccountRootType, AccountRootTypeEnum, AccountType } from './types';
export class Account extends Doc {
rootType?: AccountRootType;
accountType?: AccountType;
parentAccount?: string;
get isDebit() {
const debitAccounts = [
AccountRootTypeEnum.Asset,
AccountRootTypeEnum.Expense,
] as AccountRootType[];
return debitAccounts.includes(this.rootType!);
}
get isCredit() {
return !this.isDebit;
}
required: RequiredMap = {
/**
* Added here cause rootAccounts don't have parents
* they are created during initialization. if this is
* added to the schema it will cause NOT NULL errors
*/
parentAccount: () => !!this.fyo.singles?.AccountingSettings?.setupComplete,
};
static defaults: DefaultMap = {
/**
* NestedSet indices are actually not used
* this needs updation as they may be required
* later on.
*/
lft: () => 0,
rgt: () => 0,
};
async beforeSync() {
if (this.accountType || !this.parentAccount) {
return;
}
const account = await this.fyo.db.get(
'Account',
this.parentAccount as string
);
this.accountType = account.accountType as AccountType;
}
static getListViewSettings(): ListViewSettings {
return {
columns: ['name', 'parentAccount', 'rootType'],
};
}
static getTreeSettings(fyo: Fyo): void | TreeViewSettings {
return {
parentField: 'parentAccount',
async getRootLabel(): Promise<string> {
const accountingSettings = await fyo.doc.getDoc('AccountingSettings');
return accountingSettings.companyName as string;
},
};
}
formulas: FormulaMap = {
rootType: {
formula: async () => {
if (!this.parentAccount) {
return;
}
return await this.fyo.getValue(
ModelNameEnum.Account,
this.parentAccount,
'rootType'
);
},
},
};
static filters: FiltersMap = {
parentAccount: (doc: Doc) => {
const filter: QueryFilter = {
isGroup: true,
};
if (doc.rootType) {
filter.rootType = doc.rootType as string;
}
return filter;
},
};
readOnly: ReadOnlyMap = {
rootType: () => this.inserted,
parentAccount: () => this.inserted,
accountType: () => !!this.accountType && this.inserted,
isGroup: () => this.inserted,
};
}