00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef _ACCOUNT_H_
00032 #define _ACCOUNT_H_
00033
00034
00035
00036
00037 #include <string>
00038 #include <map>
00039 #include <vector>
00040
00041
00042 #include "osbid.h"
00043 #include "chrono.h"
00044 #include "money.h"
00045
00046
00047
00048 namespace OSB_DB {
00049 class Session;
00050 }
00051
00052 namespace OSB_LIB {
00053 class Associate;
00054 class InvoiceInfo;
00055 class Contract;
00056 }
00057
00058
00059
00060 namespace OSB_LIB {
00062 enum AccountType {Assets, Liabilities, Capital};
00063
00069 struct Account {
00070 typedef Id<Account> Oid;
00071
00072 enum Side { credit, debit };
00079 static char toChar(Side sd);
00080
00082 Account() {}
00090 Account(Oid oid, const std::string& ac, AccountType tp)
00091 : oid_(oid), code_(ac), type_(tp) {}
00092
00094 Oid oid() const { return oid_; }
00095
00096 Oid oid_;
00097 std::string code_;
00098 AccountType type_;
00099 };
00100
00102 typedef std::map<std::string, Account> AccountList;
00103
00105 class Transaction {
00106 public:
00108 Transaction() {}
00116 void setAccount(const Account& ac, const Money& m);
00117
00119 Account account() const { return account_; }
00120
00126 Money getAmount() const;
00127
00128 Date date_;
00129 std::string detail_;
00130 std::string folio_;
00131 private:
00132 Account account_;
00133 Account::Side side_;
00134 Money amount_;
00135
00136 };
00137
00139 typedef std::vector<Transaction> TransactionList;
00140
00151 class SummaryCharges {
00152 public:
00154 SummaryCharges() {}
00156 void addTransaction(const Transaction& transaction)
00157 {
00158 transactions_.push_back(transaction);
00159 }
00160
00162 void outstandingBalance(MoneyList& ml) const;
00164 void totalAmountDue(MoneyList& ml) const;
00165
00167 typedef TransactionList::const_iterator TransactionListCI;
00169 TransactionListCI transactionsBegin() const
00170 {
00171 return transactions_.begin();
00172 }
00174 TransactionListCI transactionsEnd() const
00175 {
00176 return transactions_.end();
00177 }
00178
00180 MoneyList balanceForward_;
00182 MoneyList currentCharges_;
00183
00184 private:
00186 TransactionList transactions_;
00187 };
00188
00195 class AccountInterface {
00196 public:
00198 virtual ~AccountInterface() {}
00210 virtual bool getBalance(
00211 const Associate& associate,
00212 const DateTime& ts,
00213 MoneyList& dest) = 0;
00228 virtual long readTransactions(TransactionList& transactions,
00229 const Associate& associate,
00230 const DateTime& start,
00231 const DateTime& end) = 0;
00232
00239 virtual long getDuedays(
00240 const Associate& associate
00241 ) = 0;
00242
00255 virtual long writeTransactions(
00256 const TransactionList& transactions) = 0;
00270 virtual bool writeInvoice(
00271 const Associate& associate,
00272 const Contract& contract,
00273 const InvoiceInfo& invInfo
00274 ) = 0;
00275 };
00276
00283 class GlSummary {
00284 public:
00286 GlSummary() : sequenceNo_(0) {}
00298 void addAmount(
00299 const Account::Oid& accountCode,
00300 Account::Side side,
00301 const Money& amount
00302 );
00310 void post(const OSB_DB::Session& s);
00316 void clear();
00317
00318 private:
00320 struct GlAmounts {
00321 MoneyList credit_;
00322 MoneyList debit_;
00323 };
00324
00326 typedef std::map<Account::Oid, GlAmounts> GlSumBuf;
00327
00328 GlSumBuf glSumBuf_;
00329 long sequenceNo_;
00330 };
00331
00339 class AccountImp : public AccountInterface {
00340 public:
00342 AccountImp(OSB_DB::Session* s) : session_(s){}
00343
00347 bool getBalance(
00348 const Associate& ,
00349 const DateTime& ,
00350 MoneyList&
00351 )
00352 {
00353 return false;
00354 }
00355
00359 virtual long readTransactions(
00360 TransactionList& ,
00361 const Associate& ,
00362 const DateTime& ,
00363 const DateTime&
00364 )
00365 {
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383 return 0;
00384 }
00385
00389 long writeTransactions(
00390 const TransactionList&
00391 )
00392 {
00393 return 0;
00394 }
00395 private:
00397 OSB_DB::Session* session_;
00398 };
00399
00400 }
00401 #endif // #ifndef _ACCOUNT_H_