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