LC_CLIENT_RESULT LC_EgkCard_ReadInsuranceData_5_1_0(GWEN_XMLNODE *n, LC_HI_INSURANCE_DATA *d) { const char *s; GWEN_XMLNODE *nn; n=GWEN_XMLNode_FindFirstTag(n, "Versicherter", NULL, NULL); if (n) { nn=GWEN_XMLNode_FindFirstTag(n, "Versicherungsschutz", NULL, NULL); if (nn) { GWEN_XMLNODE *nnn; s=GWEN_XMLNode_GetCharValue(nn, "Beginn", NULL); if (s) { GWEN_TIME *ti=GWEN_Time_fromUtcString(s, "YYYYMMDD"); LC_HIInsuranceData_SetCoverBegin(d, ti); GWEN_Time_free(ti); } s=GWEN_XMLNode_GetCharValue(nn, "Ende", NULL); if (s) { GWEN_TIME *ti=GWEN_Time_fromUtcString(s, "YYYYMMDD"); LC_HIInsuranceData_SetCoverEnd(d, ti); GWEN_Time_free(ti); } nnn=GWEN_XMLNode_FindFirstTag(nn, "Kostentraeger", NULL, NULL); if (nnn) { s=GWEN_XMLNode_GetCharValue(nnn, "Kostentraegerkennung", NULL); LC_HIInsuranceData_SetInstitutionId(d, s); s=GWEN_XMLNode_GetCharValue(nnn, "Name", NULL); LC_HIInsuranceData_SetInstitutionName(d, s); } } else { DBG_INFO(LC_LOGDOMAIN, "XML element \"Versicherungsschutz\" not found"); } nn=GWEN_XMLNode_FindFirstTag(n, "Zusatzinfos", NULL, NULL); if (nn) nn=GWEN_XMLNode_FindFirstTag(nn, "ZusatzinfosGKV", NULL, NULL); if (nn) { s=GWEN_XMLNode_GetCharValue(nn, "Rechtskreis", NULL); LC_HIInsuranceData_SetGroup(d, s); s=GWEN_XMLNode_GetCharValue(nn, "Versichertenart", NULL); LC_HIInsuranceData_SetStatus(d, s); } } return LC_Client_ResultOk; }
/* --------------------------------------------------------------- FUNCTION */ int AH_AccountJob_AddCurrentDate(GWEN_BUFFER *buf) { GWEN_TIME *t; int year, month, day; char numbuf[16]; t=GWEN_CurrentTime(); assert(t); if (GWEN_Time_GetBrokenDownDate(t, &day, &month, &year)) { GWEN_Time_free(t); return -1; } snprintf(numbuf, sizeof(numbuf), "%04d%02d%02d", year, month, day); GWEN_Buffer_AppendString(buf, numbuf); GWEN_Time_free(t); return 0; }
/* --------------------------------------------------------------- FUNCTION */ int AH_AccountJob_AddCurrentTime(GWEN_BUFFER *buf) { GWEN_TIME *t; int hours, mins, secs; char numbuf[16]; t=GWEN_CurrentTime(); assert(t); if (GWEN_Time_GetBrokenDownTime(t, &hours, &mins, &secs)) { GWEN_Time_free(t); return -1; } snprintf(numbuf, sizeof(numbuf), "%02d%02d%02d", hours, mins, secs); GWEN_Buffer_AppendString(buf, numbuf); GWEN_Time_free(t); return 0; }
int LC_HIPersonalData_ReadDb(LC_HI_PERSONAL_DATA *st, GWEN_DB_NODE *db) { assert(st); assert(db); LC_HIPersonalData_SetInsuranceId(st, GWEN_DB_GetCharValue(db, "insuranceId", 0, 0)); LC_HIPersonalData_SetPrename(st, GWEN_DB_GetCharValue(db, "prename", 0, 0)); LC_HIPersonalData_SetName(st, GWEN_DB_GetCharValue(db, "name", 0, 0)); LC_HIPersonalData_SetTitle(st, GWEN_DB_GetCharValue(db, "title", 0, 0)); LC_HIPersonalData_SetNameSuffix(st, GWEN_DB_GetCharValue(db, "nameSuffix", 0, 0)); LC_HIPersonalData_SetSex(st, LC_HIPersonalData_Sex_fromString(GWEN_DB_GetCharValue(db, "sex", 0, 0))); if (1) { /* for local vars */ GWEN_DB_NODE *dbT; dbT=GWEN_DB_GetGroup(db, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "dateOfBirth"); if (dbT) { if (st->dateOfBirth) GWEN_Time_free(st->dateOfBirth); st->dateOfBirth=GWEN_Time_fromDb(dbT); } } LC_HIPersonalData_SetAddrZipCode(st, GWEN_DB_GetCharValue(db, "addrZipCode", 0, 0)); LC_HIPersonalData_SetAddrCity(st, GWEN_DB_GetCharValue(db, "addrCity", 0, 0)); LC_HIPersonalData_SetAddrState(st, GWEN_DB_GetCharValue(db, "addrState", 0, 0)); LC_HIPersonalData_SetAddrCountry(st, GWEN_DB_GetCharValue(db, "addrCountry", 0, 0)); LC_HIPersonalData_SetAddrStreet(st, GWEN_DB_GetCharValue(db, "addrStreet", 0, 0)); LC_HIPersonalData_SetAddrHouseNum(st, GWEN_DB_GetCharValue(db, "addrHouseNum", 0, 0)); return 0; }
void LC_HIPersonalData_free(LC_HI_PERSONAL_DATA *st) { if (st) { assert(st->_usage); if (--(st->_usage)==0) { if (st->insuranceId) free(st->insuranceId); if (st->prename) free(st->prename); if (st->name) free(st->name); if (st->title) free(st->title); if (st->nameSuffix) free(st->nameSuffix); if (st->dateOfBirth) GWEN_Time_free(st->dateOfBirth); if (st->addrZipCode) free(st->addrZipCode); if (st->addrCity) free(st->addrCity); if (st->addrState) free(st->addrState); if (st->addrCountry) free(st->addrCountry); if (st->addrStreet) free(st->addrStreet); if (st->addrHouseNum) free(st->addrHouseNum); GWEN_LIST_FINI(LC_HI_PERSONAL_DATA, st) GWEN_FREE_OBJECT(st); } } }
void LC_HIPersonalData_SetDateOfBirth(LC_HI_PERSONAL_DATA *st, const GWEN_TIME *d) { assert(st); if (st->dateOfBirth) GWEN_Time_free(st->dateOfBirth); if (d) st->dateOfBirth=GWEN_Time_dup(d); else st->dateOfBirth=0; st->_modified=1; }
int AB_ImExporterYN__ReadAccountStatus(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, "LEN")==0) { GWEN_XMLNODE *nnn; GWEN_TIME *ti=0; AB_VALUE *val=0; /* read time */ nnn=GWEN_XMLNode_GetNodeByXPath(n, "SG5/DTM", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (nnn) ti=AB_ImExporterYN__ReadTime(ie, nnn, 202); /* read value */ nnn=GWEN_XMLNode_GetNodeByXPath(n, "SG5/MOA", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (nnn) val=AB_ImExporterYN__ReadValue(ie, nnn, 343); if (val) { AB_ACCOUNT_STATUS *ast; AB_BALANCE *bal; AB_Value_SetCurrency(val, AB_ImExporterAccountInfo_GetCurrency(ai)); ast=AB_AccountStatus_new(); bal=AB_Balance_new(val, ti); AB_AccountStatus_SetBookedBalance(ast, bal); AB_Balance_free(bal); AB_ImExporterAccountInfo_AddAccountStatus(ai, ast); } AB_Value_free(val); GWEN_Time_free(ti); } } n=GWEN_XMLNode_FindNextTag(n, "SG4", 0, 0); } return 0; }
GWEN_TIME *GWEN_CurrentTime(void) { GWEN_TIME *t; GWEN_NEW_OBJECT(GWEN_TIME, t); if (GWEN_Time__GetCurrentTime(t)) { DBG_ERROR(GWEN_LOGDOMAIN, "Could not get current time"); GWEN_Time_free(t); return 0; } return t; }
LC_CLIENT_RESULT LC_EgkCard_ReadPersonalData_old(GWEN_XMLNODE *n, LC_HI_PERSONAL_DATA *d) { const char *s; GWEN_XMLNODE *nn; s=GWEN_XMLNode_GetCharValue(n, "Versicherten_ID", NULL); LC_HIPersonalData_SetInsuranceId(d, s); s=GWEN_XMLNode_GetCharValue(n, "Geburtsdatum", NULL); if (s) { GWEN_TIME *ti=GWEN_Time_fromUtcString(s, "YYYYMMDD"); LC_HIPersonalData_SetDateOfBirth(d, ti); GWEN_Time_free(ti); } s=GWEN_XMLNode_GetCharValue(n, "Vorname", NULL); LC_HIPersonalData_SetPrename(d, s); s=GWEN_XMLNode_GetCharValue(n, "Nachname", NULL); LC_HIPersonalData_SetName(d, s); s=GWEN_XMLNode_GetCharValue(n, "Sex", "1"); if (s) { if (strcasecmp(s, "1")==0) LC_HIPersonalData_SetSex(d, LC_HIPersonalData_SexMale); else if (strcasecmp(s, "2")==0) LC_HIPersonalData_SetSex(d, LC_HIPersonalData_SexFemale); else { DBG_WARN(LC_LOGDOMAIN, "Unknown sex \"%s\"", s); } } nn=GWEN_XMLNode_FindFirstTag(n, "Anschrift", NULL, NULL); if (nn) { s=GWEN_XMLNode_GetCharValue(nn, "Postleitzahl", NULL); LC_HIPersonalData_SetAddrZipCode(d, s); s=GWEN_XMLNode_GetCharValue(nn, "Ort", NULL); LC_HIPersonalData_SetAddrCity(d, s); s=GWEN_XMLNode_GetCharValue(nn, "Wohnsitzlaendercode", NULL); LC_HIPersonalData_SetAddrCountry(d, s); nn=GWEN_XMLNode_FindFirstTag(nn, "Adresse", NULL, NULL); if (nn) { s=GWEN_XMLNode_GetCharValue(nn, "Strasse", NULL); LC_HIPersonalData_SetAddrStreet(d, s); s=GWEN_XMLNode_GetCharValue(nn, "Hausnummer", NULL); LC_HIPersonalData_SetAddrHouseNum(d, s); } } return LC_Client_ResultOk; }
int AO_Provider__WrapRequest(AB_PROVIDER *pro, AB_USER *u, const char *mTypeName, const char *tTypeName, GWEN_BUFFER *buf) { GWEN_BUFFER *tbuf; GWEN_TIME *ti; tbuf=GWEN_Buffer_new(0, 512, 0, 1); /* begin: msg wrapper */ GWEN_Buffer_AppendString(tbuf, "<"); GWEN_Buffer_AppendString(tbuf, mTypeName); GWEN_Buffer_AppendString(tbuf, "MSGSRQV1>"); /* begin: transaction wrapper */ GWEN_Buffer_AppendString(tbuf, "<"); GWEN_Buffer_AppendString(tbuf, tTypeName); GWEN_Buffer_AppendString(tbuf, "TRNRQ>"); ti=GWEN_CurrentTime(); assert(ti); GWEN_Buffer_AppendString(tbuf, "<TRNUID>"); if (AO_User_GetFlags(u) & AO_USER_FLAGS_SEND_SHORT_DATE) GWEN_Time_toString(ti, "YYYYMMDDhhmmss", tbuf); else GWEN_Time_toString(ti, "YYYYMMDDhhmmss.000", tbuf); GWEN_Buffer_AppendString(tbuf, "<CLTCOOKIE>1"); /* append ends of elements to original buffer */ GWEN_Buffer_AppendString(buf, "</"); GWEN_Buffer_AppendString(buf, tTypeName); GWEN_Buffer_AppendString(buf, "TRNRQ>"); GWEN_Buffer_AppendString(buf, "</"); GWEN_Buffer_AppendString(buf, mTypeName); GWEN_Buffer_AppendString(buf, "MSGSRQV1>"); /* go to start of buffer and insert leading elements there */ GWEN_Buffer_SetPos(buf, 0); GWEN_Buffer_InsertBuffer(buf, tbuf); /* point to end of buffer */ GWEN_Buffer_SetPos(buf, GWEN_Buffer_GetUsedBytes(buf)); /* cleanup */ GWEN_Time_free(ti); GWEN_Buffer_free(tbuf); return 0; }
int AO_Provider__AddHeaders(AB_PROVIDER *pro, AB_USER *u, GWEN_BUFFER *buf) { GWEN_TIME *ti; const char *s; ti=GWEN_CurrentTime(); assert(ti); GWEN_Buffer_AppendString(buf, "OFXHEADER:100\r\n" "DATA:OFXSGML\r\n"); GWEN_Buffer_AppendString(buf, "VERSION:"); s=AO_User_GetHeaderVer(u); if (!s || !*s) s="102"; GWEN_Buffer_AppendString(buf, s); GWEN_Buffer_AppendString(buf, "\r\n"); s=AO_User_GetSecurityType(u); if (!s || !*s) s="NONE"; GWEN_Buffer_AppendString(buf, "SECURITY:"); GWEN_Buffer_AppendString(buf, s); GWEN_Buffer_AppendString(buf, "\r\n"); GWEN_Buffer_AppendString(buf, "ENCODING:USASCII\r\n" "CHARSET:1252\r\n" "COMPRESSION:NONE\r\n" "OLDFILEUID:NONE\r\n"); GWEN_Buffer_AppendString(buf, "NEWFILEUID:"); GWEN_Time_toString(ti, "YYYYMMDDhhmmss.000", buf); GWEN_Buffer_AppendString(buf, "\r\n"); /* header finished */ GWEN_Buffer_AppendString(buf, "\r\n"); /* cleanup */ GWEN_Time_free(ti); /* 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; }
AB_TRANSACTION *mkSepaTransfer(AB_ACCOUNT *a, GWEN_DB_NODE *db, int expTransferType) { AB_BANKING *ab; AB_TRANSACTION *t; const char *s; int i; GWEN_TIME *d; assert(a); assert(db); ab=AB_Account_GetBanking(a); assert(ab); t=AB_Transaction_new(); AB_Banking_FillGapsInTransaction(ab, a, t); s=GWEN_DB_GetCharValue(db, "name", 0, 0); if (s && *s) AB_Transaction_SetLocalName(t, s); /* remote account */ s=GWEN_DB_GetCharValue(db, "remoteBankId", 0, 0); if (s && *s) AB_Transaction_SetRemoteBankCode(t, s); s=GWEN_DB_GetCharValue(db, "remoteAccountId", 0, 0); if (s && *s) AB_Transaction_SetRemoteAccountNumber(t, s); s=GWEN_DB_GetCharValue(db, "remoteIban", 0, 0); if (s && *s) AB_Transaction_SetRemoteIban(t, s); else { DBG_ERROR(0, "No remote IBAN given"); AB_Transaction_free(t); return NULL; } s=GWEN_DB_GetCharValue(db, "remoteBic", 0, 0); if (s && *s) AB_Transaction_SetRemoteBic(t, s); else if (strncmp(AB_Transaction_GetLocalIban(t), AB_Transaction_GetRemoteIban(t), 2)) { DBG_ERROR(0, "Remote BIC id required for international transaction"); AB_Transaction_free(t); return NULL; } for (i=0; i<10; i++) { s=GWEN_DB_GetCharValue(db, "remoteName", i, 0); if (!s) break; if (*s) AB_Transaction_AddRemoteName(t, s, 0); } if (i<1) { DBG_ERROR(0, "No remote name given"); AB_Transaction_free(t); return NULL; } /* transfer data */ for (i=0; i<20; i++) { s=GWEN_DB_GetCharValue(db, "purpose", i, 0); if (!s) break; if (*s) AB_Transaction_AddPurpose(t, s, 0); } if (i<1) { DBG_ERROR(0, "No purpose given"); AB_Transaction_free(t); return NULL; } i=GWEN_DB_GetIntValue(db, "textkey", 0, -1); if (i>0) AB_Transaction_SetTextKey(t, i); s=GWEN_DB_GetCharValue(db, "value", 0, 0); if (s && *s) { AB_VALUE *v; v=AB_Value_fromString(s); assert(v); if (AB_Value_IsNegative(v) || AB_Value_IsZero(v)) { DBG_ERROR(0, "Only positive non-zero amount allowed"); AB_Transaction_free(t); return NULL; } AB_Transaction_SetValue(t, v); AB_Value_free(v); } else { DBG_ERROR(0, "No value given"); AB_Transaction_free(t); return NULL; } /* dated transfer, SEPA debit notes */ s=GWEN_DB_GetCharValue(db, "executionDate", 0, 0); if (s && *s) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendString(dbuf, s); GWEN_Buffer_AppendString(dbuf, "-00:00"); d=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); GWEN_Buffer_free(dbuf); if (d==0) { DBG_ERROR(0, "Invalid execution date value \"%s\"", s); AB_Transaction_free(t); return NULL; } AB_Transaction_SetDate(t, d); GWEN_Time_free(d); } /* standing orders */ s=GWEN_DB_GetCharValue(db, "firstExecutionDate", 0, 0); if (s && *s) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendString(dbuf, s); GWEN_Buffer_AppendString(dbuf, "-00:00"); d=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); GWEN_Buffer_free(dbuf); if (d==0) { DBG_ERROR(0, "Invalid first execution date value \"%s\"", s); AB_Transaction_free(t); return NULL; } AB_Transaction_SetFirstExecutionDate(t, d); GWEN_Time_free(d); } s=GWEN_DB_GetCharValue(db, "lastExecutionDate", 0, 0); if (s && *s) { GWEN_BUFFER *dbuf; dbuf=GWEN_Buffer_new(0, 32, 0, 1); GWEN_Buffer_AppendString(dbuf, s); GWEN_Buffer_AppendString(dbuf, "-00:00"); d=GWEN_Time_fromUtcString(GWEN_Buffer_GetStart(dbuf), "YYYYMMDD-hh:mm"); GWEN_Buffer_free(dbuf); if (d==0) { DBG_ERROR(0, "Invalid last execution date value \"%s\"", s); AB_Transaction_free(t); return NULL; } AB_Transaction_SetLastExecutionDate(t, d); GWEN_Time_free(d); } if (expTransferType==AB_Job_TypeSepaCreateStandingOrder || expTransferType==AB_Job_TypeSepaModifyStandingOrder) { const char *s; AB_TRANSACTION_PERIOD period=AB_Transaction_PeriodUnknown; /* only needed for standing orders */ s=GWEN_DB_GetCharValue(db, "executionPeriod", 0, 0); if (s && *s) { period=AB_Transaction_Period_fromString(s); if (period==AB_Transaction_PeriodUnknown) { DBG_ERROR(0, "Invalid execution period value \"%s\"", s); AB_Transaction_free(t); return NULL; } } else { DBG_ERROR(0, "Missing execution period value"); return NULL; } AB_Transaction_SetPeriod(t, period); i=GWEN_DB_GetIntValue(db, "executionCycle", 0, -1); if (i <= 0) { DBG_ERROR(0, "Invalid execution cycle value \"%d\"", i); AB_Transaction_free(t); return NULL; } AB_Transaction_SetCycle(t, i); i=GWEN_DB_GetIntValue(db, "executionDay", 0, -1); if (i <= 0 || (period == AB_Transaction_PeriodWeekly && i > 7) || (period == AB_Transaction_PeriodMonthly && i > 30 && (i < 97 || i > 99))) { DBG_ERROR(0, "Invalid execution day value \"%d\"", i); AB_Transaction_free(t); return NULL; } AB_Transaction_SetExecutionDay(t, i); } return t; }
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); }
AB_TRANSACTION *AB_ImExporterYN__ReadLNE_LNS(AB_IMEXPORTER *ie, AB_IMEXPORTER_ACCOUNTINFO *ai, GWEN_XMLNODE *node) { AB_TRANSACTION *t; GWEN_XMLNODE *nn; GWEN_TIME *ti=0; AB_VALUE *val=0; t=AB_Transaction_new(); /* get date */ nn=GWEN_XMLNode_FindFirstTag(node, "DTM", 0, 0); if (nn) ti=AB_ImExporterYN__ReadTime(ie, nn, 209); AB_Transaction_SetValutaDate(t, ti); GWEN_Time_free(ti); ti=0; /* read amount */ nn=GWEN_XMLNode_FindFirstTag(node, "MOA", 0, 0); if (nn) { /* Gutschrift */ val=AB_ImExporterYN__ReadValue(ie, nn, 210); if (val) { if (AB_Value_IsZero(val)) { AB_Value_free(val); val=NULL; } } if (val==NULL) { val=AB_ImExporterYN__ReadValue(ie, nn, 211); if (val) AB_Value_Negate(val); } } if (val==NULL) val=AB_Value_new(); AB_Value_SetCurrency(val, AB_ImExporterAccountInfo_GetCurrency(ai)); AB_Transaction_SetValue(t, val); AB_Value_free(val); val=0; /* read purpose */ nn=GWEN_XMLNode_GetNodeByXPath(node, "FTX/C108", GWEN_PATH_FLAGS_NAMEMUSTEXIST); if (nn) { GWEN_XMLNODE *nnn; nnn=GWEN_XMLNode_FindFirstTag(nn, "D_4440", 0, 0); while(nnn) { GWEN_XMLNODE *nData; nData=GWEN_XMLNode_GetFirstData(nnn); if (nData) { const char *s; s=GWEN_XMLNode_GetData(nData); if (s) { GWEN_BUFFER *xbuf; xbuf=GWEN_Buffer_new(0, 256, 0, 1); AB_ImExporter_Iso8859_1ToUtf8(s, strlen(s), xbuf); AB_Transaction_AddPurpose(t, GWEN_Buffer_GetStart(xbuf), 0); GWEN_Buffer_free(xbuf); } } nnn=GWEN_XMLNode_FindNextTag(nnn, "D_4440", 0, 0); } } return t; }
int EBC_Provider_EuSign_A004(AB_PROVIDER *pro, AB_USER *u, const char *requestType, const uint8_t *pMsg, uint32_t lMsg, GWEN_BUFFER *sbuf) { EBC_PROVIDER *dp; GWEN_MDIGEST *md; GWEN_BUFFER *hbuf; GWEN_BUFFER *ebuf; GWEN_CRYPT_TOKEN *ct; const GWEN_CRYPT_TOKEN_CONTEXT *ctx; const GWEN_CRYPT_TOKEN_KEYINFO *ki; uint32_t keyId; int ksize; uint32_t l; GWEN_CRYPT_PADDALGO *algo; EB_EU *eu; GWEN_TIME *ti; int rv; const char *userId; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, EBC_PROVIDER, pro); assert(dp); userId=AB_User_GetUserId(u); md=GWEN_MDigest_Rmd160_new(); assert(md); rv=GWEN_MDigest_Begin(md); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); return rv; } rv=GWEN_MDigest_Update(md, pMsg, lMsg); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); return rv; } rv=GWEN_MDigest_End(md); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_MDigest_free(md); return rv; } hbuf=GWEN_Buffer_new(0, GWEN_MDigest_GetDigestSize(md), 0, 1); GWEN_Buffer_AppendBytes(hbuf, (const char*)GWEN_MDigest_GetDigestPtr(md), GWEN_MDigest_GetDigestSize(md)); GWEN_MDigest_free(md); /* get crypt token and context */ rv=EBC_Provider_MountToken(pro, u, &ct, &ctx); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); return rv; } /* get key id */ keyId=GWEN_Crypt_Token_Context_GetSignKeyId(ctx); ki=GWEN_Crypt_Token_GetKeyInfo(ct, keyId, 0xffffffff, 0); if (ki==NULL) { DBG_INFO(AQEBICS_LOGDOMAIN, "Keyinfo %04x not found on crypt token [%s:%s]", keyId, GWEN_Crypt_Token_GetTypeName(ct), GWEN_Crypt_Token_GetTokenName(ct)); GWEN_Crypt_Token_Close(ct, 0, 0); GWEN_Buffer_free(hbuf); return GWEN_ERROR_NOT_FOUND; } ksize=GWEN_Crypt_Token_KeyInfo_GetKeySize(ki); /* select padd algo */ algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Iso9796_2); GWEN_Crypt_PaddAlgo_SetPaddSize(algo, ksize); /* actually sign */ ebuf=GWEN_Buffer_new(0, ksize+16, 0, 1); l=GWEN_Buffer_GetMaxUnsegmentedWrite(ebuf); rv=GWEN_Crypt_Token_Sign(ct, keyId, algo, (const uint8_t*)GWEN_Buffer_GetStart(hbuf), GWEN_Buffer_GetUsedBytes(hbuf), (uint8_t*)GWEN_Buffer_GetPosPointer(ebuf), &l, NULL, /* ignore seq counter */ 0); GWEN_Crypt_PaddAlgo_free(algo); if (rv<0) { DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(ebuf); GWEN_Buffer_free(hbuf); return rv; } GWEN_Buffer_IncrementPos(ebuf, l); GWEN_Buffer_AdjustUsedBytes(ebuf); GWEN_Buffer_free(hbuf); /* assemble EU */ eu=EB_Eu_new(); EB_Eu_SetVersion(eu, "A004"); EB_Eu_SetModLen(eu, ksize*8); EB_Eu_SetJobType(eu, requestType); EB_Eu_SetSignature(eu, (const uint8_t*) GWEN_Buffer_GetStart(ebuf), GWEN_Buffer_GetUsedBytes(ebuf)); GWEN_Buffer_free(ebuf); ti=GWEN_CurrentTime(); EB_Eu_SetCreationTime(eu, ti); EB_Eu_SetSignatureTime(eu, ti); GWEN_Time_free(ti); EB_Eu_SetUserId(eu, userId); /* store EU in given buffer */ EB_Eu_toBuffer(eu, sbuf); EB_Eu_free(eu); return 0; }
int AO_Provider__AddSignOn(AB_PROVIDER *pro, AB_USER *u, GWEN_BUFFER *buf) { GWEN_TIME *ti; const char *s; char userpass[64]; ti=GWEN_CurrentTime(); assert(ti); GWEN_Buffer_AppendString(buf, "<SIGNONMSGSRQV1>"); GWEN_Buffer_AppendString(buf, "<SONRQ>"); GWEN_Buffer_AppendString(buf, "<DTCLIENT>"); if (AO_User_GetFlags(u) & AO_USER_FLAGS_SEND_SHORT_DATE) GWEN_Time_toString(ti, "YYYYMMDDhhmmss", buf); else GWEN_Time_toString(ti, "YYYYMMDDhhmmss.000", buf); s=AB_User_GetUserId(u); if (s) { GWEN_Buffer_AppendString(buf, "<USERID>"); GWEN_Buffer_AppendString(buf, s); GWEN_Buffer_AppendString(buf, "\r\n"); } else { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Missing user id, should not happen"); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Missing user id, should not happen")); return GWEN_ERROR_INTERNAL; } /* get password */ userpass[0]=0; while (strlen(userpass)<4) { GWEN_BUFFER *nbuf; int rv; char msg[]=I18S("Please enter the password for user %s" "<html>" "Please enter the password for user <b>%s</b>" "</html>"); char msgbuf[512]; nbuf=GWEN_Buffer_new(0, 64, 0, 1); GWEN_Buffer_AppendString(nbuf, "OFX::userpass::"); GWEN_Buffer_AppendString(nbuf, s); snprintf(msgbuf, sizeof(msgbuf), I18N(msg), s, s); rv=GWEN_Gui_GetPassword(0, GWEN_Buffer_GetStart(nbuf), I18N("Enter Password"), msgbuf, userpass, 4, sizeof(userpass), 0); GWEN_Buffer_free(nbuf); if (rv<0) { memset(userpass, 0, sizeof(userpass)); GWEN_Time_free(ti); return rv; } } /* while */ GWEN_Buffer_AppendString(buf, "<USERPASS>"); GWEN_Buffer_AppendString(buf, userpass); GWEN_Buffer_AppendString(buf, "\r\n"); memset(userpass, 0, sizeof(userpass)); GWEN_Buffer_AppendString(buf, "<LANGUAGE>ENG"); /* possibly add FI */ if (!(AO_User_GetFlags(u) & AO_USER_FLAGS_EMPTY_FID)) { if (AO_User_GetFid(u)) { GWEN_Buffer_AppendString(buf, "<FI>"); s=AO_User_GetOrg(u); if (s) { GWEN_Buffer_AppendString(buf, "<ORG>"); GWEN_Buffer_AppendString(buf, s); } s=AO_User_GetFid(u); if (s) { GWEN_Buffer_AppendString(buf, "<FID>"); GWEN_Buffer_AppendString(buf, s); } GWEN_Buffer_AppendString(buf, "</FI>"); } } /* add APPID */ s=AO_User_GetAppId(u); if (s==NULL || *s==0) s="QWIN"; GWEN_Buffer_AppendString(buf, "<APPID>"); GWEN_Buffer_AppendString(buf, s); /* add APPVER */ s=AO_User_GetAppVer(u); if (s==NULL || *s==0) s="1200"; GWEN_Buffer_AppendString(buf, "<APPVER>"); GWEN_Buffer_AppendString(buf, s); /* add CLIENTUID, if known */ s=AO_User_GetClientUid(u); if (s && *s) { GWEN_Buffer_AppendString(buf, "<CLIENTUID>"); GWEN_Buffer_AppendString(buf, s); } /* close elements */ GWEN_Buffer_AppendString(buf, "</SONRQ>"); GWEN_Buffer_AppendString(buf, "</SIGNONMSGSRQV1>"); GWEN_Time_free(ti); return 0; }
int AHB_DTAUS__CreateSetA(GWEN_BUFFER *dst, GWEN_DB_NODE *cfg) { unsigned int i; GWEN_TIME *gt; char buffer[16]; int day, month, year; const char *p; GWEN_DB_NODE *dbT; DBG_DEBUG(AQBANKING_LOGDOMAIN, "Creating A set"); /* field 1, 2: record header */ GWEN_Buffer_AppendString(dst, "0128A"); /* field 3: type */ p=GWEN_DB_GetCharValue(cfg, "type", 0, "transfer"); if (strcasecmp(p, "transfer")==0 || strcasecmp(p, "transaction")==0) GWEN_Buffer_AppendString(dst, "GK"); else if (strcasecmp(p, "debitnote")==0) GWEN_Buffer_AppendString(dst, "LK"); else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unknown group \"%s\"", GWEN_DB_GroupName(cfg)); return -1; } /* field 4: bank code */ if (AHB_DTAUS__AddNum(dst, 8, GWEN_DB_GetCharValue(cfg, "bankCode", 0, "0"))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing bankCode to buffer"); return -1; } /* field 5: 0s */ for (i=0; i<8; i++) GWEN_Buffer_AppendByte(dst, '0'); /* field 6: sender name */ if (AHB_DTAUS__AddWord(dst, 27, GWEN_DB_GetCharValue(cfg, "name", 0, "0"))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing name to buffer"); return -1; } /* field 7: date */ gt=GWEN_CurrentTime(); if (GWEN_Time_GetBrokenDownDate(gt, &day, &month, &year)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unable to break down date"); GWEN_Time_free(gt); return -1; } GWEN_Time_free(gt); snprintf(buffer, sizeof(buffer), "%02d%02d%02d", day, month+1, year%100); if (AHB_DTAUS__AddWord(dst, 6, buffer)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); return -1; } /* field 8: blanks */ for (i=0; i<4; i++) GWEN_Buffer_AppendByte(dst, ' '); /* field 9: account id */ if (AHB_DTAUS__AddNum(dst, 10, GWEN_DB_GetCharValue(cfg, "accountid", 0, ""))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing accountid to buffer"); return -1; } /* field 10: customer reference */ if (AHB_DTAUS__AddNum(dst, 10, GWEN_DB_GetCharValue(cfg, "custref", 0, "0"))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing custref to buffer"); return -1; } /* field 11a: blanks */ for (i=0; i<15; i++) GWEN_Buffer_AppendByte(dst, ' '); /* field 11b: date of execution */ dbT=GWEN_DB_GetGroup(cfg, GWEN_PATH_FLAGS_NAMEMUSTEXIST, "execdate"); if (dbT) { GWEN_TIME *ti; ti=GWEN_Time_fromDb(dbT); if (!ti) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad execution date"); return -1; } if (GWEN_Time_GetBrokenDownDate(ti, &day, &month, &year)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Bad execution date"); GWEN_Time_free(ti); return -1; } snprintf(buffer, sizeof(buffer), "%02d%02d%04d", day, month+1, year); if (AHB_DTAUS__AddWord(dst, 8, buffer)) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing execdate to buffer"); GWEN_Time_free(ti); return -1; } GWEN_Time_free(ti); } else { if (AHB_DTAUS__AddWord(dst, 8, "")) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Error writing to buffer"); return -1; } } /* field 11c: blanks */ for (i=0; i<24; i++) GWEN_Buffer_AppendByte(dst, ' '); /* field 12: currency */ p=GWEN_DB_GetCharValue(cfg, "currency", 0, "EUR"); if (strcasecmp(p, "EUR")==0) GWEN_Buffer_AppendByte(dst, '1'); else if (strcasecmp(p, "DEM")==0) GWEN_Buffer_AppendByte(dst, ' '); else { DBG_ERROR(AQBANKING_LOGDOMAIN, "Unknown currency \"%s\"", p); return -1; } 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_GetAccountInfo(ctx, AB_Account_GetBankCode(a), AB_Account_GetAccountNumber(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_TIME *date; GWEN_TIME *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_Time_fromString(p, "YYYYMMDD"); else date=NULL; /* read valutaData (Umsatzdatum) */ p=GWEN_DB_GetCharValue(dbT, "valutaDate", 0, 0); if (p) valutaDate=GWEN_Time_fromString(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_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_SetPurpose(t, purpose); DBG_INFO(AQHBCI_LOGDOMAIN, "Adding transaction"); AB_ImExporterAccountInfo_AddTransaction(ai, t); GWEN_StringList_free(purpose); AB_Value_free(v2); GWEN_Time_free(date); GWEN_Time_free(valutaDate); dbT = GWEN_DB_FindNextGroup(dbT, "entries"); } //while (dbT) } //if (dbXA) dbCurr=GWEN_DB_GetNextGroup(dbCurr); } 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 GWEN_CryptMgr_Sign(GWEN_CRYPTMGR *cm, const uint8_t *pData, uint32_t lData, GWEN_BUFFER *dbuf) { GWEN_SIGHEAD *sh; GWEN_SIGTAIL *st; GWEN_TIME *ti; uint32_t pos; uint32_t shPos; uint8_t *p; uint32_t l; int rv; GWEN_BUFFER *sigbuf; assert(cm); GWEN_Buffer_AppendByte(dbuf, GWEN_CRYPTMGR_TLV_SIGNEDOBJECT); pos=GWEN_Buffer_GetPos(dbuf); GWEN_Buffer_AppendByte(dbuf, 0); GWEN_Buffer_AppendByte(dbuf, 0); /* prepare signature head */ sh=GWEN_SigHead_new(); GWEN_SigHead_SetKeyName(sh, cm->localKeyName); GWEN_SigHead_SetKeyNumber(sh, cm->localKeyNumber); GWEN_SigHead_SetKeyVersion(sh, cm->localKeyVersion); ti=GWEN_CurrentTime(); GWEN_SigHead_SetDateTime(sh, ti); GWEN_Time_free(ti); GWEN_SigHead_SetSignatureProfile(sh, cm->signatureProfile); GWEN_SigHead_SetSignatureNumber(sh, 1); /* write signature head to buffer */ shPos=GWEN_Buffer_GetPos(dbuf); rv=GWEN_SigHead_toBuffer(sh, dbuf, GWEN_CRYPTMGR_TLV_SIGHEAD); GWEN_SigHead_free(sh); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); return rv; } /* write data to buffer */ if (pData && lData) GWEN_Tag16_DirectlyToBuffer(GWEN_CRYPTMGR_TLV_SIGDATA, (const char*)pData, lData, dbuf); /* sign data: signature head TLV + data TLV */ sigbuf=GWEN_Buffer_new(0, 300, 0, 1); p=((uint8_t*)GWEN_Buffer_GetStart(dbuf))+shPos; l=GWEN_Buffer_GetPos(dbuf)-shPos; rv=GWEN_CryptMgr_SignData(cm, p, l, sigbuf); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(sigbuf); return rv; } /* create signature tail */ st=GWEN_SigTail_new(); GWEN_SigTail_SetSignature(st, (const uint8_t*)GWEN_Buffer_GetStart(sigbuf), GWEN_Buffer_GetUsedBytes(sigbuf)); GWEN_Buffer_free(sigbuf); GWEN_SigTail_SetSignatureNumber(st, 1); /* write signature tail */ rv=GWEN_SigTail_toBuffer(st, dbuf, GWEN_CRYPTMGR_TLV_SIGTAIL); GWEN_SigTail_free(st); if (rv<0) { DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv); return rv; } /* write complete size */ l=GWEN_Buffer_GetPos(dbuf)-pos-2; p=(uint8_t*)GWEN_Buffer_GetStart(dbuf)+pos; *(p++)=l & 0xff; *p=(l>>8) & 0xff; return 0; }
/* --------------------------------------------------------------- FUNCTION */ AB_BALANCE *AH_Job_GetBalance__ReadBalance(GWEN_DB_NODE *dbT) { GWEN_BUFFER *buf; GWEN_TIME *t; AB_VALUE *v1, *v2; AB_BALANCE *bal; const char *p; bal=0; /* read date and time */ buf=GWEN_Buffer_new(0, 32, 0, 1); p=GWEN_DB_GetCharValue(dbT, "date", 0, 0); if (p) GWEN_Buffer_AppendString(buf, p); else { AH_AccountJob_AddCurrentDate(buf); } p=GWEN_DB_GetCharValue(dbT, "time", 0, 0); if (p) GWEN_Buffer_AppendString(buf, p); else { AH_AccountJob_AddCurrentTime(buf); } t=GWEN_Time_fromString(GWEN_Buffer_GetStart(buf), "YYYYMMDDhhmmss"); if (!t) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Error parsing date and time"); } GWEN_Buffer_free(buf); /* read value */ v1=AB_Value_fromDb(dbT); 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; } } if (v2) bal=AB_Balance_new(v2, t); else bal=0; } AB_Value_free(v2); AB_Value_free(v1); GWEN_Time_free(t); return bal; }
GWEN_FSLOCK_RESULT GWEN_FSLock_Lock(GWEN_FSLOCK *fl, int timeout, uint32_t gid) { GWEN_TIME *t0; int distance; int count; GWEN_FSLOCK_RESULT rv; uint32_t progressId; t0=GWEN_CurrentTime(); assert(t0); progressId=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Accquiring lock"), NULL, (timeout==GWEN_TIMEOUT_FOREVER) ?0:timeout, gid); if (timeout==GWEN_TIMEOUT_NONE) distance=GWEN_TIMEOUT_NONE; else if (timeout==GWEN_TIMEOUT_FOREVER) distance=GWEN_TIMEOUT_FOREVER; else { distance=GWEN_GUI_CHECK_PERIOD; if (distance>timeout) distance=timeout; } for (count=0;; count++) { int err; err=GWEN_Gui_ProgressAdvance(progressId, GWEN_GUI_PROGRESS_NONE); if (err==GWEN_ERROR_USER_ABORTED) { DBG_ERROR(GWEN_LOGDOMAIN, "User aborted."); GWEN_Gui_ProgressEnd(progressId); return GWEN_FSLock_ResultUserAbort; } rv=GWEN_FSLock__Lock(fl); if (rv==GWEN_FSLock_ResultError) { DBG_INFO(GWEN_LOGDOMAIN, "here"); GWEN_Time_free(t0); GWEN_Gui_ProgressEnd(progressId); return rv; } else if (rv==GWEN_FSLock_ResultOk) { GWEN_Time_free(t0); GWEN_Gui_ProgressEnd(progressId); return rv; } else { /* check timeout */ if (timeout!=GWEN_TIMEOUT_FOREVER) { GWEN_TIME *t1; double d; if (timeout==GWEN_TIMEOUT_NONE) { GWEN_Gui_ProgressEnd(progressId); return GWEN_FSLock_ResultTimeout; } t1=GWEN_CurrentTime(); assert(t1); d=GWEN_Time_Diff(t1, t0); GWEN_Time_free(t1); if (d>=timeout) { DBG_DEBUG(GWEN_LOGDOMAIN, "Could not lock within %d milliseconds, giving up", timeout); GWEN_Time_free(t0); GWEN_Gui_ProgressEnd(progressId); return GWEN_FSLock_ResultTimeout; } err=GWEN_Gui_ProgressAdvance(progressId, (uint64_t)d); if (err) { DBG_ERROR(GWEN_LOGDOMAIN, "User aborted."); GWEN_Gui_ProgressEnd(progressId); return GWEN_FSLock_ResultUserAbort; } } /* sleep for the distance of the WaitCallback */ GWEN_Socket_Select(0, 0, 0, distance); } } /* for */ GWEN_Gui_ProgressEnd(progressId); DBG_WARN(GWEN_LOGDOMAIN, "We should never reach this point"); GWEN_Time_free(t0); return GWEN_FSLock_ResultError; }
/* --------------------------------------------------------------- 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; }