LibOFX
build/libofx-0.10.0/lib/ofx_container_transaction.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  ofx_container_account.cpp
3  -------------------
4  copyright : (C) 2002 by Benoit Gr�goire
5  email : benoitg@coeus.ca
6 ***************************************************************************/
11 /***************************************************************************
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * *
18  ***************************************************************************/
19 
20 #ifdef HAVE_CONFIG_H
21 #include <config.h>
22 #endif
23 
24 #include <cstdlib>
25 #include <string>
26 #include "messages.hh"
27 #include "libofx.h"
28 #include "ofx_containers.hh"
29 #include "ofx_utilities.hh"
30 
31 extern OfxMainContainer * MainContainer;
32 
33 /***************************************************************************
34  * OfxTransactionContainer *
35  ***************************************************************************/
36 
37 OfxTransactionContainer::OfxTransactionContainer(LibofxContext *p_libofx_context, OfxGenericContainer *para_parentcontainer, string para_tag_identifier):
38  OfxGenericContainer(p_libofx_context, para_parentcontainer, para_tag_identifier)
39 {
40  OfxGenericContainer * tmp_parentcontainer = parentcontainer;
41 
42  memset(&data, 0, sizeof(data));
43  type = "TRANSACTION";
44  /* Find the parent statement container*/
45  while (tmp_parentcontainer != NULL && tmp_parentcontainer->type != "STATEMENT")
46  {
47  tmp_parentcontainer = tmp_parentcontainer->parentcontainer;
48  }
49  if (tmp_parentcontainer != NULL)
50  {
51  parent_statement = (OfxStatementContainer*)tmp_parentcontainer;
52  }
53  else
54  {
55  parent_statement = NULL;
56  message_out(ERROR, "Unable to find the enclosing statement container this transaction");
57  }
58  if (parent_statement != NULL && parent_statement->data.account_id_valid == true)
59  {
60  strncpy(data.account_id, parent_statement->data.account_id, OFX_ACCOUNT_ID_LENGTH);
61  data.account_id_valid = true;
62  }
63 }
64 OfxTransactionContainer::~OfxTransactionContainer()
65 {
66 
67 }
68 
70 {
71  if (data.unique_id_valid == true && MainContainer != NULL)
72  {
73  data.security_data_ptr = MainContainer->find_security(data.unique_id);
74  if (data.security_data_ptr != NULL)
75  {
76  data.security_data_valid = true;
77  }
78  }
79  libofx_context->transactionCallback(data);
80  return true;
81 }
82 
84 {
85 
86  if (MainContainer != NULL)
87  {
88  return MainContainer->add_container(this);
89  }
90  else
91  {
92  return false;
93  }
94 }
95 
96 
97 void OfxTransactionContainer::add_attribute(const string identifier, const string value)
98 {
99 
100  if (identifier == "DTPOSTED")
101  {
102  data.date_posted = ofxdate_to_time_t(value);
103  data.date_posted_valid = true;
104  }
105  else if (identifier == "DTUSER")
106  {
107  data.date_initiated = ofxdate_to_time_t(value);
108  data.date_initiated_valid = true;
109  }
110  else if (identifier == "DTAVAIL")
111  {
112  data.date_funds_available = ofxdate_to_time_t(value);
113  data.date_funds_available_valid = true;
114  }
115  else if (identifier == "FITID")
116  {
117  strncpy(data.fi_id, value.c_str(), sizeof(data.fi_id));
118  data.fi_id_valid = true;
119  }
120  else if (identifier == "CORRECTFITID")
121  {
122  strncpy(data.fi_id_corrected, value.c_str(), sizeof(data.fi_id_corrected));
123  data.fi_id_corrected_valid = true;
124  }
125  else if (identifier == "CORRECTACTION")
126  {
127  data.fi_id_correction_action_valid = true;
128  if (value == "REPLACE")
129  {
130  data.fi_id_correction_action = REPLACE;
131  }
132  else if (value == "DELETE")
133  {
134  data.fi_id_correction_action = DELETE;
135  }
136  else
137  {
138  data.fi_id_correction_action_valid = false;
139  }
140  }
141  else if ((identifier == "SRVRTID") || (identifier == "SRVRTID2"))
142  {
143  strncpy(data.server_transaction_id, value.c_str(), sizeof(data.server_transaction_id));
144  data.server_transaction_id_valid = true;
145  }
146  else if (identifier == "MEMO" || identifier == "MEMO2")
147  {
148  strncpy(data.memo, value.c_str(), sizeof(data.memo));
149  data.memo_valid = true;
150  }
151  else if (identifier == "CURRENCY")
152  {
153  data.amounts_are_foreign_currency = false;
154  data.amounts_are_foreign_currency_valid = true;
155  }
156  else if (identifier == "ORIGCURRENCY")
157  {
158  data.amounts_are_foreign_currency = true;
159  data.amounts_are_foreign_currency_valid = true;
160  }
161  else
162  {
163  /* Redirect unknown identifiers to the base class */
164  OfxGenericContainer::add_attribute(identifier, value);
165  }
166 }// end OfxTransactionContainer::add_attribute()
167 
168 void OfxTransactionContainer::add_account(OfxAccountData * account_data)
169 {
170  if (account_data->account_id_valid == true)
171  {
172  data.account_ptr = account_data;
173  strncpy(data.account_id, account_data->account_id, OFX_ACCOUNT_ID_LENGTH);
174  data.account_id_valid = true;
175  }
176 }
177 
178 /***************************************************************************
179  * OfxBankTransactionContainer *
180  ***************************************************************************/
181 
182 OfxBankTransactionContainer::OfxBankTransactionContainer(LibofxContext *p_libofx_context, OfxGenericContainer *para_parentcontainer, string para_tag_identifier):
183  OfxTransactionContainer(p_libofx_context, para_parentcontainer, para_tag_identifier)
184 {
185  ;
186 }
187 void OfxBankTransactionContainer::add_attribute(const string identifier, const string value)
188 {
189  if ( identifier == "TRNTYPE")
190  {
191  data.transactiontype_valid = true;
192  if (value == "CREDIT")
193  {
194  data.transactiontype = OFX_CREDIT;
195  }
196  else if (value == "DEBIT")
197  {
198  data.transactiontype = OFX_DEBIT;
199  }
200  else if (value == "INT")
201  {
202  data.transactiontype = OFX_INT;
203  }
204  else if (value == "DIV")
205  {
206  data.transactiontype = OFX_DIV;
207  }
208  else if (value == "FEE")
209  {
210  data.transactiontype = OFX_FEE;
211  }
212  else if (value == "SRVCHG")
213  {
214  data.transactiontype = OFX_SRVCHG;
215  }
216  else if (value == "DEP")
217  {
218  data.transactiontype = OFX_DEP;
219  }
220  else if (value == "ATM")
221  {
222  data.transactiontype = OFX_ATM;
223  }
224  else if (value == "POS")
225  {
226  data.transactiontype = OFX_POS;
227  }
228  else if (value == "XFER")
229  {
230  data.transactiontype = OFX_XFER;
231  }
232  else if (value == "CHECK")
233  {
234  data.transactiontype = OFX_CHECK;
235  }
236  else if (value == "PAYMENT")
237  {
238  data.transactiontype = OFX_PAYMENT;
239  }
240  else if (value == "CASH")
241  {
242  data.transactiontype = OFX_CASH;
243  }
244  else if (value == "DIRECTDEP")
245  {
246  data.transactiontype = OFX_DIRECTDEP;
247  }
248  else if (value == "DIRECTDEBIT")
249  {
250  data.transactiontype = OFX_DIRECTDEBIT;
251  }
252  else if (value == "REPEATPMT")
253  {
254  data.transactiontype = OFX_REPEATPMT;
255  }
256  else if (value == "OTHER")
257  {
258  data.transactiontype = OFX_OTHER;
259  }
260  else
261  {
262  data.transactiontype_valid = false;
263  }
264  }//end TRANSTYPE
265  else if (identifier == "TRNAMT")
266  {
267  data.amount = ofxamount_to_double(value);
268  data.amount_valid = true;
269  data.units = -data.amount;
270  data.units_valid = true;
271  data.unitprice = 1.00;
272  data.unitprice_valid = true;
273  }
274  else if (identifier == "CHECKNUM")
275  {
276  strncpy(data.check_number, value.c_str(), sizeof(data.check_number));
277  data.check_number_valid = true;
278  }
279  else if (identifier == "REFNUM")
280  {
281  strncpy(data.reference_number, value.c_str(), sizeof(data.reference_number));
282  data.reference_number_valid = true;
283  }
284  else if (identifier == "SIC")
285  {
286  data.standard_industrial_code = atoi(value.c_str());
287  data.standard_industrial_code_valid = true;
288  }
289  else if ((identifier == "PAYEEID") || (identifier == "PAYEEID2"))
290  {
291  strncpy(data.payee_id, value.c_str(), sizeof(data.payee_id));
292  data.payee_id_valid = true;
293  }
294  else if (identifier == "NAME")
295  {
296  strncpy(data.name, value.c_str(), sizeof(data.name));
297  data.name_valid = true;
298  }
299  else
300  {
301  /* Redirect unknown identifiers to base class */
302  OfxTransactionContainer::add_attribute(identifier, value);
303  }
304 }//end OfxBankTransactionContainer::add_attribute
305 
306 
307 /***************************************************************************
308  * OfxInvestmentTransactionContainer *
309  ***************************************************************************/
310 
311 OfxInvestmentTransactionContainer::OfxInvestmentTransactionContainer(LibofxContext *p_libofx_context, OfxGenericContainer *para_parentcontainer, string para_tag_identifier):
312  OfxTransactionContainer(p_libofx_context, para_parentcontainer, para_tag_identifier)
313 {
314  type = "INVESTMENT";
315  data.transactiontype = OFX_OTHER;
316  data.transactiontype_valid = true;
317 
318  data.invtransactiontype_valid = true;
319  if (para_tag_identifier == "BUYDEBT")
320  {
321  data.invtransactiontype = OFX_BUYDEBT;
322  }
323  else if (para_tag_identifier == "BUYMF")
324  {
325  data.invtransactiontype = OFX_BUYMF;
326  }
327  else if (para_tag_identifier == "BUYOPT")
328  {
329  data.invtransactiontype = OFX_BUYOPT;
330  }
331  else if (para_tag_identifier == "BUYOTHER")
332  {
333  data.invtransactiontype = OFX_BUYOTHER;
334  }
335  else if (para_tag_identifier == "BUYSTOCK")
336  {
337  data.invtransactiontype = OFX_BUYSTOCK;
338  }
339  else if (para_tag_identifier == "CLOSUREOPT")
340  {
341  data.invtransactiontype = OFX_CLOSUREOPT;
342  }
343  else if (para_tag_identifier == "INCOME")
344  {
345  data.invtransactiontype = OFX_INCOME;
346  }
347  else if (para_tag_identifier == "INVEXPENSE")
348  {
349  data.invtransactiontype = OFX_INVEXPENSE;
350  }
351  else if (para_tag_identifier == "JRNLFUND")
352  {
353  data.invtransactiontype = OFX_JRNLFUND;
354  }
355  else if (para_tag_identifier == "JRNLSEC")
356  {
357  data.invtransactiontype = OFX_JRNLSEC;
358  }
359  else if (para_tag_identifier == "MARGININTEREST")
360  {
361  data.invtransactiontype = OFX_MARGININTEREST;
362  }
363  else if (para_tag_identifier == "REINVEST")
364  {
365  data.invtransactiontype = OFX_REINVEST;
366  }
367  else if (para_tag_identifier == "RETOFCAP")
368  {
369  data.invtransactiontype = OFX_RETOFCAP;
370  }
371  else if (para_tag_identifier == "SELLDEBT")
372  {
373  data.invtransactiontype = OFX_SELLDEBT;
374  }
375  else if (para_tag_identifier == "SELLMF")
376  {
377  data.invtransactiontype = OFX_SELLMF;
378  }
379  else if (para_tag_identifier == "SELLOPT")
380  {
381  data.invtransactiontype = OFX_SELLOPT;
382  }
383  else if (para_tag_identifier == "SELLOTHER")
384  {
385  data.invtransactiontype = OFX_SELLOTHER;
386  }
387  else if (para_tag_identifier == "SELLSTOCK")
388  {
389  data.invtransactiontype = OFX_SELLSTOCK;
390  }
391  else if (para_tag_identifier == "SPLIT")
392  {
393  data.invtransactiontype = OFX_SPLIT;
394  }
395  else if (para_tag_identifier == "TRANSFER")
396  {
397  data.invtransactiontype = OFX_TRANSFER;
398  }
399  else if (para_tag_identifier == "INVBANKTRAN")
400  {
401  data.invtransactiontype = OFX_INVBANKTRAN;
402  }
403  else
404  {
405  message_out(ERROR, "This should not happen, " + para_tag_identifier + " is an unknown investment transaction type");
406  data.invtransactiontype_valid = false;
407  }
408 }
409 
410 void OfxInvestmentTransactionContainer::add_attribute(const string identifier, const string value)
411 {
412  if (identifier == "UNIQUEID")
413  {
414  strncpy(data.unique_id, value.c_str(), sizeof(data.unique_id));
415  data.unique_id_valid = true;
416  }
417  else if (identifier == "UNIQUEIDTYPE")
418  {
419  strncpy(data.unique_id_type, value.c_str(), sizeof(data.unique_id_type));
420  data.unique_id_type_valid = true;
421  }
422  else if (identifier == "UNITS")
423  {
424  data.units = ofxamount_to_double(value);
425  data.units_valid = true;
426  }
427  else if (identifier == "UNITPRICE")
428  {
429  data.unitprice = ofxamount_to_double(value);
430  data.unitprice_valid = true;
431  }
432  else if (identifier == "MKTVAL")
433  {
434  data.market_value = ofxamount_to_double(value);
435  data.market_value_valid = true;
436  }
437  else if (identifier == "TOTAL")
438  {
439  data.amount = ofxamount_to_double(value);
440  data.amount_valid = true;
441  }
442  else if (identifier == "CURRATE")
443  {
444  data.currency_ratio = ofxamount_to_double(value);
445  data.currency_ratio_valid = true;
446  }
447  else if (identifier == "CURSYM")
448  {
449  strncpy(data.currency, value.c_str(), sizeof(data.currency));
450  data.currency_valid = true;
451  }
452  else if (identifier == "DTSETTLE")
453  {
454  data.date_posted = ofxdate_to_time_t(value);
455  data.date_posted_valid = true;
456  }
457  else if (identifier == "DTTRADE")
458  {
459  data.date_initiated = ofxdate_to_time_t(value);
460  data.date_initiated_valid = true;
461  }
462  else if (identifier == "COMMISSION")
463  {
464  data.commission = ofxamount_to_double(value);
465  data.commission_valid = true;
466  }
467  else if (identifier == "FEES")
468  {
469  data.fees = ofxamount_to_double(value);
470  data.fees_valid = true;
471  }
472  else if (identifier == "OLDUNITS")
473  {
474  data.oldunits = ofxamount_to_double(value);
475  data.oldunits_valid = true;
476  }
477  else if (identifier == "NEWUNITS")
478  {
479  data.newunits = ofxamount_to_double(value);
480  data.newunits_valid = true;
481  }
482  else if (identifier == "ACCRDINT")
483  {
484  data.accrued_interest = ofxamount_to_double(value);
485  data.accrued_interest_valid = true;
486  }
487  else if (identifier == "AVGCOSTBASIS")
488  {
489  data.avg_cost_basis = ofxamount_to_double(value);
490  data.avg_cost_basis_valid = true;
491  }
492  else if (identifier == "BUYTYPE" || identifier == "OPTBUYTYPE")
493  {
494  if (value == "BUY")
495  {
496  data.buy_type = data.OFX_BUY_TYPE_BUY;
497  data.buy_type_valid = true;
498  }
499  else if (value == "BUYTOCOVER")
500  {
501  data.buy_type = data.OFX_BUY_TYPE_BUYTOCOVER;
502  data.buy_type_valid = true;
503  }
504  else if (value == "BUYTOOPEN")
505  {
506  data.buy_type = data.OFX_BUY_TYPE_BUYTOOPEN;
507  data.buy_type_valid = true;
508  }
509  else if (value == "BUYTOCLOSE")
510  {
511  data.buy_type = data.OFX_BUY_TYPE_BUYTOCLOSE;
512  data.buy_type_valid = true;
513  }
514  }
515  else if (identifier == "DENOMINATOR")
516  {
517  data.denominator = ofxamount_to_double(value);
518  data.denominator_valid = true;
519  }
520  else if (identifier == "DTPAYROLL")
521  {
522  data.date_payroll = ofxdate_to_time_t(value);
523  data.date_payroll_valid = true;
524  }
525  else if (identifier == "DTPURCHASE")
526  {
527  data.date_purchase = ofxdate_to_time_t(value);
528  data.date_purchase_valid = true;
529  }
530  else if (identifier == "GAIN")
531  {
532  data.gain = ofxamount_to_double(value);
533  data.gain_valid = true;
534  }
535  else if (identifier == "FRACCASH")
536  {
537  data.cash_for_fractional = ofxamount_to_double(value);
538  data.cash_for_fractional_valid = true;
539  }
540  else if (identifier == "INCOMETYPE")
541  {
542  if (value == "CGLONG")
543  {
544  data.income_type = data.OFX_CGLONG;
545  data.income_type_valid = true;
546  }
547  else if (value == "CGSHORT")
548  {
549  data.income_type = data.OFX_CGSHORT;
550  data.income_type_valid = true;
551  }
552  else if (value == "DIV")
553  {
554  data.income_type = data.OFX_DIVIDEND;
555  data.income_type_valid = true;
556  }
557  else if (value == "INTEREST")
558  {
559  data.income_type = data.OFX_INTEREST;
560  data.income_type_valid = true;
561  }
562  else if (value == "MISC")
563  {
564  data.income_type = data.OFX_MISC;
565  data.income_type_valid = true;
566  }
567  }
568  else if (identifier == "INV401KSOURCE")
569  {
570  if (value == "PRETAX")
571  {
572  data.inv_401k_source = data.OFX_401K_SOURCE_PRETAX;
573  data.inv_401k_source_valid = true;
574  }
575  else if (value == "AFTERTAX")
576  {
577  data.inv_401k_source = data.OFX_401K_SOURCE_AFTERTAX;
578  data.inv_401k_source_valid = true;
579  }
580  else if (value == "MATCH")
581  {
582  data.inv_401k_source = data.OFX_401K_SOURCE_MATCH;
583  data.inv_401k_source_valid = true;
584  }
585  else if (value == "PROFITSHARING")
586  {
587  data.inv_401k_source = data.OFX_401K_SOURCE_PROFITSHARING;
588  data.inv_401k_source_valid = true;
589  }
590  else if (value == "ROLLOVER")
591  {
592  data.inv_401k_source = data.OFX_401K_SOURCE_ROLLOVER;
593  data.inv_401k_source_valid = true;
594  }
595  else if (value == "OTHERVEST")
596  {
597  data.inv_401k_source = data.OFX_401K_SOURCE_OTHERVEST;
598  data.inv_401k_source_valid = true;
599  }
600  else if (value == "OTHERNONVEST")
601  {
602  data.inv_401k_source = data.OFX_401K_SOURCE_OTHERNONVEST;
603  data.inv_401k_source_valid = true;
604  }
605  }
606  else if (identifier == "LOAD")
607  {
608  data.load = ofxamount_to_double(value);
609  data.load_valid = true;
610  }
611  else if (identifier == "LOANID")
612  {
613  strncpy(data.loan_id, value.c_str(), sizeof(data.loan_id));
614  data.loan_id_valid = true;
615  }
616  else if (identifier == "LOANINTEREST")
617  {
618  data.loan_interest = ofxamount_to_double(value);
619  data.loan_interest_valid = true;
620  }
621  else if (identifier == "LOANPRINCIPAL")
622  {
623  data.loan_principal = ofxamount_to_double(value);
624  data.loan_principal_valid = true;
625  }
626  else if (identifier == "MARKDOWN")
627  {
628  data.markdown = ofxamount_to_double(value);
629  data.markdown_valid = true;
630  }
631  else if (identifier == "MARKUP")
632  {
633  data.markup = ofxamount_to_double(value);
634  data.markup_valid = true;
635  }
636  else if (identifier == "NUMERATOR")
637  {
638  data.numerator = ofxamount_to_double(value);
639  data.numerator_valid = true;
640  }
641  else if (identifier == "OPTACTION")
642  {
643  if (value == "EXERCISE")
644  {
645  data.opt_action = data.OFX_OPTACTION_EXERCISE;
646  data.opt_action_valid = true;
647  }
648  else if (value == "ASSIGN")
649  {
650  data.opt_action = data.OFX_OPTACTION_ASSIGN;
651  data.opt_action_valid = true;
652  }
653  else if (value == "EXPIRE")
654  {
655  data.opt_action = data.OFX_OPTACTION_EXPIRE;
656  data.opt_action_valid = true;
657  }
658  }
659  else if (identifier == "PENALTY")
660  {
661  data.penalty = ofxamount_to_double(value);
662  data.penalty_valid = true;
663  }
664  else if (identifier == "POSTYPE")
665  {
666  if (value == "LONG")
667  {
668  data.pos_type = data.OFX_POSTYPE_LONG;
669  data.pos_type_valid = true;
670  }
671  else if (value == "SHORT")
672  {
673  data.pos_type = data.OFX_POSTYPE_SHORT;
674  data.pos_type_valid = true;
675  }
676  }
677  else if (identifier == "PRIORYEARCONTRIB")
678  {
679  if (value == "Y")
680  {
681  data.prior_year_contrib = true;
682  data.prior_year_contrib_valid = true;
683  }
684  else if (value == "N")
685  {
686  data.prior_year_contrib = false;
687  data.prior_year_contrib_valid = true;
688  }
689  }
690  else if (identifier == "RELFITID")
691  {
692  strncpy(data.related_fi_tid, value.c_str(), sizeof(data.related_fi_tid));
693  data.related_fi_tid_valid = true;
694  }
695  else if (identifier == "RELTYPE")
696  {
697  if (value == "SPREAD")
698  {
699  data.related_type = data.OFX_RELTYPE_SPREAD;
700  data.related_type_valid = true;
701  }
702  else if (value == "STRADDLE")
703  {
704  data.related_type = data.OFX_RELTYPE_STRADDLE;
705  data.related_type_valid = true;
706  }
707  else if (value == "NONE")
708  {
709  data.related_type = data.OFX_RELTYPE_NONE;
710  data.related_type_valid = true;
711  }
712  else if (value == "OTHER")
713  {
714  data.related_type = data.OFX_RELTYPE_OTHER;
715  data.related_type_valid = true;
716  }
717  }
718  else if (identifier == "SECURED")
719  {
720  if (value == "NAKED")
721  {
722  data.option_secured = data.OFX_SECURED_NAKED;
723  data.option_secured_valid = true;
724  }
725  else if (value == "COVERED")
726  {
727  data.option_secured = data.OFX_SECURED_COVERED;
728  data.option_secured_valid = true;
729  }
730  }
731  else if (identifier == "SELLREASON")
732  {
733  if (value == "CALL")
734  {
735  data.sell_reason = data.OFX_SELLREASON_CALL;
736  data.sell_reason_valid = true;
737  }
738  else if (value == "SELL")
739  {
740  data.sell_reason = data.OFX_SELLREASON_SELL;
741  data.sell_reason_valid = true;
742  }
743  else if (value == "MATURITY")
744  {
745  data.sell_reason = data.OFX_SELLREASON_MATURITY;
746  data.sell_reason_valid = true;
747  }
748  }
749  else if (identifier == "SELLTYPE" || identifier == "OPTSELLTYPE")
750  {
751  if (value == "SELL")
752  {
753  data.sell_type = data.OFX_SELL_TYPE_SELL;
754  data.sell_type_valid = true;
755  }
756  else if (value == "SELLSHORT")
757  {
758  data.sell_type = data.OFX_SELL_TYPE_SELLSHORT;
759  data.sell_type_valid = true;
760  }
761  else if (value == "SELLTOOPEN")
762  {
763  data.sell_type = data.OFX_SELL_TYPE_SELLTOOPEN;
764  data.sell_type_valid = true;
765  }
766  else if (value == "SELLTOCLOSE")
767  {
768  data.sell_type = data.OFX_SELL_TYPE_SELLTOCLOSE;
769  data.sell_type_valid = true;
770  }
771  }
772  else if (identifier == "SHPERCTRCT")
773  {
774  data.shares_per_cont = ofxamount_to_double(value);
775  data.shares_per_cont_valid = true;
776  }
777  else if (identifier == "STATEWITHHOLDING")
778  {
779  data.state_withholding = ofxamount_to_double(value);
780  data.state_withholding_valid = true;
781  }
782  else if (identifier == "SUBACCTFROM")
783  {
784  if (value == "CASH")
785  {
786  data.subacct_from = data.OFX_SUBACCT_CASH;
787  data.subacct_from_valid = true;
788  }
789  else if (value == "MARGIN")
790  {
791  data.subacct_from = data.OFX_SUBACCT_MARGIN;
792  data.subacct_from_valid = true;
793  }
794  else if (value == "SHORT")
795  {
796  data.subacct_from = data.OFX_SUBACCT_SHORT;
797  data.subacct_from_valid = true;
798  }
799  else if (value == "OTHER")
800  {
801  data.subacct_from = data.OFX_SUBACCT_OTHER;
802  data.subacct_from_valid = true;
803  }
804  }
805  else if (identifier == "SUBACCTFUND")
806  {
807  if (value == "CASH")
808  {
809  data.subacct_funding = data.OFX_SUBACCT_CASH;
810  data.subacct_funding_valid = true;
811  }
812  else if (value == "MARGIN")
813  {
814  data.subacct_funding = data.OFX_SUBACCT_MARGIN;
815  data.subacct_funding_valid = true;
816  }
817  else if (value == "SHORT")
818  {
819  data.subacct_funding = data.OFX_SUBACCT_SHORT;
820  data.subacct_funding_valid = true;
821  }
822  else if (value == "OTHER")
823  {
824  data.subacct_funding = data.OFX_SUBACCT_OTHER;
825  data.subacct_funding_valid = true;
826  }
827  }
828  else if (identifier == "SUBACCTSEC")
829  {
830  if (value == "CASH")
831  {
832  data.subacct_security = data.OFX_SUBACCT_CASH;
833  data.subacct_security_valid = true;
834  }
835  else if (value == "MARGIN")
836  {
837  data.subacct_security = data.OFX_SUBACCT_MARGIN;
838  data.subacct_security_valid = true;
839  }
840  else if (value == "SHORT")
841  {
842  data.subacct_security = data.OFX_SUBACCT_SHORT;
843  data.subacct_security_valid = true;
844  }
845  else if (value == "OTHER")
846  {
847  data.subacct_security = data.OFX_SUBACCT_OTHER;
848  data.subacct_security_valid = true;
849  }
850  }
851  else if (identifier == "SUBACCTTO")
852  {
853  if (value == "CASH")
854  {
855  data.subacct_to = data.OFX_SUBACCT_CASH;
856  data.subacct_to_valid = true;
857  }
858  else if (value == "MARGIN")
859  {
860  data.subacct_to = data.OFX_SUBACCT_MARGIN;
861  data.subacct_to_valid = true;
862  }
863  else if (value == "SHORT")
864  {
865  data.subacct_to = data.OFX_SUBACCT_SHORT;
866  data.subacct_to_valid = true;
867  }
868  else if (value == "OTHER")
869  {
870  data.subacct_to = data.OFX_SUBACCT_OTHER;
871  data.subacct_to_valid = true;
872  }
873  }
874  else if (identifier == "TAXES")
875  {
876  data.taxes = ofxamount_to_double(value);
877  data.taxes_valid = true;
878  }
879  else if (identifier == "TAXEXEMPT")
880  {
881  if (value == "Y")
882  {
883  data.tax_exempt = true;
884  data.tax_exempt_valid = true;
885  }
886  else if (value == "N")
887  {
888  data.tax_exempt = false;
889  data.tax_exempt_valid = true;
890  }
891  }
892  else if (identifier == "TFERACTION")
893  {
894  if (value == "IN")
895  {
896  data.transfer_action = data.OFX_TFERACTION_IN;
897  data.transfer_action_valid = true;
898  }
899  else if (value == "OUT")
900  {
901  data.transfer_action = data.OFX_TFERACTION_OUT;
902  data.transfer_action_valid = true;
903  }
904  }
905  else if (identifier == "UNITTYPE")
906  {
907  if (value == "SHARES")
908  {
909  data.unit_type = data.OFX_UNITTYPE_SHARES;
910  data.unit_type_valid = true;
911  }
912  else if (value == "CURRENCY")
913  {
914  data.unit_type = data.OFX_UNITTYPE_CURRENCY;
915  data.unit_type_valid = true;
916  }
917  }
918  else if (identifier == "WITHHOLDING")
919  {
920  data.withholding = ofxamount_to_double(value);
921  data.withholding_valid = true;
922  }
923  /* the following fields are <STMTTRN> elements for <INVBANKTRAN> */
924  else if ( identifier == "TRNTYPE")
925  {
926  data.transactiontype_valid = true;
927  if (value == "CREDIT")
928  {
929  data.transactiontype = OFX_CREDIT;
930  }
931  else if (value == "DEBIT")
932  {
933  data.transactiontype = OFX_DEBIT;
934  }
935  else if (value == "INT")
936  {
937  data.transactiontype = OFX_INT;
938  }
939  else if (value == "DIV")
940  {
941  data.transactiontype = OFX_DIV;
942  }
943  else if (value == "FEE")
944  {
945  data.transactiontype = OFX_FEE;
946  }
947  else if (value == "SRVCHG")
948  {
949  data.transactiontype = OFX_SRVCHG;
950  }
951  else if (value == "DEP")
952  {
953  data.transactiontype = OFX_DEP;
954  }
955  else if (value == "ATM")
956  {
957  data.transactiontype = OFX_ATM;
958  }
959  else if (value == "POS")
960  {
961  data.transactiontype = OFX_POS;
962  }
963  else if (value == "XFER")
964  {
965  data.transactiontype = OFX_XFER;
966  }
967  else if (value == "CHECK")
968  {
969  data.transactiontype = OFX_CHECK;
970  }
971  else if (value == "PAYMENT")
972  {
973  data.transactiontype = OFX_PAYMENT;
974  }
975  else if (value == "CASH")
976  {
977  data.transactiontype = OFX_CASH;
978  }
979  else if (value == "DIRECTDEP")
980  {
981  data.transactiontype = OFX_DIRECTDEP;
982  }
983  else if (value == "DIRECTDEBIT")
984  {
985  data.transactiontype = OFX_DIRECTDEBIT;
986  }
987  else if (value == "REPEATPMT")
988  {
989  data.transactiontype = OFX_REPEATPMT;
990  }
991  else if (value == "OTHER")
992  {
993  data.transactiontype = OFX_OTHER;
994  }
995  else
996  {
997  data.transactiontype_valid = false;
998  }
999  }//end TRANSTYPE
1000  else if (identifier == "TRNAMT")
1001  {
1002  data.amount = ofxamount_to_double(value);
1003  data.amount_valid = true;
1004  data.units = -data.amount;
1005  data.units_valid = true;
1006  data.unitprice = 1.00;
1007  data.unitprice_valid = true;
1008  }
1009  else if (identifier == "CHECKNUM")
1010  {
1011  strncpy(data.check_number, value.c_str(), sizeof(data.check_number));
1012  data.check_number_valid = true;
1013  }
1014  else if (identifier == "REFNUM")
1015  {
1016  strncpy(data.reference_number, value.c_str(), sizeof(data.reference_number));
1017  data.reference_number_valid = true;
1018  }
1019  else if (identifier == "SIC")
1020  {
1021  data.standard_industrial_code = atoi(value.c_str());
1022  data.standard_industrial_code_valid = true;
1023  }
1024  else if ((identifier == "PAYEEID") || (identifier == "PAYEEID2"))
1025  {
1026  strncpy(data.payee_id, value.c_str(), sizeof(data.payee_id));
1027  data.payee_id_valid = true;
1028  }
1029  else if (identifier == "NAME")
1030  {
1031  strncpy(data.name, value.c_str(), sizeof(data.name));
1032  data.name_valid = true;
1033  }
1034  else
1035  {
1036  /* Redirect unknown identifiers to the base class */
1037  OfxTransactionContainer::add_attribute(identifier, value);
1038  }
1039 }//end OfxInvestmentTransactionContainer::add_attribute
1040 
An abstraction of an account.
Definition: inc/libofx.h:276
double ofxamount_to_double(const string ofxamount)
Convert OFX amount of money to double float.
virtual int add_to_main_tree()
Add this container to the main tree.
A generic container for an OFX SGML element. Every container inherits from OfxGenericContainer.
char account_id[OFX_ACCOUNT_ID_LENGTH]
Definition: inc/libofx.h:290
Represents a generic transaction.
Various simple functions for type conversion & al.
LibOFX internal object code.
virtual void add_attribute(const string identifier, const string value)
Add data to a container object.
time_t ofxdate_to_time_t(const string ofxdate)
Convert a C++ string containing a time in OFX format to a C time_t.
virtual void add_attribute(const string identifier, const string value)
Add data to a container object.
char account_id[OFX_ACCOUNT_ID_LENGTH]
Definition: inc/libofx.h:1072
int message_out(OfxMsgType error_type, const string message)
Message output function.
void add_attribute(const string identifier, const string value)
Add data to a container object.
struct OfxAccountData * account_ptr
Definition: inc/libofx.h:1074
void add_attribute(const string identifier, const string value)
Add data to a container object.
Represents a statement for either a bank account or a credit card account.
Message IO functionality.
char currency[OFX_CURRENCY_LENGTH]
Definition: inc/libofx.h:1069
The root container. Created by the <OFX> OFX element or by the export functions.
virtual int gen_event()
Generate libofx.h events.