LibOFX
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
31extern OfxMainContainer * MainContainer;
32
33/***************************************************************************
34 * OfxTransactionContainer *
35 ***************************************************************************/
36
37OfxTransactionContainer::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 ASSIGN_STRNCPY(data.account_id, std::string(parent_statement->data.account_id));
61 }
62}
63OfxTransactionContainer::~OfxTransactionContainer()
64{
65
66}
67
69{
70 if (data.unique_id_valid == true && MainContainer != NULL)
71 {
72 data.security_data_ptr = MainContainer->find_security(data.unique_id);
73 if (data.security_data_ptr != NULL)
74 {
75 data.security_data_valid = true;
76 }
77 }
78 libofx_context->transactionCallback(data);
79 return true;
80}
81
83{
84
85 if (MainContainer != NULL)
86 {
87 return MainContainer->add_container(this);
88 }
89 else
90 {
91 return false;
92 }
93}
94
95
96void OfxTransactionContainer::add_attribute(const string identifier, const string value)
97{
98
99 if (identifier == "DTPOSTED")
100 {
102 }
103 else if (identifier == "DTUSER")
104 {
106 }
107 else if (identifier == "DTAVAIL")
108 {
110 }
111 else if (identifier == "FITID")
112 {
113 ASSIGN_STRNCPY(data.fi_id, value);
114 }
115 else if (identifier == "CORRECTFITID")
116 {
117 ASSIGN_STRNCPY(data.fi_id_corrected, value);
118 }
119 else if (identifier == "CORRECTACTION")
120 {
121 data.fi_id_correction_action_valid = true;
122 if (value == "REPLACE")
123 {
125 }
126 else if (value == "DELETE")
127 {
129 }
130 else
131 {
132 data.fi_id_correction_action_valid = false;
133 }
134 }
135 else if ((identifier == "SRVRTID") || (identifier == "SRVRTID2"))
136 {
138 }
139 else if (identifier == "MEMO" || identifier == "MEMO2")
140 {
141 ASSIGN_STRNCPY(data.memo, value);
142 }
143 else if (identifier == "CURRENCY")
144 {
146 }
147 else if (identifier == "ORIGCURRENCY")
148 {
150 }
151 else
152 {
153 /* Redirect unknown identifiers to the base class */
154 OfxGenericContainer::add_attribute(identifier, value);
155 }
156}// end OfxTransactionContainer::add_attribute()
157
158void OfxTransactionContainer::add_account(OfxAccountData * account_data)
159{
160 if (account_data->account_id_valid == true)
161 {
162 data.account_ptr = account_data;
163 ASSIGN_STRNCPY(data.account_id, std::string(account_data->account_id));
164 }
165}
166
167/***************************************************************************
168 * OfxBankTransactionContainer *
169 ***************************************************************************/
170
171OfxBankTransactionContainer::OfxBankTransactionContainer(LibofxContext *p_libofx_context, OfxGenericContainer *para_parentcontainer, string para_tag_identifier):
172 OfxTransactionContainer(p_libofx_context, para_parentcontainer, para_tag_identifier)
173{
174 ;
175}
176void OfxBankTransactionContainer::add_attribute(const string identifier, const string value)
177{
178 if ( identifier == "TRNTYPE")
179 {
180 data.transactiontype_valid = true;
181 if (value == "CREDIT")
182 {
183 data.transactiontype = OFX_CREDIT;
184 }
185 else if (value == "DEBIT")
186 {
187 data.transactiontype = OFX_DEBIT;
188 }
189 else if (value == "INT")
190 {
191 data.transactiontype = OFX_INT;
192 }
193 else if (value == "DIV")
194 {
195 data.transactiontype = OFX_DIV;
196 }
197 else if (value == "FEE")
198 {
199 data.transactiontype = OFX_FEE;
200 }
201 else if (value == "SRVCHG")
202 {
203 data.transactiontype = OFX_SRVCHG;
204 }
205 else if (value == "DEP")
206 {
207 data.transactiontype = OFX_DEP;
208 }
209 else if (value == "ATM")
210 {
211 data.transactiontype = OFX_ATM;
212 }
213 else if (value == "POS")
214 {
215 data.transactiontype = OFX_POS;
216 }
217 else if (value == "XFER")
218 {
219 data.transactiontype = OFX_XFER;
220 }
221 else if (value == "CHECK")
222 {
223 data.transactiontype = OFX_CHECK;
224 }
225 else if (value == "PAYMENT")
226 {
227 data.transactiontype = OFX_PAYMENT;
228 }
229 else if (value == "CASH")
230 {
231 data.transactiontype = OFX_CASH;
232 }
233 else if (value == "DIRECTDEP")
234 {
235 data.transactiontype = OFX_DIRECTDEP;
236 }
237 else if (value == "DIRECTDEBIT")
238 {
239 data.transactiontype = OFX_DIRECTDEBIT;
240 }
241 else if (value == "REPEATPMT")
242 {
243 data.transactiontype = OFX_REPEATPMT;
244 }
245 else if (value == "OTHER")
246 {
247 data.transactiontype = OFX_OTHER;
248 }
249 else
250 {
251 data.transactiontype_valid = false;
252 }
253 }//end TRANSTYPE
254 else if (identifier == "TRNAMT")
255 {
256 ASSIGN(data.amount, ofxamount_to_double(value));
257 ASSIGN(data.units, -data.amount);
258 ASSIGN(data.unitprice, 1.00);
259 }
260 else if (identifier == "CHECKNUM")
261 {
262 ASSIGN_STRNCPY(data.check_number, value);
263 }
264 else if (identifier == "REFNUM")
265 {
266 ASSIGN_STRNCPY(data.reference_number, value);
267 }
268 else if (identifier == "SIC")
269 {
270 ASSIGN(data.standard_industrial_code, atoi(value.c_str()));
271 }
272 else if ((identifier == "PAYEEID") || (identifier == "PAYEEID2"))
273 {
274 ASSIGN_STRNCPY(data.payee_id, value);
275 }
276 else if (identifier == "NAME")
277 {
278 ASSIGN_STRNCPY(data.name, value);
279 }
280 else
281 {
282 /* Redirect unknown identifiers to base class */
284 }
285}//end OfxBankTransactionContainer::add_attribute
286
287
288/***************************************************************************
289 * OfxInvestmentTransactionContainer *
290 ***************************************************************************/
291
292OfxInvestmentTransactionContainer::OfxInvestmentTransactionContainer(LibofxContext *p_libofx_context, OfxGenericContainer *para_parentcontainer, string para_tag_identifier):
293 OfxTransactionContainer(p_libofx_context, para_parentcontainer, para_tag_identifier)
294{
295 type = "INVESTMENT";
296 ASSIGN(data.transactiontype, OFX_OTHER);
297
298 data.invtransactiontype_valid = true;
299 if (para_tag_identifier == "BUYDEBT")
300 {
301 data.invtransactiontype = OFX_BUYDEBT;
302 }
303 else if (para_tag_identifier == "BUYMF")
304 {
305 data.invtransactiontype = OFX_BUYMF;
306 }
307 else if (para_tag_identifier == "BUYOPT")
308 {
309 data.invtransactiontype = OFX_BUYOPT;
310 }
311 else if (para_tag_identifier == "BUYOTHER")
312 {
313 data.invtransactiontype = OFX_BUYOTHER;
314 }
315 else if (para_tag_identifier == "BUYSTOCK")
316 {
317 data.invtransactiontype = OFX_BUYSTOCK;
318 }
319 else if (para_tag_identifier == "CLOSUREOPT")
320 {
321 data.invtransactiontype = OFX_CLOSUREOPT;
322 }
323 else if (para_tag_identifier == "INCOME")
324 {
325 data.invtransactiontype = OFX_INCOME;
326 }
327 else if (para_tag_identifier == "INVEXPENSE")
328 {
329 data.invtransactiontype = OFX_INVEXPENSE;
330 }
331 else if (para_tag_identifier == "JRNLFUND")
332 {
333 data.invtransactiontype = OFX_JRNLFUND;
334 }
335 else if (para_tag_identifier == "JRNLSEC")
336 {
337 data.invtransactiontype = OFX_JRNLSEC;
338 }
339 else if (para_tag_identifier == "MARGININTEREST")
340 {
341 data.invtransactiontype = OFX_MARGININTEREST;
342 }
343 else if (para_tag_identifier == "REINVEST")
344 {
345 data.invtransactiontype = OFX_REINVEST;
346 }
347 else if (para_tag_identifier == "RETOFCAP")
348 {
349 data.invtransactiontype = OFX_RETOFCAP;
350 }
351 else if (para_tag_identifier == "SELLDEBT")
352 {
353 data.invtransactiontype = OFX_SELLDEBT;
354 }
355 else if (para_tag_identifier == "SELLMF")
356 {
357 data.invtransactiontype = OFX_SELLMF;
358 }
359 else if (para_tag_identifier == "SELLOPT")
360 {
361 data.invtransactiontype = OFX_SELLOPT;
362 }
363 else if (para_tag_identifier == "SELLOTHER")
364 {
365 data.invtransactiontype = OFX_SELLOTHER;
366 }
367 else if (para_tag_identifier == "SELLSTOCK")
368 {
369 data.invtransactiontype = OFX_SELLSTOCK;
370 }
371 else if (para_tag_identifier == "SPLIT")
372 {
373 data.invtransactiontype = OFX_SPLIT;
374 }
375 else if (para_tag_identifier == "TRANSFER")
376 {
377 data.invtransactiontype = OFX_TRANSFER;
378 }
379 else if (para_tag_identifier == "INVBANKTRAN")
380 {
381 data.invtransactiontype = OFX_INVBANKTRAN;
382 }
383 else
384 {
385 message_out(ERROR, "This should not happen, " + para_tag_identifier + " is an unknown investment transaction type");
386 data.invtransactiontype_valid = false;
387 }
388}
389
390void OfxInvestmentTransactionContainer::add_attribute(const string identifier, const string value)
391{
392 if (identifier == "UNIQUEID")
393 {
394 ASSIGN_STRNCPY(data.unique_id, value);
395 }
396 else if (identifier == "UNIQUEIDTYPE")
397 {
398 ASSIGN_STRNCPY(data.unique_id_type, value);
399 }
400 else if (identifier == "UNITS")
401 {
402 ASSIGN(data.units, ofxamount_to_double(value));
403 }
404 else if (identifier == "UNITPRICE")
405 {
407 }
408 else if (identifier == "MKTVAL")
409 {
411 }
412 else if (identifier == "TOTAL")
413 {
414 ASSIGN(data.amount, ofxamount_to_double(value));
415 }
416 else if (identifier == "CURRATE")
417 {
419 }
420 else if (identifier == "CURSYM")
421 {
422 ASSIGN_STRNCPY(data.currency, value);
423 }
424 else if (identifier == "DTSETTLE")
425 {
427 }
428 else if (identifier == "DTTRADE")
429 {
431 }
432 else if (identifier == "COMMISSION")
433 {
435 }
436 else if (identifier == "FEES")
437 {
438 ASSIGN(data.fees, ofxamount_to_double(value));
439 }
440 else if (identifier == "OLDUNITS")
441 {
442 ASSIGN(data.oldunits, ofxamount_to_double(value));
443 }
444 else if (identifier == "NEWUNITS")
445 {
446 ASSIGN(data.newunits, ofxamount_to_double(value));
447 }
448 else if (identifier == "ACCRDINT")
449 {
451 }
452 else if (identifier == "AVGCOSTBASIS")
453 {
455 }
456 else if (identifier == "BUYTYPE" || identifier == "OPTBUYTYPE")
457 {
458 if (value == "BUY")
459 {
460 ASSIGN(data.buy_type, data.OFX_BUY_TYPE_BUY);
461 }
462 else if (value == "BUYTOCOVER")
463 {
464 ASSIGN(data.buy_type, data.OFX_BUY_TYPE_BUYTOCOVER);
465 }
466 else if (value == "BUYTOOPEN")
467 {
468 ASSIGN(data.buy_type, data.OFX_BUY_TYPE_BUYTOOPEN);
469 }
470 else if (value == "BUYTOCLOSE")
471 {
472 ASSIGN(data.buy_type, data.OFX_BUY_TYPE_BUYTOCLOSE);
473 }
474 }
475 else if (identifier == "DENOMINATOR")
476 {
478 }
479 else if (identifier == "DTPAYROLL")
480 {
482 }
483 else if (identifier == "DTPURCHASE")
484 {
486 }
487 else if (identifier == "GAIN")
488 {
489 ASSIGN(data.gain, ofxamount_to_double(value));
490 }
491 else if (identifier == "FRACCASH")
492 {
494 }
495 else if (identifier == "INCOMETYPE")
496 {
497 if (value == "CGLONG")
498 {
499 ASSIGN(data.income_type, data.OFX_CGLONG);
500 }
501 else if (value == "CGSHORT")
502 {
503 ASSIGN(data.income_type, data.OFX_CGSHORT);
504 }
505 else if (value == "DIV")
506 {
507 ASSIGN(data.income_type, data.OFX_DIVIDEND);
508 }
509 else if (value == "INTEREST")
510 {
511 ASSIGN(data.income_type, data.OFX_INTEREST);
512 }
513 else if (value == "MISC")
514 {
515 ASSIGN(data.income_type, data.OFX_MISC);
516 }
517 }
518 else if (identifier == "INV401KSOURCE")
519 {
520 if (value == "PRETAX")
521 {
522 ASSIGN(data.inv_401k_source, data.OFX_401K_SOURCE_PRETAX);
523 }
524 else if (value == "AFTERTAX")
525 {
526 ASSIGN(data.inv_401k_source, data.OFX_401K_SOURCE_AFTERTAX);
527 }
528 else if (value == "MATCH")
529 {
530 ASSIGN(data.inv_401k_source, data.OFX_401K_SOURCE_MATCH);
531 }
532 else if (value == "PROFITSHARING")
533 {
534 ASSIGN(data.inv_401k_source, data.OFX_401K_SOURCE_PROFITSHARING);
535 }
536 else if (value == "ROLLOVER")
537 {
538 ASSIGN(data.inv_401k_source, data.OFX_401K_SOURCE_ROLLOVER);
539 }
540 else if (value == "OTHERVEST")
541 {
542 ASSIGN(data.inv_401k_source, data.OFX_401K_SOURCE_OTHERVEST);
543 }
544 else if (value == "OTHERNONVEST")
545 {
546 ASSIGN(data.inv_401k_source, data.OFX_401K_SOURCE_OTHERNONVEST);
547 }
548 }
549 else if (identifier == "LOAD")
550 {
551 ASSIGN(data.load, ofxamount_to_double(value));
552 }
553 else if (identifier == "LOANID")
554 {
555 ASSIGN_STRNCPY(data.loan_id, value);
556 }
557 else if (identifier == "LOANINTEREST")
558 {
560 }
561 else if (identifier == "LOANPRINCIPAL")
562 {
564 }
565 else if (identifier == "MARKDOWN")
566 {
567 ASSIGN(data.markdown, ofxamount_to_double(value));
568 }
569 else if (identifier == "MARKUP")
570 {
571 ASSIGN(data.markup, ofxamount_to_double(value));
572 }
573 else if (identifier == "NUMERATOR")
574 {
576 }
577 else if (identifier == "OPTACTION")
578 {
579 if (value == "EXERCISE")
580 {
581 ASSIGN(data.opt_action, data.OFX_OPTACTION_EXERCISE);
582 }
583 else if (value == "ASSIGN")
584 {
585 ASSIGN(data.opt_action, data.OFX_OPTACTION_ASSIGN);
586 }
587 else if (value == "EXPIRE")
588 {
589 ASSIGN(data.opt_action, data.OFX_OPTACTION_EXPIRE);
590 }
591 }
592 else if (identifier == "PENALTY")
593 {
594 ASSIGN(data.penalty, ofxamount_to_double(value));
595 }
596 else if (identifier == "POSTYPE")
597 {
598 if (value == "LONG")
599 {
600 ASSIGN(data.pos_type, data.OFX_POSTYPE_LONG);
601 }
602 else if (value == "SHORT")
603 {
604 ASSIGN(data.pos_type, data.OFX_POSTYPE_SHORT);
605 }
606 }
607 else if (identifier == "PRIORYEARCONTRIB")
608 {
609 if (value == "Y")
610 {
611 ASSIGN(data.prior_year_contrib, true);
612 }
613 else if (value == "N")
614 {
615 ASSIGN(data.prior_year_contrib, false);
616 }
617 }
618 else if (identifier == "RELFITID")
619 {
620 ASSIGN_STRNCPY(data.related_fi_tid, value);
621 }
622 else if (identifier == "RELTYPE")
623 {
624 if (value == "SPREAD")
625 {
626 ASSIGN(data.related_type, data.OFX_RELTYPE_SPREAD);
627 }
628 else if (value == "STRADDLE")
629 {
630 ASSIGN(data.related_type, data.OFX_RELTYPE_STRADDLE);
631 }
632 else if (value == "NONE")
633 {
634 ASSIGN(data.related_type, data.OFX_RELTYPE_NONE);
635 }
636 else if (value == "OTHER")
637 {
638 ASSIGN(data.related_type, data.OFX_RELTYPE_OTHER);
639 }
640 }
641 else if (identifier == "SECURED")
642 {
643 if (value == "NAKED")
644 {
645 ASSIGN(data.option_secured, data.OFX_SECURED_NAKED);
646 }
647 else if (value == "COVERED")
648 {
649 ASSIGN(data.option_secured, data.OFX_SECURED_COVERED);
650 }
651 }
652 else if (identifier == "SELLREASON")
653 {
654 if (value == "CALL")
655 {
656 ASSIGN(data.sell_reason, data.OFX_SELLREASON_CALL);
657 }
658 else if (value == "SELL")
659 {
660 ASSIGN(data.sell_reason, data.OFX_SELLREASON_SELL);
661 }
662 else if (value == "MATURITY")
663 {
664 ASSIGN(data.sell_reason, data.OFX_SELLREASON_MATURITY);
665 }
666 }
667 else if (identifier == "SELLTYPE" || identifier == "OPTSELLTYPE")
668 {
669 if (value == "SELL")
670 {
671 ASSIGN(data.sell_type, data.OFX_SELL_TYPE_SELL);
672 }
673 else if (value == "SELLSHORT")
674 {
675 ASSIGN(data.sell_type, data.OFX_SELL_TYPE_SELLSHORT);
676 }
677 else if (value == "SELLTOOPEN")
678 {
679 ASSIGN(data.sell_type, data.OFX_SELL_TYPE_SELLTOOPEN);
680 }
681 else if (value == "SELLTOCLOSE")
682 {
683 ASSIGN(data.sell_type, data.OFX_SELL_TYPE_SELLTOCLOSE);
684 }
685 }
686 else if (identifier == "SHPERCTRCT")
687 {
689 }
690 else if (identifier == "STATEWITHHOLDING")
691 {
693 }
694 else if (identifier == "SUBACCTFROM")
695 {
696 if (value == "CASH")
697 {
698 ASSIGN(data.subacct_from, data.OFX_SUBACCT_CASH);
699 }
700 else if (value == "MARGIN")
701 {
702 ASSIGN(data.subacct_from, data.OFX_SUBACCT_MARGIN);
703 }
704 else if (value == "SHORT")
705 {
706 ASSIGN(data.subacct_from, data.OFX_SUBACCT_SHORT);
707 }
708 else if (value == "OTHER")
709 {
710 ASSIGN(data.subacct_from, data.OFX_SUBACCT_OTHER);
711 }
712 }
713 else if (identifier == "SUBACCTFUND")
714 {
715 if (value == "CASH")
716 {
717 ASSIGN(data.subacct_funding, data.OFX_SUBACCT_CASH);
718 }
719 else if (value == "MARGIN")
720 {
721 ASSIGN(data.subacct_funding, data.OFX_SUBACCT_MARGIN);
722 }
723 else if (value == "SHORT")
724 {
725 ASSIGN(data.subacct_funding, data.OFX_SUBACCT_SHORT);
726 }
727 else if (value == "OTHER")
728 {
729 ASSIGN(data.subacct_funding, data.OFX_SUBACCT_OTHER);
730 }
731 }
732 else if (identifier == "SUBACCTSEC")
733 {
734 if (value == "CASH")
735 {
736 ASSIGN(data.subacct_security, data.OFX_SUBACCT_CASH);
737 }
738 else if (value == "MARGIN")
739 {
740 ASSIGN(data.subacct_security, data.OFX_SUBACCT_MARGIN);
741 }
742 else if (value == "SHORT")
743 {
744 ASSIGN(data.subacct_security, data.OFX_SUBACCT_SHORT);
745 }
746 else if (value == "OTHER")
747 {
748 ASSIGN(data.subacct_security, data.OFX_SUBACCT_OTHER);
749 }
750 }
751 else if (identifier == "SUBACCTTO")
752 {
753 if (value == "CASH")
754 {
755 ASSIGN(data.subacct_to, data.OFX_SUBACCT_CASH);
756 }
757 else if (value == "MARGIN")
758 {
759 ASSIGN(data.subacct_to, data.OFX_SUBACCT_MARGIN);
760 }
761 else if (value == "SHORT")
762 {
763 ASSIGN(data.subacct_to, data.OFX_SUBACCT_SHORT);
764 }
765 else if (value == "OTHER")
766 {
767 ASSIGN(data.subacct_to, data.OFX_SUBACCT_OTHER);
768 }
769 }
770 else if (identifier == "TAXES")
771 {
772 ASSIGN(data.taxes, ofxamount_to_double(value));
773 }
774 else if (identifier == "TAXEXEMPT")
775 {
776 if (value == "Y")
777 {
778 ASSIGN(data.tax_exempt, true);
779 }
780 else if (value == "N")
781 {
782 ASSIGN(data.tax_exempt, false);
783 }
784 }
785 else if (identifier == "TFERACTION")
786 {
787 if (value == "IN")
788 {
789 ASSIGN(data.transfer_action, data.OFX_TFERACTION_IN);
790 }
791 else if (value == "OUT")
792 {
793 ASSIGN(data.transfer_action, data.OFX_TFERACTION_OUT);
794 }
795 }
796 else if (identifier == "UNITTYPE")
797 {
798 if (value == "SHARES")
799 {
800 ASSIGN(data.unit_type, data.OFX_UNITTYPE_SHARES);
801 }
802 else if (value == "CURRENCY")
803 {
804 ASSIGN(data.unit_type, data.OFX_UNITTYPE_CURRENCY);
805 }
806 }
807 else if (identifier == "WITHHOLDING")
808 {
810 }
811 /* the following fields are <STMTTRN> elements for <INVBANKTRAN> */
812 else if ( identifier == "TRNTYPE")
813 {
814 data.transactiontype_valid = true;
815 if (value == "CREDIT")
816 {
817 data.transactiontype = OFX_CREDIT;
818 }
819 else if (value == "DEBIT")
820 {
821 data.transactiontype = OFX_DEBIT;
822 }
823 else if (value == "INT")
824 {
825 data.transactiontype = OFX_INT;
826 }
827 else if (value == "DIV")
828 {
829 data.transactiontype = OFX_DIV;
830 }
831 else if (value == "FEE")
832 {
833 data.transactiontype = OFX_FEE;
834 }
835 else if (value == "SRVCHG")
836 {
837 data.transactiontype = OFX_SRVCHG;
838 }
839 else if (value == "DEP")
840 {
841 data.transactiontype = OFX_DEP;
842 }
843 else if (value == "ATM")
844 {
845 data.transactiontype = OFX_ATM;
846 }
847 else if (value == "POS")
848 {
849 data.transactiontype = OFX_POS;
850 }
851 else if (value == "XFER")
852 {
853 data.transactiontype = OFX_XFER;
854 }
855 else if (value == "CHECK")
856 {
857 data.transactiontype = OFX_CHECK;
858 }
859 else if (value == "PAYMENT")
860 {
861 data.transactiontype = OFX_PAYMENT;
862 }
863 else if (value == "CASH")
864 {
865 data.transactiontype = OFX_CASH;
866 }
867 else if (value == "DIRECTDEP")
868 {
869 data.transactiontype = OFX_DIRECTDEP;
870 }
871 else if (value == "DIRECTDEBIT")
872 {
873 data.transactiontype = OFX_DIRECTDEBIT;
874 }
875 else if (value == "REPEATPMT")
876 {
877 data.transactiontype = OFX_REPEATPMT;
878 }
879 else if (value == "OTHER")
880 {
881 data.transactiontype = OFX_OTHER;
882 }
883 else
884 {
885 data.transactiontype_valid = false;
886 }
887 }//end TRANSTYPE
888 else if (identifier == "TRNAMT")
889 {
890 ASSIGN(data.amount, ofxamount_to_double(value));
891 ASSIGN(data.units, -data.amount);
892 ASSIGN(data.unitprice, 1.00);
893 }
894 else if (identifier == "CHECKNUM")
895 {
896 ASSIGN_STRNCPY(data.check_number, value);
897 }
898 else if (identifier == "REFNUM")
899 {
900 ASSIGN_STRNCPY(data.reference_number, value);
901 }
902 else if (identifier == "SIC")
903 {
904 ASSIGN(data.standard_industrial_code, atoi(value.c_str()));
905 }
906 else if ((identifier == "PAYEEID") || (identifier == "PAYEEID2"))
907 {
908 ASSIGN_STRNCPY(data.payee_id, value);
909 }
910 else if (identifier == "NAME")
911 {
912 ASSIGN_STRNCPY(data.name, value);
913 }
914 else
915 {
916 /* Redirect unknown identifiers to the base class */
918 }
919}//end OfxInvestmentTransactionContainer::add_attribute
920
void add_attribute(const string identifier, const string value)
Add data to a container object.
A generic container for an OFX SGML element. Every container inherits from OfxGenericContainer.
virtual void add_attribute(const string identifier, const string value)
Add data to a container object.
void add_attribute(const string identifier, const string value)
Add data to a container object.
The root container. Created by the <OFX> OFX element or by the export functions.
Represents a statement for either a bank account or a credit card account.
Represents a generic transaction.
virtual int gen_event()
Generate libofx.h events.
virtual void add_attribute(const string identifier, const string value)
Add data to a container object.
virtual int add_to_main_tree()
Add this container to the main tree.
Main header file containing the LibOfx API.
@ REPLACE
Definition libofx.h:672
@ DELETE
Definition libofx.h:670
@ OFX_XFER
Definition libofx.h:633
@ OFX_POS
Definition libofx.h:632
@ OFX_DIRECTDEP
Definition libofx.h:637
@ OFX_PAYMENT
Definition libofx.h:635
@ OFX_CASH
Definition libofx.h:636
@ OFX_CREDIT
Definition libofx.h:624
@ OFX_ATM
Definition libofx.h:631
@ OFX_OTHER
Definition libofx.h:640
@ OFX_INT
Definition libofx.h:626
@ OFX_CHECK
Definition libofx.h:634
@ OFX_SRVCHG
Definition libofx.h:629
@ OFX_DEBIT
Definition libofx.h:625
@ OFX_DIRECTDEBIT
Definition libofx.h:638
@ OFX_FEE
Definition libofx.h:628
@ OFX_DEP
Definition libofx.h:630
@ OFX_DIV
Definition libofx.h:627
@ OFX_REPEATPMT
Definition libofx.h:639
@ OFX_SELLOTHER
Definition libofx.h:661
@ OFX_MARGININTEREST
Definition libofx.h:655
@ OFX_BUYOPT
Definition libofx.h:647
@ OFX_CLOSUREOPT
Definition libofx.h:650
@ OFX_JRNLSEC
Definition libofx.h:654
@ OFX_JRNLFUND
Definition libofx.h:653
@ OFX_INVBANKTRAN
Definition libofx.h:665
@ OFX_BUYMF
Definition libofx.h:646
@ OFX_SPLIT
Definition libofx.h:663
@ OFX_REINVEST
Definition libofx.h:656
@ OFX_INVEXPENSE
Definition libofx.h:652
@ OFX_SELLSTOCK
Definition libofx.h:662
@ OFX_RETOFCAP
Definition libofx.h:657
@ OFX_BUYSTOCK
Definition libofx.h:649
@ OFX_BUYOTHER
Definition libofx.h:648
@ OFX_SELLDEBT
Definition libofx.h:658
@ OFX_BUYDEBT
Definition libofx.h:645
@ OFX_INCOME
Definition libofx.h:651
@ OFX_TRANSFER
Definition libofx.h:664
@ OFX_SELLMF
Definition libofx.h:659
@ OFX_SELLOPT
Definition libofx.h:660
int message_out(OfxMsgType error_type, const string message)
Message output function.
Definition messages.cpp:61
Message IO functionality.
@ ERROR
Definition messages.hh:34
LibOFX internal object code.
time_t ofxdate_to_time_t(const string &ofxdate)
Convert a C++ string containing a time in OFX format to a C time_t.
double ofxamount_to_double(const string ofxamount)
Convert OFX amount of money to double float.
Various simple functions for type conversion & al.
#define ASSIGN_STRNCPY(DEST, VALUE)
#define ASSIGN(DEST, VALUE)
An abstraction of an account.
Definition libofx.h:277
char account_id[OFX_ACCOUNT_ID_LENGTH]
Definition libofx.h:290
double market_value
Definition libofx.h:821
char fi_id[OFX_FITID_LENGTH]
Definition libofx.h:726
char unique_id_type[OFX_UNIQUE_ID_TYPE_LENGTH]
Definition libofx.h:740
time_t date_funds_available
Definition libofx.h:762
FiIdCorrectionAction fi_id_correction_action
Definition libofx.h:775
long int standard_industrial_code
Definition libofx.h:794
char currency[OFX_CURRENCY_LENGTH]
Definition libofx.h:825
char unique_id[OFX_UNIQUE_ID_LENGTH]
Definition libofx.h:738
char memo[OFX_MEMO2_LENGTH]
Definition libofx.h:805
int security_data_valid
Definition libofx.h:745
int amounts_are_foreign_currency
Definition libofx.h:835
char related_fi_tid[OFX_FITID_LENGTH]
Definition libofx.h:944
double denominator
Definition libofx.h:859
char account_id[OFX_ACCOUNT_ID_LENGTH]
Definition libofx.h:690
time_t date_purchase
Definition libofx.h:865
double state_withholding
Definition libofx.h:990
double commission
Definition libofx.h:808
char name[OFX_TRANSACTION_NAME_LENGTH]
Definition libofx.h:801
time_t date_posted
Definition libofx.h:747
double currency_ratio
Definition libofx.h:829
int transactiontype_valid
Definition libofx.h:698
time_t date_payroll
Definition libofx.h:862
char fi_id_corrected[OFX_FITID_LENGTH]
Definition libofx.h:770
time_t date_initiated
Definition libofx.h:754
double cash_for_fractional
Definition libofx.h:871
char loan_id[OFX_LOANID_LENGTH]
Definition libofx.h:901
double loan_principal
Definition libofx.h:907
char payee_id[OFX_SVRTID2_LENGTH]
Definition libofx.h:798
char server_transaction_id[OFX_SVRTID2_LENGTH]
Definition libofx.h:780
double accrued_interest
Definition libofx.h:842
double shares_per_cont
Definition libofx.h:986
double loan_interest
Definition libofx.h:904
char check_number[OFX_CHECK_NUMBER_LENGTH]
Definition libofx.h:786
char reference_number[OFX_REFERENCE_NUMBER_LENGTH]
Definition libofx.h:791
double avg_cost_basis
Definition libofx.h:845
struct OfxAccountData * account_ptr
Definition libofx.h:693