LibOFX
|
00001 /*************************************************************************** 00002 ofx2qif.c 00003 ------------------- 00004 copyright : (C) 2002 by Benoit Gr�goire 00005 email : benoitg@coeus.ca 00006 ***************************************************************************/ 00032 /*************************************************************************** 00033 * * 00034 * This program is free software; you can redistribute it and/or modify * 00035 * it under the terms of the GNU General Public License as published by * 00036 * the Free Software Foundation; either version 2 of the License, or * 00037 * (at your option) any later version. * 00038 * * 00039 ***************************************************************************/ 00040 00041 #include <stdio.h> 00042 #include <string.h> 00043 #include <time.h> 00044 #include "libofx.h" 00045 00046 #define QIF_FILE_MAX_SIZE 256000 00047 00048 int ofx_proc_transaction_cb(const struct OfxTransactionData data, void * transaction_data) 00049 { 00050 char dest_string[255]; 00051 char trans_buff[4096]; 00052 struct tm temp_tm; 00053 char trans_list_buff[QIF_FILE_MAX_SIZE]; 00054 00055 trans_list_buff[0]='\0'; 00056 00057 if(data.date_posted_valid==true){ 00058 temp_tm = *localtime(&(data.date_posted)); 00059 sprintf(trans_buff, "D%d%s%d%s%d%s", temp_tm.tm_mday, "/", temp_tm.tm_mon+1, "/", temp_tm.tm_year+1900, "\n"); 00060 strncat(trans_list_buff, trans_buff, sizeof(trans_list_buff)-1 - strlen(trans_list_buff)); 00061 } 00062 if(data.amount_valid==true){ 00063 sprintf(trans_buff, "T%.2f%s",data.amount,"\n"); 00064 strncat(trans_list_buff, trans_buff, sizeof(trans_list_buff)-1 - strlen(trans_list_buff)); 00065 } 00066 if(data.check_number_valid==true){ 00067 sprintf(trans_buff, "N%s%s",data.check_number,"\n"); 00068 strncat(trans_list_buff, trans_buff, sizeof(trans_list_buff)-1 - strlen(trans_list_buff)); 00069 } 00070 else if(data.reference_number_valid==true){ 00071 sprintf(trans_buff, "N%s%s",data.reference_number,"\n"); 00072 strncat(trans_list_buff, trans_buff, sizeof(trans_list_buff)-1 - strlen(trans_list_buff)); 00073 } 00074 if(data.name_valid==true){ 00075 sprintf(trans_buff, "P%s%s",data.name,"\n"); 00076 strncat(trans_list_buff, trans_buff, sizeof(trans_list_buff)-1 - strlen(trans_list_buff)); 00077 } 00078 if(data.memo_valid==true){ 00079 sprintf(trans_buff, "M%s%s",data.memo,"\n"); 00080 strncat(trans_list_buff, trans_buff, sizeof(trans_list_buff)-1 - strlen(trans_list_buff)); 00081 } 00082 /* Add PAYEE and ADRESS here once supported by the library */ 00083 00084 00085 if(data.transactiontype_valid==true){ 00086 switch(data.transactiontype){ 00087 case OFX_CREDIT: strncpy(dest_string, "Generic credit", sizeof(dest_string)); 00088 break; 00089 case OFX_DEBIT: strncpy(dest_string, "Generic debit", sizeof(dest_string)); 00090 break; 00091 case OFX_INT: strncpy(dest_string, "Interest earned or paid (Note: Depends on signage of amount)", sizeof(dest_string)); 00092 break; 00093 case OFX_DIV: strncpy(dest_string, "Dividend", sizeof(dest_string)); 00094 break; 00095 case OFX_FEE: strncpy(dest_string, "FI fee", sizeof(dest_string)); 00096 break; 00097 case OFX_SRVCHG: strncpy(dest_string, "Service charge", sizeof(dest_string)); 00098 break; 00099 case OFX_DEP: strncpy(dest_string, "Deposit", sizeof(dest_string)); 00100 break; 00101 case OFX_ATM: strncpy(dest_string, "ATM debit or credit (Note: Depends on signage of amount)", sizeof(dest_string)); 00102 break; 00103 case OFX_POS: strncpy(dest_string, "Point of sale debit or credit (Note: Depends on signage of amount)", sizeof(dest_string)); 00104 break; 00105 case OFX_XFER: strncpy(dest_string, "Transfer", sizeof(dest_string)); 00106 break; 00107 case OFX_CHECK: strncpy(dest_string, "Check", sizeof(dest_string)); 00108 break; 00109 case OFX_PAYMENT: strncpy(dest_string, "Electronic payment", sizeof(dest_string)); 00110 break; 00111 case OFX_CASH: strncpy(dest_string, "Cash withdrawal", sizeof(dest_string)); 00112 break; 00113 case OFX_DIRECTDEP: strncpy(dest_string, "Direct deposit", sizeof(dest_string)); 00114 break; 00115 case OFX_DIRECTDEBIT: strncpy(dest_string, "Merchant initiated debit", sizeof(dest_string)); 00116 break; 00117 case OFX_REPEATPMT: strncpy(dest_string, "Repeating payment/standing order", sizeof(dest_string)); 00118 break; 00119 case OFX_OTHER: strncpy(dest_string, "Other", sizeof(dest_string)); 00120 break; 00121 default : strncpy(dest_string, "Unknown transaction type", sizeof(dest_string)); 00122 break; 00123 } 00124 sprintf(trans_buff, "L%s%s",dest_string,"\n"); 00125 strncat(trans_list_buff, trans_buff, sizeof(trans_list_buff)-1 - strlen(trans_list_buff)); 00126 } 00127 strcpy(trans_buff, "^\n"); 00128 strncat(trans_list_buff, trans_buff, sizeof(trans_list_buff)-1 - strlen(trans_list_buff)); 00129 fputs(trans_list_buff,stdout); 00130 return 0; 00131 }/* end ofx_proc_transaction() */ 00132 00133 int ofx_proc_statement_cb(const struct OfxStatementData data, void * statement_data) 00134 { 00135 struct tm temp_tm; 00136 00137 printf("!Account\n"); 00138 if(data.account_id_valid==true){ 00139 /* Use the account id as the qif name of the account */ 00140 printf("N%s%s",data.account_id,"\n"); 00141 } 00142 if(data.account_ptr->account_type_valid==true) 00143 { 00144 switch(data.account_ptr->account_type){ 00145 case OFX_CHECKING : printf("TBank\n"); 00146 break; 00147 case OFX_SAVINGS : printf("TBank\n"); 00148 break; 00149 case OFX_MONEYMRKT : printf("TOth A\n"); 00150 break; 00151 case OFX_CREDITLINE : printf("TOth L\n"); 00152 break; 00153 case OFX_CMA : printf("TOth A\n"); 00154 break; 00155 case OFX_CREDITCARD : printf("TCCard\n"); 00156 break; 00157 default: perror("WRITEME: ofx_proc_account() This is an unknown account type!"); 00158 } 00159 } 00160 printf("DOFX online account\n"); 00161 00162 if(data.ledger_balance_date_valid==true){ 00163 temp_tm = *localtime(&(data.ledger_balance_date)); 00164 printf("/%d%s%d%s%d%s", temp_tm.tm_mday, "/", temp_tm.tm_mon+1, "/", temp_tm.tm_year+1900, "\n"); 00165 } 00166 if(data.ledger_balance_valid==true){ 00167 printf("$%.2f%s",data.ledger_balance,"\n"); 00168 } 00169 printf("^\n"); 00170 /*The transactions will follow, here is the header */ 00171 if(data.account_ptr->account_type_valid==true){ 00172 switch(data.account_ptr->account_type){ 00173 case OFX_CHECKING : printf("!Type:Bank\n"); 00174 break; 00175 case OFX_SAVINGS : printf("!Type:Bank\n"); 00176 break; 00177 case OFX_MONEYMRKT : printf("!Type:Oth A\n"); 00178 break; 00179 case OFX_CREDITLINE : printf("!Type:Oth L\n"); 00180 break; 00181 case OFX_CMA : printf("!Type:Oth A\n"); 00182 break; 00183 case OFX_CREDITCARD : printf("!Type:CCard\n"); 00184 break; 00185 default: perror("WRITEME: ofx_proc_account() This is an unknown account type!"); 00186 } 00187 } 00188 00189 return 0; 00190 }/* end ofx_proc_statement() */ 00191 00192 int ofx_proc_account_cb(const struct OfxAccountData data, void * account_data) 00193 { 00194 char dest_string[255]=""; 00195 00196 00197 // strncat(trans_list_buff, dest_string, QIF_FILE_MAX_SIZE - strlen(trans_list_buff)); 00198 fputs(dest_string,stdout); 00199 return 0; 00200 }/* end ofx_proc_account() */ 00201 00202 int main (int argc, char *argv[]) 00203 { 00204 extern int ofx_PARSER_msg; 00205 extern int ofx_DEBUG_msg; 00206 extern int ofx_WARNING_msg; 00207 extern int ofx_ERROR_msg; 00208 extern int ofx_INFO_msg; 00209 extern int ofx_STATUS_msg; 00210 ofx_PARSER_msg = false; 00211 ofx_DEBUG_msg = false; 00212 ofx_WARNING_msg = false; 00213 ofx_ERROR_msg = false; 00214 ofx_INFO_msg = false; 00215 ofx_STATUS_msg = false; 00216 00217 LibofxContextPtr libofx_context = libofx_get_new_context(); 00218 ofx_set_statement_cb(libofx_context, ofx_proc_statement_cb, 0); 00219 ofx_set_account_cb(libofx_context, ofx_proc_account_cb, 0); 00220 ofx_set_transaction_cb(libofx_context, ofx_proc_transaction_cb, 0); 00221 00222 if(argc >= 2){ 00223 libofx_proc_file(libofx_context, argv[1], OFX); 00224 } 00225 return libofx_free_context(libofx_context); 00226 } 00227 00228 00229 00230 00231