diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/InvoiceUtil.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/InvoiceUtil.java index f9a8746..7e710c5 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/InvoiceUtil.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/InvoiceUtil.java @@ -28,6 +28,9 @@ public class InvoiceUtil { public static final String CHILD_ITEM_PROPERTY = "_ChildItems"; public static final String ITEM_INVOICE_PERIOD = "invoice.period"; public static final String ITEM_INVOICE_POSITIONS = "invoice.positions"; + public static final String ITEM_CDTR_NUMBER = "cdtr.number"; + public static final String ITEM_CDTR_NAME = "cdtr.name"; + public static final String ITEM_CDTR_NAME_CARGOSOFT = "cdtr.name.cargosoft"; public static double round(double value) { BigDecimal bd = BigDecimal.valueOf(value); @@ -76,6 +79,24 @@ public class InvoiceUtil { return childItems; } + /** + * Convert the List of ItemCollections back into a List of Map elements + * + * @param workitem + */ + @SuppressWarnings({ "rawtypes" }) + public static void implodeChildList(ItemCollection workitem, List childItems) { + List mapOrderItems = new ArrayList(); + // convert the child ItemCollection elements into a List of Map + if (childItems != null) { + // iterate over all order items.. + for (ItemCollection orderItem : childItems) { + mapOrderItems.add(orderItem.getAllItems()); + } + workitem.replaceItemValue(CHILD_ITEM_PROPERTY, mapOrderItems); + } + } + /** * Diese Methode berechnet das feld 'invoice.positions' welches eine Valueliste * mit allen Positionsnummern aus dem Childliste enthält. diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListExportAdapterByWeek.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListExportAdapterByWeek.java index 8d65dad..6c72d4c 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListExportAdapterByWeek.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListExportAdapterByWeek.java @@ -200,18 +200,15 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { XSSFRow rowSpacesCurrencies = sheet.getRow(10); XSSFRow rowValues = sheet.getRow(11); - XSSFCell cellSpaceLabelReference = rowSpacesLabels.getCell(1); + XSSFCell cellSpaceLabelReference = rowSpacesLabels.getCell(2); XSSFCell cellSpaceCurrencyReference = rowSpacesCurrencies.getCell(1); int column = 1; for (ItemCollection space : spaces) { + XSSFCell cell = null; String spaceName = space.getItemValueString("space.name"); String spaceID = space.getUniqueID(); spaceNames.add(spaceName); - // Space Labe - XSSFCell cell = rowSpacesLabels.getCell(column); - // cell.copyCellFrom(cellSpaceLabelReference, new CellCopyPolicy()); - cell.setCellValue(spaceName); // Space currency EUR cell = rowSpacesCurrencies.getCell(column); cell.copyCellFrom(cellSpaceCurrencyReference, new CellCopyPolicy()); @@ -223,11 +220,16 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { cell.copyCellFrom(cellSpaceCurrencyReference, new CellCopyPolicy()); cell.setCellValue("USD"); + // Space Label + cell = rowSpacesLabels.getCell(column); + cell.setCellValue(spaceName); + // create two new cells... + column++; cell = rowSpacesLabels.createCell(column); cell.copyCellFrom(cellSpaceLabelReference, new CellCopyPolicy()); cell.setCellValue(""); - column++; + cell = rowSpacesLabels.createCell(column); cell.copyCellFrom(cellSpaceLabelReference, new CellCopyPolicy()); cell.setCellValue(""); @@ -267,21 +269,21 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { column = 1; for (String name : spaceNames) { String key = name + "/" + week; - logger.info("serach WeekInvoiceData for " + key); + logger.info("search WeekInvoiceData for " + key); // list of invoices WeekInvoiceData weekData = weekDataMap.get(key); if (weekData != null) { - logger.info("eur=" + weekData.totalEUR); + logger.info(" EUR=" + weekData.totalEUR + " USD=" + weekData.totalUSD); row.getCell(column).setCellValue(weekData.totalEUR); column++; row.getCell(column).setCellValue(weekData.totalUSD); + column++; } else { logger.info("...... NOT FOUND"); // skip columns column = column + 2; } - } // update style @@ -392,12 +394,13 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { private void groupInvoicesByWeek(String spaceID, String spaceName, Map cache) { - logger.info("...group invoices for " + spaceID); + logger.info("...group invoices for " + spaceName + "/" + spaceID); try { List invoices = documentService.find( "$modelversion:rechnungsausgang-* AND type:workitem AND $uniqueidref:" + spaceID, 9999, 0, "invoice.number", false); + logger.info(" found " + invoices.size() + " for space " + spaceName); for (ItemCollection invoice : invoices) { // compute Week Date dueDate = invoice.getItemValueDate("invoice.duedate"); @@ -414,7 +417,7 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { // haben wir shon ein listchen? String key = spaceName + "/" + weekCategory; - logger.info("....building weekInvoiceData object for " + key); + logger.fine(" ....building weekInvoiceData object for " + key); WeekInvoiceData weekData = cache.get(key); if (weekData == null) { diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/ZahlungsavisAppendAdapter.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/ZahlungsavisAppendAdapter.java index 1a0c045..defa813 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/ZahlungsavisAppendAdapter.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/ZahlungsavisAppendAdapter.java @@ -34,10 +34,6 @@ public class ZahlungsavisAppendAdapter implements SignalAdapter { public static final String ERROR_MISSING_DATA = "MISSING_DATA"; public static final String ERROR_CONFIG = "CONFIG_ERROR"; - public static final String ITEM_CDTR_NUMBER = "cdtr.number"; - public static final String ITEM_CDTR_NAME = "cdtr.name"; - public static final String ITEM_CDTR_NAME_CARGOSOFT = "cdtr.name.cargosoft"; - @Inject WorkflowService workflowService; @@ -63,26 +59,28 @@ public class ZahlungsavisAppendAdapter implements SignalAdapter { * @throws PluginException */ private void appendInvoice(ItemCollection document) throws PluginException { - String cdtrNumber = document.getItemValueString(ITEM_CDTR_NUMBER); + String cdtrNumber = document.getItemValueString(InvoiceUtil.ITEM_CDTR_NUMBER); String currency = document.getItemValueString("invoice.currency"); if (cdtrNumber == null || cdtrNumber.isEmpty()) { throw new PluginException(PluginException.class.getName(), ERROR_MISSING_DATA, "Zahlungsavis kann nicht erzeugt werden. Bitte wählen Sie zuerst einen Kreditor aus."); } - - + logger.info("......Search Zahlungsavis or creditor '" + cdtrNumber + "'..."); ItemCollection zahlungsAvis; try { - zahlungsAvis = findZahlungsavis(cdtrNumber,currency); + zahlungsAvis = findZahlungsavis(cdtrNumber, currency); if (zahlungsAvis == null) { // create a new one zahlungsAvis = new ItemCollection().workflowGroup("Zahlungsavis").task(1000).event(100); // add cdtr.name - zahlungsAvis.setItemValue(ITEM_CDTR_NAME, document.getItemValue(ITEM_CDTR_NAME)); - zahlungsAvis.setItemValue(ITEM_CDTR_NUMBER, document.getItemValue(ITEM_CDTR_NUMBER)); - zahlungsAvis.setItemValue(ITEM_CDTR_NAME_CARGOSOFT, document.getItemValue(ITEM_CDTR_NAME_CARGOSOFT)); + zahlungsAvis.setItemValue(InvoiceUtil.ITEM_CDTR_NAME, + document.getItemValue(InvoiceUtil.ITEM_CDTR_NAME)); + zahlungsAvis.setItemValue(InvoiceUtil.ITEM_CDTR_NUMBER, + document.getItemValue(InvoiceUtil.ITEM_CDTR_NUMBER)); + zahlungsAvis.setItemValue(InvoiceUtil.ITEM_CDTR_NAME_CARGOSOFT, + document.getItemValue(InvoiceUtil.ITEM_CDTR_NAME_CARGOSOFT)); zahlungsAvis.setItemValue("invoice.currency", currency); } else { // zahlungsavis speichern @@ -107,14 +105,13 @@ public class ZahlungsavisAppendAdapter implements SignalAdapter { * @return * @throws QueryException */ - private ItemCollection findZahlungsavis(String cdtrNumber,String currency) throws QueryException { + private ItemCollection findZahlungsavis(String cdtrNumber, String currency) throws QueryException { String query = "(type:workitem) AND ($modelversion:zahlungsavis*) "; List resultList = workflowService.getDocumentService().find(query, 999, 0, "$modified", true); for (ItemCollection zahlungsavis : resultList) { - if (cdtrNumber.equals(zahlungsavis.getItemValueString(ITEM_CDTR_NUMBER)) - && currency.equals(zahlungsavis.getItemValueString("invoice.currency")) - ) { + if (cdtrNumber.equals(zahlungsavis.getItemValueString(InvoiceUtil.ITEM_CDTR_NUMBER)) + && currency.equals(zahlungsavis.getItemValueString("invoice.currency"))) { return zahlungsavis; } } 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 9d8e0c8..7627a95 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 @@ -531,7 +531,7 @@ public class DatevCargosoftImportAdapter implements SignalAdapter { datevWorkitem.setItemValue("invoice.total", total); datevWorkitem.setItemValue("invoice.saldo", total); // implode die Splitbuchungen - implodeChildList(datevWorkitem, splitBuchungen); + InvoiceUtil.implodeChildList(datevWorkitem, splitBuchungen); // set dbtr.name ItemCollection dbtrItemCol = kreditorDebitorService @@ -577,6 +577,8 @@ public class DatevCargosoftImportAdapter implements SignalAdapter { String belegNummer = datevWorkitem.getItemValueString("invoice.number"); if (belegNummer.startsWith("ATC")) { // Zollanmeldung + // Lookup Kreditor data... and switch dbtr to cdtr + updateATCInvoice(datevWorkitem); datevWorkitem.model(INITIAL_MODEL_VERSION_TAX).task(INITIAL_TASK_ID_TAX).event(INITIAL_EVENT_ID_TAX); } else { // Normale Ausgangsrechnung @@ -588,22 +590,41 @@ public class DatevCargosoftImportAdapter implements SignalAdapter { } /** - * Convert the List of ItemCollections back into a List of Map elements + * This helper method updates some attributes of a DATEV Import regarding ATC + * Invoice (Zollanmeldungen) * - * @param workitem + * Hier handelt es sich praktisch um eine Eingangsrechnung, daher tauschen wir + * die Vorzeichen und dbtr/cdtr + * + * @param datevWorkitem + * @throws PluginException */ - @SuppressWarnings({ "rawtypes" }) - private void implodeChildList(ItemCollection workitem, List childItems) { - List mapOrderItems = new ArrayList(); - // convert the child ItemCollection elements into a List of Map - if (childItems != null) { - logger.fine("Convert child items into Map..."); - // iterate over all order items.. - for (ItemCollection orderItem : childItems) { - mapOrderItems.add(orderItem.getAllItems()); - } - workitem.replaceItemValue(CHILD_ITEM_PROPERTY, mapOrderItems); + private void updateATCInvoice(ItemCollection datevWorkitem) throws PluginException { + String cdtrNumber = datevWorkitem.getItemValueString("dbtr.number"); + datevWorkitem.setItemValue("cdtr.number", cdtrNumber); + datevWorkitem.removeItem("dbtr.number"); + ItemCollection creditor = kreditorDebitorService.findCreditor(cdtrNumber); + if (creditor != null) { + // update name.... + datevWorkitem.setItemValue(InvoiceUtil.ITEM_CDTR_NAME, creditor.getItemValueString("_VENDOR_Name")); } + // Update invoice.positions + InvoiceUtil.updateInvoicePositions(datevWorkitem); + + // Switch S/H + List childs = InvoiceUtil.explodeChildList(datevWorkitem); + for (ItemCollection posItem : childs) { + if (posItem.hasItem("datev.shzeichen")) { + String sh = posItem.getItemValueString("datev.shzeichen"); + if ("S".equalsIgnoreCase(sh)) { + sh = "H"; + } else { + sh = "S"; + } + posItem.setItemValue("datev.shzeichen", sh); + } + } + InvoiceUtil.implodeChildList(datevWorkitem, childs); } } \ No newline at end of file diff --git a/templates/op-liste_kw_template.xlsx b/templates/op-liste_kw_template.xlsx index 6d5b323..034ff20 100644 Binary files a/templates/op-liste_kw_template.xlsx and b/templates/op-liste_kw_template.xlsx differ diff --git a/workflow/opliste-de-1.0.1.bpmn b/workflow/opliste-de-1.0.1.bpmn index 338ded7..0b1f2a9 100644 --- a/workflow/opliste-de-1.0.1.bpmn +++ b/workflow/opliste-de-1.0.1.bpmn @@ -604,7 +604,6 @@ Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt SequenceFlow_2 sequenceFlow_71XoqA sequenceFlow_QzU0Xg - sequenceFlow_hH7RWQ @@ -618,40 +617,27 @@ Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt + + + Mahnwesen OP-Liste KW Template op-liste_kw_template.xlsx op-liste_space.name_$lasteventdate.xlsx - - C6 - sequencenumber - text - - - D6 - Gesamtübersicht - text - - - C8 - space.name - text - I6 $lasteventdate date - + + +I7 ]]> - - - - + sequenceFlow_QzU0Xg sequenceFlow_64kfIA @@ -689,6 +675,7 @@ Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt SequenceFlow_10 sequenceFlow_64kfIA sequenceFlow_W9rmgA + sequenceFlow_hH7RWQ @@ -761,7 +748,7 @@ Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt - + @@ -797,7 +784,7 @@ Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt sequenceFlow_hH7RWQ - + @@ -1023,26 +1010,25 @@ Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt - + - + - + - - - + + - - + + @@ -1060,9 +1046,7 @@ Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt - - - + @@ -1074,23 +1058,23 @@ Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt - + - - - - + + + + - + - + - - - + + +