AB_IMEXPORTER_CONTEXT *AB_ImExporterContext_fromDb(GWEN_DB_NODE *db) { AB_IMEXPORTER_CONTEXT *iec; iec=AB_ImExporterContext_new(); AB_ImExporterContext_ReadDb(iec, db); return iec; }
int readContext(const char *ctxFile, AB_IMEXPORTER_CONTEXT **pCtx, int mustExist) { AB_IMEXPORTER_CONTEXT *ctx; GWEN_SYNCIO *sio; GWEN_DB_NODE *dbCtx; int rv; if (ctxFile==NULL) { sio=GWEN_SyncIo_File_fromStdin(); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FLAGS_DONTCLOSE | GWEN_SYNCIO_FILE_FLAGS_READ); } else { sio=GWEN_SyncIo_File_new(ctxFile, GWEN_SyncIo_File_CreationMode_OpenExisting); GWEN_SyncIo_AddFlags(sio, GWEN_SYNCIO_FILE_FLAGS_READ); rv=GWEN_SyncIo_Connect(sio); if (rv<0) { if (!mustExist) { ctx=AB_ImExporterContext_new(); *pCtx=ctx; GWEN_SyncIo_free(sio); return 0; } GWEN_SyncIo_free(sio); return 4; } } /* actually read */ dbCtx=GWEN_DB_Group_new("context"); rv=GWEN_DB_ReadFromIo(dbCtx, sio, GWEN_DB_FLAGS_DEFAULT | GWEN_PATH_FLAGS_CREATE_GROUP); if (rv<0) { DBG_ERROR(0, "Error reading context file (%d)", rv); GWEN_DB_Group_free(dbCtx); GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); return rv; } GWEN_SyncIo_Disconnect(sio); GWEN_SyncIo_free(sio); ctx=AB_ImExporterContext_fromDb(dbCtx); if (!ctx) { DBG_ERROR(0, "No context in input data"); GWEN_DB_Group_free(dbCtx); return GWEN_ERROR_BAD_DATA; } GWEN_DB_Group_free(dbCtx); *pCtx=ctx; return 0; }
/* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaStandingOrdersGet__ReadSto(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx, const uint8_t *ptr, uint32_t len, const char *fiId){ int rv; AB_IMEXPORTER_CONTEXT *tmpCtx; GWEN_BUFFER *tbuf; AB_IMEXPORTER_ACCOUNTINFO *ai; tmpCtx=AB_ImExporterContext_new(); tbuf=GWEN_Buffer_new(0, 256, 0, 1); GWEN_Buffer_AppendBytes(tbuf, (const char*) ptr, len); rv=AB_Banking_ImportBuffer(AH_Job_GetBankingApi(j), tmpCtx, "sepa", "default", tbuf); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(tbuf); AB_ImExporterContext_free(tmpCtx); return rv; } GWEN_Buffer_free(tbuf); ai=AB_ImExporterContext_GetFirstAccountInfo(tmpCtx); if (ai) { AB_TRANSACTION *t; while( (t=AB_ImExporterAccountInfo_GetFirstTransaction(ai)) ) { AB_Transaction_List_Del(t); AB_Transaction_SetFiId(t, fiId); /* add to real im/exporter context */ AB_ImExporterContext_AddTransaction(ctx, t); } } AB_ImExporterContext_free(tmpCtx); return 0; }
static PyObject *aqbanking_Account_transactions(aqbanking_Account* self, PyObject *args, PyObject *kwds) { int rv; double tmpDateTime = 0; const char *bank_code; const char *account_no; #if PY_VERSION_HEX >= 0x03030000 bank_code = PyUnicode_AsUTF8(self->bank_code); account_no = PyUnicode_AsUTF8(self->no); #else PyObject *s = _PyUnicode_AsDefaultEncodedString(self->bank_code, NULL); bank_code = PyBytes_AS_STRING(s); s = _PyUnicode_AsDefaultEncodedString(self->no, NULL); account_no = PyBytes_AS_STRING(s); #endif GWEN_TIME *gwTime; const char *dateFrom=NULL, *dateTo=NULL; static char *kwlist[] = {"dateFrom", "dateTo", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kwds, "|ss", kwlist, &dateFrom, &dateTo)) { return NULL; } AB_ACCOUNT *a; AB_JOB *job = 0; AB_JOB_LIST2 *jl = 0; AB_IMEXPORTER_CONTEXT *ctx = 0; AB_IMEXPORTER_ACCOUNTINFO *ai; /*aqbanking_Transaction *trans = NULL;*/ PyObject *transList = PyList_New(0); // Valid data set? if (self->no == NULL) { PyErr_SetString(PyExc_AttributeError, "no"); } if (self->bank_code == NULL) { PyErr_SetString(PyExc_AttributeError, "bank_code"); } // Initialize aqbanking. rv = AB_create(self); if (rv > 0) { Py_DECREF(transList); return NULL; } // Let us find the account! a = AB_Banking_GetAccountByCodeAndNumber(self->ab, bank_code, account_no); if (!a) { PyErr_SetString(AccountNotFound, "Could not find the given account! "); Py_DECREF(transList); return NULL; } // Create job and execute it. job = AB_JobGetTransactions_new(a); if (dateFrom != NULL) { gwTime = GWEN_Time_fromString(dateFrom, "YYYYMMDD"); AB_JobGetTransactions_SetFromTime(job, gwTime); } if (dateTo != NULL) { gwTime = GWEN_Time_fromString(dateTo, "YYYYMMDD"); AB_JobGetTransactions_SetToTime(job, gwTime); } // Check for availability rv = AB_Job_CheckAvailability(job); if (rv) { PyErr_SetString(ExecutionFailed, "Transaction retrieval is not supported!"); Py_DECREF(transList); return NULL; } jl = AB_Job_List2_new(); AB_Job_List2_PushBack(jl, job); ctx = AB_ImExporterContext_new(); rv = AB_Banking_ExecuteJobs(self->ab, jl, ctx); if (rv) { PyErr_SetString(ExecutionFailed, "Could not retrieve transactions!"); Py_DECREF(transList); return NULL; } // With success. No process the result. ai = AB_ImExporterContext_GetFirstAccountInfo (ctx); while(ai) { const AB_TRANSACTION *t; t = AB_ImExporterAccountInfo_GetFirstTransaction(ai); while(t) { const AB_VALUE *v; AB_TRANSACTION_STATUS state; v=AB_Transaction_GetValue(t); if (v) { const GWEN_STRINGLIST *sl; const GWEN_TIME *tdtime; const char *purpose; const char *remoteName; aqbanking_Transaction *trans = (aqbanking_Transaction*) PyObject_CallObject((PyObject *) &aqbanking_TransactionType, NULL); /* The purpose (memo field) might contain multiple lines. * Therefore AqBanking stores the purpose in a string list * of which the first entry is used in this tutorial */ sl = AB_Transaction_GetPurpose(t); if (sl) { purpose = GWEN_StringList_FirstString(sl); if (purpose == NULL) { purpose = ""; } } else { purpose = ""; } #ifdef DEBUGSTDERR fprintf(stderr, "[%-10d]: [%-10s/%-10s][%-10s/%-10s] %-32s (%.2f %s)\n", AB_Transaction_GetUniqueId(t), AB_Transaction_GetRemoteIban(t), AB_Transaction_GetRemoteBic(t), AB_Transaction_GetRemoteAccountNumber(t), AB_Transaction_GetRemoteBankCode(t), purpose, AB_Value_GetValueAsDouble(v), AB_Value_GetCurrency(v) ); #endif tdtime = AB_Transaction_GetDate(t); tmpDateTime = PyLong_AsDouble(PyLong_FromSize_t(GWEN_Time_Seconds(tdtime))); trans->date = PyDate_FromTimestamp(Py_BuildValue("(O)", PyFloat_FromDouble(tmpDateTime))); tdtime = AB_Transaction_GetValutaDate(t); tmpDateTime = PyLong_AsDouble(PyLong_FromSize_t(GWEN_Time_Seconds(tdtime))); trans->valutaDate = PyDate_FromTimestamp(Py_BuildValue("(O)", PyFloat_FromDouble(tmpDateTime))); trans->purpose = PyUnicode_FromString(purpose); // Local user if (AB_Transaction_GetLocalAccountNumber(t) == NULL) { trans->localAccount = Py_None; Py_INCREF(Py_None); } else { trans->localAccount = PyUnicode_FromString(AB_Transaction_GetLocalAccountNumber(t)); } if (AB_Transaction_GetLocalBankCode(t) == NULL) { trans->localBank = Py_None; Py_INCREF(Py_None); } else { trans->localBank = PyUnicode_FromString(AB_Transaction_GetLocalBankCode(t)); } if (AB_Transaction_GetLocalIban(t) == NULL) { trans->localIban = Py_None; Py_INCREF(Py_None); } else { trans->localIban = PyUnicode_FromString(AB_Transaction_GetLocalIban(t)); } if (AB_Transaction_GetLocalBic(t) == NULL) { trans->localBic = Py_None; Py_INCREF(Py_None); } else { trans->localBic = PyUnicode_FromString(AB_Transaction_GetLocalBic(t)); } if (AB_Transaction_GetLocalName(t) == NULL) { trans->localName = Py_None; Py_INCREF(Py_None); } else { trans->localName = PyUnicode_FromString(AB_Transaction_GetLocalName(t)); } // Remote user if (AB_Transaction_GetRemoteAccountNumber(t) == NULL) { trans->remoteAccount = Py_None; Py_INCREF(Py_None); } else { trans->remoteAccount = PyUnicode_FromString(AB_Transaction_GetRemoteAccountNumber(t)); } if (AB_Transaction_GetRemoteBankCode(t) == NULL) { trans->remoteBank = Py_None; Py_INCREF(Py_None); } else { trans->remoteBank = PyUnicode_FromString(AB_Transaction_GetRemoteBankCode(t)); } if (AB_Transaction_GetRemoteIban(t) == NULL) { trans->remoteIban = Py_None; Py_INCREF(Py_None); } else { trans->remoteIban = PyUnicode_FromString(AB_Transaction_GetRemoteIban(t)); } if (AB_Transaction_GetRemoteBic(t) == NULL) { trans->remoteBic = Py_None; Py_INCREF(Py_None); } else { trans->remoteBic = PyUnicode_FromString(AB_Transaction_GetRemoteBic(t)); } if (AB_Transaction_GetRemoteName(t) == NULL) { trans->remoteName = Py_None; Py_INCREF(Py_None); } else { sl = AB_Transaction_GetRemoteName(t); remoteName = GWEN_StringList_FirstString(sl); if (remoteName == NULL) { trans->remoteName = Py_None; } else { trans->remoteName = PyUnicode_FromString(remoteName); } } trans->value = PyFloat_FromDouble(AB_Value_GetValueAsDouble(v)); trans->currency = PyUnicode_FromString("EUR"); trans->uniqueId = PyLong_FromLong(AB_Transaction_GetUniqueId(t)); if (AB_Transaction_GetTransactionText(t) == NULL) { trans->transactionText = PyUnicode_FromString(""); } else { trans->transactionText = PyUnicode_FromString(AB_Transaction_GetTransactionText(t)); } trans->transactionCode = PyLong_FromLong(AB_Transaction_GetTransactionCode(t)); trans->textKey = PyLong_FromLong(AB_Transaction_GetTextKey(t)); trans->textKeyExt = PyLong_FromLong(AB_Transaction_GetTextKeyExt(t)); if (AB_Transaction_GetMandateId(t) == NULL) { trans->sepaMandateId = Py_None; } else { trans->sepaMandateId = PyUnicode_FromString(AB_Transaction_GetMandateId(t)); } if (AB_Transaction_GetCustomerReference(t) == NULL) { trans->customerReference = PyUnicode_FromString(""); } else { trans->customerReference = PyUnicode_FromString(AB_Transaction_GetCustomerReference(t)); } if (AB_Transaction_GetBankReference(t) == NULL) { trans->bankReference = PyUnicode_FromString(""); } else { trans->bankReference = PyUnicode_FromString(AB_Transaction_GetBankReference(t)); } if (AB_Transaction_GetEndToEndReference(t) == NULL) { trans->endToEndReference = PyUnicode_FromString(""); } else { trans->endToEndReference = PyUnicode_FromString(AB_Transaction_GetEndToEndReference(t)); } trans->state = 0; state = AB_Transaction_GetStatus(t); switch(state) { case AB_Transaction_StatusUnknown: trans->state = -1; break; case AB_Transaction_StatusNone: trans->state = 0; break; case AB_Transaction_StatusAccepted: trans->state = 1; break; case AB_Transaction_StatusRejected: trans->state = 2; break; case AB_Transaction_StatusPending: trans->state = 4; break; case AB_Transaction_StatusSending: trans->state = 8; break; case AB_Transaction_StatusAutoReconciled: trans->state = 16; break; case AB_Transaction_StatusManuallyReconciled: trans->state = 32; break; case AB_Transaction_StatusRevoked: trans->state = 64; break; case AB_Transaction_StatusAborted: trans->state = 128; break; } PyList_Append(transList, (PyObject *)trans); Py_DECREF(trans); } t = AB_ImExporterAccountInfo_GetNextTransaction(ai); } ai = AB_ImExporterContext_GetNextAccountInfo(ctx); } // Free jobs. AB_Job_free(job); AB_Job_List2_free(jl); AB_ImExporterContext_free(ctx); // Exit aqbanking. rv = AB_free(self); if (rv > 0) { //Py_XDECREF(trans); Py_DECREF(transList); return NULL; } return transList; }
static PyObject *aqbanking_Account_balance(aqbanking_Account* self, PyObject *args, PyObject *keywds) { const AB_ACCOUNT_STATUS * status; const AB_BALANCE * bal; const AB_VALUE *v = 0; int rv; double balance; const char *bank_code; const char *account_no; #if PY_VERSION_HEX >= 0x03030000 bank_code = PyUnicode_AsUTF8(self->bank_code); account_no = PyUnicode_AsUTF8(self->no); #else PyObject *s = _PyUnicode_AsDefaultEncodedString(self->bank_code, NULL); bank_code = PyBytes_AS_STRING(s); s = _PyUnicode_AsDefaultEncodedString(self->no, NULL); account_no = PyBytes_AS_STRING(s); #endif AB_ACCOUNT *a; AB_JOB *job = 0; AB_JOB_LIST2 *jl = 0; AB_IMEXPORTER_CONTEXT *ctx = 0; AB_IMEXPORTER_ACCOUNTINFO *ai; // Valid data set? if (self->no == NULL) { PyErr_SetString(PyExc_AttributeError, "no"); } if (self->bank_code == NULL) { PyErr_SetString(PyExc_AttributeError, "bank_code"); } // Initialize aqbanking. rv = AB_create(self); if (rv > 0) { return NULL; } // Let us find the account! a = AB_Banking_GetAccountByCodeAndNumber(self->ab, bank_code, account_no); if (!a) { PyErr_SetString(AccountNotFound, "Could not find the given account! "); return NULL; } // Create job and execute it. ctx = AB_ImExporterContext_new(); jl = AB_Job_List2_new(); job = AB_JobGetBalance_new(a); AB_Job_List2_PushBack(jl, job); rv = AB_Banking_ExecuteJobs(self->ab, jl, ctx); if (rv) { PyErr_SetString(ExecutionFailed, "Could not get the balance!"); return NULL; } // With success. No process the result. ai = AB_ImExporterContext_GetFirstAccountInfo (ctx); status = AB_ImExporterAccountInfo_GetFirstAccountStatus (ai); bal = AB_AccountStatus_GetBookedBalance (status); v = AB_Balance_GetValue (bal); balance = AB_Value_GetValueAsDouble(v); // Free jobs. AB_Job_List2_free(jl); AB_ImExporterContext_free(ctx); // Exit aqbanking. rv = AB_free(self); if (rv > 0) { return NULL; } // FIXME: currency! return Py_BuildValue("(d,s)", balance, "EUR"); }
int AH_NewKeyFileDialog_DoIt(GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; AB_USER *u; GWEN_URL *url; int rv; uint32_t pid; AB_IMEXPORTER_CONTEXT *ctx; AB_PROVIDER *pro; GWEN_PLUGIN_MANAGER *pm; GWEN_PLUGIN *pl; GWEN_CRYPT_TOKEN *ct; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); rv=AH_NewKeyFileDialog_GetFilePageData(dlg); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No file?"); // TODO: show error message return GWEN_DialogEvent_ResultHandled; } pro=AB_Banking_GetProvider(xdlg->banking, "aqhbci"); if (pro==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not find backend, maybe some plugins are not installed?"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not find HBCI backend, maybe some plugins are not installed?")); return GWEN_DialogEvent_ResultHandled; } u=AB_Banking_CreateUser(xdlg->banking, "aqhbci"); if (u==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create user, maybe backend missing?"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not find HBCI backend, maybe some plugins are not installed?")); return GWEN_DialogEvent_ResultHandled; } /* generic setup */ AB_User_SetUserName(u, xdlg->userName); AB_User_SetUserId(u, xdlg->userId); if (xdlg->customerId && *(xdlg->customerId)) AB_User_SetCustomerId(u, xdlg->customerId); else AB_User_SetCustomerId(u, xdlg->userId); AB_User_SetCountry(u, "de"); AB_User_SetBankCode(u, xdlg->bankCode); /* HBCI setup */ AH_User_SetTokenType(u, "ohbci"); AH_User_SetTokenName(u, AH_NewKeyFileDialog_GetFileName(dlg)); AH_User_SetTokenContextId(u, 1); AH_User_SetCryptMode(u, AH_CryptMode_Rdh); AH_User_SetStatus(u, AH_UserStatusPending); AH_User_SetHbciVersion(u, xdlg->hbciVersion); AH_User_SetRdhType(u, xdlg->rdhVersion); AH_User_SetFlags(u, xdlg->flags); /* create CryptToken */ pm=GWEN_PluginManager_FindPluginManager(GWEN_CRYPT_TOKEN_PLUGIN_TYPENAME); if (pm==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Plugin manager not found"); GWEN_Gui_ShowError(I18N("Error"), I18N("CryptToken plugin for type %s is not available. Did you install all necessary packages?"), GWEN_CRYPT_TOKEN_PLUGIN_TYPENAME); return 3; } pl=GWEN_PluginManager_GetPlugin(pm, AH_User_GetTokenType(u)); if (pl==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Plugin not found"); GWEN_Gui_ShowError(I18N("Error"), I18N("CryptToken plugin for type %s is not available. Did you install all necessary packages?"), AH_User_GetTokenType(u)); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } ct=GWEN_Crypt_Token_Plugin_CreateToken(pl, AH_User_GetTokenName(u)); if (ct==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create crypt token"); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } /* create crypt token */ rv=GWEN_Crypt_Token_Create(ct, 0); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create token"); GWEN_Gui_ShowError(I18N("Error"), I18N("The keyfile %s could not be created. Maybe there already is a file of that name (%d)."), GWEN_Crypt_Token_GetTokenName(ct), rv); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } /* close crypt token */ rv=GWEN_Crypt_Token_Close(ct, 0, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not close token"); GWEN_Gui_ShowError(I18N("Error"), I18N("The keyfile %s could not be closed. Please check disc space."), GWEN_Crypt_Token_GetTokenName(ct), rv); AB_User_free(u); unlink(AH_User_GetTokenName(u)); return GWEN_DialogEvent_ResultHandled; } url=GWEN_Url_fromString(xdlg->url); assert(url); GWEN_Url_SetProtocol(url, "hbci"); if (GWEN_Url_GetPort(url)==0) GWEN_Url_SetPort(url, 3000); AH_User_SetServerUrl(u, url); GWEN_Url_free(url); rv=AB_Banking_AddUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not add user (%d)", rv); GWEN_Gui_ShowError(I18N("Error"), I18N("Could not add HBCI user, maybe there already is a user of that id (%d)"), rv); AB_User_free(u); DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not add user, maybe there already is a user of the same id (%d)?", rv); return GWEN_DialogEvent_ResultHandled; } pid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Setting Up Keyfile User"), I18N("The server keys will now be retrieved, keys created and sent to the bank."), 3, /* getkeys, mkKeys, sendKeys */ 0); /* lock new user */ rv=AB_Banking_BeginExclUseUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not lock user (%d)", rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Unable to lock users (%d)"), rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* get server keys id */ GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Retrieving server keys")); ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetServerKeys(pro, u, ctx, 0, 1, 0); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=AH_NewKeyFileDialog_CheckBankIniLetter(dlg, u); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Bad bank keys, you should contact your bank.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* generate keys */ rv=AH_Provider_CreateKeys(pro, u, 0); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Error generating keys: %d"), rv); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* send user keys */ GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Sending user keys")); ctx=AB_ImExporterContext_new(); rv=AH_Provider_SendUserKeys2(pro, u, ctx, 0, 0, 1, 0); /* withAuthKey, withProgress, nounmount, doLock */ if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); //unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* unlock user */ rv=AB_Banking_EndExclUseUser(xdlg->banking, u, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not unlock customer [%s] (%d)", AB_User_GetCustomerId(u), rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Could not unlock user %s (%d)"), AB_User_GetUserId(u), rv); AB_Banking_EndExclUseUser(xdlg->banking, u, 1); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } GWEN_Gui_ProgressEnd(pid); AH_NewKeyFileDialog_EnterPage(dlg, PAGE_END, 1); xdlg->user=u; return GWEN_DialogEvent_ResultHandled; }
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; }
void gnc_ab_gettrans(GtkWidget *parent, Account *gnc_acc) { AB_BANKING *api; gboolean online = FALSE; AB_ACCOUNT *ab_acc; GWEN_TIME *from_date = NULL, *to_date = NULL; Timespec until_timespec; AB_JOB *job = NULL; AB_JOB_LIST2 *job_list = NULL; GncGWENGui *gui = NULL; AB_IMEXPORTER_CONTEXT *context = NULL; GncABImExContextImport *ieci = NULL; AB_JOB_STATUS job_status; g_return_if_fail(parent && gnc_acc); /* Get the API */ api = gnc_AB_BANKING_new(); if (!api) { g_warning("gnc_ab_gettrans: Couldn't get AqBanking API"); return; } if (AB_Banking_OnlineInit(api #ifdef AQBANKING_VERSION_4_EXACTLY , 0 #endif ) != 0) { g_warning("gnc_ab_gettrans: Couldn't initialize AqBanking API"); goto cleanup; } online = TRUE; /* Get the AqBanking Account */ ab_acc = gnc_ab_get_ab_account(api, gnc_acc); if (!ab_acc) { g_warning("gnc_ab_gettrans: No AqBanking account found"); gnc_error_dialog(parent, _("No valid online banking account assigned.")); goto cleanup; } /* Get the start and end dates for the GetTransactions job. */ if (!gettrans_dates(parent, gnc_acc, &from_date, &to_date)) { g_debug("gnc_ab_gettrans: gettrans_dates aborted"); goto cleanup; } /* Use this as a local storage for the until_time below. */ timespecFromTime_t(&until_timespec, GWEN_Time_toTime_t(to_date)); /* Get a GetTransactions job and enqueue it */ job = AB_JobGetTransactions_new(ab_acc); if (!job || AB_Job_CheckAvailability(job #ifndef AQBANKING_VERSION_5_PLUS , 0 #endif )) { g_warning("gnc_ab_gettrans: JobGetTransactions not available for this " "account"); gnc_error_dialog(parent, _("Online action \"Get Transactions\" not available for this account.")); goto cleanup; } AB_JobGetTransactions_SetFromTime(job, from_date); AB_JobGetTransactions_SetToTime(job, to_date); job_list = AB_Job_List2_new(); AB_Job_List2_PushBack(job_list, job); /* Get a GUI object */ gui = gnc_GWEN_Gui_get(parent); if (!gui) { g_warning("gnc_ab_gettrans: Couldn't initialize Gwenhywfar GUI"); goto cleanup; } /* Create a context to store the results */ context = AB_ImExporterContext_new(); /* Execute the job */ AB_Banking_ExecuteJobs(api, job_list, context #ifndef AQBANKING_VERSION_5_PLUS , 0 #endif ); /* Ignore the return value of AB_Banking_ExecuteJobs(), as the job's * status always describes better whether the job was actually * transferred to and accepted by the bank. See also * http://lists.gnucash.org/pipermail/gnucash-de/2008-September/006389.html */ job_status = AB_Job_GetStatus(job); if (job_status != AB_Job_StatusFinished && job_status != AB_Job_StatusPending) { g_warning("gnc_ab_gettrans: Error on executing job"); gnc_error_dialog(parent, _("Error on executing job.\n\nStatus: %s - %s") , AB_Job_Status2Char(job_status) , AB_Job_GetResultText(job)); goto cleanup; } /* Import the results */ ieci = gnc_ab_import_context(context, AWAIT_TRANSACTIONS, FALSE, NULL, parent); if (!(gnc_ab_ieci_get_found(ieci) & FOUND_TRANSACTIONS)) { /* No transaction found */ GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(parent), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "%s", _("The Online Banking import returned no transactions " "for the selected time period.")); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } /* Store the date of this retrieval */ gnc_ab_set_account_trans_retrieval(gnc_acc, until_timespec); cleanup: if (ieci) g_free(ieci); if (context) AB_ImExporterContext_free(context); if (gui) gnc_GWEN_Gui_release(gui); if (job_list) AB_Job_List2_free(job_list); if (job) AB_Job_free(job); if (to_date) GWEN_Time_free(to_date); if (from_date) GWEN_Time_free(from_date); if (online) #ifdef AQBANKING_VERSION_4_EXACTLY AB_Banking_OnlineFini(api, 0); #else AB_Banking_OnlineFini(api); #endif gnc_AB_BANKING_fini(api); }
int AH_Control_GetItanModes(AB_PROVIDER *pro, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; uint32_t uid; AB_USER *u=NULL; int rv; const GWEN_ARGS args[]= { { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Int, /* type */ "userId", /* name */ 0, /* minnum */ 1, /* maxnum */ "u", /* short option */ "user", /* long option */ "Specify the unique user id", /* short description */ "Specify the unique user id" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } /* doit */ uid=(uint32_t) GWEN_DB_GetIntValue(db, "userId", 0, 0); if (uid==0) { fprintf(stderr, "ERROR: Invalid or missing unique user id\n"); return 1; } rv=AB_Provider_HasUser(pro, uid); if (rv<0) { fprintf(stderr, "ERROR: User with id %lu not found\n", (unsigned long int) uid); return 2; } rv=AB_Provider_GetUser(pro, uid, 1, 1, &u); if (rv<0) { fprintf(stderr, "ERROR: User with id %lu not found\n", (unsigned long int) uid); return 2; } else { AB_IMEXPORTER_CONTEXT *ctx; ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetItanModes(pro, u, ctx, 1, 0, 1); AB_ImExporterContext_free(ctx); if (rv) { DBG_ERROR_ERR(0, rv); AB_User_free(u); return 3; } } AB_User_free(u); return 0; }
void gnc_ab_maketrans(GtkWidget *parent, Account *gnc_acc, GncABTransType trans_type) { AB_BANKING *api; gboolean online = FALSE; AB_ACCOUNT *ab_acc; GList *templates = NULL; GncABTransDialog *td = NULL; gboolean successful = FALSE; gboolean aborted = FALSE; g_return_if_fail(parent && gnc_acc); /* Get the API */ api = gnc_AB_BANKING_new(); if (!api) { g_warning("gnc_ab_maketrans: Couldn't get AqBanking API"); return; } if (AB_Banking_OnlineInit(api #ifdef AQBANKING_VERSION_4_EXACTLY , 0 #endif ) != 0) { g_warning("gnc_ab_maketrans: Couldn't initialize AqBanking API"); goto cleanup; } online = TRUE; /* Get the AqBanking Account */ ab_acc = gnc_ab_get_ab_account(api, gnc_acc); if (!ab_acc) { g_warning("gnc_ab_gettrans: No AqBanking account found"); gnc_error_dialog(parent, _("No valid online banking account assigned.")); goto cleanup; } /* Get list of template transactions */ templates = gnc_ab_trans_templ_list_new_from_book( gnc_account_get_book(gnc_acc)); /* Create new ABTransDialog */ td = gnc_ab_trans_dialog_new(parent, ab_acc, xaccAccountGetCommoditySCU(gnc_acc), trans_type, templates); templates = NULL; /* Repeat until AqBanking action was successful or user pressed cancel */ do { GncGWENGui *gui = NULL; gint result; gboolean changed; const AB_TRANSACTION *ab_trans; AB_JOB *job = NULL; AB_JOB_LIST2 *job_list = NULL; XferDialog *xfer_dialog = NULL; gnc_numeric amount; gchar *description; gchar *memo; Transaction *gnc_trans = NULL; AB_IMEXPORTER_CONTEXT *context = NULL; AB_JOB_STATUS job_status; GncABImExContextImport *ieci = NULL; /* Get a GUI object */ gui = gnc_GWEN_Gui_get(parent); if (!gui) { g_warning("gnc_ab_maketrans: Couldn't initialize Gwenhywfar GUI"); aborted = TRUE; goto repeat; } /* Let the user enter the values */ result = gnc_ab_trans_dialog_run_until_ok(td); /* Save the templates */ templates = gnc_ab_trans_dialog_get_templ(td, &changed); if (changed) save_templates(parent, gnc_acc, templates, (result == GNC_RESPONSE_NOW)); g_list_free(templates); templates = NULL; if (result != GNC_RESPONSE_NOW && result != GNC_RESPONSE_LATER) { aborted = TRUE; goto repeat; } /* Get a job and enqueue it */ ab_trans = gnc_ab_trans_dialog_get_ab_trans(td); job = gnc_ab_trans_dialog_get_job(td); if (!job || AB_Job_CheckAvailability(job #ifndef AQBANKING_VERSION_5_PLUS , 0 #endif )) { if (!gnc_verify_dialog( parent, FALSE, "%s", _("The backend found an error during the preparation " "of the job. It is not possible to execute this job. \n" "\n" "Most probable the bank does not support your chosen " "job or your Online Banking account does not have the permission " "to execute this job. More error messages might be " "visible on your console log.\n" "\n" "Do you want to enter the job again?"))) aborted = TRUE; goto repeat; } job_list = AB_Job_List2_new(); AB_Job_List2_PushBack(job_list, job); /* Setup a Transfer Dialog for the GnuCash transaction */ xfer_dialog = gnc_xfer_dialog(gnc_ab_trans_dialog_get_parent(td), gnc_acc); switch (trans_type) { case SINGLE_DEBITNOTE: gnc_xfer_dialog_set_title( xfer_dialog, _("Online Banking Direct Debit Note")); gnc_xfer_dialog_lock_to_account_tree(xfer_dialog); break; case SINGLE_INTERNAL_TRANSFER: gnc_xfer_dialog_set_title( xfer_dialog, _("Online Banking Bank-Internal Transfer")); gnc_xfer_dialog_lock_from_account_tree(xfer_dialog); break; case SEPA_TRANSFER: gnc_xfer_dialog_set_title( xfer_dialog, _("Online Banking European (SEPA) Transfer")); gnc_xfer_dialog_lock_from_account_tree(xfer_dialog); break; case SEPA_DEBITNOTE: gnc_xfer_dialog_set_title( xfer_dialog, _("Online Banking European (SEPA) Debit Note")); gnc_xfer_dialog_lock_to_account_tree(xfer_dialog); break; case SINGLE_TRANSFER: default: gnc_xfer_dialog_set_title( xfer_dialog, _("Online Banking Transaction")); gnc_xfer_dialog_lock_from_account_tree(xfer_dialog); } gnc_xfer_dialog_set_to_show_button_active(xfer_dialog, TRUE); amount = double_to_gnc_numeric( AB_Value_GetValueAsDouble(AB_Transaction_GetValue(ab_trans)), xaccAccountGetCommoditySCU(gnc_acc), GNC_HOW_RND_ROUND_HALF_UP); gnc_xfer_dialog_set_amount(xfer_dialog, amount); gnc_xfer_dialog_set_amount_sensitive(xfer_dialog, FALSE); gnc_xfer_dialog_set_date_sensitive(xfer_dialog, FALSE); description = gnc_ab_description_to_gnc(ab_trans); gnc_xfer_dialog_set_description(xfer_dialog, description); g_free(description); memo = gnc_ab_memo_to_gnc(ab_trans); gnc_xfer_dialog_set_memo(xfer_dialog, memo); g_free(memo); gnc_xfer_dialog_set_txn_cb(xfer_dialog, txn_created_cb, &gnc_trans); /* And run it */ successful = gnc_xfer_dialog_run_until_done(xfer_dialog); /* On cancel, go back to the AB transaction dialog */ if (!successful || !gnc_trans) { successful = FALSE; goto repeat; } if (result == GNC_RESPONSE_NOW) { /* Create a context to store possible results */ context = AB_ImExporterContext_new(); gui = gnc_GWEN_Gui_get(parent); if (!gui) { g_warning("gnc_ab_maketrans: Couldn't initialize Gwenhywfar GUI"); aborted = TRUE; goto repeat; } /* Finally, execute the job */ AB_Banking_ExecuteJobs(api, job_list, context #ifndef AQBANKING_VERSION_5_PLUS , 0 #endif ); /* Ignore the return value of AB_Banking_ExecuteJobs(), as the job's * status always describes better whether the job was actually * transferred to and accepted by the bank. See also * http://lists.gnucash.org/pipermail/gnucash-de/2008-September/006389.html */ job_status = AB_Job_GetStatus(job); if (job_status != AB_Job_StatusFinished && job_status != AB_Job_StatusPending) { successful = FALSE; if (!gnc_verify_dialog( parent, FALSE, "%s", _("An error occurred while executing the job. Please check " "the log window for the exact error message.\n" "\n" "Do you want to enter the job again?"))) { aborted = TRUE; } } else { successful = TRUE; } if (successful) { /* Import the results, awaiting nothing */ ieci = gnc_ab_import_context(context, 0, FALSE, NULL, parent); } } /* Simply ignore any other case */ repeat: /* Clean up */ if (gnc_trans && !successful) { xaccTransBeginEdit(gnc_trans); xaccTransDestroy(gnc_trans); xaccTransCommitEdit(gnc_trans); gnc_trans = NULL; } if (ieci) g_free(ieci); if (context) AB_ImExporterContext_free(context); if (job_list) { AB_Job_List2_free(job_list); job_list = NULL; } if (job) { AB_Job_free(job); job = NULL; } if (gui) { gnc_GWEN_Gui_release(gui); gui = NULL; } } while (!successful && !aborted); cleanup: if (td) gnc_ab_trans_dialog_free(td); if (online) #ifdef AQBANKING_VERSION_4_EXACTLY AB_Banking_OnlineFini(api, 0); #else AB_Banking_OnlineFini(api); #endif gnc_AB_BANKING_fini(api); }
void gnc_ab_getbalance(GtkWidget *parent, Account *gnc_acc) { AB_BANKING *api; gboolean online = FALSE; AB_ACCOUNT *ab_acc; AB_JOB *job = NULL; AB_JOB_LIST2 *job_list = NULL; GncGWENGui *gui = NULL; AB_IMEXPORTER_CONTEXT *context = NULL; GncABImExContextImport *ieci = NULL; AB_JOB_STATUS job_status; g_return_if_fail(parent && gnc_acc); /* Get the API */ api = gnc_AB_BANKING_new(); if (!api) { g_warning("gnc_ab_gettrans: Couldn't get AqBanking API"); return; } if (AB_Banking_OnlineInit(api #ifdef AQBANKING_VERSION_4_EXACTLY , 0 #endif ) != 0) { g_warning("gnc_ab_gettrans: Couldn't initialize AqBanking API"); goto cleanup; } online = TRUE; /* Get the AqBanking Account */ ab_acc = gnc_ab_get_ab_account(api, gnc_acc); if (!ab_acc) { g_warning("gnc_ab_getbalance: No AqBanking account found"); gnc_error_dialog (GTK_WINDOW (parent), _("No valid online banking account assigned.")); goto cleanup; } /* Get a GetBalance job and enqueue it */ job = AB_JobGetBalance_new(ab_acc); if (!job || AB_Job_CheckAvailability(job #ifndef AQBANKING_VERSION_5_PLUS , 0 #endif )) { g_warning("gnc_ab_getbalance: JobGetBalance not available for this " "account"); gnc_error_dialog (GTK_WINDOW (parent), _("Online action \"Get Balance\" not available for this account.")); goto cleanup; } job_list = AB_Job_List2_new(); AB_Job_List2_PushBack(job_list, job); /* Get a GUI object */ gui = gnc_GWEN_Gui_get(parent); if (!gui) { g_warning("gnc_ab_getbalance: Couldn't initialize Gwenhywfar GUI"); goto cleanup; } /* Create a context to store the results */ context = AB_ImExporterContext_new(); /* Execute the job */ AB_Banking_ExecuteJobs(api, job_list, context #ifndef AQBANKING_VERSION_5_PLUS , 0 #endif ); /* Ignore the return value of AB_Banking_ExecuteJobs(), as the job's * status always describes better whether the job was actually * transferred to and accepted by the bank. See also * http://lists.gnucash.org/pipermail/gnucash-de/2008-September/006389.html */ job_status = AB_Job_GetStatus(job); if (job_status != AB_Job_StatusFinished && job_status != AB_Job_StatusPending) { g_warning("gnc_ab_getbalance: Error on executing job"); gnc_error_dialog (GTK_WINDOW (parent), _("Error on executing job.\n\nStatus: %s - %s"), AB_Job_Status2Char(job_status), AB_Job_GetResultText(job)); goto cleanup; } /* Import the results */ ieci = gnc_ab_import_context(context, AWAIT_BALANCES, FALSE, NULL, parent); cleanup: if (ieci) g_free(ieci); if (context) AB_ImExporterContext_free(context); if (gui) gnc_GWEN_Gui_release(gui); if (job_list) AB_Job_List2_free(job_list); if (job) AB_Job_free(job); if (online) #ifdef AQBANKING_VERSION_4_EXACTLY AB_Banking_OnlineFini(api, 0); #else AB_Banking_OnlineFini(api); #endif gnc_AB_BANKING_fini(api); }
/* --------------------------------------------------------------- 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; }
void gnc_file_aqbanking_import(const gchar *aqbanking_importername, const gchar *aqbanking_profilename, gboolean execute_transactions) { gchar *default_dir; gchar *selected_filename = NULL; gint dtaus_fd = -1; AB_BANKING *api = NULL; gboolean online = FALSE; GncGWENGui *gui = NULL; AB_IMEXPORTER *importer; GWEN_DB_NODE *db_profiles = NULL; GWEN_DB_NODE *db_profile; AB_IMEXPORTER_CONTEXT *context = NULL; GWEN_IO_LAYER *io; GncABImExContextImport *ieci = NULL; AB_JOB_LIST2 *job_list = NULL; /* Select a file */ default_dir = gnc_get_default_directory(GCONF_SECTION_AQBANKING); selected_filename = gnc_file_dialog(_("Select a file to import"), NULL, default_dir, GNC_FILE_DIALOG_IMPORT); g_free(default_dir); if (!selected_filename) goto cleanup; DEBUG("filename: %s", selected_filename); /* Remember the directory as the default */ default_dir = g_path_get_dirname(selected_filename); gnc_set_default_directory(GCONF_SECTION_AQBANKING, default_dir); g_free(default_dir); dtaus_fd = g_open(selected_filename, O_RDONLY, 0); if (dtaus_fd == -1) { DEBUG("Could not open file %s", selected_filename); goto cleanup; } /* Get the API */ api = gnc_AB_BANKING_new(); if (!api) { g_warning("gnc_file_aqbanking_import: Couldn't get AqBanking API"); goto cleanup; } if (AB_Banking_OnlineInit(api #ifdef AQBANKING_VERSION_4_PLUS , 0 #endif ) != 0) { g_warning("gnc_file_aqbanking_import: " "Couldn't initialize AqBanking API"); goto cleanup; } online = TRUE; /* Get a GUI object */ gui = gnc_GWEN_Gui_get(NULL); if (!gui) { g_warning("gnc_ab_getbalance: Couldn't initialize Gwenhywfar GUI"); goto cleanup; } /* Get import module */ importer = AB_Banking_GetImExporter(api, aqbanking_importername); if (!importer) { g_warning("Import module %s not found", aqbanking_importername); gnc_error_dialog(NULL, "%s", _("Import module for DTAUS import not found.")); goto cleanup; } /* Load the import profile */ db_profiles = AB_Banking_GetImExporterProfiles(api, aqbanking_importername); /* Select profile */ db_profile = GWEN_DB_GetFirstGroup(db_profiles); while (db_profile) { const gchar *name; name = GWEN_DB_GetCharValue(db_profile, "name", 0, 0); g_return_if_fail(name); if (g_ascii_strcasecmp(name, aqbanking_profilename) == 0) break; db_profile = GWEN_DB_GetNextGroup(db_profile); } if (!db_profile) { g_warning("Profile \"%s\" for importer \"%s\" not found", aqbanking_profilename, aqbanking_importername); /* For debugging: Print those available names that have been found */ db_profile = GWEN_DB_GetFirstGroup(db_profiles); while (db_profile) { const char *name = GWEN_DB_GetCharValue(db_profile, "name", 0, 0); g_warning("Only found profile \"%s\"\n", name ? name : "(null)"); db_profile = GWEN_DB_GetNextGroup(db_profile); } goto cleanup; } /* Create a context to store the results */ context = AB_ImExporterContext_new(); /* Wrap file in buffered gwen io */ io = GWEN_Io_LayerFile_new(dtaus_fd, -1); dtaus_fd = -1; if (GWEN_Io_Manager_RegisterLayer(io)) { g_warning("gnc_file_aqbanking_import: Failed to wrap file"); goto cleanup; } /* Run the import */ if (AB_ImExporter_Import(importer, context, io, db_profile, 0)) { g_warning("gnc_file_aqbanking_import: Error on import"); goto cleanup; } /* Close the file */ GWEN_Io_Layer_free(io); /* Import the results */ ieci = gnc_ab_import_context(context, AWAIT_TRANSACTIONS, execute_transactions, execute_transactions ? api : NULL, NULL); /* Extract the list of jobs */ job_list = gnc_ab_ieci_get_job_list(ieci); if (execute_transactions) { if (gnc_ab_ieci_run_matcher(ieci)) { /* FIXME */ /* gnc_hbci_multijob_execute(NULL, api, job_list, gui); */ } } cleanup: if (job_list) AB_Job_List2_FreeAll(job_list); if (ieci) g_free(ieci); if (context) AB_ImExporterContext_free(context); if (db_profiles) GWEN_DB_Group_free(db_profiles); if (gui) gnc_GWEN_Gui_release(gui); if (online) #ifdef AQBANKING_VERSION_4_PLUS AB_Banking_OnlineFini(api, 0); #else AB_Banking_OnlineFini(api); #endif if (api) gnc_AB_BANKING_fini(api); if (dtaus_fd != -1) close(dtaus_fd); if (selected_filename) g_free(selected_filename); }
int main(int argc, char **argv) { GWEN_GUI *gui; AB_BANKING *ab; AB_ACCOUNT_SPEC_LIST *accs=NULL; AB_ACCOUNT_SPEC *as; AB_IMEXPORTER_ACCOUNTINFO *ai; gui=GWEN_Gui_CGui_new(); GWEN_Gui_SetGui(gui); ab=AB_Banking_new("tutorial3", 0, 0); AB_Banking_Init(ab); fprintf(stderr, "AqBanking successfully initialized.\n"); /* get the list of known accounts */ AB_Banking_GetAccountSpecList(ab, &accs); /* find a matching account within the given list */ as=AB_AccountSpec_List_FindFirst(accs, "aqhbci", /* backendName */ "de", /* country */ "28*", /* bankId bank */ "*", /* accountNumber */ "*", /* subAccountId */ "*", /* iban */ "*", /* currency */ AB_AccountType_Unknown); /* ty */ if (as) { AB_TRANSACTION_LIST2 *cmdList; AB_TRANSACTION *t; AB_IMEXPORTER_CONTEXT *ctx; cmdList=AB_Transaction_List2_new(); t=AB_Transaction_new(); AB_Transaction_SetCommand(t, AB_Transaction_CommandGetTransactions); AB_Transaction_SetUniqueAccountId(t, AB_AccountSpec_GetUniqueId(as)); AB_Transaction_List2_PushBack(cmdList, t); ctx=AB_ImExporterContext_new(); AB_Banking_SendCommands(ab, cmdList, ctx); ai=AB_ImExporterContext_GetFirstAccountInfo(ctx); while (ai) { const AB_TRANSACTION *t; t=AB_ImExporterAccountInfo_GetFirstTransaction(ai, 0, 0); while (t) { const AB_VALUE *v; v=AB_Transaction_GetValue(t); if (v) { const char *purpose; purpose=AB_Transaction_GetPurpose(t); fprintf(stderr, " %-32s (%.2f %s)\n", purpose, AB_Value_GetValueAsDouble(v), AB_Value_GetCurrency(v)); } t=AB_Transaction_List_Next(t); } /* while transactions */ ai=AB_ImExporterAccountInfo_List_Next(ai); } /* while ai */ AB_ImExporterContext_free(ctx); } /* if (as) */ AB_Banking_Fini(ab); AB_Banking_free(ab); return 0; }
static int listTrans(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv) { GWEN_DB_NODE *db; int rv; const char *ctxFile; const char *outFile; const char *exporterName; const char *profileName; const char *profileFile; AB_IMEXPORTER_CONTEXT *ctx=0; AB_IMEXPORTER_CONTEXT *nctx=0; AB_IMEXPORTER_ACCOUNTINFO *iea=0; const char *bankId; const char *accountId; const char *bankName; const char *accountName; const GWEN_ARGS args[]={ { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankId", /* name */ 0, /* minnum */ 1, /* maxnum */ "b", /* short option */ "bank", /* long option */ "Specify the bank code", /* short description */ "Specify the bank code" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountId", /* name */ 0, /* minnum */ 1, /* maxnum */ "a", /* short option */ "account", /* long option */ "Specify the account number", /* short description */ "Specify the account number" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "bankName", /* name */ 0, /* minnum */ 1, /* maxnum */ "N", /* short option */ "bankname", /* long option */ "Specify the bank name", /* short description */ "Specify the bank name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "accountName", /* name */ 0, /* minnum */ 1, /* maxnum */ "n", /* short option */ "accountname", /* long option */ "Specify the account name", /* short description */ "Specify the account name" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "ctxFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "c", /* short option */ "ctxfile", /* long option */ "Specify the file to store the context in", /* short description */ "Specify the file to store the context in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "outFile", /* name */ 0, /* minnum */ 1, /* maxnum */ "o", /* short option */ "outfile", /* long option */ "Specify the file to store the data in", /* short description */ "Specify the file to store the data in" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "exporterName", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "exporter", /* long option */ "Specify the exporter to use", /* short description */ "Specify the exporter to use" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "profileName", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "profile", /* long option */ "Specify the export profile to use", /* short description */ "Specify the export profile to use" /* long description */ }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ "profileFile", /* name */ 0, /* minnum */ 1, /* maxnum */ 0, /* short option */ "profile-file", /* long option */ "Specify the file to load the export profile from",/* short description */ "Specify the file to load the export profile from" /* long description */ }, { GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ GWEN_ArgsType_Int, /* type */ "help", /* name */ 0, /* minnum */ 0, /* maxnum */ "h", /* short option */ "help", /* long option */ "Show this help screen", /* short description */ "Show this help screen" /* long description */ } }; db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local"); rv=GWEN_Args_Check(argc, argv, 1, 0 /*GWEN_ARGS_MODE_ALLOW_FREEPARAM*/, args, db); if (rv==GWEN_ARGS_RESULT_ERROR) { fprintf(stderr, "ERROR: Could not parse arguments\n"); return 1; } else if (rv==GWEN_ARGS_RESULT_HELP) { GWEN_BUFFER *ubuf; ubuf=GWEN_Buffer_new(0, 1024, 0, 1); if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { fprintf(stderr, "ERROR: Could not create help string\n"); return 1; } fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf)); GWEN_Buffer_free(ubuf); return 0; } exporterName=GWEN_DB_GetCharValue(db, "exporterName", 0, "csv"); profileName=GWEN_DB_GetCharValue(db, "profileName", 0, "default"); profileFile=GWEN_DB_GetCharValue(db, "profileFile", 0, NULL); bankId=GWEN_DB_GetCharValue(db, "bankId", 0, 0); bankName=GWEN_DB_GetCharValue(db, "bankName", 0, 0); accountId=GWEN_DB_GetCharValue(db, "accountId", 0, 0); accountName=GWEN_DB_GetCharValue(db, "accountName", 0, 0); outFile=GWEN_DB_GetCharValue(db, "outFile", 0, 0); rv=AB_Banking_Init(ab); if (rv) { DBG_ERROR(0, "Error on init (%d)", rv); return 2; } /* load ctx file */ ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); rv=readContext(ctxFile, &ctx, 1); if (rv<0) { DBG_ERROR(0, "Error reading context (%d)", rv); AB_ImExporterContext_free(ctx); return 4; } nctx=AB_ImExporterContext_new(); iea=AB_ImExporterContext_GetFirstAccountInfo(ctx); while(iea) { int matches=1; const char *s; if (matches && bankId) { s=AB_ImExporterAccountInfo_GetBankCode(iea); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, bankId, 0)) matches=0; } if (matches && bankName) { s=AB_ImExporterAccountInfo_GetBankName(iea); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, bankName, 0)) matches=0; } if (matches && accountId) { s=AB_ImExporterAccountInfo_GetAccountNumber(iea); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, accountId, 0)) matches=0; } if (matches && accountName) { s=AB_ImExporterAccountInfo_GetAccountName(iea); if (!s || !*s || -1==GWEN_Text_ComparePattern(s, accountName, 0)) matches=0; } if (matches) { AB_IMEXPORTER_ACCOUNTINFO *nai; nai=AB_ImExporterAccountInfo_dup(iea); AB_ImExporterContext_AddAccountInfo(nctx, nai); } /* if matches */ iea=AB_ImExporterContext_GetNextAccountInfo(ctx); } /* while */ AB_ImExporterContext_free(ctx); /* export new context */ rv=AB_Banking_ExportToFileWithProfile(ab, exporterName, nctx, profileName, profileFile, outFile); if (rv<0) { DBG_ERROR(0, "Error exporting (%d).", rv); AB_ImExporterContext_free(nctx); return 4; } AB_ImExporterContext_free(nctx); rv=AB_Banking_Fini(ab); if (rv) { fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv); return 5; } return 0; }