void AB_ImExporterContext_AddTransaction(AB_IMEXPORTER_CONTEXT *iec, AB_TRANSACTION *t){ AB_IMEXPORTER_ACCOUNTINFO *iea; iea=AB_ImExporterContext__GetAccountInfoForTransaction(iec, t); assert(iea); AB_ImExporterAccountInfo_AddTransaction(iea, t); }
int AB_ImExporterYN__ReadTransactions(AB_IMEXPORTER *ie, AB_IMEXPORTER_ACCOUNTINFO *ai, GWEN_XMLNODE *doc) { GWEN_XMLNODE *n; n=GWEN_XMLNode_FindFirstTag(doc, "SG4", 0, 0); while (n) { GWEN_XMLNODE *nn; nn=GWEN_XMLNode_GetNodeByXPath(n, "LIN/PF:D_0805", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (nn) { const char *s; s=GWEN_XMLNode_GetProperty(nn, "Value", 0); if (s && (strcasecmp(s, "LNE")==0 || strcasecmp(s, "LNS")==0) ) { nn = GWEN_XMLNode_FindFirstTag(n, "SG6", 0, 0); while (nn) { AB_TRANSACTION *t; const char *s; t=AB_ImExporterYN__ReadLNE_LNS(ie, ai, nn); s=AB_ImExporterAccountInfo_GetAccountNumber(ai); AB_Transaction_SetLocalAccountNumber(t, s); s=AB_ImExporterAccountInfo_GetIban(ai); AB_Transaction_SetLocalIban(t, s); AB_ImExporterAccountInfo_AddTransaction(ai, t); nn=GWEN_XMLNode_FindNextTag(nn, "SG6", 0, 0); } } } n=GWEN_XMLNode_FindNextTag(n, "SG4", 0, 0); } return 0; }
int EBC_Provider_ExecContext__IZV(AB_PROVIDER *pro, AB_IMEXPORTER_CONTEXT *ctx, AB_USER *u, AB_ACCOUNT *a, GWEN_HTTP_SESSION *sess, EBC_CONTEXT *ectx){ EBC_PROVIDER *dp; AB_JOB_LIST2_ITERATOR *jit; AB_JOB_STATUS js; AB_IMEXPORTER_CONTEXT *exCtx; AB_IMEXPORTER_ACCOUNTINFO *ai; GWEN_BUFFER *bufDtaus; GWEN_TIME *currentTime; GWEN_BUFFER *logbuf; int rv; const char *profileName=NULL; const char *s; const char *rqType; uint32_t groupId=0; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); /* prepare CTX log */ logbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendString(logbuf, "BEGIN"); currentTime=GWEN_CurrentTime(); GWEN_Time_toString(currentTime, I18N("YYYY/MM/DD-hh:mm:ss"), logbuf); GWEN_Time_free(currentTime); GWEN_Buffer_AppendString(logbuf, "\t"); GWEN_Buffer_AppendString(logbuf, I18N("National Mass Transfer")); GWEN_Buffer_AppendString(logbuf, "\n"); GWEN_Buffer_AppendString(logbuf, "\t"); GWEN_Buffer_AppendString(logbuf, I18N("Transfer type: ")); GWEN_Buffer_AppendString(logbuf, "\t"); switch(EBC_Context_GetJobType(ectx)) { case AB_Job_TypeTransfer: if (!profileName) profileName="transfer"; GWEN_Buffer_AppendString(logbuf, I18N("Transfer")); break; case AB_Job_TypeDebitNote: if (!profileName) profileName="debitnote"; GWEN_Buffer_AppendString(logbuf, I18N("Debit Note")); break; default: GWEN_Buffer_AppendString(logbuf, I18N("unknown")); break; } GWEN_Buffer_AppendString(logbuf, "\n"); GWEN_Buffer_AppendString(logbuf, "\t"); GWEN_Buffer_AppendString(logbuf, I18N("Account: ")); GWEN_Buffer_AppendString(logbuf, "\t"); GWEN_Buffer_AppendString(logbuf, AB_Account_GetBankCode(a)); GWEN_Buffer_AppendString(logbuf, " / "); GWEN_Buffer_AppendString(logbuf, AB_Account_GetAccountNumber(a)); GWEN_Buffer_AppendString(logbuf, "\n"); /* add a tab-less line to start a new table */ GWEN_Buffer_AppendString(logbuf, "Transactions\n"); DBG_INFO(AQEBICS_LOGDOMAIN, "Sampling transactions from jobs"); exCtx=AB_ImExporterContext_new(); ai=AB_ImExporterAccountInfo_new(); AB_ImExporterAccountInfo_FillFromAccount(ai, a); jit=AB_Job_List2_First(EBC_Context_GetJobs(ectx)); if (jit) { AB_JOB *uj; uj=AB_Job_List2Iterator_Data(jit); assert(uj); while(uj) { AB_TRANSACTION *t; const GWEN_STRINGLIST *sl; const char *s; const AB_VALUE *v; switch(EBC_Context_GetJobType(ectx)) { case AB_Job_TypeTransfer: case AB_Job_TypeDebitNote: t=AB_Job_GetTransaction(uj); break; default: t=NULL; } assert(t); if (groupId==0) /* take id from first job of the created DTAUS doc */ groupId=AB_Job_GetJobId(uj); AB_Transaction_SetGroupId(t, groupId); AB_ImExporterAccountInfo_AddTransaction(ai, AB_Transaction_dup(t)); sl=AB_Transaction_GetRemoteName(t); s=NULL; if (sl) s=GWEN_StringList_FirstString(sl); if (!s) s=I18N("unknown"); GWEN_Buffer_AppendString(logbuf, s); GWEN_Buffer_AppendString(logbuf, "\t"); s=AB_Transaction_GetRemoteBankCode(t); if (!s) s="????????"; GWEN_Buffer_AppendString(logbuf, s); GWEN_Buffer_AppendString(logbuf, "\t"); s=AB_Transaction_GetRemoteAccountNumber(t); if (!s) s="??????????"; GWEN_Buffer_AppendString(logbuf, s); GWEN_Buffer_AppendString(logbuf, "\t"); sl=AB_Transaction_GetPurpose(t); s=NULL; if (sl) s=GWEN_StringList_FirstString(sl); if (!s) s=""; GWEN_Buffer_AppendString(logbuf, s); GWEN_Buffer_AppendString(logbuf, "\t"); v=AB_Transaction_GetValue(t); if (v) AB_Value_toHumanReadableString(v, logbuf, 2); else GWEN_Buffer_AppendString(logbuf, "0,00 EUR"); GWEN_Buffer_AppendString(logbuf, "\n"); uj=AB_Job_List2Iterator_Next(jit); } /* while */ AB_Job_List2Iterator_free(jit); } AB_ImExporterContext_AddAccountInfo(exCtx, ai); GWEN_Buffer_AppendString(logbuf, I18N("Results:\n")); /* export as DTAUS to bufDtaus */ bufDtaus=GWEN_Buffer_new(0, 1024, 0, 1); DBG_INFO(AQEBICS_LOGDOMAIN, "Exporting transactions to DTAUS[default]"); rv=AB_Banking_ExportToBuffer(AB_Provider_GetBanking(pro), exCtx, "dtaus", profileName, bufDtaus); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(bufDtaus); EBC_Provider_SetJobListStatus(EBC_Context_GetJobs(ectx), AB_Job_StatusError); GWEN_Buffer_AppendString(logbuf, "\t"); GWEN_Buffer_AppendString(logbuf, I18N("Error while exporting to DTAUS\n")); GWEN_Buffer_AppendString(logbuf, "END\n"); AB_ImExporterContext_AddLog(ctx, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); return rv; } GWEN_Buffer_AppendString(logbuf, "\t"); GWEN_Buffer_AppendString(logbuf, I18N("Exporting to DTAUS: ok\n")); /* exchange upload request */ DBG_INFO(AQEBICS_LOGDOMAIN, "Uploading."); AB_HttpSession_ClearLog(sess); if (EBC_Context_GetJobType(ectx)==AB_Job_TypeDebitNote) { if (EBC_User_GetFlags(u) & EBC_USER_FLAGS_USE_IZL) rqType="IZL"; else rqType="IZV"; } else rqType="IZV"; rv=EBC_Provider_XchgUploadRequest(pro, sess, u, rqType, (const uint8_t*)GWEN_Buffer_GetStart(bufDtaus), GWEN_Buffer_GetUsedBytes(bufDtaus)); if (rv<0 || rv>=300) js=AB_Job_StatusError; else js=AB_Job_StatusFinished; s=AB_HttpSession_GetLog(sess); if (s) GWEN_Buffer_AppendString(logbuf, s); GWEN_Buffer_AppendString(logbuf, "END\n"); AB_ImExporterContext_AddLog(ctx, GWEN_Buffer_GetStart(logbuf)); GWEN_Buffer_free(logbuf); EBC_Provider_SetJobListStatus(EBC_Context_GetJobs(ectx), js); DBG_INFO(AQEBICS_LOGDOMAIN, "Done"); return 0; }
int AH_ImExporterOFX_TransactionCallback_cb(const struct OfxTransactionData data, void *user_data) { AH_IMEXPORTER_OFX *ieh; DBG_INFO(AQBANKING_LOGDOMAIN, "Transaction callback"); ieh=(AH_IMEXPORTER_OFX *)user_data; if (!ieh->lastAccountInfo) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Transaction but no account. Ignoring"); return -1; } else { AB_TRANSACTION *t; t=AB_Transaction_new(); if (data.account_id_valid) AB_Transaction_SetLocalAccountNumber(t, data.account_id); else AB_Transaction_SetLocalAccountNumber(t, "----"); if (data.date_posted_valid) { GWEN_TIME *ti; ti=GWEN_Time_fromSeconds(data.date_posted); AB_Transaction_SetValutaDate(t, ti); GWEN_Time_free(ti); } if (data.date_initiated_valid) { GWEN_TIME *ti; ti=GWEN_Time_fromSeconds(data.date_initiated); AB_Transaction_SetDate(t, ti); GWEN_Time_free(ti); } if (data.fi_id_valid) AB_Transaction_SetFiId(t, data.fi_id); if (data.name_valid) AB_Transaction_AddRemoteName(t, data.name, 0); if (data.memo_valid) AB_Transaction_AddPurpose(t, data.memo, 0); if (data.amount_valid) { AB_VALUE *val; const char *cur; cur=0; if (data.account_ptr) if (data.account_ptr->currency_valid) cur=data.account_ptr->currency; val=AB_Value_fromDouble(data.amount); assert(val); AB_Value_SetCurrency(val, cur); if (data.invtransactiontype_valid) /* negate for investment transaction type (hack, see KMyMoney) */ AB_Value_Negate(val); AB_Transaction_SetValue(t, val); AB_Value_free(val); } else { DBG_ERROR(AQBANKING_LOGDOMAIN, "No amount in transaction"); } if (data.transactiontype_valid) { switch (data.transactiontype) { case OFX_CHECK: AB_Transaction_SetTransactionKey(t, "CHK"); AB_Transaction_SetTransactionText(t, "Check"); break; case OFX_INT: AB_Transaction_SetTransactionKey(t, "INT"); AB_Transaction_SetTransactionText(t, "Interest"); break; case OFX_DIV: AB_Transaction_SetTransactionKey(t, "DIV"); AB_Transaction_SetTransactionText(t, "Dividend"); break; case OFX_SRVCHG: AB_Transaction_SetTransactionKey(t, "CHG"); AB_Transaction_SetTransactionText(t, "Service charge"); break; case OFX_FEE: AB_Transaction_SetTransactionKey(t, "BRF"); AB_Transaction_SetTransactionText(t, "Fee"); break; case OFX_DEP: AB_Transaction_SetTransactionKey(t, "LDP"); /* FIXME: not sure */ AB_Transaction_SetTransactionText(t, "Deposit"); break; case OFX_ATM: AB_Transaction_SetTransactionKey(t, "MSC"); /* misc */ AB_Transaction_SetTransactionText(t, "Cash dispenser"); break; case OFX_POS: AB_Transaction_SetTransactionKey(t, "MSC"); /* misc */ AB_Transaction_SetTransactionText(t, "Point of sale"); break; case OFX_XFER: AB_Transaction_SetTransactionKey(t, "TRF"); AB_Transaction_SetTransactionText(t, "Transfer"); break; case OFX_PAYMENT: AB_Transaction_SetTransactionKey(t, "TRF"); /* FIXME: not sure */ AB_Transaction_SetTransactionText(t, "Electronic payment"); break; case OFX_CASH: AB_Transaction_SetTransactionKey(t, "MSC"); /* FIXME: not sure */ AB_Transaction_SetTransactionText(t, "Cash"); break; case OFX_DIRECTDEP: AB_Transaction_SetTransactionKey(t, "LDP"); /* FIXME: not sure */ AB_Transaction_SetTransactionText(t, "Direct deposit"); break; case OFX_DIRECTDEBIT: AB_Transaction_SetTransactionKey(t, "MSC"); /* FIXME: not sure */ AB_Transaction_SetTransactionText(t, "Merchant initiated debit"); break; case OFX_REPEATPMT: AB_Transaction_SetTransactionKey(t, "STO"); AB_Transaction_SetTransactionText(t, "Standing order"); break; case OFX_DEBIT: case OFX_CREDIT: case OFX_OTHER: AB_Transaction_SetTransactionKey(t, "MSC"); /* FIXME: not sure */ break; } } /* if transaction type is valid */ else if (data.invtransactiontype_valid) { switch (data.invtransactiontype) { case OFX_BUYDEBT: case OFX_BUYMF: case OFX_BUYOPT: case OFX_BUYOTHER: case OFX_BUYSTOCK: AB_Transaction_SetTransactionKey(t, "BUY"); AB_Transaction_SetTransactionText(t, "Buy stocks or alike"); AB_Transaction_SetSubType(t, AB_Transaction_SubTypeBuy); break; case OFX_REINVEST: AB_Transaction_SetTransactionKey(t, "REINV"); AB_Transaction_SetTransactionText(t, "Reinvestment"); AB_Transaction_SetSubType(t, AB_Transaction_SubTypeReinvest); break; case OFX_SELLDEBT: case OFX_SELLMF: case OFX_SELLOPT: case OFX_SELLOTHER: case OFX_SELLSTOCK: AB_Transaction_SetTransactionKey(t, "BUY"); AB_Transaction_SetTransactionText(t, "Buy stocks or alike"); AB_Transaction_SetSubType(t, AB_Transaction_SubTypeSell); break; case OFX_INCOME: AB_Transaction_SetTransactionKey(t, "DIV"); AB_Transaction_SetTransactionText(t, "Dividend"); AB_Transaction_SetSubType(t, AB_Transaction_SubTypeDividend); break; /* rest is unhandled */ case OFX_CLOSUREOPT: AB_Transaction_SetTransactionText(t, "XCLOSUREOPT"); break; case OFX_INVEXPENSE: AB_Transaction_SetTransactionText(t, "XINVEXPENSE"); break; case OFX_JRNLFUND: AB_Transaction_SetTransactionText(t, "XJRNLFUND"); break; case OFX_MARGININTEREST: AB_Transaction_SetTransactionText(t, "XMARGININTEREST"); break; case OFX_RETOFCAP: AB_Transaction_SetTransactionText(t, "XRETOFCAP"); break; case OFX_SPLIT: AB_Transaction_SetTransactionText(t, "XSPLIT"); break; case OFX_TRANSFER: AB_Transaction_SetTransactionText(t, "XTRANSFER"); break; default: break; } #ifdef HAVE_OFX_0_8_PLUS if (data.fees_valid || data.commission_valid) { AB_VALUE *vFees; vFees=AB_Value_new(); if (data.fees_valid) { AB_VALUE *v; v=AB_Value_fromDouble(data.fees); AB_Value_AddValue(vFees, v); AB_Value_free(v); } if (data.commission_valid) { AB_VALUE *v; v=AB_Value_fromDouble(data.commission); AB_Value_AddValue(vFees, v); AB_Value_free(v); } AB_Transaction_SetFees(t, vFees); AB_Value_free(vFees); } #endif if (data.units_valid) AB_Transaction_SetUnits(t, data.units); #ifdef HAVE_OFX_0_8_PLUS if (data.unitprice_valid && data.fees_valid) { AB_VALUE *v; v=AB_Value_fromDouble(data.fees); /* TODO: add currency */ AB_Transaction_SetUnitPrice(t, v); AB_Value_free(v); } #endif } else { DBG_NOTICE(AQBANKING_LOGDOMAIN, "No transaction type"); } if (data.server_transaction_id_valid) AB_Transaction_SetBankReference(t, data.server_transaction_id); if (data.check_number_valid) AB_Transaction_SetCustomerReference(t, data.check_number); else if (data.reference_number_valid) AB_Transaction_SetCustomerReference(t, data.reference_number); DBG_INFO(0, "Adding transaction"); AB_ImExporterAccountInfo_AddTransaction(ieh->lastAccountInfo, t); } return 0; }
int AH_Job_GetTransactionsCreditCard_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx) { AH_JOB_GETTRANSACTIONS *aj; AB_ACCOUNT *a; AB_IMEXPORTER_ACCOUNTINFO *ai; AB_USER *u; GWEN_DB_NODE *dbResponses; GWEN_DB_NODE *dbCurr; GWEN_BUFFER *tbooked; GWEN_BUFFER *tnoted; int rv; DBG_INFO(AQHBCI_LOGDOMAIN, "Processing JobGetTransactionsCreditCard"); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETTRANSACTIONS, j); assert(aj); tbooked=GWEN_Buffer_new(0, 1024, 0, 1); tnoted=GWEN_Buffer_new(0, 1024, 0, 1); dbResponses=AH_Job_GetResponses(j); assert(dbResponses); DBG_INFO(AQHBCI_LOGDOMAIN, "Response:"); GWEN_DB_Dump(dbResponses, 2); DBG_INFO(AQHBCI_LOGDOMAIN, "Response end"); a=AH_AccountJob_GetAccount(j); assert(a); ai=AB_ImExporterContext_GetOrAddAccountInfo(ctx, AB_Account_GetUniqueId(a), AB_Account_GetIban(a), AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(a), AB_Account_GetAccountType(a)); assert(ai); AB_ImExporterAccountInfo_SetAccountId(ai, AB_Account_GetUniqueId(a)); u=AH_Job_GetUser(j); assert(u); /* search for "Transactions" */ dbCurr=GWEN_DB_GetFirstGroup(dbResponses); while (dbCurr) { GWEN_DB_NODE *dbXA; rv=AH_Job_CheckEncryption(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (encryption)"); GWEN_Buffer_free(tbooked); GWEN_Buffer_free(tnoted); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } rv=AH_Job_CheckSignature(j, dbCurr); if (rv) { DBG_INFO(AQHBCI_LOGDOMAIN, "Compromised security (signature)"); GWEN_Buffer_free(tbooked); GWEN_Buffer_free(tnoted); AH_Job_SetStatus(j, AH_JobStatusError); return rv; } dbXA=GWEN_DB_GetGroup(dbCurr, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "data/transactionscreditcard"); if (dbXA) { GWEN_DB_NODE *dbT; GWEN_DB_NODE *dbV; GWEN_DATE *date; GWEN_DATE *valutaDate; const char *p; const char *ref; int i; dbT=GWEN_DB_GetGroup(dbXA, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "entries"); while (dbT) { AB_VALUE *v1; AB_VALUE *v2; GWEN_STRINGLIST *purpose; AB_TRANSACTION *t; /* read date (Buchungsdatum) */ p=GWEN_DB_GetCharValue(dbT, "date", 0, 0); if (p) date=GWEN_Date_fromStringWithTemplate(p, "YYYYMMDD"); else date=NULL; /* read valutaData (Umsatzdatum) */ p=GWEN_DB_GetCharValue(dbT, "valutaDate", 0, 0); if (p) valutaDate=GWEN_Date_fromStringWithTemplate(p, "YYYYMMDD"); else valutaDate=NULL; /* read value */ dbV=GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "value"); if (dbV) v1=AB_Value_fromDb(dbV); else v1=NULL; v2=0; if (!v1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error parsing value from DB"); } else { p=GWEN_DB_GetCharValue(dbT, "debitMark", 0, 0); if (p) { if (strcasecmp(p, "D")==0 || strcasecmp(p, "RC")==0) { v2=AB_Value_dup(v1); AB_Value_Negate(v2); } else if (strcasecmp(p, "C")==0 || strcasecmp(p, "RD")==0) v2=AB_Value_dup(v1); else { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad debit mark \"%s\"", p); v2=0; } } AB_Value_free(v1); } /* read purpose */ purpose=GWEN_StringList_new(); for (i=0; i<10; i++) { p=GWEN_DB_GetCharValue(dbT, "purpose", i, 0); if (!p) break; GWEN_StringList_AppendString(purpose, p, 0, 0); } /* read reference */ ref=GWEN_DB_GetCharValue(dbT, "reference", 0, 0); if (ref) GWEN_StringList_AppendString(purpose, ref, 0, 0); t=AB_Transaction_new(); if (ref) AB_Transaction_SetFiId(t, ref); AB_Transaction_SetUniqueAccountId(t, AB_Account_GetUniqueId(a)); AB_Transaction_SetLocalBankCode(t, AB_User_GetBankCode(u)); AB_Transaction_SetLocalAccountNumber(t, AB_Account_GetAccountNumber(a)); AB_Transaction_SetValutaDate(t, valutaDate); AB_Transaction_SetDate(t, date); AB_Transaction_SetValue(t, v2); AB_Transaction_SetPurposeFromStringList(t, purpose); DBG_INFO(AQHBCI_LOGDOMAIN, "Adding transaction"); AB_ImExporterAccountInfo_AddTransaction(ai, t); GWEN_StringList_free(purpose); AB_Value_free(v2); GWEN_Date_free(date); GWEN_Date_free(valutaDate); dbT = GWEN_DB_FindNextGroup(dbT, "entries"); } //while (dbT) } //if (dbXA) dbCurr=GWEN_DB_GetNextGroup(dbCurr); } return 0; }
/* --------------------------------------------------------------- FUNCTION */ int AH_Job_GetTransactions__ReadTransactions(AH_JOB *j, AB_IMEXPORTER_ACCOUNTINFO *ai, const char *docType, int ty, const uint8_t *ptr, uint32_t len) { AB_PROVIDER *pro; AB_IMEXPORTER_CONTEXT *tempContext; AB_IMEXPORTER_ACCOUNTINFO *tempAccountInfo; int rv; assert(j); pro=AH_Job_GetProvider(j); assert(pro); /* import data into a temporary context */ tempContext=AB_ImExporterContext_new(); #if 0 DBG_ERROR(0, "About to read this SWIFT data (%s)", docType); GWEN_Text_DumpString((const char *) ptr, len, 2); #endif rv=AB_Banking_ImportFromBufferLoadProfile(AB_Provider_GetBanking(pro), "swift", tempContext, docType, NULL, ptr, len); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_ImExporterContext_free(tempContext); return rv; } /* copy data from temporary context to real context */ tempAccountInfo=AB_ImExporterContext_GetFirstAccountInfo(tempContext); while (tempAccountInfo) { AB_TRANSACTION_LIST *tl; AB_BALANCE_LIST *bl; /* move transactions, set transaction type */ tl=AB_ImExporterAccountInfo_GetTransactionList(tempAccountInfo); if (tl) { AB_TRANSACTION *t; while ((t=AB_Transaction_List_First(tl))) { AB_Transaction_List_Del(t); AB_Transaction_SetType(t, ty); AB_ImExporterAccountInfo_AddTransaction(ai, t); } } /* move balances */ bl=AB_ImExporterAccountInfo_GetBalanceList(tempAccountInfo); if (bl) { AB_BALANCE *bal; while ((bal=AB_Balance_List_First(bl))) { AB_Balance_List_Del(bal); AB_ImExporterAccountInfo_AddBalance(ai, bal); } } tempAccountInfo=AB_ImExporterAccountInfo_List_Next(tempAccountInfo); } AB_ImExporterContext_free(tempContext); return 0; }
/* --------------------------------------------------------------- FUNCTION */ int AH_Job_GetTransactions__ReadTransactions(AH_JOB *j, AB_IMEXPORTER_ACCOUNTINFO *ai, const char *docType, int noted, GWEN_BUFFER *buf){ GWEN_DBIO *dbio; GWEN_SYNCIO *sio; int rv; GWEN_DB_NODE *db; GWEN_DB_NODE *dbDay; GWEN_DB_NODE *dbParams; AB_ACCOUNT *a; AB_USER *u; uint32_t progressId; uint64_t cnt=0; a=AH_AccountJob_GetAccount(j); assert(a); u=AH_Job_GetUser(j); assert(u); dbio=GWEN_DBIO_GetPlugin("swift"); if (!dbio) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Plugin SWIFT is not found"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Plugin \"SWIFT\" not found.")); return AB_ERROR_PLUGIN_MISSING; } GWEN_Buffer_Rewind(buf); sio=GWEN_SyncIo_Memory_new(buf, 0); db=GWEN_DB_Group_new("transactions"); dbParams=GWEN_DB_Group_new("params"); GWEN_DB_SetCharValue(dbParams, GWEN_DB_FLAGS_OVERWRITE_VARS, "type", docType); if (AH_User_GetFlags(u) & AH_USER_FLAGS_KEEP_MULTIPLE_BLANKS) GWEN_DB_SetIntValue(dbParams, GWEN_DB_FLAGS_OVERWRITE_VARS, "keepMultipleBlanks", 1); else GWEN_DB_SetIntValue(dbParams, GWEN_DB_FLAGS_OVERWRITE_VARS, "keepMultipleBlanks", 0); rv=GWEN_DBIO_Import(dbio, sio, db, dbParams, GWEN_PATH_FLAGS_CREATE_GROUP); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error parsing SWIFT %s (%d)", docType, rv); GWEN_DB_Group_free(dbParams); GWEN_DB_Group_free(db); GWEN_SyncIo_free(sio); GWEN_DBIO_free(dbio); return rv; } GWEN_DB_Group_free(dbParams); GWEN_SyncIo_free(sio); GWEN_DBIO_free(dbio); /* first count the groups */ dbDay=GWEN_DB_FindFirstGroup(db, "day"); while(dbDay) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_FindFirstGroup(dbDay, "transaction"); while(dbT) { cnt++; dbT=GWEN_DB_FindNextGroup(dbT, "transaction"); } /* while */ dbDay=GWEN_DB_FindNextGroup(dbDay, "day"); } /* while */ progressId=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Importing transactions..."), NULL, cnt, 0); /* add transactions to list */ dbDay=GWEN_DB_FindFirstGroup(db, "day"); while(dbDay) { GWEN_DB_NODE *dbT; dbT=GWEN_DB_FindFirstGroup(dbDay, "transaction"); while(dbT) { AB_TRANSACTION *t; t=AB_Transaction_fromDb(dbT); if (!t) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Bad transaction data:"); GWEN_DB_Dump(dbT, 2); } else { const char *s; AB_Transaction_SetLocalBankCode(t, AB_User_GetBankCode(u)); AB_Transaction_SetLocalAccountNumber(t, AB_Account_GetAccountNumber(a)); /* some translations */ s=AB_Transaction_GetRemoteIban(t); if (!(s && *s)) { const char *sAid; /* no remote IBAN set, check whether the bank sends this info in the * fields for national account specifications (instead of the SWIFT * field "?38" which was specified for this case) */ sAid=AB_Transaction_GetRemoteAccountNumber(t); if (sAid && *sAid && AB_Banking_CheckIban(sAid)==0) { /* there is a remote account number specification, and that is an IBAN, * so we set that accordingly */ DBG_INFO(AQBANKING_LOGDOMAIN, "Setting remote IBAN from account number"); AB_Transaction_SetRemoteIban(t, sAid); /* set remote BIC if it not already is */ s=AB_Transaction_GetRemoteBic(t); if (!(s && *s)) { const char *sBid; sBid=AB_Transaction_GetRemoteBankCode(t); if (sBid && *sBid) { DBG_INFO(AQBANKING_LOGDOMAIN, "Setting remote BIC from bank code"); AB_Transaction_SetRemoteBic(t, sBid); } } } } DBG_INFO(AQHBCI_LOGDOMAIN, "Adding transaction"); if (noted) AB_ImExporterAccountInfo_AddNotedTransaction(ai, t); else AB_ImExporterAccountInfo_AddTransaction(ai, t); } if (GWEN_ERROR_USER_ABORTED== GWEN_Gui_ProgressAdvance(progressId, GWEN_GUI_PROGRESS_ONE)) { GWEN_Gui_ProgressEnd(progressId); return GWEN_ERROR_USER_ABORTED; } dbT=GWEN_DB_FindNextGroup(dbT, "transaction"); } /* while */ /* read all endsaldos */ if (!noted) { dbT=GWEN_DB_FindFirstGroup(dbDay, "endSaldo"); while (dbT) { GWEN_DB_NODE *dbX; GWEN_TIME *ti=0; dbX=GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "date"); if (dbX) ti=GWEN_Time_fromDb(dbX); dbX=GWEN_DB_GetGroup(dbT, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "value"); if (dbX) { AB_VALUE *v; v=AB_Value_fromDb(dbX); if (v) { AB_BALANCE *bal; AB_ACCOUNT_STATUS *as; bal=AB_Balance_new(v, ti); AB_Value_free(v); as=AB_AccountStatus_new(); if (ti) AB_AccountStatus_SetTime(as, ti); AB_AccountStatus_SetNotedBalance(as, bal); AB_Balance_free(bal); AB_ImExporterAccountInfo_AddAccountStatus(ai, as); } } GWEN_Time_free(ti); dbT=GWEN_DB_FindNextGroup(dbT, "endSaldo"); } /* while */ } dbDay=GWEN_DB_FindNextGroup(dbDay, "day"); } /* while */ GWEN_Gui_ProgressEnd(progressId); GWEN_DB_Group_free(db); return 0; }