|
/***************************************************************************
|
|
begin : Tue May 03 2005
|
|
copyright : (C) 2018 by Martin Preuss
|
|
email : martin@libchipcard.de
|
|
|
|
***************************************************************************
|
|
* Please see toplevel file COPYING for license details *
|
|
***************************************************************************/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include <config.h>
|
|
#endif
|
|
|
|
|
|
/* tool includes */
|
|
#include "globals.h"
|
|
|
|
/* aqbanking includes */
|
|
#include <aqbanking/types/transaction.h>
|
|
|
|
/* gwenhywfar includes */
|
|
#include <gwenhywfar/text.h>
|
|
|
|
|
|
/* forward declarations */
|
|
static GWEN_DB_NODE *_readCommandLine(GWEN_DB_NODE *dbArgs, int argc, char **argv);
|
|
|
|
static int _createAndAndSendRequests(AB_BANKING *ab,
|
|
AB_ACCOUNT_SPEC_LIST *asl,
|
|
const GWEN_DATE *fromDate,
|
|
const GWEN_DATE *toDate,
|
|
uint32_t requestFlags,
|
|
const char *ctxFile);
|
|
|
|
|
|
|
|
|
|
int request(AB_BANKING *ab, GWEN_DB_NODE *dbArgs, int argc, char **argv)
|
|
{
|
|
GWEN_DB_NODE *db;
|
|
AB_ACCOUNT_SPEC_LIST *al=NULL;
|
|
uint32_t requestFlags=0;
|
|
const char *s;
|
|
int rv;
|
|
const char *ctxFile;
|
|
GWEN_DATE *fromDate=0;
|
|
GWEN_DATE *toDate=0;
|
|
|
|
/* parse command line */
|
|
db=_readCommandLine(dbArgs, argc, argv);
|
|
if (db==NULL) {
|
|
fprintf(stderr, "ERROR: Could not parse arguments\n");
|
|
return 1;
|
|
}
|
|
|
|
/* read arguments */
|
|
if (GWEN_DB_GetIntValue(db, "reqTrans", 0, 0))
|
|
requestFlags|=AQBANKING_TOOL_REQUEST_STATEMENTS;
|
|
if (GWEN_DB_GetIntValue(db, "reqBalance", 0, 0))
|
|
requestFlags|=AQBANKING_TOOL_REQUEST_BALANCE;
|
|
if (GWEN_DB_GetIntValue(db, "reqSepaSto", 0, 0))
|
|
requestFlags|=AQBANKING_TOOL_REQUEST_SEPASTO;
|
|
if (GWEN_DB_GetIntValue(db, "reqEStatements", 0, 0))
|
|
requestFlags|=AQBANKING_TOOL_REQUEST_ESTATEMENTS;
|
|
if (GWEN_DB_GetIntValue(db, "ignoreUnsupported", 0, 0))
|
|
requestFlags|=AQBANKING_TOOL_REQUEST_IGNORE_UNSUP;
|
|
|
|
/* read command line arguments */
|
|
ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0);
|
|
s=GWEN_DB_GetCharValue(db, "fromDate", 0, 0);
|
|
if (s && *s) {
|
|
fromDate=GWEN_Date_fromStringWithTemplate(s, "YYYYMMDD");
|
|
if (fromDate==NULL) {
|
|
DBG_ERROR(0, "Invalid fromdate value \"%s\"", s);
|
|
return 1;
|
|
}
|
|
}
|
|
s=GWEN_DB_GetCharValue(db, "toDate", 0, 0);
|
|
if (s && *s) {
|
|
toDate=GWEN_Date_fromStringWithTemplate(s, "YYYYMMDD");
|
|
if (toDate==NULL) {
|
|
DBG_ERROR(0, "Invalid todate value \"%s\"", s);
|
|
GWEN_Date_free(fromDate);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
/* init AqBanking */
|
|
rv=AB_Banking_Init(ab);
|
|
if (rv) {
|
|
DBG_ERROR(0, "Error on init (%d)", rv);
|
|
GWEN_Date_free(toDate);
|
|
GWEN_Date_free(fromDate);
|
|
return 2;
|
|
}
|
|
|
|
/* get accounts */
|
|
rv=getSelectedAccounts(ab, db, &al);
|
|
if (rv<0) {
|
|
if (rv==GWEN_ERROR_NOT_FOUND) {
|
|
DBG_ERROR(0, "No matching accounts");
|
|
}
|
|
else {
|
|
DBG_ERROR(0, "Error getting selected accounts (%d)", rv);
|
|
}
|
|
GWEN_Date_free(toDate);
|
|
GWEN_Date_free(fromDate);
|
|
AB_Banking_Fini(ab);
|
|
return 2;
|
|
}
|
|
|
|
/* create requests for every account spec and send them */
|
|
rv=_createAndAndSendRequests(ab, al, fromDate, toDate, requestFlags, ctxFile);
|
|
if (rv) {
|
|
AB_AccountSpec_List_free(al);
|
|
GWEN_Date_free(toDate);
|
|
GWEN_Date_free(fromDate);
|
|
AB_Banking_Fini(ab);
|
|
return 3;
|
|
}
|
|
|
|
/* cleanup */
|
|
AB_AccountSpec_List_free(al);
|
|
GWEN_Date_free(toDate);
|
|
GWEN_Date_free(fromDate);
|
|
|
|
/* deinit */
|
|
rv=AB_Banking_Fini(ab);
|
|
if (rv) {
|
|
fprintf(stderr, "ERROR: Error on deinit (%d)\n", rv);
|
|
return 5;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
int _createAndAndSendRequests(AB_BANKING *ab,
|
|
AB_ACCOUNT_SPEC_LIST *asl,
|
|
const GWEN_DATE *fromDate,
|
|
const GWEN_DATE *toDate,
|
|
uint32_t requestFlags,
|
|
const char *ctxFile)
|
|
{
|
|
AB_ACCOUNT_SPEC *as;
|
|
AB_TRANSACTION_LIST2 *jobList;
|
|
|
|
/* sample jobs */
|
|
jobList=AB_Transaction_List2_new();
|
|
|
|
as=AB_AccountSpec_List_First(asl);
|
|
while (as) {
|
|
int rv;
|
|
|
|
rv=createAndAddRequests(ab, jobList, as, fromDate, toDate, requestFlags);
|
|
if (rv) {
|
|
AB_Transaction_List2_free(jobList);
|
|
return 3;
|
|
}
|
|
|
|
/* next */
|
|
as=AB_AccountSpec_List_Next(as);
|
|
} /* while (as) */
|
|
|
|
/* send jobs */
|
|
if (AB_Transaction_List2_GetSize(jobList)) {
|
|
int rv;
|
|
|
|
rv=execBankingJobs(ab, jobList, ctxFile);
|
|
if (rv) {
|
|
fprintf(stderr, "Error on sendCommands (%d)\n", rv);
|
|
AB_Transaction_List2_free(jobList);
|
|
return 3;
|
|
}
|
|
}
|
|
else {
|
|
DBG_ERROR(0, "No requests created");
|
|
AB_Transaction_List2_free(jobList);
|
|
return 4;
|
|
}
|
|
|
|
AB_Transaction_List2_free(jobList);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
/* parse command line */
|
|
GWEN_DB_NODE *_readCommandLine(GWEN_DB_NODE *dbArgs, int argc, char **argv)
|
|
{
|
|
GWEN_DB_NODE *db;
|
|
int rv;
|
|
const GWEN_ARGS args[]= {
|
|
{
|
|
GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
|
|
GWEN_ArgsType_Int, /* type */
|
|
"uniqueAccountId", /* name */
|
|
0, /* minnum */
|
|
1, /* maxnum */
|
|
NULL, /* short option */
|
|
"aid", /* long option */
|
|
"Specify the unique account id", /* short description */
|
|
"Specify the unique account id" /* long description */
|
|
},
|
|
{
|
|
GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
|
|
GWEN_ArgsType_Char, /* type */
|
|
"backendName", /* name */
|
|
0, /* minnum */
|
|
1, /* maxnum */
|
|
NULL, /* short option */
|
|
"backend", /* long option */
|
|
"Specify the name of the backend for your account", /* short description */
|
|
"Specify the name of the backend for your account" /* long description */
|
|
},
|
|
{
|
|
GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
|
|
GWEN_ArgsType_Char, /* type */
|
|
"country", /* name */
|
|
0, /* minnum */
|
|
1, /* maxnum */
|
|
NULL, /* short option */
|
|
"country", /* long option */
|
|
"Specify the country for your account (e.g. \"de\")", /* short description */
|
|
"Specify the country for your account (e.g. \"de\")" /* long description */
|
|
},
|
|
{
|
|
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 */
|
|
"subAccountId", /* name */
|
|
0, /* minnum */
|
|
1, /* maxnum */
|
|
"aa", /* short option */
|
|
"subaccount", /* long option */
|
|
"Specify the sub account id (Unterkontomerkmal)", /* short description */
|
|
"Specify the sub account id (Unterkontomerkmal)" /* long description */
|
|
},
|
|
{
|
|
GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
|
|
GWEN_ArgsType_Char, /* type */
|
|
"iban", /* name */
|
|
0, /* minnum */
|
|
1, /* maxnum */
|
|
"A", /* short option */
|
|
"iban", /* long option */
|
|
"Specify the iban of your account", /* short description */
|
|
"Specify the iban of your account" /* long description */
|
|
},
|
|
{
|
|
GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
|
|
GWEN_ArgsType_Char, /* type */
|
|
"accountType", /* name */
|
|
0, /* minnum */
|
|
1, /* maxnum */
|
|
"at", /* short option */
|
|
"accounttype", /* long option */
|
|
"Specify the type of your account", /* short description */
|
|
"Specify the type of your account" /* 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 */
|
|
},
|
|
{
|
|
0, /* flags */
|
|
GWEN_ArgsType_Int, /* type */
|
|
"reqTrans", /* name */
|
|
0, /* minnum */
|
|
1, /* maxnum */
|
|
0, /* short option */
|
|
"transactions", /* long option */
|
|
"Request transactions", /* short description */
|
|
"Request transactions" /* long description */
|
|
},
|
|
{
|
|
0, /* flags */
|
|
GWEN_ArgsType_Int, /* type */
|
|
"reqBalance", /* name */
|
|
0, /* minnum */
|
|
1, /* maxnum */
|
|
0, /* short option */
|
|
"balance", /* long option */
|
|
"Request balance", /* short description */
|
|
"Request balance" /* long description */
|
|
},
|
|
{
|
|
0, /* flags */
|
|
GWEN_ArgsType_Int, /* type */
|
|
"reqSto", /* name */
|
|
0, /* minnum */
|
|
1, /* maxnum */
|
|
0, /* short option */
|
|
"sto", /* long option */
|
|
"Request standing orders", /* short description */
|
|
"Request standing orders" /* long description */
|
|
},
|
|
{
|
|
0, /* flags */
|
|
GWEN_ArgsType_Int, /* type */
|
|
"reqSepaSto", /* name */
|
|
0, /* minnum */
|
|
1, /* maxnum */
|
|
0, /* short option */
|
|
"sepaSto", /* long option */
|
|
"Request SEPA standing orders", /* short description */
|
|
"Request SEPA standing orders" /* long description */
|
|
},
|
|
{
|
|
0, /* flags */
|
|
GWEN_ArgsType_Int, /* type */
|
|
"reqEStatements", /* name */
|
|
0, /* minnum */
|
|
1, /* maxnum */
|
|
0, /* short option */
|
|
"estatements", /* long option */
|
|
"Request electronic statements", /* short description */
|
|
"Request electronic statements" /* long description */
|
|
},
|
|
{
|
|
0,
|
|
GWEN_ArgsType_Int,
|
|
"ignoreUnsupported",
|
|
0,
|
|
1,
|
|
0,
|
|
"ignoreUnsupported",
|
|
"let AqBanking ignore unsupported requests for accounts",
|
|
"let AqBanking ignore unsupported requests for accounts",
|
|
},
|
|
{
|
|
GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
|
|
GWEN_ArgsType_Char, /* type */
|
|
"fromDate", /* name */
|
|
0, /* minnum */
|
|
1, /* maxnum */
|
|
0, /* short option */
|
|
"fromdate", /* long option */
|
|
"Specify the first date for which transactions are wanted (YYYYMMDD)", /* short */
|
|
"Specify the first date for which transactions are wanted (YYYYMMDD)" /* long */
|
|
},
|
|
{
|
|
GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
|
|
GWEN_ArgsType_Char, /* type */
|
|
"toDate", /* name */
|
|
0, /* minnum */
|
|
1, /* maxnum */
|
|
0, /* short option */
|
|
"todate", /* long option */
|
|
"Specify the last date for which transactions are wanted (YYYYMMDD)", /* short */
|
|
"Specify the last date for which transactions are wanted (YYYYMMDD)" /* long */
|
|
},
|
|
|
|
{
|
|
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 NULL;
|
|
}
|
|
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 NULL;
|
|
}
|
|
fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf));
|
|
GWEN_Buffer_free(ubuf);
|
|
return NULL;
|
|
}
|
|
|
|
return db;
|
|
}
|
|
|
|
|