00001
00002
00003
00004
00005
00006
00022
00023
00024
00025
00026
00027
00028
00029
00030
#include <iostream>
00031
#include <iomanip>
00032
#include <string>
00033
#include "libofx.h"
00034
#include <stdio.h>
00035
#include <config.h>
00036
00037
#include "cmdline.h"
00038
00039
using namespace std;
00040
00041
00042
int ofx_proc_security_cb(
struct OfxSecurityData data,
void * security_data)
00043 {
00044
char dest_string[255];
00045 cout<<
"ofx_proc_security():\n";
00046
if(data.
unique_id_valid==
true){
00047 cout<<
" Unique ID of the security being traded: "<<data.
unique_id<<
"\n";
00048 }
00049
if(data.
unique_id_type_valid==
true){
00050 cout<<
" Format of the Unique ID: "<<data.
unique_id_type<<
"\n";
00051 }
00052
if(data.
secname_valid==
true){
00053 cout<<
" Name of the security: "<<data.
secname<<
"\n";
00054 }
00055
if(data.
ticker_valid==
true){
00056 cout<<
" Ticker symbol: "<<data.
ticker<<
"\n";
00057 }
00058
if(data.
unitprice_valid==
true){
00059 cout<<
" Price of each unit of the security: "<<data.
unitprice<<
"\n";
00060 }
00061
if(data.
date_unitprice_valid==
true){
00062 strftime(dest_string,
sizeof(dest_string),
"%c %Z",localtime(&(data.
date_unitprice)));
00063 cout<<
" Date as of which the unitprice is valid: "<<dest_string<<
"\n";
00064 }
00065
if(data.
currency_valid==
true){
00066 cout<<
" Currency of the unitprice: "<<data.
currency<<
"\n";
00067 }
00068
if(data.
memo_valid==
true){
00069 cout<<
" Extra transaction information (memo): "<<data.
memo<<
"\n";
00070 }
00071 cout<<
"\n";
00072
return 0;
00073 }
00074
00075
int ofx_proc_transaction_cb(
struct OfxTransactionData data,
void * transaction_data)
00076 {
00077
char dest_string[255];
00078 cout<<
"ofx_proc_transaction():\n";
00079
00080
if(data.
account_id_valid==
true){
00081 cout<<
" Account ID : "<<data.
account_id<<
"\n";
00082 }
00083
00084
if(data.
transactiontype_valid==
true)
00085 {
00086
if(data.
transactiontype==
OFX_CREDIT)
00087 strncpy(dest_string,
"CREDIT: Generic credit",
sizeof(dest_string));
00088
else if (data.
transactiontype==
OFX_DEBIT)
00089 strncpy(dest_string,
"DEBIT: Generic debit",
sizeof(dest_string));
00090
else if (data.
transactiontype==
OFX_INT)
00091 strncpy(dest_string,
"INT: Interest earned or paid (Note: Depends on signage of amount)",
sizeof(dest_string));
00092
else if (data.
transactiontype==
OFX_DIV)
00093 strncpy(dest_string,
"DIV: Dividend",
sizeof(dest_string));
00094
else if (data.
transactiontype==
OFX_FEE)
00095 strncpy(dest_string,
"FEE: FI fee",
sizeof(dest_string));
00096
else if (data.
transactiontype==
OFX_SRVCHG)
00097 strncpy(dest_string,
"SRVCHG: Service charge",
sizeof(dest_string));
00098
else if (data.
transactiontype==
OFX_DEP)
00099 strncpy(dest_string,
"DEP: Deposit",
sizeof(dest_string));
00100
else if (data.
transactiontype==
OFX_ATM)
00101 strncpy(dest_string,
"ATM: ATM debit or credit (Note: Depends on signage of amount)",
sizeof(dest_string));
00102
else if (data.
transactiontype==
OFX_POS)
00103 strncpy(dest_string,
"POS: Point of sale debit or credit (Note: Depends on signage of amount)",
sizeof(dest_string));
00104
else if (data.
transactiontype==
OFX_XFER)
00105 strncpy(dest_string,
"XFER: Transfer",
sizeof(dest_string));
00106
else if (data.
transactiontype==
OFX_CHECK)
00107 strncpy(dest_string,
"CHECK: Check",
sizeof(dest_string));
00108
else if (data.
transactiontype==
OFX_PAYMENT)
00109 strncpy(dest_string,
"PAYMENT: Electronic payment",
sizeof(dest_string));
00110
else if (data.
transactiontype==
OFX_CASH)
00111 strncpy(dest_string,
"CASH: Cash withdrawal",
sizeof(dest_string));
00112
else if (data.
transactiontype==
OFX_DIRECTDEP)
00113 strncpy(dest_string,
"DIRECTDEP: Direct deposit",
sizeof(dest_string));
00114
else if (data.
transactiontype==
OFX_DIRECTDEBIT)
00115 strncpy(dest_string,
"DIRECTDEBIT: Merchant initiated debit",
sizeof(dest_string));
00116
else if (data.
transactiontype==
OFX_REPEATPMT)
00117 strncpy(dest_string,
"REPEATPMT: Repeating payment/standing order",
sizeof(dest_string));
00118
else if (data.
transactiontype==
OFX_OTHER)
00119 strncpy(dest_string,
"OTHER: Other",
sizeof(dest_string));
00120
else
00121 strncpy(dest_string,
"Unknown transaction type",
sizeof(dest_string));
00122 cout<<
" Transaction type: "<<dest_string<<
"\n";
00123 }
00124
00125
00126
if(data.
date_initiated_valid==
true){
00127 strftime(dest_string,
sizeof(dest_string),
"%c %Z",localtime(&(data.
date_initiated)));
00128 cout<<
" Date initiated: "<<dest_string<<
"\n";
00129 }
00130
if(data.
date_posted_valid==
true){
00131 strftime(dest_string,
sizeof(dest_string),
"%c %Z",localtime(&(data.
date_posted)));
00132 cout<<
" Date posted: "<<dest_string<<
"\n";
00133 }
00134
if(data.
date_funds_available_valid==
true){
00135 strftime(dest_string,
sizeof(dest_string),
"%c %Z",localtime(&(data.
date_funds_available)));
00136 cout<<
" Date funds are available: "<<dest_string<<
"\n";
00137 }
00138
if(data.
amount_valid==
true){
00139 cout<<
" Total money amount: "<<setiosflags(ios::fixed)<<setiosflags(ios::showpoint)<<setprecision(2)<<data.
amount<<
"\n";
00140 }
00141
if(data.
units_valid==
true){
00142 cout<<
" # of units: "<<setiosflags(ios::fixed)<<setiosflags(ios::showpoint)<<setprecision(2)<<data.
units<<
"\n";
00143 }
00144
if(data.
unitprice_valid==
true){
00145 cout<<
" Unit price: "<<setiosflags(ios::fixed)<<setiosflags(ios::showpoint)<<setprecision(2)<<data.
unitprice<<
"\n";
00146 }
00147
if(data.
fi_id_valid==
true){
00148 cout<<
" Financial institution's ID for this transaction: "<<data.
fi_id<<
"\n";
00149 }
00150
if(data.
fi_id_corrected_valid==
true){
00151 cout<<
" Financial institution ID replaced or corrected by this transaction: "<<data.
fi_id_corrected<<
"\n";
00152 }
00153
if(data.
fi_id_correction_action_valid==
true){
00154 cout<<
" Action to take on the corrected transaction: ";
00155
if (data.
fi_id_correction_action==
DELETE)
00156 cout<<
"DELETE\n";
00157
else if (data.
fi_id_correction_action==
REPLACE)
00158 cout<<
"REPLACE\n";
00159
else
00160 cout<<
"ofx_proc_transaction(): This should not happen!\n";
00161 }
00162
if(data.
invtransactiontype_valid==
true){
00163 cout<<
" Investment transaction type: ";
00164
if (data.
invtransactiontype==
OFX_BUYDEBT)
00165 strncpy(dest_string,
"BUYDEBT (Buy debt security)",
sizeof(dest_string));
00166
else if (data.
invtransactiontype==
OFX_BUYMF)
00167 strncpy(dest_string,
"BUYMF (Buy mutual fund)",
sizeof(dest_string));
00168
else if (data.
invtransactiontype==
OFX_BUYOPT)
00169 strncpy(dest_string,
"BUYOPT (Buy option)",
sizeof(dest_string));
00170
else if (data.
invtransactiontype==
OFX_BUYOTHER)
00171 strncpy(dest_string,
"BUYOTHER (Buy other security type)",
sizeof(dest_string));
00172
else if (data.
invtransactiontype==
OFX_BUYSTOCK)
00173 strncpy(dest_string,
"BUYSTOCK (Buy stock))",
sizeof(dest_string));
00174
else if (data.
invtransactiontype==
OFX_CLOSUREOPT)
00175 strncpy(dest_string,
"CLOSUREOPT (Close a position for an option)",
sizeof(dest_string));
00176
else if (data.
invtransactiontype==
OFX_INCOME)
00177 strncpy(dest_string,
"INCOME (Investment income is realized as cash into the investment account)",
sizeof(dest_string));
00178
else if (data.
invtransactiontype==
OFX_INVEXPENSE)
00179 strncpy(dest_string,
"INVEXPENSE (Misc investment expense that is associated with a specific security)",
sizeof(dest_string));
00180
else if (data.
invtransactiontype==
OFX_JRNLFUND)
00181 strncpy(dest_string,
"JRNLFUND (Journaling cash holdings between subaccounts within the same investment account)",
sizeof(dest_string));
00182
else if (data.
invtransactiontype==
OFX_MARGININTEREST)
00183 strncpy(dest_string,
"MARGININTEREST (Margin interest expense)",
sizeof(dest_string));
00184
else if (data.
invtransactiontype==
OFX_REINVEST)
00185 strncpy(dest_string,
"REINVEST (Reinvestment of income)",
sizeof(dest_string));
00186
else if (data.
invtransactiontype==
OFX_RETOFCAP)
00187 strncpy(dest_string,
"RETOFCAP (Return of capital)",
sizeof(dest_string));
00188
else if (data.
invtransactiontype==
OFX_SELLDEBT)
00189 strncpy(dest_string,
"SELLDEBT (Sell debt security. Used when debt is sold, called, or reached maturity)",
sizeof(dest_string));
00190
else if (data.
invtransactiontype==
OFX_SELLMF)
00191 strncpy(dest_string,
"SELLMF (Sell mutual fund)",
sizeof(dest_string));
00192
else if (data.
invtransactiontype==
OFX_SELLOPT)
00193 strncpy(dest_string,
"SELLOPT (Sell option)",
sizeof(dest_string));
00194
else if (data.
invtransactiontype==
OFX_SELLOTHER)
00195 strncpy(dest_string,
"SELLOTHER (Sell other type of security)",
sizeof(dest_string));
00196
else if (data.
invtransactiontype==
OFX_SELLSTOCK)
00197 strncpy(dest_string,
"SELLSTOCK (Sell stock)",
sizeof(dest_string));
00198
else if (data.
invtransactiontype==
OFX_SPLIT)
00199 strncpy(dest_string,
"SPLIT (Stock or mutial fund split)",
sizeof(dest_string));
00200
else if (data.
invtransactiontype==
OFX_TRANSFER)
00201 strncpy(dest_string,
"TRANSFER (Transfer holdings in and out of the investment account)",
sizeof(dest_string));
00202
else
00203 strncpy(dest_string,
"ERROR, this investment transaction type is unknown. This is a bug in ofxdump",
sizeof(dest_string));
00204
00205 cout<<dest_string<<
"\n";
00206 }
00207
if(data.
unique_id_valid==
true){
00208 cout<<
" Unique ID of the security being traded: "<<data.
unique_id<<
"\n";
00209 }
00210
if(data.
unique_id_type_valid==
true){
00211 cout<<
" Format of the Unique ID: "<<data.
unique_id_type<<
"\n";
00212 }
00213
if(data.
security_data_valid==
true){
00214 ofx_proc_security_cb(*(data.
security_data_ptr), NULL );
00215 }
00216
00217
if(data.
server_transaction_id_valid==
true){
00218 cout<<
" Server's transaction ID (confirmation number): "<<data.
server_transaction_id<<
"\n";
00219 }
00220
if(data.
check_number_valid==
true){
00221 cout<<
" Check number: "<<data.
check_number<<
"\n";
00222 }
00223
if(data.
reference_number_valid==
true){
00224 cout<<
" Reference number: "<<data.
reference_number<<
"\n";
00225 }
00226
if(data.
standard_industrial_code_valid==
true){
00227 cout<<
" Standard Industrial Code: "<<data.
standard_industrial_code<<
"\n";
00228 }
00229
if(data.
payee_id_valid==
true){
00230 cout<<
" Payee_id: "<<data.
payee_id<<
"\n";
00231 }
00232
if(data.
name_valid==
true){
00233 cout<<
" Name of payee or transaction description: "<<data.
name<<
"\n";
00234 }
00235
if(data.
memo_valid==
true){
00236 cout<<
" Extra transaction information (memo): "<<data.
memo<<
"\n";
00237 }
00238 cout<<
"\n";
00239
return 0;
00240 }
00241
00242
int ofx_proc_statement_cb(
struct OfxStatementData data,
void * statement_data)
00243 {
00244
char dest_string[255];
00245 cout<<
"ofx_proc_statement():\n";
00246
if(data.
currency_valid==
true){
00247 cout<<
" Currency: "<<data.
currency<<
"\n";
00248 }
00249
if(data.
account_id_valid==
true){
00250 cout<<
" Account ID: "<<data.
account_id<<
"\n";
00251 }
00252
if(data.
date_start_valid==
true){
00253 strftime(dest_string,
sizeof(dest_string),
"%c %Z",localtime(&(data.
date_start)));
00254 cout<<
" Start date of this statement: "<<dest_string<<
"\n";
00255 }
00256
if(data.
date_end_valid==
true){
00257 strftime(dest_string,
sizeof(dest_string),
"%c %Z",localtime(&(data.
date_end)));
00258 cout<<
" End date of this statement: "<<dest_string<<
"\n";
00259 }
00260
if(data.
ledger_balance_valid==
true){
00261 cout<<
" Ledger balance: "<<setiosflags(ios::fixed)<<setiosflags(ios::showpoint)<<setprecision(2)<<data.
ledger_balance<<
"\n";
00262 }
00263
if(data.
ledger_balance_date_valid==
true){
00264 strftime(dest_string,
sizeof(dest_string),
"%c %Z",localtime(&(data.
ledger_balance_date)));
00265 cout<<
" Ledger balance date: "<<dest_string<<
"\n";
00266 }
00267
if(data.
available_balance_valid==
true){
00268 cout<<
" Available balance: "<<setiosflags(ios::fixed)<<setiosflags(ios::showpoint)<<setprecision(2)<<data.
available_balance<<
"\n";
00269 }
00270
if(data.
available_balance_date_valid==
true){
00271 strftime(dest_string,
sizeof(dest_string),
"%c %Z",localtime(&(data.
available_balance_date)));
00272 cout<<
" Ledger balance date: "<<dest_string<<
"\n";
00273 }
00274
if(data.
marketing_info_valid==
true){
00275 cout<<
" Marketing information: "<<data.
marketing_info<<
"\n";
00276 }
00277 cout<<
"\n";
00278
return 0;
00279 }
00280
00281
int ofx_proc_account_cb(
struct OfxAccountData data,
void * account_data)
00282 {
00283 cout<<
"ofx_proc_account():\n";
00284
if(data.
account_id_valid==
true){
00285 cout<<
" Account ID: "<<data.
account_id<<
"\n";
00286 cout<<
" Account name: "<<data.
account_name<<
"\n";
00287 }
00288
if(data.
account_type_valid==
true){
00289 cout<<
" Account type: ";
00290
switch(data.
account_type){
00291
case OfxAccountData::OFX_CHECKING : cout<<
"CHECKING\n";
00292
break;
00293
case OfxAccountData::OFX_SAVINGS : cout<<
"SAVINGS\n";
00294
break;
00295
case OfxAccountData::OFX_MONEYMRKT : cout<<
"MONEYMRKT\n";
00296
break;
00297
case OfxAccountData::OFX_CREDITLINE : cout<<
"CREDITLINE\n";
00298
break;
00299
case OfxAccountData::OFX_CMA : cout<<
"CMA\n";
00300
break;
00301
case OfxAccountData::OFX_CREDITCARD : cout<<
"CREDITCARD\n";
00302
break;
00303
case OfxAccountData::OFX_INVESTMENT : cout<<
"INVESTMENT\n";
00304
break;
00305
default: cout<<
"ofx_proc_account() WRITEME: This is an unknown account type!";
00306 }
00307 }
00308
if(data.
currency_valid==
true){
00309 cout<<
" Currency: "<<data.
currency<<
"\n";
00310 }
00311
00312 cout<<
"\n";
00313
return 0;
00314 }
00315
00316
00317
00318
int ofx_proc_status_cb(
struct OfxStatusData data,
void * status_data)
00319 {
00320 cout<<
"ofx_proc_status():\n";
00321
if(data.
ofx_element_name_valid==
true){
00322 cout<<
" Ofx entity this status is relevent to: "<< data.
ofx_element_name<<
" \n";
00323 }
00324
if(data.
severity_valid==
true){
00325 cout<<
" Severity: ";
00326
switch(data.
severity){
00327
case OfxStatusData::INFO : cout<<
"INFO\n";
00328
break;
00329
case OfxStatusData::WARN : cout<<
"WARN\n";
00330
break;
00331
case OfxStatusData::ERROR : cout<<
"ERROR\n";
00332
break;
00333
default: cout<<
"WRITEME: Unknown status severity!\n";
00334 }
00335 }
00336
if(data.
code_valid==
true){
00337 cout<<
" Code: "<<data.
code<<
", name: "<<data.
name<<
"\n Description: "<<data.
description<<
"\n";
00338 }
00339
if(data.
server_message_valid==
true){
00340 cout<<
" Server Message: "<<data.
server_message<<
"\n";
00341 }
00342 cout<<
"\n";
00343
return 0;
00344 }
00345
00346
00347 int main (
int argc,
char *argv[])
00348 {
00350
extern int ofx_PARSER_msg;
00351
extern int ofx_DEBUG_msg;
00352
extern int ofx_WARNING_msg;
00353
extern int ofx_ERROR_msg;
00354
extern int ofx_INFO_msg;
00355
extern int ofx_STATUS_msg;
00356
00357 gengetopt_args_info args_info;
00358
00359
00360
if (cmdline_parser (argc, argv, &args_info) != 0)
00361 exit(1) ;
00362
00363
00364
00365
00366
00367
00368 args_info.msg_parser_flag ?
ofx_PARSER_msg =
true :
ofx_PARSER_msg =
false;
00369 args_info.msg_debug_flag ?
ofx_DEBUG_msg =
true :
ofx_DEBUG_msg =
false;
00370 args_info.msg_warning_flag ?
ofx_WARNING_msg =
true :
ofx_WARNING_msg =
false;
00371 args_info.msg_error_flag ?
ofx_ERROR_msg =
true :
ofx_ERROR_msg =
false;
00372 args_info.msg_info_flag ?
ofx_INFO_msg =
true :
ofx_INFO_msg =
false;
00373 args_info.msg_status_flag ?
ofx_STATUS_msg =
true :
ofx_STATUS_msg;
00374
00375
if(args_info.list_import_formats_given)
00376 {
00377 cout <<
"The supported file formats for the 'input-file-format' argument are:"<<endl;
00378
for(
int i=0; LibofxImportFormatList[i].format!=
LAST; i++)
00379 {
00380 cout <<
" "<<LibofxImportFormatList[i].description<<endl;
00381 }
00382 }
00383
00384 LibofxContextPtr libofx_context =
libofx_get_new_context();
00385
00386
00387
00388
if (args_info.inputs_num > 0)
00389 {
00390
00391
ofx_set_statement_cb(libofx_context, ofx_proc_statement_cb, 0);
00392
ofx_set_account_cb(libofx_context, ofx_proc_account_cb, 0);
00393
ofx_set_transaction_cb(libofx_context, ofx_proc_transaction_cb, 0);
00394
ofx_set_security_cb(libofx_context, ofx_proc_security_cb, 0);
00395
ofx_set_status_cb(libofx_context, ofx_proc_status_cb, 0);
00396
00397
enum LibofxFileFormat file_format = libofx_get_file_format_from_str(LibofxImportFormatList, args_info.import_format_arg);
00399
if(args_info.inputs_num > 1)
00400 {
00401 cout <<
"Sorry, currently, only the first file is processed as the library can't deal with more right now. The followinf files were ignored:"<<endl;
00402
for (
unsigned i = 1 ; i < args_info.inputs_num ; ++i )
00403 {
00404 cout <<
"file: " << args_info.inputs[i] << endl ;
00405 }
00406 }
00407
libofx_proc_file(libofx_context, args_info.inputs[0], file_format);
00408 }
00409
else
00410 {
00411
00412 }
00413
return 0;
00414 }