LibOFX

ofx2qif.c

Go to the documentation of this file.
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