LibOFX
ofx_container_transaction.cpp
Go to the documentation of this file.
00001 /***************************************************************************
00002          ofx_container_account.cpp
00003                              -------------------
00004     copyright            : (C) 2002 by Benoit Gr�goire
00005     email                : benoitg@coeus.ca
00006 ***************************************************************************/
00011 /***************************************************************************
00012  *                                                                         *
00013  *   This program is free software; you can redistribute it and/or modify  *
00014  *   it under the terms of the GNU General Public License as published by  *
00015  *   the Free Software Foundation; either version 2 of the License, or     *
00016  *   (at your option) any later version.                                   *
00017  *                                                                         *
00018  ***************************************************************************/
00019 
00020 #ifdef HAVE_CONFIG_H
00021 #include <config.h>
00022 #endif
00023 
00024 #include <cstdlib>
00025 #include <string>
00026 #include "messages.hh"
00027 #include "libofx.h"
00028 #include "ofx_containers.hh"
00029 #include "ofx_utilities.hh"
00030 
00031 extern OfxMainContainer * MainContainer;
00032 
00033 /***************************************************************************
00034  *                      OfxTransactionContainer                            *
00035  ***************************************************************************/
00036 
00037 OfxTransactionContainer::OfxTransactionContainer(LibofxContext *p_libofx_context, OfxGenericContainer *para_parentcontainer, string para_tag_identifier):
00038   OfxGenericContainer(p_libofx_context, para_parentcontainer, para_tag_identifier)
00039 {
00040   OfxGenericContainer * tmp_parentcontainer = parentcontainer;
00041 
00042   memset(&data, 0, sizeof(data));
00043   type = "TRANSACTION";
00044   /* Find the parent statement container*/
00045   while (tmp_parentcontainer != NULL && tmp_parentcontainer->type != "STATEMENT")
00046   {
00047     tmp_parentcontainer = tmp_parentcontainer->parentcontainer;
00048   }
00049   if (tmp_parentcontainer != NULL)
00050   {
00051     parent_statement = (OfxStatementContainer*)tmp_parentcontainer;
00052   }
00053   else
00054   {
00055     parent_statement = NULL;
00056     message_out(ERROR, "Unable to find the enclosing statement container this transaction");
00057   }
00058   if (parent_statement != NULL && parent_statement->data.account_id_valid == true)
00059   {
00060     strncpy(data.account_id, parent_statement->data.account_id, OFX_ACCOUNT_ID_LENGTH);
00061     data.account_id_valid = true;
00062   }
00063 }
00064 OfxTransactionContainer::~OfxTransactionContainer()
00065 {
00066 
00067 }
00068 
00069 int OfxTransactionContainer::gen_event()
00070 {
00071   if (data.unique_id_valid == true && MainContainer != NULL)
00072   {
00073     data.security_data_ptr = MainContainer->find_security(data.unique_id);
00074     if (data.security_data_ptr != NULL)
00075     {
00076       data.security_data_valid = true;
00077     }
00078   }
00079   libofx_context->transactionCallback(data);
00080   return true;
00081 }
00082 
00083 int  OfxTransactionContainer::add_to_main_tree()
00084 {
00085 
00086   if (MainContainer != NULL)
00087   {
00088     return MainContainer->add_container(this);
00089   }
00090   else
00091   {
00092     return false;
00093   }
00094 }
00095 
00096 
00097 void OfxTransactionContainer::add_attribute(const string identifier, const string value)
00098 {
00099 
00100   if (identifier == "DTPOSTED")
00101   {
00102     data.date_posted = ofxdate_to_time_t(value);
00103     data.date_posted_valid = true;
00104   }
00105   else if (identifier == "DTUSER")
00106   {
00107     data.date_initiated = ofxdate_to_time_t(value);
00108     data.date_initiated_valid = true;
00109   }
00110   else if (identifier == "DTAVAIL")
00111   {
00112     data.date_funds_available = ofxdate_to_time_t(value);
00113     data.date_funds_available_valid = true;
00114   }
00115   else if (identifier == "FITID")
00116   {
00117     strncpy(data.fi_id, value.c_str(), sizeof(data.fi_id));
00118     data.fi_id_valid = true;
00119   }
00120   else if (identifier == "CORRECTFITID")
00121   {
00122     strncpy(data.fi_id_corrected, value.c_str(), sizeof(data.fi_id));
00123     data.fi_id_corrected_valid = true;
00124   }
00125   else if (identifier == "CORRECTACTION")
00126   {
00127     data.fi_id_correction_action_valid = true;
00128     if (value == "REPLACE")
00129     {
00130       data.fi_id_correction_action = REPLACE;
00131     }
00132     else if (value == "DELETE")
00133     {
00134       data.fi_id_correction_action = DELETE;
00135     }
00136     else
00137     {
00138       data.fi_id_correction_action_valid = false;
00139     }
00140   }
00141   else if ((identifier == "SRVRTID") || (identifier == "SRVRTID2"))
00142   {
00143     strncpy(data.server_transaction_id, value.c_str(), sizeof(data.server_transaction_id));
00144     data.server_transaction_id_valid = true;
00145   }
00146   else if (identifier == "MEMO" || identifier == "MEMO2")
00147   {
00148     strncpy(data.memo, value.c_str(), sizeof(data.memo));
00149     data.memo_valid = true;
00150   }
00151   else
00152   {
00153     /* Redirect unknown identifiers to the base class */
00154     OfxGenericContainer::add_attribute(identifier, value);
00155   }
00156 }// end OfxTransactionContainer::add_attribute()
00157 
00158 void OfxTransactionContainer::add_account(OfxAccountData * account_data)
00159 {
00160   if (account_data->account_id_valid == true)
00161   {
00162     data.account_ptr = account_data;
00163     strncpy(data.account_id, account_data->account_id, OFX_ACCOUNT_ID_LENGTH);
00164     data.account_id_valid = true;
00165   }
00166 }
00167 
00168 /***************************************************************************
00169  *                      OfxBankTransactionContainer                        *
00170  ***************************************************************************/
00171 
00172 OfxBankTransactionContainer::OfxBankTransactionContainer(LibofxContext *p_libofx_context, OfxGenericContainer *para_parentcontainer, string para_tag_identifier):
00173   OfxTransactionContainer(p_libofx_context, para_parentcontainer, para_tag_identifier)
00174 {
00175   ;
00176 }
00177 void OfxBankTransactionContainer::add_attribute(const string identifier, const string value)
00178 {
00179   if ( identifier == "TRNTYPE")
00180   {
00181     data.transactiontype_valid = true;
00182     if (value == "CREDIT")
00183     {
00184       data.transactiontype = OFX_CREDIT;
00185     }
00186     else if (value == "DEBIT")
00187     {
00188       data.transactiontype = OFX_DEBIT;
00189     }
00190     else if (value == "INT")
00191     {
00192       data.transactiontype = OFX_INT;
00193     }
00194     else if (value == "DIV")
00195     {
00196       data.transactiontype = OFX_DIV;
00197     }
00198     else if (value == "FEE")
00199     {
00200       data.transactiontype = OFX_FEE;
00201     }
00202     else if (value == "SRVCHG")
00203     {
00204       data.transactiontype = OFX_SRVCHG;
00205     }
00206     else if (value == "DEP")
00207     {
00208       data.transactiontype = OFX_DEP;
00209     }
00210     else if (value == "ATM")
00211     {
00212       data.transactiontype = OFX_ATM;
00213     }
00214     else if (value == "POS")
00215     {
00216       data.transactiontype = OFX_POS;
00217     }
00218     else if (value == "XFER")
00219     {
00220       data.transactiontype = OFX_XFER;
00221     }
00222     else if (value == "CHECK")
00223     {
00224       data.transactiontype = OFX_CHECK;
00225     }
00226     else if (value == "PAYMENT")
00227     {
00228       data.transactiontype = OFX_PAYMENT;
00229     }
00230     else if (value == "CASH")
00231     {
00232       data.transactiontype = OFX_CASH;
00233     }
00234     else if (value == "DIRECTDEP")
00235     {
00236       data.transactiontype = OFX_DIRECTDEP;
00237     }
00238     else if (value == "DIRECTDEBIT")
00239     {
00240       data.transactiontype = OFX_DIRECTDEBIT;
00241     }
00242     else if (value == "REPEATPMT")
00243     {
00244       data.transactiontype = OFX_REPEATPMT;
00245     }
00246     else if (value == "OTHER")
00247     {
00248       data.transactiontype = OFX_OTHER;
00249     }
00250     else
00251     {
00252       data.transactiontype_valid = false;
00253     }
00254   }//end TRANSTYPE
00255   else if (identifier == "TRNAMT")
00256   {
00257     data.amount = ofxamount_to_double(value);
00258     data.amount_valid = true;
00259     data.units = -data.amount;
00260     data.units_valid = true;
00261     data.unitprice = 1.00;
00262     data.unitprice_valid = true;
00263   }
00264   else if (identifier == "CHECKNUM")
00265   {
00266     strncpy(data.check_number, value.c_str(), sizeof(data.check_number));
00267     data.check_number_valid = true;
00268   }
00269   else if (identifier == "REFNUM")
00270   {
00271     strncpy(data.reference_number, value.c_str(), sizeof(data.reference_number));
00272     data.reference_number_valid = true;
00273   }
00274   else if (identifier == "SIC")
00275   {
00276     data.standard_industrial_code = atoi(value.c_str());
00277     data.standard_industrial_code_valid = true;
00278   }
00279   else if ((identifier == "PAYEEID") || (identifier == "PAYEEID2"))
00280   {
00281     strncpy(data.payee_id, value.c_str(), sizeof(data.payee_id));
00282     data.payee_id_valid = true;
00283   }
00284   else if (identifier == "NAME")
00285   {
00286     strncpy(data.name, value.c_str(), sizeof(data.name));
00287     data.name_valid = true;
00288   }
00289   else
00290   {
00291     /* Redirect unknown identifiers to base class */
00292     OfxTransactionContainer::add_attribute(identifier, value);
00293   }
00294 }//end OfxBankTransactionContainer::add_attribute
00295 
00296 
00297 /***************************************************************************
00298  *                    OfxInvestmentTransactionContainer                    *
00299  ***************************************************************************/
00300 
00301 OfxInvestmentTransactionContainer::OfxInvestmentTransactionContainer(LibofxContext *p_libofx_context, OfxGenericContainer *para_parentcontainer, string para_tag_identifier):
00302   OfxTransactionContainer(p_libofx_context, para_parentcontainer, para_tag_identifier)
00303 {
00304   type = "INVESTMENT";
00305   data.transactiontype = OFX_OTHER;
00306   data.transactiontype_valid = true;
00307 
00308   data.invtransactiontype_valid = true;
00309   if (para_tag_identifier == "BUYDEBT")
00310   {
00311     data.invtransactiontype = OFX_BUYDEBT;
00312   }
00313   else if (para_tag_identifier == "BUYMF")
00314   {
00315     data.invtransactiontype = OFX_BUYMF;
00316   }
00317   else if (para_tag_identifier == "BUYOPT")
00318   {
00319     data.invtransactiontype = OFX_BUYOPT;
00320   }
00321   else if (para_tag_identifier == "BUYOTHER")
00322   {
00323     data.invtransactiontype = OFX_BUYOTHER;
00324   }
00325   else if (para_tag_identifier == "BUYSTOCK")
00326   {
00327     data.invtransactiontype = OFX_BUYSTOCK;
00328   }
00329   else if (para_tag_identifier == "CLOSUREOPT")
00330   {
00331     data.invtransactiontype = OFX_CLOSUREOPT;
00332   }
00333   else if (para_tag_identifier == "INCOME")
00334   {
00335     data.invtransactiontype = OFX_INCOME;
00336   }
00337   else if (para_tag_identifier == "INVEXPENSE")
00338   {
00339     data.invtransactiontype = OFX_INVEXPENSE;
00340   }
00341   else if (para_tag_identifier == "JRNLFUND")
00342   {
00343     data.invtransactiontype = OFX_JRNLFUND;
00344   }
00345   else if (para_tag_identifier == "JRNLSEC")
00346   {
00347     data.invtransactiontype = OFX_JRNLSEC;
00348   }
00349   else if (para_tag_identifier == "MARGININTEREST")
00350   {
00351     data.invtransactiontype = OFX_MARGININTEREST;
00352   }
00353   else if (para_tag_identifier == "REINVEST")
00354   {
00355     data.invtransactiontype = OFX_REINVEST;
00356   }
00357   else if (para_tag_identifier == "RETOFCAP")
00358   {
00359     data.invtransactiontype = OFX_RETOFCAP;
00360   }
00361   else if (para_tag_identifier == "SELLDEBT")
00362   {
00363     data.invtransactiontype = OFX_SELLDEBT;
00364   }
00365   else if (para_tag_identifier == "SELLMF")
00366   {
00367     data.invtransactiontype = OFX_SELLMF;
00368   }
00369   else if (para_tag_identifier == "SELLOPT")
00370   {
00371     data.invtransactiontype = OFX_SELLOPT;
00372   }
00373   else if (para_tag_identifier == "SELLOTHER")
00374   {
00375     data.invtransactiontype = OFX_SELLOTHER;
00376   }
00377   else if (para_tag_identifier == "SELLSTOCK")
00378   {
00379     data.invtransactiontype = OFX_SELLSTOCK;
00380   }
00381   else if (para_tag_identifier == "SPLIT")
00382   {
00383     data.invtransactiontype = OFX_SPLIT;
00384   }
00385   else if (para_tag_identifier == "TRANSFER")
00386   {
00387     data.invtransactiontype = OFX_TRANSFER;
00388   }
00389   else
00390   {
00391     message_out(ERROR, "This should not happen, " + para_tag_identifier + " is an unknown investment transaction type");
00392     data.invtransactiontype_valid = false;
00393   }
00394 }
00395 
00396 void OfxInvestmentTransactionContainer::add_attribute(const string identifier, const string value)
00397 {
00398   if (identifier == "UNIQUEID")
00399   {
00400     strncpy(data.unique_id, value.c_str(), sizeof(data.unique_id));
00401     data.unique_id_valid = true;
00402   }
00403   else if (identifier == "UNIQUEIDTYPE")
00404   {
00405     strncpy(data.unique_id_type, value.c_str(), sizeof(data.unique_id_type));
00406     data.unique_id_type_valid = true;
00407   }
00408   else if (identifier == "UNITS")
00409   {
00410     data.units = ofxamount_to_double(value);
00411     data.units_valid = true;
00412   }
00413   else if (identifier == "UNITPRICE")
00414   {
00415     data.unitprice = ofxamount_to_double(value);
00416     data.unitprice_valid = true;
00417   }
00418   else if (identifier == "MKTVAL")
00419   {
00420     message_out(DEBUG, "MKTVAL of " + value + " ignored since MKTVAL should always be UNITS*UNITPRICE");
00421   }
00422   else if (identifier == "TOTAL")
00423   {
00424     data.amount = ofxamount_to_double(value);
00425     data.amount_valid = true;
00426   }
00427   else if (identifier == "DTSETTLE")
00428   {
00429     data.date_posted = ofxdate_to_time_t(value);
00430     data.date_posted_valid = true;
00431   }
00432   else if (identifier == "DTTRADE")
00433   {
00434     data.date_initiated = ofxdate_to_time_t(value);
00435     data.date_initiated_valid = true;
00436   }
00437   else if (identifier == "COMMISSION")
00438   {
00439     data.commission = ofxamount_to_double(value);
00440     data.commission_valid = true;
00441   }
00442   else if (identifier == "FEES")
00443   {
00444     data.fees = ofxamount_to_double(value);
00445     data.fees_valid = true;
00446   }
00447   else if (identifier == "OLDUNITS")
00448   {
00449     data.oldunits = ofxamount_to_double(value);
00450     data.oldunits_valid = true;
00451   }
00452   else if (identifier == "NEWUNITS")
00453   {
00454     data.newunits = ofxamount_to_double(value);
00455     data.newunits_valid = true;
00456   }
00457   else
00458   {
00459     /* Redirect unknown identifiers to the base class */
00460     OfxTransactionContainer::add_attribute(identifier, value);
00461   }
00462 }//end OfxInvestmentTransactionContainer::add_attribute
00463