/* --------------------------------------------------------------- FUNCTION */ int AH_Job_GetTransactions_HandleCommand(AH_JOB *j, const AB_TRANSACTION *t) { const GWEN_DATE *da; da=AB_Transaction_GetFirstDate(t); if (da) { char dbuf[16]; GWEN_DB_NODE *dbArgs; dbArgs=AH_Job_GetArguments(j); snprintf(dbuf, sizeof(dbuf), "%04d%02d%02d", GWEN_Date_GetYear(da), GWEN_Date_GetMonth(da), GWEN_Date_GetDay(da)); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "fromDate", dbuf); } da=AB_Transaction_GetLastDate(t); if (da) { char dbuf[16]; GWEN_DB_NODE *dbArgs; dbArgs=AH_Job_GetArguments(j); snprintf(dbuf, sizeof(dbuf), "%04d%02d%02d", GWEN_Date_GetYear(da), GWEN_Date_GetMonth(da), GWEN_Date_GetDay(da)); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "toDate", dbuf); } return 0; }
/* --------------------------------------------------------------- FUNCTION */ int AH_Job_SepaStandingOrderGet_Prepare(AH_JOB *j) { GWEN_DB_NODE *dbArgs; GWEN_DB_NODE *profile; DBG_INFO(AQHBCI_LOGDOMAIN, "Preparing job"); dbArgs=AH_Job_GetArguments(j); /* find the right profile to produce pain.001 messages */ profile=AH_Job_FindSepaProfile(j, "001*", AH_User_GetSepaTransferProfile(AH_Job_GetUser(j))); if (!profile) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No suitable profile found"); return GWEN_ERROR_GENERIC; } else { const char *s; s=GWEN_DB_GetCharValue(profile, "descriptor", 0, 0); if (s) { GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "SupportedSepaFormats/Format", s); } else { DBG_ERROR(AQHBCI_LOGDOMAIN, "No matching SEPA descriptor found"); return GWEN_ERROR_GENERIC; } } return 0; }
/* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_GetTransactions_new(AB_PROVIDER *pro, AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; AH_JOB_GETTRANSACTIONS *aj; GWEN_DB_NODE *dbArgs; GWEN_DB_NODE *updgroup; int useCreditCardJob = 0; //Check if we should use DKKKU updgroup=AH_User_GetUpdForAccount(u, account); if (updgroup) { GWEN_DB_NODE *n; n=GWEN_DB_GetFirstGroup(updgroup); while (n) { if (strcasecmp(GWEN_DB_GetCharValue(n, "job", 0, ""), "DKKKU")==0) { useCreditCardJob = 1; break; } n=GWEN_DB_GetNextGroup(n); } /* while */ } /* if updgroup for the given account found */ if (useCreditCardJob) j=AH_AccountJob_new("JobGetTransactionsCreditCard", pro, u, account); else j=AH_AccountJob_new("JobGetTransactions", pro, u, account); if (!j) return 0; GWEN_NEW_OBJECT(AH_JOB_GETTRANSACTIONS, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_GETTRANSACTIONS, j, aj, AH_Job_GetTransactions_FreeData); AH_Job_SetSupportedCommand(j, AB_Transaction_CommandGetTransactions); /* overwrite some virtual functions */ if (useCreditCardJob) AH_Job_SetProcessFn(j, AH_Job_GetTransactionsCreditCard_Process); else AH_Job_SetProcessFn(j, AH_Job_GetTransactions_Process); AH_Job_SetGetLimitsFn(j, AH_Job_GetTransactions_GetLimits); AH_Job_SetHandleCommandFn(j, AH_Job_GetTransactions_HandleCommand); AH_Job_SetHandleResultsFn(j, AH_Job_HandleResults_Empty); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); if (useCreditCardJob) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "accountNumber", AB_Account_GetAccountNumber(account)); else GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "allAccounts", "N"); return j; }
/* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_GetBalance_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; AH_JOB_GETBALANCE *aj; GWEN_DB_NODE *dbArgs; int useCreditCardJob=0; GWEN_DB_NODE *updgroup; //Check if we should use DKKKS updgroup=AH_User_GetUpdForAccount(u, account); if (updgroup) { GWEN_DB_NODE *n; n=GWEN_DB_GetFirstGroup(updgroup); while(n) { if (strcasecmp(GWEN_DB_GetCharValue(n, "job", 0, ""), "DKKKS")==0) { useCreditCardJob = 1; break; } n=GWEN_DB_GetNextGroup(n); } /* while */ } /* if updgroup for the given account found */ if(useCreditCardJob) j=AH_AccountJob_new("JobGetBalanceCreditCard", u, account); else j=AH_AccountJob_new("JobGetBalance", u, account); if (!j) return 0; GWEN_NEW_OBJECT(AH_JOB_GETBALANCE, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_JOB_GETBALANCE, j, aj, AH_Job_GetBalance_FreeData); /* overwrite some virtual functions */ AH_Job_SetProcessFn(j, AH_Job_GetBalance_Process); AH_Job_SetExchangeFn(j, AH_Job_GetBalance_Exchange); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); if(useCreditCardJob) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "accountNumber", AB_Account_GetAccountNumber(account)); else GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "allAccounts", "N"); return j; }
/* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_Job_SepaStandingOrderGet_new(AB_USER *u, AB_ACCOUNT *account) { AH_JOB *j; GWEN_DB_NODE *dbArgs; j=AH_AccountJob_new("JobSepaStandingOrderGet", u, account); if (!j) return 0; /* overwrite some virtual functions */ AH_Job_SetPrepareFn(j, AH_Job_SepaStandingOrderGet_Prepare); AH_Job_SetProcessFn(j, AH_Job_SepaStandingOrdersGet_Process); AH_Job_SetExchangeFn(j, AH_Job_SepaStandingOrdersGet_Exchange); /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "allAccounts", "N"); return j; }
/* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_AccountJob_new(const char *name, AB_USER *u, AB_ACCOUNT *account){ AH_ACCOUNTJOB *aj; AH_JOB *j; GWEN_DB_NODE *dbArgs; const char *s; int jobVersion=0; assert(name); assert(u); assert(account); if (!(AH_Account_GetFlags(account) & AH_BANK_FLAGS_KTV2)) { int maxVer=0; /* no account suffix, so we try to determine the highest usable * version of the job which still doesn't need the suffix */ if (strcasecmp(name, "JobGetTransactions")==0) maxVer=4; else if (strcasecmp(name, "JobGetBalance")==0) maxVer=4; else if (strcasecmp(name, "JobSingleTransfer")==0) maxVer=3; else if (strcasecmp(name, "JobSingleDebitNote")==0) maxVer=3; else if (strcasecmp(name, "JobInternalTransfer")==0 || strcasecmp(name, "JobLoadCellPhone")==0) /* this job needs a suffix, so if there is none you don't get it */ maxVer=-1; else if (strcasecmp(name, "JobGetDatedTransfers")==0) maxVer=1; else if (strcasecmp(name, "JobCreateDatedTransfer")==0) maxVer=2; else if (strcasecmp(name, "JobModifyDatedTransfer")==0) maxVer=2; else if (strcasecmp(name, "JobDeleteDatedTransfer")==0) maxVer=1; else if (strcasecmp(name, "JobCreateStandingOrder")==0) maxVer=2; else if (strcasecmp(name, "JobModifyStandingOrder")==0) maxVer=2; else if (strcasecmp(name, "JobDeleteStandingOrder")==0) maxVer=1; if (maxVer==-1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "This job needs an account suffix, but your bank didn't provide one. " "Therefore this job is not supported with your account."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("This job needs an account suffix, but your bank did not provide one. " "Therefore this job is not supported with your account.\n" "Setting a higher HBCI version in the user settings might fix " "the problem.")); return NULL; } if (maxVer>0) { jobVersion=AH_Job_GetMaxVersionUpUntil(name, u, maxVer); if (jobVersion<1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No job [%s] below version %d, falling back to 0", name, maxVer); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, "No version for job [%s] up to %d found, falling back to 0", name, maxVer); jobVersion=0; } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Reducing version of job [%s] to %d", name, jobVersion); } } } j=AH_Job_new(name, u, AB_Account_GetAccountNumber(account), AB_Account_GetSubAccountId(account), jobVersion); if (!j) return 0; GWEN_NEW_OBJECT(AH_ACCOUNTJOB, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_ACCOUNTJOB, j, aj, AH_AccountJob_FreeData); aj->account=account; /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); s=AB_Account_GetAccountNumber(account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "accountId", s); s=AB_Account_GetSubAccountId(account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "accountSubId", s); s=AB_Account_GetBankCode(account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "bankCode", s); GWEN_DB_SetIntValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "country", 280); /* new for SEPA jobs */ s=AB_Account_GetIBAN(account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "iban", s); s=AB_Account_GetBIC(account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "bic", s); return j; }
/* --------------------------------------------------------------- FUNCTION */ int AH_Job_GetTransactions_Exchange(AH_JOB *j, AB_JOB *bj, AH_JOB_EXCHANGE_MODE m, AB_IMEXPORTER_CONTEXT *ctx){ AH_JOB_GETTRANSACTIONS *aj; DBG_INFO(AQHBCI_LOGDOMAIN, "Exchanging (%d)", m); assert(j); aj=GWEN_INHERIT_GETDATA(AH_JOB, AH_JOB_GETTRANSACTIONS, j); assert(aj); if (AB_Job_GetType(bj)!=AB_Job_TypeGetTransactions) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Not a GetTransactions job"); return GWEN_ERROR_INVALID; } switch(m) { case AH_Job_ExchangeModeParams: { GWEN_DB_NODE *dbParams; dbParams=AH_Job_GetParams(j); AB_JobGetTransactions_SetMaxStoreDays(bj, GWEN_DB_GetIntValue(dbParams, "storeDays", 0, 0) ); return 0; } case AH_Job_ExchangeModeArgs: { const GWEN_TIME *ti; ti=AB_JobGetTransactions_GetFromTime(bj); if (ti) { int year, month, day; char dbuf[16]; GWEN_DB_NODE *dbArgs; dbArgs=AH_Job_GetArguments(j); if (GWEN_Time_GetBrokenDownDate(ti, &day, &month, &year)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Internal error: bad fromTime"); return GWEN_ERROR_INVALID; } snprintf(dbuf, sizeof(dbuf), "%04d%02d%02d", year, month+1, day); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "fromDate", dbuf); } ti=AB_JobGetTransactions_GetToTime(bj); if (ti) { int year, month, day; char dbuf[16]; GWEN_DB_NODE *dbArgs; dbArgs=AH_Job_GetArguments(j); if (GWEN_Time_GetBrokenDownDate(ti, &day, &month, &year)) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Internal error: bad toTime"); return GWEN_ERROR_INVALID; } snprintf(dbuf, sizeof(dbuf), "%04d%02d%02d", year, month+1, day); GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_OVERWRITE_VARS, "toDate", dbuf); } return 0; } case AH_Job_ExchangeModeResults: return 0; default: DBG_NOTICE(AQHBCI_LOGDOMAIN, "Unsupported exchange mode"); return GWEN_ERROR_NOT_SUPPORTED; } /* switch */ }