r20016 - gnucash/trunk/src/import-export/aqbanking - Bug #635355: Implement the correct "DTAUS import and send" feature again.

Christian Stimming cstim at code.gnucash.org
Fri Dec 31 07:29:09 EST 2010


Author: cstim
Date: 2010-12-31 07:29:09 -0500 (Fri, 31 Dec 2010)
New Revision: 20016
Trac: http://svn.gnucash.org/trac/changeset/20016

Modified:
   gnucash/trunk/src/import-export/aqbanking/gnc-file-aqb-import.c
Log:
Bug #635355: Implement the correct "DTAUS import and send" feature again.

Patch by Manfred Usselmann: Improved version: Only transactions which have
been successfully imported into GC are transmitted to the bank.

Modified: gnucash/trunk/src/import-export/aqbanking/gnc-file-aqb-import.c
===================================================================
--- gnucash/trunk/src/import-export/aqbanking/gnc-file-aqb-import.c	2010-12-31 12:25:30 UTC (rev 20015)
+++ gnucash/trunk/src/import-export/aqbanking/gnc-file-aqb-import.c	2010-12-31 12:29:09 UTC (rev 20016)
@@ -79,6 +79,14 @@
     GWEN_IO_LAYER *io;
     GncABImExContextImport *ieci = NULL;
     AB_JOB_LIST2 *job_list = NULL;
+    AB_JOB_LIST2_ITERATOR *jit;
+    AB_JOB *job;
+    AB_JOB_STATUS job_status;
+    gboolean successful = TRUE;
+    int num_jobs = 0;
+    int num_jobs_failed = 0;
+    int max_failures = 5;
+    GString *errstr = NULL;
 
     /* Select a file */
     default_dir = gnc_get_default_directory(GCONF_SECTION_AQBANKING);
@@ -122,14 +130,6 @@
     }
     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)
@@ -211,16 +211,113 @@
                                  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 */
-            g_error("Sorry, executing the list of imported jobs is not yet implemented.");
-            /* gnc_hbci_multijob_execute(NULL, api, job_list, gui); */
+            AB_IMEXPORTER_CONTEXT *execution_context;
+
+            /* Extract the list of jobs */
+            job_list = gnc_ab_ieci_get_job_list(ieci);
+
+            /* Create a context to store possible results */
+            execution_context = AB_ImExporterContext_new();
+
+            /* Get a GUI object */
+            gui = gnc_GWEN_Gui_get(NULL);
+            if (!gui)
+            {
+                g_warning("gnc_file_aqbanking_import: Couldn't initialize Gwenhywfar GUI");
+                goto cleanup;
+            }
+
+            /* And execute the jobs */
+            AB_Banking_ExecuteJobs(api, job_list, execution_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
+             */
+
+            /* So we must go through all jobs and check AB_Job_GetStatus(job)
+             * to give the appropriate feedback if any of the jobs didn't
+             * work. */
+
+            jit = AB_Job_List2_First(job_list);
+            if (jit)
+            {
+
+                job = AB_Job_List2Iterator_Data(jit);
+                while (job)
+                {
+                    num_jobs += 1;
+                    job_status = AB_Job_GetStatus(job);
+                    if (job_status != AB_Job_StatusFinished
+                            && job_status != AB_Job_StatusPending)
+                    {
+                        successful = FALSE;
+                        num_jobs_failed += 1;
+
+                        if (num_jobs_failed <= max_failures)
+                        {
+                            if (num_jobs_failed == 1)
+                            {
+                                errstr = g_string_new("Failed jobs:\n");
+                            }
+                            g_string_append_printf(errstr, _("Job %d status %d - %s: %s \n")
+                                                   , num_jobs
+                                                   , job_status
+                                                   , AB_Job_Status2Char(job_status)
+                                                   , AB_Job_GetResultText(job));
+                        }
+                        else
+                        {
+                            if (num_jobs_failed == (max_failures + 1) )
+                            {
+                                /* indicate that additional failures exist */
+                                g_string_append(errstr, _("...\n"));
+                            }
+                        }
+                    }
+                    job = AB_Job_List2Iterator_Next(jit);
+                } /* while */
+
+                AB_Job_List2Iterator_free(jit);
+            }
+
+            if (!successful)
+            {
+                g_warning("%s", errstr->str);
+                gnc_error_dialog(NULL,
+                                 _("An error occurred while executing jobs: %d of %d failed. "
+                                   "Please check the log window or gnucash.trace for the exact"
+                                   "error message.\n\n%s")
+                                 , num_jobs_failed, num_jobs, errstr->str);
+            }
+            else
+            {
+                if (num_jobs == 0)
+                {
+                    gnc_info_dialog(NULL,
+                                    _("No jobs to be send.")
+                                   );
+                }
+                else
+                {
+                    gnc_info_dialog(NULL, ngettext
+                                    ("The job was executed successfully, but as a precaution "
+                                     "please check the log window for potential errors.",
+                                     "All %d jobs were executed successfully, but as a precaution "
+                                     "please check the log window for potential errors.",
+                                     num_jobs), num_jobs);
+                }
+            }
+            AB_ImExporterContext_free(execution_context);
         }
     }
 
@@ -247,4 +344,7 @@
         close(dtaus_fd);
     if (selected_filename)
         g_free(selected_filename);
+    if (errstr)
+        g_string_free(errstr, TRUE);
+
 }



More information about the gnucash-changes mailing list