1
package
hudsonfog.voc.finance;
2
3
import
com.fogx.webdav.DavResource;
4
import
com.fogx.webdav.DavClass;
5
import
com.fogx.webdav.DavBean;
6
import
com.fogx.webdav.DavProperty;
7
import
static
com.fogx.webdav.DavProperty.*;
8
import
com.fogx.webdav.packages.DavBeanPackage;
9
import
com.fogx.webdav.util.DavResourceSupport;
10
import
com.fogx.webdav.util.UrlUtil;
11
import
java.util.Date;
12
import
java.util.Map;
13
import
java.util.HashMap;
14
import
java.util.List;
15
import
java.util.Collections;
16
import
java.util.Arrays;
17
18
import
hudsonfog.voc.model.company
.*;
19
import
hudsonfog.voc.system.primitiveTypes
.*;
20
import
hudsonfog.voc.finance.billpayment
.*;
21
import
hudsonfog.voc.model.accounting
.*;
22
import
hudsonfog.voc.finance.banking
.*;
23
import
hudsonfog.voc.system.parse
.*;
24
import
hudsonfog.voc.system.security
.*;
25
import
hudsonfog.voc.system.XMLSchema
.*;
26
27
import
hudsonfog.voc.system.fog
.*;
28
29
30
public
abstract
class
banking {
31
32
public
static
class
Account
implements
FileSystem {
33
@_maxSize(
40
)
34
@k
public
String number;
35
@k
public
Bank bank;
36
public
ComplexDate dateOpened;
37
public
ComplexDate dateClosed;
38
public
AccountStatus status;
39
public
AccountPolicy accountPolicy;
40
@_maxSize(
240
)
41
public
String comments;
42
@_backLink(
"account"
)
43
public
AccountHolder[] holders;
44
@_backLink(
"forResource"
)
45
@_cloneOf(
"attachments"
)
46
@c
public
ExternalFile[] documents;
//* initial application, etc.
47
@_cloneOf(
"attachmentsUrl"
)
48
@c
public
String url;
49
public
AccountGroup accountGroup;
50
@_backLink(
"from"
)
51
public
ScheduledPayment[] scheduledPayments;
52
}
53
54
public
static
enum AccountStatus {
55
active, @_label(
"on hold"
) onHold, suspended, closed;
56
}
57
58
public
static
class
Bank
extends
hudsonfog.voc.model.company.ExternalOrganization
{
59
@_displayNameElm
60
@k@s
public
String name;
61
public
String routingNumber;
62
public
String swiftNumber;
63
}
64
65
@DavClass._abstract
66
public
static
abstract
class
AccountHolder {
67
@k
public
Account account;
68
public
HolderRole role;
69
public
ExternalFile signatureCard;
70
public
Boolean canWithdraw;
71
public
Boolean canDeposit;
72
}
73
74
public
static
class
PersonalHolder
extends
AccountHolder {
75
@k
public
Person person;
76
@k@s
public
Account account;
77
@s
public
String role;
78
@s
public
ExternalFile signatureCard;
79
@s
public
Boolean canWithdraw;
80
@s
public
Boolean canDeposit;
81
}
82
83
public
static
class
CorporateHolder
extends
AccountHolder {
84
@k
public
Contact contact;
85
@k@s
public
Account account;
86
@s
public
String role;
87
@s
public
ExternalFile signatureCard;
88
@s
public
Boolean canWithdraw;
89
@s
public
Boolean canDeposit;
90
}
91
92
public
static
class
CreditAccount
extends
Account {
93
@k@s
public
String number;
94
@k@s
public
Bank bank;
95
}
96
97
public
static
class
CreditCardAccount
extends
CreditAccount {
98
@k@s
public
String number;
99
@k@s
public
Bank bank;
100
public
Money creditLimit;
101
}
102
103
public
static
class
LineOfCredit
extends
CreditAccount {
104
@k@s
public
String number;
105
@k@s
public
Bank bank;
106
public
Money creditLimit;
107
}
108
109
public
static
class
Loan
extends
CreditAccount {
110
@k@s
public
String number;
111
@k@s
public
Bank bank;
112
public
Money loanAmount;
113
}
114
115
public
static
class
BankCard {
116
@_maxSize(
30
)
117
@k
public
String cardNumber;
118
public
Person person;
119
public
AccountGroup linkedTo;
120
}
121
122
/**
123
* Group of accounts share the same policy (like ATM or online banking)
124
*/
125
public
static
class
AccountGroup {
126
@k
public
String name;
127
@_backLink(
"accountGroup"
)
128
public
Account[] accounts;
129
public
AccountGroupPolicy policy;
130
}
131
132
/**
133
* Policy, like Select Banking
134
*/
135
public
static
class
AccountGroupPolicy {
136
@k
public
Bank bank;
137
@k
public
String policyName;
138
public
Boolean atmAllowed;
139
public
Boolean onlineAllowed;
140
}
141
142
public
static
class
Person
extends
hudsonfog.voc.model.company.Person
{
143
@s
public
String firstName;
144
@s
public
String lastName;
145
@k
public
Bank bank;
146
@_autoincrement
147
@_readOnly
148
@k
public
Integer number;
149
@s
public
User user;
150
@_maxSize(
20
)
151
@_regexp(
"{0-9}(3)-{0-9}(2)-{0-9}(4)"
)
152
public
String socialSecurityNumber;
// todo: generalize for international
153
public
Long dateOfBirth;
154
public
String driversLicense;
155
public
String stateIdNumber;
156
@_backLink(
"person"
)
157
public
BankCard[] cards;
158
@_backLink(
"person"
)
159
public
PersonalHolder[] accountHolding;
160
}
161
162
public
static
enum HolderRole {
163
owner, @_label(
"co-owner"
) co_owner;
164
}
165
166
public
static
class
AccountPolicy {
167
@_maxSize(
50
)
168
@k
public
String policyName;
169
public
Integer minBalance;
170
public
Integer maxMonthlyDeposits;
171
public
Integer maxMonthlyWithdrawals;
172
public
Integer allowsWireTransfers;
173
public
Integer maxDailyWithdrawal;
174
public
Integer maxSingleWithdrawal;
175
public
Integer maxSingleWireTrasfer;
176
public
Integer maxDailyWireTransfer;
177
}
178
179
public
static
class
CheckingAccount
extends
Account {
180
@k@s
public
String number;
181
@k@s
public
Bank bank;
182
}
183
184
public
static
class
SavingsAccount
extends
Account {
185
@k@s
public
String number;
186
@k@s
public
Bank bank;
187
}
188
189
public
static
class
TrustAccount
extends
Account {
190
@k@s
public
String number;
191
@k@s
public
Bank bank;
192
}
193
194
public
static
class
CDAccount
extends
Account {
195
@k@s
public
String number;
196
@k@s
public
Bank bank;
197
}
198
199
public
static
class
MoneyMarketAccount
extends
Account {
200
@k@s
public
String number;
201
@k@s
public
Bank bank;
202
}
203
204
public
static
class
AccountApplication {
205
@_autoincrement
206
@_readOnly
207
@k
public
Integer applicationNumber;
208
@k
public
Bank bank;
209
public
ApplicationStatus status;
210
}
211
212
public
static
enum ApplicationStatus {
213
submitted, approved, rejected;
214
}
215
216
public
static
class
AcountState {
217
@k
public
Account account;
218
public
Money availableBalance;
219
public
Money grossBalance;
220
public
Money unclearedDeposits;
221
public
Money availableCredit;
222
public
Money totalAvailable;
223
public
Money balancePlusCredit;
224
public
Money YTDInterest;
225
public
Percent interestRate;
226
}
227
228
public
static
class
Transaction {
229
@k
public
String referenceNumber;
230
@k
public
Account account;
231
public
ComplexDate date;
232
public
Money amount;
233
public
Money balance;
234
}
235
236
public
static
class
Deposit
extends
Transaction {
237
@k@s
public
String referenceNumber;
238
@_subPropertyOf(
"account"
)
239
@k@s
public
Account accountTo;
240
}
241
242
public
static
class
CashDeposit
extends
Deposit {
243
@k@s
public
String referenceNumber;
244
@k@s
public
Account accountTo;
245
}
246
247
public
static
class
IntraCheckDeposit
extends
Deposit {
248
@k@s
public
String referenceNumber;
249
@k@s
public
Account accountTo;
250
}
251
252
public
static
class
CheckDeposit
extends
Deposit {
253
@k@s
public
String referenceNumber;
254
@k@s
public
Account accountTo;
255
public
String accountFrom;
256
public
Bank originator;
257
@_maxSize(
10
)
258
public
String checkSerialNumber;
259
@_maxSize(
25
)
260
public
String checkNumber;
261
}
262
263
public
static
class
WireTransferDeposit
extends
Deposit {
264
@k@s
public
String referenceNumber;
265
@k@s
public
Account accountTo;
266
}
267
268
public
static
class
Withdrawal
extends
Transaction {
269
@k@s
public
String referenceNumber;
270
@k@s
public
Account account;
271
}
272
273
public
static
class
ATMWithdrawal
extends
Withdrawal {
274
@k@s
public
String referenceNumber;
275
@k@s
public
Account account;
276
}
277
278
public
static
class
Check
extends
Withdrawal {
279
@k@s
public
String referenceNumber;
280
@k@s
public
Account account;
281
}
282
283
public
static
class
ACH
extends
Withdrawal {
284
@k@s
public
String referenceNumber;
285
@k@s
public
Account account;
286
}
287
288
public
static
class
WireTransfer
extends
Withdrawal {
289
@k@s
public
String referenceNumber;
290
@k@s
public
Account account;
291
}
292
293
public
static
class
BankAccount
implements
FileSystem {
294
@_maxSize(
100
)
295
@_displayNameElm
296
@k
public
String number;
297
@_displayNameElm
298
@k
public
Bank bank;
299
@_label(
"IBAN"
)
300
public
String extendedNumber;
//* extended account number
301
public
ComplexDate dateOpened;
302
public
ComplexDate dateClosed;
303
@_maxSize(
1000
)
304
public
String comments;
305
@_backLink(
"forResource"
)
306
@_cloneOf(
"attachments"
)
307
@c
public
ExternalFile[] documents;
308
@_cloneOf(
"attachmentsUrl"
)
309
@c
public
String url;
310
@_backLink(
"account"
)
311
public
BankingTransaction[] transactions;
312
@_displayNameElm
313
public
Currency currency;
//* currency of funds on this account
314
}
315
316
@DavClass._derived
317
public
static
class
BankingTransaction
extends
hudsonfog.voc.model.accounting.ExternalTransaction
{
318
@_resourceLink
319
@_displayNameElm
320
@k@s
public
Integer id;
321
@s
public
dateTime date;
//* transaction date
322
public
dateTime valueDate;
//* date when funds actually moved
323
@_maxSize(
1000
)
324
@_displayNameElm
325
public
String information;
//* invoice, contact, order number
326
@_makeTotal
327
public
Money credit;
328
@_makeTotal
329
public
Money debit;
330
@_makeTotal
331
@_colorCoding(
"-10000000000-0 red"
)
332
@s
public
Money amount = writeJS(
"getThisChange().credit != null ? credit : getThisChange().debit != null ? debit : amount"
);
333
@_allowRoles(
"admin,positionTitle==General Manager,positionTitle=Controller,positionTitle=Board Member"
)
334
public
Money accountBalance;
335
public
BankAccount account;
336
}
337
338
public
static
class
BankingCredit
extends
BankingTransaction {
339
@_displayNameElm
340
@k@s
public
Integer id;
341
@_backLink(
"transaction"
)
342
@s
public
CreditDetail[] details;
343
@_makeTotal
344
@r@s
public
Money credit;
345
@h@s
public
Money debit;
346
}
347
348
public
static
class
BankingDebit
extends
BankingTransaction {
349
@_displayNameElm
350
@k@s
public
Integer id;
351
@_backLink(
"transaction"
)
352
@s
public
DebitDetail[] details;
353
@_makeTotal
354
@r@s
public
Money debit;
355
@h@s
public
Money credit;
356
}
357
358
public
static
class
PaymentDetail
extends
hudsonfog.voc.model.accounting.TransactionDetail
{
359
@k@s
public
BankingTransaction transaction;
360
@k@s
public
Integer seq;
361
@_notifyContainer
362
@_subPropertyOf(
"inRelationTo"
)
363
@s
public
Invoice invoice;
//*? Organization and Amount will be taken from invoice, if invoice is provided
364
@_readOnly
365
@_onCreate
366
@s
public
dateTime date;
367
@s
public
Money amount = writeJS(
"amount != null ? amount : invoice.amount"
);
368
}
369
370
public
static
class
CreditDetail
extends
PaymentDetail {
371
@k@s
public
BankingCredit transaction;
372
@k@s
public
Integer seq;
373
@s
public
Invoice invoice;
374
public
ExternalOrganization organization = writeJS(
"organization ? organization : invoice.partyFrom.party"
);
375
}
376
377
public
static
class
DebitDetail
extends
PaymentDetail {
378
@k@s
public
BankingDebit transaction;
379
@k@s
public
Integer seq;
380
@s
public
Invoice invoice;
381
public
ExternalOrganization organization = writeJS(
"organization ? organization : invoice.partyto.party"
);
382
}
383
}
384