diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/datev/DatevCargosoftImportAdapter.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/datev/DatevCargosoftImportAdapter.java index 557905b..7bb06ea 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/datev/DatevCargosoftImportAdapter.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/datev/DatevCargosoftImportAdapter.java @@ -25,6 +25,7 @@ import org.imixs.workflow.exceptions.AdapterException; import org.imixs.workflow.exceptions.ModelException; import org.imixs.workflow.exceptions.PluginException; import org.imixs.workflow.exceptions.ProcessingErrorException; +import org.imixs.workflow.exceptions.QueryException; import com.alexanderlogistics.KreditorDebitorService; @@ -68,7 +69,8 @@ public class DatevCargosoftImportAdapter implements SignalAdapter { logger.info("...parse datev file import..."); try { - readData(workitem); + List log = readData(workitem); + workitem.setItemValue("import.log", log); } catch (ModelException e) { throw new AdapterException(PluginException.class.getSimpleName(), DatevImportAdapter.DATEV_IMPORT_ERROR, "Failed to import datev data!", e); @@ -91,21 +93,27 @@ public class DatevCargosoftImportAdapter implements SignalAdapter { * @throws ProcessingErrorException * @throws AccessDeniedException */ - private void readData(ItemCollection workitem) + private List readData(ItemCollection workitem) throws PluginException, AccessDeniedException, ProcessingErrorException, ModelException { + List logBuffer = new ArrayList(); + int line = 0; + int positions = 0; + int invoices = 0; + int dupplicates = 0; + String dataLine; // Start Datum Wirtschaftsjahr berechnen (JJJJMMTT) - String wjBeginn=workitem.getItemValueString("datev.WJ-Beginn"); - String wjBeginnMonat=wjBeginn.substring(4,6); + String wjBeginn = workitem.getItemValueString("datev.WJ-Beginn"); + String wjBeginnMonat = wjBeginn.substring(4, 6); SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyyMMdd"); - ItemCollection invoiceWorkitem = null; List splitBuchungen = new ArrayList(); FileData fileData = workitem.getFileData().get(0); ByteArrayInputStream imputStream = new ByteArrayInputStream(fileData.getContent()); + log(logBuffer, "Importdatei: " + fileData.getName()); try { BufferedReader in = new BufferedReader(new InputStreamReader(imputStream, ENCODING)); @@ -114,7 +122,7 @@ public class DatevCargosoftImportAdapter implements SignalAdapter { in.readLine(); // read content.... - int line = 0; + line = 0; int blockSize = 0; while ((dataLine = in.readLine()) != null) { line++; @@ -126,8 +134,8 @@ public class DatevCargosoftImportAdapter implements SignalAdapter { // alle werte parsen String[] header1List = dataLine.split(";(?=([^\"]*\"[^\"]*\")*[^\"]*$)", 99); if (header1List.length < 6) { - throw new PluginException(DatevCargosoftImportAdapter.class.getName(),DatevImportAdapter.DATEV_IMPORT_ERROR, - "Invalid data in line " + line); + throw new PluginException(DatevCargosoftImportAdapter.class.getName(), + DatevImportAdapter.DATEV_IMPORT_ERROR, "Invalid data in line " + line); } String belegNummer = DatevImportAdapter.csvVal(header1List[10]); @@ -135,36 +143,36 @@ public class DatevCargosoftImportAdapter implements SignalAdapter { String text = DatevImportAdapter.csvVal(header1List[13]); String buchungsTag = DatevImportAdapter.csvVal(header1List[9]); // cargosoft laesst gerne die führende 0 weg.... - if (buchungsTag.length()==3) { - buchungsTag="0"+buchungsTag; + if (buchungsTag.length() == 3) { + buchungsTag = "0" + buchungsTag; } // berechne Buchungsdatum DDMM - String tag=buchungsTag.substring(0,2); - String monat=buchungsTag.substring(2,4); - String jahr=wjBeginn.substring(0,4); + String tag = buchungsTag.substring(0, 2); + String monat = buchungsTag.substring(2, 4); + String jahr = wjBeginn.substring(0, 4); // compute next year if start of WJ is not January - if (Integer.parseInt(wjBeginnMonat)>Integer.parseInt(monat)) { - jahr=Integer.parseInt(jahr+1)+""; + if (Integer.parseInt(wjBeginnMonat) > Integer.parseInt(monat)) { + jahr = Integer.parseInt(jahr + 1) + ""; } - Date dateBuchung = dateFormatter.parse(jahr+monat+tag); + Date dateBuchung = dateFormatter.parse(jahr + monat + tag); // Fälligkeit - Date dueDate=dateFormatter.parse(DatevImportAdapter.csvVal(header1List[23])); - String paymentTerm= DatevImportAdapter.csvVal(header1List[31]); + Date dueDate = dateFormatter.parse(DatevImportAdapter.csvVal(header1List[23])); + String paymentTerm = DatevImportAdapter.csvVal(header1List[31]); String waehrung = DatevImportAdapter.csvVal(header1List[2]); - + // kurse - double kurs=parseBetrag(DatevImportAdapter.csvVal(header1List[3])); - double basisumsatz= parseBetrag(DatevImportAdapter.csvVal(header1List[4])); - + double kurs = parseBetrag(DatevImportAdapter.csvVal(header1List[3])); + double basisumsatz = parseBetrag(DatevImportAdapter.csvVal(header1List[4])); + // Skip Eingangsrechnungen if (!gegenKonto.startsWith("1")) { // skip continue; } - - logger.info("...read dbtr: " + gegenKonto + " beleg-nr: "+belegNummer); - + positions++; + logger.info("...read dbtr: " + gegenKonto + " beleg-nr: " + belegNummer); + // Erzeuge einen Buchungssatz ItemCollection dataItemCol = new ItemCollection(); dataItemCol.setItemValue("datev.text", text); @@ -174,16 +182,19 @@ public class DatevCargosoftImportAdapter implements SignalAdapter { dataItemCol.setItemValue("datev.kurs", parseBetrag(DatevImportAdapter.csvVal(header1List[3]))); dataItemCol.setItemValue("datev.basisumsatz", parseBetrag(DatevImportAdapter.csvVal(header1List[4]))); dataItemCol.setItemValue("datev.konto", DatevImportAdapter.csvVal(header1List[6])); - - - - // Haben wir schon eine Invoice Workitem angelegt? if (invoiceWorkitem == null) { logger.info("...create new workitem...."); // erzeuge ein neues - invoiceWorkitem =createEmptyInvoice(belegNummer,text,gegenKonto,dateBuchung,dueDate,paymentTerm,waehrung,kurs,basisumsatz ); + try { + invoiceWorkitem = createEmptyInvoice(belegNummer, text, gegenKonto, dateBuchung, dueDate, + paymentTerm, waehrung, kurs, basisumsatz); + invoices++; + } catch (AdapterException e) { + dupplicates++; + continue; + } } // ist es noch die selbe Belegnummer? @@ -193,47 +204,100 @@ public class DatevCargosoftImportAdapter implements SignalAdapter { logger.info("...add splitbuchung...."); } else { logger.info("...close workitem...."); - + // nein - also invoice schließen closeInvoiceWorkitem(invoiceWorkitem, splitBuchungen); - + invoiceWorkitem=null; // neue Splitbuchungstabelle anlegen splitBuchungen = new ArrayList(); // invoice zurücksetzten // erzeuge ein neues - invoiceWorkitem =createEmptyInvoice(belegNummer,text,gegenKonto,dateBuchung,dueDate,paymentTerm,waehrung,kurs,basisumsatz ); + try { + invoiceWorkitem = createEmptyInvoice(belegNummer, text, gegenKonto, dateBuchung, dueDate, + paymentTerm, waehrung, kurs, basisumsatz); + invoices++; + } catch (AdapterException e) { + dupplicates++; + continue; + } splitBuchungen.add(dataItemCol); } - }// wile end - closeInvoiceWorkitem(invoiceWorkitem,splitBuchungen); + } // wile end + closeInvoiceWorkitem(invoiceWorkitem, splitBuchungen); } catch (IOException | ParseException e) { - throw new PluginException(DatevCargosoftImportAdapter.class.getName(), DatevImportAdapter.DATEV_IMPORT_ERROR, - "Unable to read file", e); + throw new PluginException(DatevCargosoftImportAdapter.class.getName(), + DatevImportAdapter.DATEV_IMPORT_ERROR, "Unable to read file", e); } + log(logBuffer, line + " Zeilen eingelesen "); + log(logBuffer, positions + " Rechnungspositionen eingelesen "); + log(logBuffer, invoices + " Rechnungen importiert "); + if (dupplicates > 0) { + log(logBuffer, dupplicates + " Rechnungen wurden übersprungen da diese bereits importiert wurden!"); + } + + // return log + return logBuffer; + } - private ItemCollection createEmptyInvoice(String belegNummer, String text, String gegenKonto, Date dateBuchung,Date dueDate,String paymentTerm,String currency, - double kurs,double basisUmsatz) { + /** + * This method returns a new empty invoice ItemCollection. + *

+ * The method tests if an invoice with this number already exits. If so, the + * method throws a AdapterException + * + * @param belegNummer + * @param text + * @param gegenKonto + * @param dateBuchung + * @param dueDate + * @param paymentTerm + * @param currency + * @param kurs + * @param basisUmsatz + * @return + * @throws AdapterException + */ + private ItemCollection createEmptyInvoice(String belegNummer, String text, String gegenKonto, Date dateBuchung, + Date dueDate, String paymentTerm, String currency, double kurs, double basisUmsatz) + throws AdapterException { + + // test if invoice was already imported before + String sQuery = "((type:workitem OR type:workitemarchive) AND $modelversion:rechnungsausgang* AND invoice.number:\""+belegNummer+"\")"; + try { + // find the textblock... + List result = documentService.find(sQuery, 1, 0); + if (result.size() > 0) { + throw new AdapterException(DatevCargosoftImportAdapter.class.getName(), "DUPPLICATE", + "Invoice already imported"); + } + } catch (QueryException e) { + logger.warning("failed to search invoices by query: " + e.getMessage()); + } + ItemCollection invoiceWorkitem = new ItemCollection(); invoiceWorkitem.setItemValue("invoice.number", belegNummer); - invoiceWorkitem.setItemValue("invoice.currency", currency); + invoiceWorkitem.setItemValue("invoice.currency", currency); invoiceWorkitem.setItemValue("invoice.text", text); invoiceWorkitem.setItemValue("invoice.date", dateBuchung); invoiceWorkitem.setItemValue("dbtr.number", gegenKonto); - invoiceWorkitem.setItemValue("invoice.duedate",dueDate); + invoiceWorkitem.setItemValue("invoice.duedate", dueDate); invoiceWorkitem.setItemValue("invoice.reminder", dueDate); - invoiceWorkitem.setItemValue("payment.term",paymentTerm); - - - invoiceWorkitem.setItemValue("invoice.rate",kurs); - invoiceWorkitem.setItemValue("invoice.base.amount",basisUmsatz); - + invoiceWorkitem.setItemValue("payment.term", paymentTerm); + + invoiceWorkitem.setItemValue("invoice.rate", kurs); + invoiceWorkitem.setItemValue("invoice.base.amount", basisUmsatz); + return invoiceWorkitem; } + private void log(List log, String message) { + log.add(new Date() + ": " + message+"\n"); + } + /** * . entfernen , mit punkt ersetzten * diff --git a/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/import_log.xhtml b/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/import_log.xhtml new file mode 100644 index 0000000..9a5bf48 --- /dev/null +++ b/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/import_log.xhtml @@ -0,0 +1,27 @@ + + + + + + +

Protokoll:

+ + + + +
+
+ + + + + + + + + + diff --git a/workflow/datev-import-1.0.0.bpmn b/workflow/datev-import-1.0.0.bpmn index e4fad31..3f54169 100644 --- a/workflow/datev-import-1.0.0.bpmn +++ b/workflow/datev-import-1.0.0.bpmn @@ -165,7 +165,7 @@ result.isValid=true; - + @@ -232,7 +232,7 @@ if (workitem['$file.count'][0]!=1) { $created]]> - + @@ -277,7 +277,7 @@ if (workitem['$file.count'][0]!=1) { - + @@ -318,7 +318,7 @@ if (workitem['$file.count'][0]!=1) { - +