00001
00002
00003
00004
00005
00006
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#ifdef HAVE_CONFIG_H
00021
#include <config.h>
00022
#endif
00023
00024
#include <string>
00025
#include "messages.hh"
00026
#include "libofx.h"
00027
#include "ofx_containers.hh"
00028
#include "ofx_utilities.hh"
00029
00030
extern OfxMainContainer * MainContainer;
00031
00032
00033
00034
00035
00036 OfxTransactionContainer::OfxTransactionContainer(LibofxContext *p_libofx_context,
OfxGenericContainer *para_parentcontainer, string para_tag_identifier):
00037
OfxGenericContainer(p_libofx_context, para_parentcontainer, para_tag_identifier)
00038 {
00039
OfxGenericContainer * tmp_parentcontainer=parentcontainer;
00040
00041 memset(&data,0,
sizeof(data));
00042
type=
"TRANSACTION";
00043
00044
while(tmp_parentcontainer!=NULL&&tmp_parentcontainer->
type!=
"STATEMENT")
00045 {
00046 tmp_parentcontainer=tmp_parentcontainer->
parentcontainer;
00047 }
00048
if (tmp_parentcontainer!=NULL){
00049 parent_statement=(
OfxStatementContainer*)tmp_parentcontainer;
00050 }
00051
else{
00052 parent_statement=NULL;
00053
message_out(ERROR,
"Unable to find the enclosing statement container this transaction");
00054 }
00055
if (parent_statement!=NULL&&parent_statement->data.account_id_valid==
true){
00056 strncpy(data.
account_id,parent_statement->data.account_id,OFX_ACCOUNT_ID_LENGTH);
00057 data.
account_id_valid =
true;
00058 }
00059 }
00060 OfxTransactionContainer::~OfxTransactionContainer()
00061 {
00062
00063 }
00064
00065
int OfxTransactionContainer::gen_event()
00066 {
00067
if(data.
unique_id_valid==
true&&MainContainer != NULL)
00068 {
00069 data.
security_data_ptr = MainContainer->
find_security(data.
unique_id);
00070
if(data.
security_data_ptr!=NULL)
00071 {
00072 data.
security_data_valid =
true;
00073 }
00074 }
00075 libofx_context->transactionCallback(data);
00076
return true;
00077 }
00078
00079
int OfxTransactionContainer::add_to_main_tree()
00080 {
00081
00082
if(MainContainer != NULL)
00083 {
00084
return MainContainer->
add_container(
this);
00085 }
00086
else
00087 {
00088
return false;
00089 }
00090 }
00091
00092
00093
void OfxTransactionContainer::add_attribute(
const string identifier,
const string value)
00094 {
00095
00096
if(identifier==
"DTPOSTED"){
00097 data.
date_posted =
ofxdate_to_time_t(value);
00098 data.
date_posted_valid =
true;
00099 }
00100
else if(identifier==
"DTUSER"){
00101 data.
date_initiated =
ofxdate_to_time_t(value);
00102 data.
date_initiated_valid =
true;
00103 }
00104
else if(identifier==
"DTAVAIL"){
00105 data.
date_funds_available =
ofxdate_to_time_t(value);
00106 data.
date_funds_available_valid =
true;
00107 }
00108
else if(identifier==
"FITID"){
00109 strncpy(data.
fi_id,value.c_str(),
sizeof(data.
fi_id));
00110 data.
fi_id_valid =
true;
00111 }
00112
else if(identifier==
"CORRECTFITID"){
00113 strncpy(data.
fi_id_corrected,value.c_str(),
sizeof(data.
fi_id));
00114 data.
fi_id_corrected_valid =
true;
00115 }
00116
else if(identifier==
"CORRECTACTION"){
00117 data.
fi_id_correction_action_valid=
true;
00118
if(value==
"REPLACE"){
00119 data.
fi_id_correction_action=
REPLACE;
00120 }
00121
else if(value==
"DELETE"){
00122 data.
fi_id_correction_action=
DELETE;
00123 }
00124
else{
00125 data.
fi_id_correction_action_valid=
false;
00126 }
00127 }
00128
else if((identifier==
"SRVRTID")||(identifier==
"SRVRTID2")){
00129 strncpy(data.
server_transaction_id,value.c_str(),
sizeof(data.
server_transaction_id));
00130 data.
server_transaction_id_valid =
true;
00131 }
00132
else if(identifier==
"MEMO" || identifier==
"MEMO2"){
00133 strncpy(data.
memo,value.c_str(),
sizeof(data.
memo));
00134 data.
memo_valid =
true;
00135 }
00136
else{
00137
00138
OfxGenericContainer::add_attribute(identifier, value);
00139 }
00140 }
00141
00142
void OfxTransactionContainer::add_account(
OfxAccountData * account_data)
00143 {
00144
if(account_data->
account_id_valid==
true)
00145 {
00146 data.
account_ptr = account_data;
00147 strncpy(data.
account_id,account_data->
account_id,OFX_ACCOUNT_ID_LENGTH);
00148 data.
account_id_valid =
true;
00149 }
00150 }
00151
00152
00153
00154
00155
00156 OfxBankTransactionContainer::OfxBankTransactionContainer(LibofxContext *p_libofx_context,
OfxGenericContainer *para_parentcontainer, string para_tag_identifier):
00157
OfxTransactionContainer(p_libofx_context, para_parentcontainer, para_tag_identifier)
00158 {
00159 ;
00160 }
00161
void OfxBankTransactionContainer::add_attribute(
const string identifier,
const string value)
00162 {
00163
if( identifier==
"TRNTYPE"){
00164 data.
transactiontype_valid=
true;
00165
if(value==
"CREDIT"){
00166 data.
transactiontype=
OFX_CREDIT;
00167 }
00168
else if(value==
"DEBIT"){
00169 data.
transactiontype=
OFX_DEBIT;
00170 }
00171
else if(value==
"INT"){
00172 data.
transactiontype=
OFX_INT;
00173 }
00174
else if(value==
"DIV"){
00175 data.
transactiontype=
OFX_DIV;
00176 }
00177
else if(value==
"FEE"){
00178 data.
transactiontype=
OFX_FEE;
00179 }
00180
else if(value==
"SRVCHG"){
00181 data.
transactiontype=
OFX_SRVCHG;
00182 }
00183
else if(value==
"DEP"){
00184 data.
transactiontype=
OFX_DEP;
00185 }
00186
else if(value==
"ATM"){
00187 data.
transactiontype=
OFX_ATM;
00188 }
00189
else if(value==
"POS"){
00190 data.
transactiontype=
OFX_POS;
00191 }
00192
else if(value==
"XFER"){
00193 data.
transactiontype=
OFX_XFER;
00194 }
00195
else if(value==
"CHECK"){
00196 data.
transactiontype=
OFX_CHECK;
00197 }
00198
else if(value==
"PAYMENT"){
00199 data.
transactiontype=
OFX_PAYMENT;
00200 }
00201
else if(value==
"CASH"){
00202 data.
transactiontype=
OFX_CASH;
00203 }
00204
else if(value==
"DIRECTDEP"){
00205 data.
transactiontype=
OFX_DIRECTDEP;
00206 }
00207
else if(value==
"DIRECTDEBIT"){
00208 data.
transactiontype=
OFX_DIRECTDEBIT;
00209 }
00210
else if(value==
"REPEATPMT"){
00211 data.
transactiontype=
OFX_REPEATPMT;
00212 }
00213
else if(value==
"OTHER"){
00214 data.
transactiontype=
OFX_OTHER;
00215 }
00216
else {
00217 data.
transactiontype_valid=
false;
00218 }
00219 }
00220
else if(identifier==
"TRNAMT"){
00221 data.
amount=
ofxamount_to_double(value);
00222 data.
amount_valid=
true;
00223 data.
units = -data.
amount;
00224 data.
units_valid=
true;
00225 data.
unitprice = 1,00;
00226 data.
unitprice_valid=
true;
00227 }
00228
else if(identifier==
"CHECKNUM"){
00229 strncpy(data.
check_number,value.c_str(),
sizeof(data.
check_number));
00230 data.
check_number_valid =
true;
00231 }
00232
else if(identifier==
"REFNUM"){
00233 strncpy(data.
reference_number,value.c_str(),
sizeof(data.
reference_number));
00234 data.
reference_number_valid =
true;
00235 }
00236
else if(identifier==
"SIC"){
00237 data.
standard_industrial_code = atoi(value.c_str());
00238 data.
standard_industrial_code_valid =
true;
00239 }
00240
else if((identifier==
"PAYEEID")||(identifier==
"PAYEEID2")){
00241 strncpy(data.
payee_id,value.c_str(),
sizeof(data.
payee_id));
00242 data.
payee_id_valid =
true;
00243 }
00244
else if(identifier==
"NAME"){
00245 strncpy(data.
name,value.c_str(),
sizeof(data.
name));
00246 data.
name_valid =
true;
00247 }
00248
else{
00249
00250
OfxTransactionContainer::add_attribute(identifier, value);
00251 }
00252 }
00253
00254
00255
00256
00257
00258
00259 OfxInvestmentTransactionContainer::OfxInvestmentTransactionContainer(LibofxContext *p_libofx_context,
OfxGenericContainer *para_parentcontainer, string para_tag_identifier):
00260
OfxTransactionContainer(p_libofx_context, para_parentcontainer, para_tag_identifier)
00261 {
00262
type=
"INVESTMENT";
00263 data.
transactiontype=
OFX_OTHER;
00264 data.
transactiontype_valid=
true;
00265
00266 data.
invtransactiontype_valid=
true;
00267
if(para_tag_identifier==
"BUYDEBT"){
00268 data.
invtransactiontype=
OFX_BUYDEBT;
00269 }
00270
else if(para_tag_identifier==
"BUYMF"){
00271 data.
invtransactiontype=
OFX_BUYMF;
00272 }
00273
else if(para_tag_identifier==
"BUYOPT"){
00274 data.
invtransactiontype=
OFX_BUYOPT;
00275 }
00276
else if(para_tag_identifier==
"BUYOTHER"){
00277 data.
invtransactiontype=
OFX_BUYOTHER;
00278 }
00279
else if(para_tag_identifier==
"BUYSTOCK"){
00280 data.
invtransactiontype=
OFX_BUYSTOCK;
00281 }
00282
else if(para_tag_identifier==
"CLOSUREOPT"){
00283 data.
invtransactiontype=
OFX_CLOSUREOPT;
00284 }
00285
else if(para_tag_identifier==
"INCOME"){
00286 data.
invtransactiontype=
OFX_INCOME;
00287 }
00288
else if(para_tag_identifier==
"INVEXPENSE"){
00289 data.
invtransactiontype=
OFX_INVEXPENSE;
00290 }
00291
else if(para_tag_identifier==
"JRNLFUND"){
00292 data.
invtransactiontype=
OFX_JRNLFUND;
00293 }
00294
else if(para_tag_identifier==
"JRNLSEC"){
00295 data.
invtransactiontype=
OFX_JRNLSEC;
00296 }
00297
else if(para_tag_identifier==
"MARGININTEREST"){
00298 data.
invtransactiontype=
OFX_MARGININTEREST;
00299 }
00300
else if(para_tag_identifier==
"REINVEST"){
00301 data.
invtransactiontype=
OFX_REINVEST;
00302 }
00303
else if(para_tag_identifier==
"RETOFCAP"){
00304 data.
invtransactiontype=
OFX_RETOFCAP;
00305 }
00306
else if(para_tag_identifier==
"SELLDEBT"){
00307 data.
invtransactiontype=
OFX_SELLDEBT;
00308 }
00309
else if(para_tag_identifier==
"SELLMF"){
00310 data.
invtransactiontype=
OFX_SELLMF;
00311 }
00312
else if(para_tag_identifier==
"SELLOPT"){
00313 data.
invtransactiontype=
OFX_SELLOPT;
00314 }
00315
else if(para_tag_identifier==
"SELLOTHER"){
00316 data.
invtransactiontype=
OFX_SELLOTHER;
00317 }
00318
else if(para_tag_identifier==
"SELLSTOCK"){
00319 data.
invtransactiontype=
OFX_SELLSTOCK;
00320 }
00321
else if(para_tag_identifier==
"SPLIT"){
00322 data.
invtransactiontype=
OFX_SPLIT;
00323 }
00324
else if(para_tag_identifier==
"TRANSFER"){
00325 data.
invtransactiontype=
OFX_TRANSFER;
00326 }
00327
else{
00328
message_out(ERROR,
"This should not happen, "+para_tag_identifier+
" is an unknown investment transaction type");
00329 data.
invtransactiontype_valid=
false;
00330 }
00331 }
00332
00333
void OfxInvestmentTransactionContainer::add_attribute(
const string identifier,
const string value)
00334 {
00335
if(identifier==
"UNIQUEID"){
00336 strncpy(data.
unique_id,value.c_str(),
sizeof(data.
unique_id));
00337 data.
unique_id_valid =
true;
00338 }
00339
else if(identifier==
"UNIQUEIDTYPE"){
00340 strncpy(data.
unique_id_type,value.c_str(),
sizeof(data.
unique_id_type));
00341 data.
unique_id_type_valid =
true;
00342 }
00343
else if(identifier==
"UNITS"){
00344 data.
units=
ofxamount_to_double(value);
00345 data.
units_valid =
true;
00346 }
00347
else if(identifier==
"UNITPRICE"){
00348 data.
unitprice=
ofxamount_to_double(value);
00349 data.
unitprice_valid =
true;
00350 }
00351
else if(identifier==
"MKTVAL"){
00352
message_out(DEBUG,
"MKTVAL of "+value+
" ignored since MKTVAL should always be UNITS*UNITPRICE");
00353 }
00354
else if(identifier==
"TOTAL"){
00355 data.
amount=
ofxamount_to_double(value);
00356 data.
amount_valid =
true;
00357 }
00358
else if(identifier==
"DTSETTLE"){
00359 data.
date_posted =
ofxdate_to_time_t(value);
00360 data.
date_posted_valid =
true;
00361 }
00362
else if(identifier==
"DTTRADE"){
00363 data.
date_initiated =
ofxdate_to_time_t(value);
00364 data.
date_initiated_valid =
true;
00365 }
00366
else{
00367
00368
OfxTransactionContainer::add_attribute(identifier, value);
00369 }
00370 }
00371