diff --git a/RELEASENOTES.md b/RELEASENOTES.md index d80c844..f9cc31b 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -10,6 +10,7 @@ - Encoding für CSV Import aus cargosoft muss auf `encoding=UTF-8` stehen! - Neues Businesspartner BPMN Modell einspielen +- Lucene Index neu berechenne wegen 'partner.id' #### Daten Synchronisation diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/AGLAnalyticControllerDebitor.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/AGLAnalyticControllerDebitor.java index fd6b866..ae2d4f5 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/AGLAnalyticControllerDebitor.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/AGLAnalyticControllerDebitor.java @@ -199,7 +199,7 @@ public class AGLAnalyticControllerDebitor implements Serializable { stats = null; } else { logger.info(" ├──load invoices for " + getDbtNr() + "...."); - String query = "(type:workitem) AND dbtr.number:" + getDbtNr() + " AND $modelversion:rechnungsausgang-*"; + String query = "(type:workitem) AND " + getDbtNrQuery() + " AND $modelversion:rechnungsausgang-*"; try { logger.info(" ├──refresh invoice stats for " + getDbtNr() + "...."); invoices = documentService.find(query, 999, 0, "$created", false); @@ -371,12 +371,31 @@ public class AGLAnalyticControllerDebitor implements Serializable { */ private String getDbtNr() { String dbtNr = workflowController.getWorkitem().getItemValueString("dbtr.number"); - if (dbtNr.startsWith("D") || dbtNr.startsWith("K")) { - dbtNr = dbtNr.substring(1); - } + // if (dbtNr.startsWith("D") || dbtNr.startsWith("K")) { + // dbtNr = dbtNr.substring(1); + // } return dbtNr; } + /** + * Hilfsmethode die auch alte Rechnungen ohne D/K findet + * + * @return + */ + private String getDbtNrQuery() { + String dbtNr = workflowController.getWorkitem().getItemValueString("dbtr.number"); + String shortDbtNr = dbtNr.substring(1); + String query = " (dbtr.number:" + dbtNr + " OR dbtr.number:" + shortDbtNr + ") "; + return query; + } + + private String getCdtrNrQuery() { + String cdtrNr = workflowController.getWorkitem().getItemValueString("cdtr.number"); + String shortCdtrNr = cdtrNr.substring(1); + String query = " (cdtr.number:" + cdtrNr + " OR cdtr.number:" + shortCdtrNr + ") "; + return query; + } + /** * Sucht alle Rechnugnen aus einem Zeitraum und sammelt Zahlungsziel und * Zahlungszeitspanne gruppiert nach monaten @@ -403,7 +422,7 @@ public class AGLAnalyticControllerDebitor implements Serializable { String endDateStr = endDate.format(formatter); String query = "(type:workitemarchive) AND " + " invoice.date:[" + startDateStr + " TO " + endDateStr + "] AND " - + "dbtr.number:" + getDbtNr() + " AND $modelversion:rechnungsausgang-* AND ($taskid:[5900 TO 5999])"; + + getDbtNrQuery() + " AND $modelversion:rechnungsausgang-* AND ($taskid:[5900 TO 5999])"; logger.fine("query = " + query); try { diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/AGLAnalyticExcelAdapterDebitor.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/AGLAnalyticExcelAdapterDebitor.java index a761ca0..b3e8e93 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/AGLAnalyticExcelAdapterDebitor.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/AGLAnalyticExcelAdapterDebitor.java @@ -206,6 +206,18 @@ public class AGLAnalyticExcelAdapterDebitor extends POIFindReplaceAdapter { return dbtNr; } + /** + * Hilfsmethode die auch alte Rechnungen ohne D/K findet + * + * @return + */ + private String getDbtNrQuery(ItemCollection workitem) { + String dbtNr = workitem.getItemValueString("dbtr.number"); + String shortDbtNr = dbtNr.substring(1); + String query = " (dbtr.number:" + dbtNr + " OR dbtr.number:" + shortDbtNr + ") "; + return query; + } + /** * This helper method inserts a row for each invoice at row 16 into the excel * template file @@ -222,7 +234,7 @@ public class AGLAnalyticExcelAdapterDebitor extends POIFindReplaceAdapter { throws PluginException, QueryException { // load dummy rechnungen - List invoices = loadInvoices(getDbtNr(document)); + List invoices = loadInvoices(document); // load XSSFWorkbook @@ -338,10 +350,10 @@ public class AGLAnalyticExcelAdapterDebitor extends POIFindReplaceAdapter { * * @return */ - private List loadInvoices(String dbtrNumber) { + private List loadInvoices(ItemCollection workitem) { List result = new ArrayList<>(); - String query = "(type:workitem) AND dbtr.number:" + dbtrNumber + " AND $modelversion:rechnungsausgang-*"; + String query = "(type:workitem) AND " + getDbtNrQuery(workitem) + " AND $modelversion:rechnungsausgang-*"; try { result = documentService.find(query, 9999, 0, "invoice.number", false); } catch (QueryException e) { diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/BusinessPartnerController.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/BusinessPartnerController.java index 749cc60..fd05632 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/BusinessPartnerController.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/BusinessPartnerController.java @@ -37,7 +37,6 @@ import org.imixs.workflow.ItemCollection; import org.imixs.workflow.engine.DocumentService; import org.imixs.workflow.exceptions.AccessDeniedException; import org.imixs.workflow.exceptions.QueryException; -import org.imixs.workflow.faces.data.WorkflowController; import org.imixs.workflow.faces.data.WorkflowEvent; import jakarta.enterprise.context.ConversationScoped; @@ -68,9 +67,6 @@ public class BusinessPartnerController implements Serializable { protected List invoicesIn = null; protected List dunnings = null; - @Inject - protected WorkflowController workflowController; - @Inject DocumentService documentService; @@ -330,51 +326,67 @@ public class BusinessPartnerController implements Serializable { * dbtr/cdtr depending on the workflow type. A form will than rerender the * opList section. */ - public void updateMetaData() { + public void updateMetaData(ItemCollection workitem) { FacesContext fc = FacesContext.getCurrentInstance(); String bpid = fc.getExternalContext().getRequestParameterMap().get("partnerID"); logger.info("....update metadata.....bpid = " + bpid); ItemCollection businessPartner = businessPartnerService.getBusinessPartnerByID(bpid); + searchResult = null; if (businessPartner != null) { // Eingangsrechnung - if (InvoiceUtil.isCreditorInvoice(workflowController.getWorkitem())) { - workflowController.getWorkitem().setItemValue("cdtr.number", + if (InvoiceUtil.isCreditorInvoice(workitem)) { + workitem.setItemValue("cdtr.number", businessPartner.getItemValueString("cdtr.number")); - workflowController.getWorkitem().setItemValue("cdtr.name", + workitem.setItemValue("cdtr.name", businessPartner.getItemValueString("partner.name")); - workflowController.getWorkitem().setItemValue("cdtr.mail", businessPartner.getItemValue("cdtr.mail")); - } - + workitem.setItemValue("cdtr.mail", businessPartner.getItemValue("cdtr.mail")); + } else // Ausgangsrechnung - if (InvoiceUtil.isDebitorInvoice(workflowController.getWorkitem())) { - workflowController.getWorkitem().setItemValue("dbtr.number", + if (InvoiceUtil.isDebitorInvoice(workitem)) { + workitem.setItemValue("dbtr.number", businessPartner.getItemValueString("dbtr.number")); - workflowController.getWorkitem().setItemValue("dbtr.name", + workitem.setItemValue("dbtr.name", businessPartner.getItemValueString("partner.name")); - workflowController.getWorkitem().setItemValue("dbtr.mail", businessPartner.getItemValue("dbtr.mail")); - } - + workitem.setItemValue("dbtr.mail", businessPartner.getItemValue("dbtr.mail")); + } else // Zahlungseingang - if (workflowController.getWorkitem().getModelVersion().startsWith("zahlungseingang")) { - workflowController.getWorkitem().setItemValue("dbtr.number", + if (workitem.getModelVersion().startsWith("zahlungseingang")) { + workitem.setItemValue("dbtr.number", businessPartner.getItemValueString("dbtr.number")); - workflowController.getWorkitem().setItemValue("dbtr.name", + workitem.setItemValue("dbtr.name", businessPartner.getItemValueString("partner.name")); - workflowController.getWorkitem().setItemValue("dbtr.mail", businessPartner.getItemValue("dbtr.mail")); - } - + workitem.setItemValue("dbtr.mail", businessPartner.getItemValue("dbtr.mail")); + } else // Analyse Debitor - if (workflowController.getWorkitem().getModelVersion().startsWith("analyse-debitor")) { - workflowController.getWorkitem().setItemValue("dbtr.number", + if (workitem.getModelVersion().startsWith("analyse-debitor")) { + workitem.setItemValue("dbtr.number", businessPartner.getItemValueString("dbtr.number")); - workflowController.getWorkitem().setItemValue("dbtr.name", + workitem.setItemValue("dbtr.name", businessPartner.getItemValueString("partner.name")); - workflowController.getWorkitem().setItemValue("dbtr.mail", businessPartner.getItemValue("dbtr.mail")); + workitem.setItemValue("dbtr.mail", businessPartner.getItemValue("dbtr.mail")); + } else { + // default behavior + if (workitem.getItemValueString("dbtr.number").isEmpty()) { + String number = businessPartner.getItemValueString("dbtr.number"); + workitem.setItemValue("dbtr.number", number); + if (number.length() > 1) { + workitem.setItemValue("dbtr.number.short", + number.substring(1)); + } + } + if (workitem.getItemValueString("cdtr.number").isEmpty()) { + String number = businessPartner.getItemValueString("cdtr.number"); + workitem.setItemValue("cdtr.number", number); + if (number.length() > 1) { + workitem.setItemValue("cdtr.number.short", + number.substring(1)); + } + + } } } - searchResult = null; } diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/dataview/AGLDataViewDebitorAdapter.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/dataview/AGLDataViewDebitorAdapter.java new file mode 100644 index 0000000..e484391 --- /dev/null +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/dataview/AGLDataViewDebitorAdapter.java @@ -0,0 +1,385 @@ +package com.alexanderlogistics.dataview; + +import java.util.List; +import java.util.logging.Logger; + +import org.apache.poi.ss.usermodel.CellCopyPolicy; +import org.apache.poi.ss.usermodel.Row.MissingCellPolicy; +import org.apache.poi.ss.util.CellReference; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.imixs.workflow.ItemCollection; +import org.imixs.workflow.engine.DocumentService; +import org.imixs.workflow.engine.WorkflowService; +import org.imixs.workflow.exceptions.PluginException; +import org.imixs.workflow.exceptions.QueryException; +import org.imixs.workflow.office.config.ConfigService; +import org.imixs.workflow.office.dataview.DataViewExportEvent; +import org.imixs.workflow.poi.POIFindReplaceAdapter; +import org.imixs.workflow.poi.POIUtil; + +import com.alexanderlogistics.InvoiceService; + +import jakarta.enterprise.event.Observes; +import jakarta.inject.Inject; + +/** + * Der AGLDataViewDebitorAdapter exportiert eine Dateview in eine Excel Datei + * und berücksichtigt dabei separate Spalten für die Währungen + * + * + * @version 1.0 + * @author rsoika + */ +public class AGLDataViewDebitorAdapter extends POIFindReplaceAdapter { + + private static Logger logger = Logger.getLogger(AGLDataViewDebitorAdapter.class.getName()); + + @Inject + WorkflowService workflowService; + + @Inject + InvoiceService invoiceService; + + @Inject + DocumentService documentService; + + @Inject + ConfigService configService; + + /** + * Spezial Adapter der den Debitor exporteirt. + * + * @param event + */ + public void onEvent(@Observes DataViewExportEvent event) { + + if ("Debitor SOA".equals(event.getDataViewDefinition().getItemValueString("name"))) { + try { + logger.info("Custom Insert Rows for Debitor SOA"); + // ermittle die Hauptwährungen + List currencyList; + + currencyList = invoiceService.getCurrenciesOut(); + + // NOTE: we only take the first sheet ! + XSSFSheet sheet = event.getXssfWorkbook().getSheetAt(0); + + // first add the columns for the currency list + addCurrencyColumns(event.getXssfWorkbook(), sheet, currencyList); + // add rows + insertInvoiceRows(sheet, event.getDataset(), currencyList); + + event.setCompleted(true); + } catch (PluginException | QueryException e) { + logger.severe("Failed to insert rows: " + e.getMessage()); + } + } + + } + + // /** + // * This method + // * + // * @throws PluginException + // */ + // @SuppressWarnings("unchecked") + // @Override + // public ItemCollection execute(ItemCollection document, ItemCollection event) + // throws AdapterException, PluginException { + + // // ermittle die Hauptwährungen + // List currencyList = invoiceService.getCurrenciesOut(); + + // // read the options + // ItemCollection ausgangsrechnungConfig = + // workflowService.evalWorkflowResult(event, "soa", document, false); + // if (ausgangsrechnungConfig == null || + // !ausgangsrechnungConfig.hasItem("excel-export")) { + // throw new PluginException(AGLDataViewAdapterDebitor.class.getSimpleName(), + // CONFIG_ERROR, + // "missing soa configuration in model event - please check model + // configuration"); + // } + // List excelDefList = + // ausgangsrechnungConfig.getItemValue("excel-export"); + // ItemCollection excelDefCollection = + // XMLParser.parseItemStructure(excelDefList.get(0)); + + // String textblock = excelDefCollection.getItemValueString("textblock"); + // String template = excelDefCollection.getItemValueString("template"); + // String targetName = excelDefCollection.getItemValueString("target-name"); + + // // adapt text.... + // targetName = workflowService.adaptText(targetName, document); + + // try { + // FileData fileData = appendExcelTemplate(document, textblock, template, + // targetName); + + // // get workbook + // XSSFWorkbook doc = null; + // try (InputStream imputStream = new + // ByteArrayInputStream(fileData.getContent())) { + // doc = new XSSFWorkbook(imputStream); + // // NOTE: we only take the first sheet ! + // XSSFSheet sheet = doc.getSheetAt(0); + + // // first add the columns for the currency list + // addCurrencyColumns(doc, sheet, currencyList); + // // add rows + // insertInvoiceRows(sheet, document, currencyList); + + // // write back the updated excel file + // ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + // doc.write(byteArrayOutputStream); + + // byte[] newContent = byteArrayOutputStream.toByteArray(); + // FileData fileDataNew = new FileData(fileData.getName(), newContent, + // fileData.getContentType(), null); + // document.addFileData(fileDataNew); + // logger.finest("......new document added"); + + // } catch (IOException | QueryException e) { + // throw new PluginException(AGLAnalyticExcelAdapter.class.getSimpleName(), + // InvoiceService.ERROR_CONFIG, + // "failed to update opliste: " + e.getMessage()); + // } finally { + // if (doc != null) { + // try { + // doc.close(); + // } catch (IOException e) { + // logger.severe("Failed to close workbook: " + e.getMessage()); + // e.printStackTrace(); + // } + // } + // } + + // // Finally process POI instructions + // processPOIUpdate(document, event, targetName); + + // } catch (PluginException e) { + // throw new PluginException(AGLAnalyticExcelAdapter.class.getSimpleName(), + // InvoiceService.ERROR_CONFIG, + // "failed to update steuerbescheide: " + e.getMessage()); + // } + // logger.info("... completed!"); + // return document; + // } + + /** + * A SOA can be created for one or multiple currencies. This helper method adds + * the Total and Saldo Colum for each currency + * + * The template provided only the columns for the first currency. + * + * @param sheet + * @param currencyList + */ + private void addCurrencyColumns(XSSFWorkbook doc, XSSFSheet sheet, List currencyList) { + if (currencyList == null || currencyList.size() <= 1) { + // no extra currencies defined! + return; + } + + // zusaetzliche Zellen einfuegen... + int newColumns = (currencyList.size() - 1) * 2; + for (int i = 0; i < newColumns; i++) { + logger.info(".. add currency column..."); + POIUtil.insertColumn(sheet, 6, 8 + i); + } + + // Beschriftungen eintragen + int col = 6; + XSSFCell cell = null; + XSSFRow labelRow = sheet.getRow(9); + for (String currency : currencyList) { + + cell = labelRow.getCell(col); + cell.setCellValue("Total " + currency); + col++; + + cell = labelRow.getCell(col); + cell.setCellValue("Balance " + currency); + col++; + } + } + + /** + * Hilfsmethode die das fuehrende K/D aus der Debitorennummer entfernt + * + * @return + */ + private String getDbtNr(ItemCollection workitem) { + String dbtNr = workitem.getItemValueString("dbtr.number"); + if (dbtNr.startsWith("D") || dbtNr.startsWith("K")) { + dbtNr = dbtNr.substring(1); + } + return dbtNr; + } + + /** + * Hilfsmethode die auch alte Rechnungen ohne D/K findet + * + * @return + */ + private String getDbtNrQuery(ItemCollection workitem) { + String dbtNr = workitem.getItemValueString("dbtr.number"); + String shortDbtNr = dbtNr.substring(1); + String query = " (dbtr.number:" + dbtNr + " OR dbtr.number:" + shortDbtNr + ") "; + return query; + } + + /** + * This helper method inserts a row for each invoice at row 16 into the excel + * template file + *

+ * The method copies the Row A16 as a reference row + *

+ * The named cell 'TOTAL' should contain the summary formula. It will be + * evaluated at the end. + * + * @throws PluginException + * @throws QueryException + */ + private void insertInvoiceRows(XSSFSheet sheet, List invoices, List currencyList) + throws PluginException, QueryException { + + // load XSSFWorkbook + + CellReference invoiceRefCell = new CellReference("A11"); + XSSFRow referenceRowInvoice = sheet.getRow(invoiceRefCell.getRow()); + int referenceRowPos = 10; + int rowPos = referenceRowPos; + int lastRow = 2999; + logger.finest("Last rownum=" + lastRow); + + // jetzt füge alle Rechnungen an. + int totalRowCount = invoices.size(); + POIUtil.insertRows(sheet, "A11", totalRowCount - 0); + + for (ItemCollection invoice : invoices) { + logger.fine("......add invoice " + invoice.getUniqueID()); + // now create a new line.. + XSSFRow row = sheet.createRow(rowPos); + row.copyRowFrom(referenceRowInvoice, new CellCopyPolicy()); + // insert values + row.getCell(0).setCellValue(invoice.getItemValueDate("$created")); + row.getCell(1, MissingCellPolicy.CREATE_NULL_AS_BLANK) + .setCellValue(invoice.getItemValueString("invoice.number")); + row.getCell(2, MissingCellPolicy.CREATE_NULL_AS_BLANK) + .setCellValue(invoice.getItemValueDate("invoice.date")); + row.getCell(3, MissingCellPolicy.CREATE_NULL_AS_BLANK) + .setCellValue(invoice.getItemValueDate("invoice.duedate")); + row.getCell(4, MissingCellPolicy.CREATE_NULL_AS_BLANK) + .setCellValue(invoice.getItemValueString("space.name")); + row.getCell(5, MissingCellPolicy.CREATE_NULL_AS_BLANK) + .setCellValue(invoice.getItemValueString("invoice.text")); + + // Waehrung? + String currency = invoice.getItemValueString("invoice.currency"); + int totalCol = findTotalPos(currency, currencyList); + + row.getCell(totalCol, MissingCellPolicy.CREATE_NULL_AS_BLANK) + .setCellValue(invoice.getItemValueDouble("invoice.total")); + row.getCell(totalCol + 1, MissingCellPolicy.CREATE_NULL_AS_BLANK) + .setCellValue(invoice.getItemValueDouble("invoice.saldo")); + // Status + row.getCell(6 + (currencyList.size() * 2), MissingCellPolicy.CREATE_NULL_AS_BLANK) + .setCellValue(invoice.getItemValueString("$workflowstatus")); + + rowPos++; + } + + // setze Summen Formeln + for (int column = 6; column < currencyList.size() * 2 + 6; column++) { + XSSFCell cell = sheet.getRow(totalRowCount + 11).getCell(column); // G11 + String cellRefFrom = POIUtil.getCellReference(column, 10); + String cellRefTo = POIUtil.getCellReference(column, totalRowCount + 10); + String formula = "SUM(" + cellRefFrom + ":" + cellRefTo + ")"; + cell.setCellFormula(formula); + } + + // Optional: Formel direkt evaluieren + XSSFFormulaEvaluator.evaluateAllFormulaCells(sheet.getWorkbook()); + + } + + /** + * Findet die Total Spalte für eine Währung + * + * @param currency + * @return + */ + private int findTotalPos(String currency, List currencyList) { + int result = 6; + if (currency != null) { + for (String cur : currencyList) { + if (currency.equals(cur)) { + return result; + } + result = result + 2; + } + } + return result; + } + + /** + * This method loads a text-block for a specified ref and appends the named + * fileData object of this document. + * + * @param document + * @throws PluginException + */ + // private FileData appendExcelTemplate(ItemCollection document, String + // textblockRef, String template, + // String targetName) throws PluginException { + + // if ((template == null || template.isEmpty()) || (textblockRef == null || + // textblockRef.isEmpty())) { + // throw new PluginException(AGLAnalyticExcelAdapter.class.getSimpleName(), + // InvoiceService.ERROR_CONFIG, + // "invalid SOA configuration in model event - textblock/template reference not + // defined!"); + // } + + // // load the text block + // FileData fileData = invoiceService.loadTextBlockFileData(textblockRef, + // template); + + // // do we found the document? + // if (fileData == null) { + // throw new PluginException(AGLAnalyticExcelAdapter.class.getSimpleName(), + // InvoiceService.ERROR_CONFIG, + // "invalid SOA configuration in model event - template=" + template + " not + // found!"); + // } + // fileData.setName(targetName); + // // append document + // logger.info("...append new SOA Template: " + targetName); + // document.addFileData(fileData); + // return fileData; + // } + + /** + * Diese Methode läd alle offenen Steuerbescheide + * + * @return + */ + // private List loadInvoices(ItemCollection workitem) { + // List result = new ArrayList<>(); + + // String query = "(type:workitem) AND " + getDbtNrQuery(workitem) + " AND + // $modelversion:rechnungsausgang-*"; + // try { + // result = documentService.find(query, 9999, 0, "invoice.number", false); + // } catch (QueryException e) { + // e.printStackTrace(); + // } + // return result; + // } + +} \ No newline at end of file diff --git a/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewController.java b/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewController.java index 4e05176..8d1d126 100644 --- a/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewController.java +++ b/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewController.java @@ -25,6 +25,7 @@ package org.imixs.workflow.office.dataview; import java.io.IOException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; @@ -42,6 +43,7 @@ import org.imixs.workflow.exceptions.PluginException; import org.imixs.workflow.exceptions.QueryException; import org.imixs.workflow.faces.data.ViewController; import org.imixs.workflow.faces.data.ViewHandler; +import org.imixs.workflow.faces.data.WorkflowController; import org.imixs.workflow.office.forms.CustomFormController; import org.imixs.workflow.office.forms.CustomFormSection; @@ -78,11 +80,11 @@ public class DataViewController extends ViewController { private static final long serialVersionUID = 1L; public static final String ERROR_CONFIG = "CONFIG_ERROR"; - public static final int MAX_ROWS = 3000; + public static final int MAX_ROWS = 9999; private List sections = null; private List viewItemDefinitions = null; - protected ItemCollection dataDefinition = null; + protected ItemCollection dataViewDefinition = null; private ItemCollection filter; private String query; private String errorMessage; @@ -105,6 +107,12 @@ public class DataViewController extends ViewController { @Inject CustomFormController customFormController; + @Inject + WorkflowController workflowController; + + @Inject + DataViewDefaultExporter dataViewDefaultExporter; + @Inject ViewHandler viewHandler; @@ -145,7 +153,7 @@ public class DataViewController extends ViewController { // alternative 'workitem=...' uniqueid = paramMap.get("workitem"); } - dataDefinition = documentService.load(uniqueid); + dataViewDefinition = documentService.load(uniqueid); } if (uniqueid != null && !uniqueid.isEmpty()) { @@ -156,23 +164,23 @@ public class DataViewController extends ViewController { try { // Init new Filter.... - if (dataDefinition != null) { - filter.setItemValue("txtWorkflowEditorCustomForm", dataDefinition.getItemValue("form")); - filter.setItemValue("name", dataDefinition.getItemValueString("name")); - filter.setItemValue("description", dataDefinition.getItemValueString("description")); + if (dataViewDefinition != null) { + filter.setItemValue("txtWorkflowEditorCustomForm", dataViewDefinition.getItemValue("form")); + filter.setItemValue("name", dataViewDefinition.getItemValueString("name")); + filter.setItemValue("description", dataViewDefinition.getItemValueString("description")); viewItemDefinitions = DataViewDefinitionController - .computeDataViewItemDefinitions(dataDefinition); + .computeDataViewItemDefinitions(dataViewDefinition); customFormController.computeFieldDefinition(filter); sections = customFormController.getSections(); // Update View Handler settings - String sortBy = dataDefinition.getItemValueString("sort.by"); + String sortBy = dataViewDefinition.getItemValueString("sort.by"); if (sortBy.isEmpty()) { sortBy = "$modified"; } this.setSortBy(sortBy); - this.setSortReverse(dataDefinition.getItemValueBoolean("sort.reverse")); + this.setSortReverse(dataViewDefinition.getItemValueBoolean("sort.reverse")); this.setPageIndex(filter.getItemValueInteger("pageIndex")); if (!filter.getItemValueString("query").isEmpty()) { query = filter.getItemValueString("query"); @@ -186,8 +194,22 @@ public class DataViewController extends ViewController { } - public ItemCollection getDefinition() { - return dataDefinition; + @Override + public List loadData() throws QueryException { + + try { + + return super.loadData(); + + } catch (Exception e) { + logger.severe("Failed to load view: " + e.getMessage()); + return new ArrayList<>(); + } + + } + + public ItemCollection getDataViewDefinition() { + return dataViewDefinition; } public List getSections() { @@ -224,13 +246,27 @@ public class DataViewController extends ViewController { * * @throws QueryException */ - public void run() throws QueryException { + public void run() throws PluginException, QueryException { reset(); // build new query from template - query = dataDefinition.getItemValueString("query"); + query = dataViewDefinition.getItemValueString("query"); + query = parseQuery(query, filter); + query = parseQuery(query, workflowController.getWorkitem()); + + logger.info("query=" + query); + filter.setItemValue("query", query); + + // Prefetch data to update total count and page count + viewHandler.getData(this); + // cache filter + dataViewCache.put(dataViewDefinition.getUniqueID(), filter); + + } + + private String parseQuery(String query, ItemCollection filter) { List filterItems = filter.getItemNames(); for (String itemName : filterItems) { String itemValue = filter.getItemValueString(itemName); @@ -251,14 +287,7 @@ public class DataViewController extends ViewController { // Replace all occurrences in the query case-insensitive. query = query.replaceAll("(?i)\\{" + Pattern.quote(itemName) + "\\}", itemValue); } - logger.finest("query=" + query); - filter.setItemValue("query", query); - - // Prefetch data to update total count and page count - viewHandler.getData(this); - // cache filter - dataViewCache.put(dataDefinition.getUniqueID(), filter); - + return query; } /** @@ -304,7 +333,11 @@ public class DataViewController extends ViewController { } /** - * Exports data into a excel template processed by apache-poi + * Exports data into a excel template processed by apache-poi. + * The method sends a DataViewExport event to allow clients to adapt the export + * process. + * + * @see DataViewExportEvent * * @throws PluginException * @throws QueryException @@ -315,7 +348,7 @@ public class DataViewController extends ViewController { run(); SimpleDateFormat dateformat = new SimpleDateFormat("yyyyMMddHHmm"); - String targetFileName = dataDefinition.getItemValueString("poi.targetFilename"); + String targetFileName = dataViewDefinition.getItemValueString("poi.targetFilename"); if (targetFileName.isEmpty()) { throw new PluginException(InkassoExportAdapter.class.getSimpleName(), ERROR_CONFIG, "Missing Excel Export definition - check configuration!"); @@ -339,22 +372,25 @@ public class DataViewController extends ViewController { throw new PluginException(InkassoExportAdapter.class.getSimpleName(), ERROR_CONFIG, "Data can not be exported into Excel because dataset exceeds " + MAX_ROWS + " rows!"); } - String sortBy = dataDefinition.getItemValueString("sort.by"); + String sortBy = dataViewDefinition.getItemValueString("sort.by"); if (sortBy.isEmpty()) { sortBy = "$modified"; // default } List invoices = documentService.find(query, MAX_ROWS, 0, sortBy, - dataDefinition.getItemValueBoolean("sort.reverse")); + dataViewDefinition.getItemValueBoolean("sort.reverse")); if (invoices.size() > 0) { - String referenceCell = dataDefinition.getItemValueString("poi.referenceCell"); - DataViewPOIHelper.insertDataRows(invoices, referenceCell, viewItemDefinitions, fileData); + dataViewDefaultExporter.insertDataRows(invoices, dataViewDefinition, viewItemDefinitions, fileData); } // create a temp event ItemCollection event = new ItemCollection().setItemValue("txtActivityResult", - dataDefinition.getItemValue("poi.update")); - ItemCollection poiConfig = workflowService.evalWorkflowResult(event, "poi-update", dataDefinition, + dataViewDefinition.getItemValue("poi.update")); + ItemCollection poiConfig = workflowService.evalWorkflowResult(event, "poi-update", dataViewDefinition, false); + + // merge workitem fields (Workaround because custom forms did hard coded map to + // workflowController instead of workitem + filter.copy(workflowController.getWorkitem()); DataViewPOIHelper.poiUpdate(filter, fileData, poiConfig, workflowService); fileData.setName(targetFileName); @@ -381,10 +417,10 @@ public class DataViewController extends ViewController { private FileData loadTemplate() { // first filename - List fileDataList = dataDefinition.getFileData(); + List fileDataList = dataViewDefinition.getFileData(); if (fileDataList != null && fileDataList.size() > 0) { String fileName = fileDataList.get(0).getName(); - return snapshotService.getWorkItemFile(dataDefinition.getUniqueID(), fileName); + return snapshotService.getWorkItemFile(dataViewDefinition.getUniqueID(), fileName); } // no file data available! return null; diff --git a/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewDefaultExporter.java b/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewDefaultExporter.java new file mode 100644 index 0000000..00ebc11 --- /dev/null +++ b/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewDefaultExporter.java @@ -0,0 +1,145 @@ +package org.imixs.workflow.office.dataview; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.Serializable; +import java.util.List; +import java.util.logging.Logger; + +import org.apache.poi.ss.usermodel.CellCopyPolicy; +import org.apache.poi.ss.util.CellReference; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.imixs.workflow.FileData; +import org.imixs.workflow.ItemCollection; +import org.imixs.workflow.exceptions.PluginException; +import org.imixs.workflow.office.forms.AnalyticController; + +import jakarta.enterprise.context.ConversationScoped; +import jakarta.enterprise.event.Event; +import jakarta.inject.Inject; +import jakarta.inject.Named; + +/** + * The DataViewDefaultExporter exports a dataset into a excel template. The + * exporter sends a DataViewExportEvent. An observer CID bean can implement + * alternative exporters. + * With the event property 'completed' a client can signal that the export + * process is completed. Otherwise the default behavior will be adapted. + * + * @author rsoika + * + */ +@Named +@ConversationScoped +public class DataViewDefaultExporter implements Serializable { + public static final String ERROR_CONFIG = "CONFIG_ERROR"; + + private static final long serialVersionUID = 1L; + private static Logger logger = Logger.getLogger(AnalyticController.class.getName()); + + @Inject + protected Event dataViewExportEvents; + + /** + * This helper method inserts a row for each invoice + * + * @throws PluginException + */ + public void insertDataRows(List dataset, ItemCollection dataViewDefinition, + List viewItemDefinitions, + FileData fileData) throws PluginException { + // load XSSFWorkbook + try (InputStream imputStream = new ByteArrayInputStream(fileData.getContent())) { + XSSFWorkbook doc = new XSSFWorkbook(imputStream); + + // send DataViewExportEvent.... + if (dataViewExportEvents != null) { + DataViewExportEvent event = new DataViewExportEvent(dataset, dataViewDefinition, viewItemDefinitions, + doc); + dataViewExportEvents.fire(event); // found FileData? + if (!event.isCompleted()) { + // Default behavior + defaultExport(dataset, dataViewDefinition, viewItemDefinitions, doc); + } + } + + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + // write back the file + doc.write(byteArrayOutputStream); + doc.close(); + byte[] newContent = byteArrayOutputStream.toByteArray(); + fileData.setContent(newContent); + + } catch (IOException e) { + throw new PluginException(DataViewPOIHelper.class.getSimpleName(), ERROR_CONFIG, + "failed to update excel export: " + e.getMessage()); + } + } + + /** + * This is the default implementation to insert a dataset into a XSSFSheet + * + * @param dataset + * @param referenceCell + * @param viewItemDefinitions + * @param doc + */ + private void defaultExport(List dataset, ItemCollection dataViewDefinition, + List viewItemDefinitions, XSSFWorkbook doc) { + String referenceCell = dataViewDefinition.getItemValueString("poi.referenceCell"); + + // NOTE: we only take the first sheet ! + XSSFSheet sheet = doc.getSheetAt(0); + + CellReference cr = new CellReference(referenceCell); + XSSFRow referenceRow = sheet.getRow(cr.getRow()); + int referenceRowPos = referenceRow.getRowNum() + 1; + int rowPos = referenceRowPos; + // int lastRow = sheet.getLastRowNum(); + int lastRow = 999; + logger.finest("Last rownum=" + lastRow); + sheet.shiftRows(rowPos, lastRow, dataset.size(), true, true); + + for (ItemCollection workitem : dataset) { + logger.finest("......copy row..."); + + // now create a new line.. + XSSFRow row = sheet.createRow(rowPos); + row.copyRowFrom(referenceRow, new CellCopyPolicy()); + // insert values + int cellNum = 0; + for (ItemCollection itemDef : viewItemDefinitions) { + String type = itemDef.getItemValueString("item.type"); + String name = itemDef.getItemValueString("item.name"); + switch (type) { + case "xs:double": + row.getCell(cellNum).setCellValue(workitem.getItemValueDouble(name)); + break; + case "xs:float": + row.getCell(cellNum).setCellValue(workitem.getItemValueFloat(name)); + break; + case "xs:int": + row.getCell(cellNum).setCellValue(workitem.getItemValueInteger(name)); + break; + case "xs:date": + row.getCell(cellNum).setCellValue(workitem.getItemValueDate(name)); + break; + + default: + row.getCell(cellNum).setCellValue(workitem.getItemValueString(name)); + } + cellNum++; + } + + rowPos++; + } + // delete reference row + sheet.shiftRows(referenceRowPos, lastRow + dataset.size(), -1, true, true); + + } + +} diff --git a/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewExportEvent.java b/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewExportEvent.java new file mode 100644 index 0000000..057f608 --- /dev/null +++ b/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewExportEvent.java @@ -0,0 +1,72 @@ +package org.imixs.workflow.office.dataview; + +import java.util.List; + +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.imixs.workflow.ItemCollection; + +/** + * An DataViewExportEvent is send by the DataViewController during exporting a + * data view into a Excel Template. + * An observer can customize the export behavior and mark an export as + * completed by setting the flag 'completed' to true + * + */ +public class DataViewExportEvent { + + private List dataset = null; + private ItemCollection dataViewDefinition = null; + private List viewItemDefinitions = null; + private XSSFWorkbook xssfWorkbook = null; + private boolean completed = false; + + public DataViewExportEvent(List dataset, ItemCollection dataViewDefinition, + List viewItemDefinitions, + XSSFWorkbook xssfWorkbook) { + this.dataset = dataset; + this.dataViewDefinition = dataViewDefinition; + this.xssfWorkbook = xssfWorkbook; + this.viewItemDefinitions = viewItemDefinitions; + } + + public boolean isCompleted() { + return completed; + } + + public void setCompleted(boolean completed) { + this.completed = completed; + } + + public List getDataset() { + return dataset; + } + + public void setDataset(List dataset) { + this.dataset = dataset; + } + + public ItemCollection getDataViewDefinition() { + return dataViewDefinition; + } + + public void setDataViewDefinition(ItemCollection dataViewDefinition) { + this.dataViewDefinition = dataViewDefinition; + } + + public List getViewItemDefinitions() { + return viewItemDefinitions; + } + + public void setViewItemDefinitions(List viewItemDefinitions) { + this.viewItemDefinitions = viewItemDefinitions; + } + + public XSSFWorkbook getXssfWorkbook() { + return xssfWorkbook; + } + + public void setXssfWorkbook(XSSFWorkbook xssfWorkbook) { + this.xssfWorkbook = xssfWorkbook; + } + +} diff --git a/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewPOIHelper.java b/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewPOIHelper.java index ad3c09b..1a5cdda 100644 --- a/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewPOIHelper.java +++ b/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/dataview/DataViewPOIHelper.java @@ -32,7 +32,6 @@ import java.util.Date; import java.util.List; import java.util.logging.Logger; -import org.apache.poi.ss.usermodel.CellCopyPolicy; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.FormulaEvaluator; import org.apache.poi.ss.usermodel.Name; @@ -93,72 +92,75 @@ public class DataViewPOIHelper { * * @throws PluginException */ - public static void insertDataRows(List dataset, String referenceCell, - List viewItemDefinitions, - FileData fileData) throws PluginException { - // load XSSFWorkbook - try (InputStream imputStream = new ByteArrayInputStream(fileData.getContent())) { - XSSFWorkbook doc = new XSSFWorkbook(imputStream); - // NOTE: we only take the first sheet ! - XSSFSheet sheet = doc.getSheetAt(0); + // public static void insertDataRows(List dataset, String + // referenceCell, + // List viewItemDefinitions, + // FileData fileData) throws PluginException { + // // load XSSFWorkbook + // try (InputStream imputStream = new + // ByteArrayInputStream(fileData.getContent())) { + // XSSFWorkbook doc = new XSSFWorkbook(imputStream); + // // NOTE: we only take the first sheet ! + // XSSFSheet sheet = doc.getSheetAt(0); - CellReference cr = new CellReference(referenceCell); - XSSFRow referenceRow = sheet.getRow(cr.getRow()); - int referenceRowPos = referenceRow.getRowNum() + 1; - int rowPos = referenceRowPos; - // int lastRow = sheet.getLastRowNum(); - int lastRow = 999; - logger.finest("Last rownum=" + lastRow); - sheet.shiftRows(rowPos, lastRow, dataset.size(), true, true); + // CellReference cr = new CellReference(referenceCell); + // XSSFRow referenceRow = sheet.getRow(cr.getRow()); + // int referenceRowPos = referenceRow.getRowNum() + 1; + // int rowPos = referenceRowPos; + // // int lastRow = sheet.getLastRowNum(); + // int lastRow = 999; + // logger.finest("Last rownum=" + lastRow); + // sheet.shiftRows(rowPos, lastRow, dataset.size(), true, true); - for (ItemCollection workitem : dataset) { - logger.finest("......copy row..."); + // for (ItemCollection workitem : dataset) { + // logger.finest("......copy row..."); - // now create a new line.. - XSSFRow row = sheet.createRow(rowPos); - row.copyRowFrom(referenceRow, new CellCopyPolicy()); - // insert values - int cellNum = 0; - for (ItemCollection itemDef : viewItemDefinitions) { - String type = itemDef.getItemValueString("item.type"); - String name = itemDef.getItemValueString("item.name"); - switch (type) { - case "xs:double": - row.getCell(cellNum).setCellValue(workitem.getItemValueDouble(name)); - break; - case "xs:float": - row.getCell(cellNum).setCellValue(workitem.getItemValueFloat(name)); - break; - case "xs:int": - row.getCell(cellNum).setCellValue(workitem.getItemValueInteger(name)); - break; - case "xs:date": - row.getCell(cellNum).setCellValue(workitem.getItemValueDate(name)); - break; + // // now create a new line.. + // XSSFRow row = sheet.createRow(rowPos); + // row.copyRowFrom(referenceRow, new CellCopyPolicy()); + // // insert values + // int cellNum = 0; + // for (ItemCollection itemDef : viewItemDefinitions) { + // String type = itemDef.getItemValueString("item.type"); + // String name = itemDef.getItemValueString("item.name"); + // switch (type) { + // case "xs:double": + // row.getCell(cellNum).setCellValue(workitem.getItemValueDouble(name)); + // break; + // case "xs:float": + // row.getCell(cellNum).setCellValue(workitem.getItemValueFloat(name)); + // break; + // case "xs:int": + // row.getCell(cellNum).setCellValue(workitem.getItemValueInteger(name)); + // break; + // case "xs:date": + // row.getCell(cellNum).setCellValue(workitem.getItemValueDate(name)); + // break; - default: - row.getCell(cellNum).setCellValue(workitem.getItemValueString(name)); - } - cellNum++; - } + // default: + // row.getCell(cellNum).setCellValue(workitem.getItemValueString(name)); + // } + // cellNum++; + // } - rowPos++; - } - // delete reference row - sheet.shiftRows(referenceRowPos, lastRow + dataset.size(), -1, true, true); + // rowPos++; + // } + // // delete reference row + // sheet.shiftRows(referenceRowPos, lastRow + dataset.size(), -1, true, true); - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - // write back the file - doc.write(byteArrayOutputStream); - doc.close(); - byte[] newContent = byteArrayOutputStream.toByteArray(); - fileData.setContent(newContent); + // ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + // // write back the file + // doc.write(byteArrayOutputStream); + // doc.close(); + // byte[] newContent = byteArrayOutputStream.toByteArray(); + // fileData.setContent(newContent); - } catch (IOException e) { - throw new PluginException(DataViewPOIHelper.class.getSimpleName(), ERROR_CONFIG, - "failed to update excel export: " + e.getMessage()); - } - } + // } catch (IOException e) { + // throw new PluginException(DataViewPOIHelper.class.getSimpleName(), + // ERROR_CONFIG, + // "failed to update excel export: " + e.getMessage()); + // } + // } /** * This helper method applies the POI update defintiions a row for each invoice diff --git a/office-alexander-logistics-app/src/main/resources/imixs.properties b/office-alexander-logistics-app/src/main/resources/imixs.properties index 6e4d783..a02c9b0 100644 --- a/office-alexander-logistics-app/src/main/resources/imixs.properties +++ b/office-alexander-logistics-app/src/main/resources/imixs.properties @@ -2,9 +2,9 @@ # Imixs Lucene Plugin ############################## lucence.indexDir=${imixs-office.IndexDir} -index.fields=txtsearchstring,txtSubject,txtname,txtEmail,txtUserName,namCreator,txtworkflowgroup,txtworkflowstatus,txtWorkflowAbstract,txtWorkflowSummary,txtworkflowhistory,txtspacename,txtprocessname,_subject,_description,_name,_projectnumber,_projectname,_ordernumber,_contractnumber,datDueDate,txtcommentlog,htmldescription,htmldocumentation,dms,dms_names,invoice.number.stripped,_childitems,$file.names,_VENDOR_NAME,dbtr.number,cdtr.number,invoice.positions,invoice.atc.number +index.fields=txtsearchstring,txtSubject,txtname,txtEmail,txtUserName,namCreator,txtworkflowgroup,txtworkflowstatus,txtWorkflowAbstract,txtWorkflowSummary,txtworkflowhistory,txtspacename,txtprocessname,_subject,_description,_name,_projectnumber,_projectname,_ordernumber,_contractnumber,datDueDate,txtcommentlog,htmldescription,htmldocumentation,dms,dms_names,invoice.number.stripped,_childitems,$file.names,_VENDOR_NAME,dbtr.number,partner.id,cdtr.number,invoice.positions,invoice.atc.number index.fields.analyze=txtUsername -index.fields.noanalyze=type,$UniqueIDRef,$created,$modified,$ModelVersion,$participants,namCreator,$ProcessID,datDate,txtWorkflowGroup,txtemail, datdate, datfrom, datto, numsequencenumber,sequencenumber,dms_count,invoice.number,invoice.number.stripped,invoice.date,invoice.duedate,taxonomy.verteilung.stop,taxonomy.sachpruefung.stop,taxonomy.verteilung.start,taxonomy.sachpruefung.start,taxonomy.buchhaltung.start,taxonomy.buchhaltung.stop,dbtr.number,cdtr.number,payment.date,invoice.total,invoice.currency,invoice.positions,$lasteventdate,payment.type,cdtr.name,document.company,invoice.atc.number +index.fields.noanalyze=type,$UniqueIDRef,$created,$modified,$ModelVersion,$participants,namCreator,$ProcessID,datDate,txtWorkflowGroup,txtemail, datdate, datfrom, datto, numsequencenumber,sequencenumber,dms_count,invoice.number,invoice.number.stripped,invoice.date,invoice.duedate,taxonomy.verteilung.stop,taxonomy.sachpruefung.stop,taxonomy.verteilung.start,taxonomy.sachpruefung.start,taxonomy.buchhaltung.start,taxonomy.buchhaltung.stop,dbtr.number,partner.id,cdtr.number,payment.date,invoice.total,invoice.currency,invoice.positions,$lasteventdate,payment.type,cdtr.name,document.company,invoice.atc.number index.fields.store=process.name,txtProcessName,txtWorkflowImageURL,payment.date,invoice.number,invoice.date,invoice.duedate,invoice.total,invoice.currency,dbtr.name,cdtr.name index.fields.category=space.name,space.ref,taxonomy.verteilung.stop.by,taxonomy.sachpruefung.stop.by,taxonomy.buchhaltung.stop.by office.search.noanalyze=invoice.number,invoice.number.stripped,invoice.positions diff --git a/office-alexander-logistics-app/src/main/webapp/pages/dataviews/data.xhtml b/office-alexander-logistics-app/src/main/webapp/pages/dataviews/data.xhtml index 4b7f1b0..ed68085 100644 --- a/office-alexander-logistics-app/src/main/webapp/pages/dataviews/data.xhtml +++ b/office-alexander-logistics-app/src/main/webapp/pages/dataviews/data.xhtml @@ -46,34 +46,25 @@

- +

-
- -
-
- - - - -
diff --git a/office-alexander-logistics-app/src/main/webapp/pages/workitems/parts/alexander/businesspartner_search.xhtml b/office-alexander-logistics-app/src/main/webapp/pages/workitems/parts/alexander/businesspartner_search.xhtml index e5dfdcb..3f26d69 100644 --- a/office-alexander-logistics-app/src/main/webapp/pages/workitems/parts/alexander/businesspartner_search.xhtml +++ b/office-alexander-logistics-app/src/main/webapp/pages/workitems/parts/alexander/businesspartner_search.xhtml @@ -17,7 +17,7 @@ - diff --git a/workflow/businesspartner-en-1.0.0.bpmn b/workflow/businesspartner-en-1.0.0.bpmn index e4b4991..a835696 100644 --- a/workflow/businesspartner-en-1.0.0.bpmn +++ b/workflow/businesspartner-en-1.0.0.bpmn @@ -256,7 +256,7 @@ + label="The trend over the last 6 months:" /> @@ -710,13 +710,23 @@ mahnlauf-en-1.0 1000 10 - partner.id,partner.name,dbtr.number,partner.name|dbtr.name + partner.id,partner.name,dbtr.number,dbtr.mail,partner.name|dbtr.name /pages/workitems/workitem.jsf?id=$uniqueid ]]> + + + sequenceFlow_ZTiO7w + @@ -742,7 +752,7 @@ A7 - dbtr.name + partner.name ]]> diff --git a/workflow/dwc/mahnlauf-en-1.0.0.bpmn b/workflow/dwc/deprecated/mahnlauf-en-1.0.0.bpmn similarity index 100% rename from workflow/dwc/mahnlauf-en-1.0.0.bpmn rename to workflow/dwc/deprecated/mahnlauf-en-1.0.0.bpmn diff --git a/workflow/dwc/mahnlauf-en-1.0.1.bpmn b/workflow/dwc/deprecated/mahnlauf-en-1.0.1.bpmn similarity index 100% rename from workflow/dwc/mahnlauf-en-1.0.1.bpmn rename to workflow/dwc/deprecated/mahnlauf-en-1.0.1.bpmn diff --git a/workflow/dwc/sepa-export-manual-dwc-3.0.0.bpmn b/workflow/dwc/deprecated/sepa-export-manual-dwc-3.0.0.bpmn similarity index 100% rename from workflow/dwc/sepa-export-manual-dwc-3.0.0.bpmn rename to workflow/dwc/deprecated/sepa-export-manual-dwc-3.0.0.bpmn diff --git a/workflow/dwc/mahnlauf-en-1.0.2.bpmn b/workflow/dwc/mahnlauf-en-1.0.2.bpmn index 565d7ab..0f7b7a6 100644 --- a/workflow/dwc/mahnlauf-en-1.0.2.bpmn +++ b/workflow/dwc/mahnlauf-en-1.0.2.bpmn @@ -483,7 +483,7 @@ Debitor: dbtr.name (dbtr.number) - + @@ -491,8 +491,11 @@ Debitor: dbtr.name (dbtr.number) + + + - + sequenceFlow_9Q3CYw sequenceFlow_mDFboQ diff --git a/workflow/dwc/posteingang-dwc-2.0.0.bpmn b/workflow/dwc/posteingang-dwc-2.0.0.bpmn index 5a6ac28..cba8450 100644 --- a/workflow/dwc/posteingang-dwc-2.0.0.bpmn +++ b/workflow/dwc/posteingang-dwc-2.0.0.bpmn @@ -1379,7 +1379,7 @@ Betrag: _amount (Brutto € _amount_brutto - (^rechnungseingang-sachrechnung-\d+(?:\.\d+)?$) + (^rechnungseingang-sachrechnung-dwc-\d+(?:\.\d+)?$) 5001 980 ]]> diff --git a/workflow/dwc/rechnungsausgang-dwc-1.0.4.bpmn b/workflow/dwc/rechnungsausgang-dwc-1.0.4.bpmn index 5df4244..d2bd7dc 100644 --- a/workflow/dwc/rechnungsausgang-dwc-1.0.4.bpmn +++ b/workflow/dwc/rechnungsausgang-dwc-1.0.4.bpmn @@ -141,7 +141,6 @@ th { font-weight: bold;} TextAnnotation_2 IntermediateCatchEvent_1 - event_orShLw @@ -471,7 +470,6 @@ Bei Fragen wenden Sie sich bitte an info@imixs.com SequenceFlow_18 SequenceFlow_34 sequenceFlow_zhcE7Q - sequenceFlow_0D6BEw SequenceFlow_61 @@ -1192,7 +1190,7 @@ Wiedervorlage wird um 7 bzw. 5 Tage erhöht - + @@ -1336,79 +1334,6 @@ Wiedervorlage wird um 7 bzw. 5 Tage erhöht - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ]]> - - - - - - - - - - - - false - - - - sequenceFlow_0D6BEw - - - - @@ -1578,9 +1503,9 @@ Wiedervorlage wird um 7 bzw. 5 Tage erhöht - + - + @@ -1777,14 +1702,14 @@ Wiedervorlage wird um 7 bzw. 5 Tage erhöht - - - - + + + + - - + + @@ -1861,18 +1786,6 @@ Wiedervorlage wird um 7 bzw. 5 Tage erhöht - - - - - - - - - - - - diff --git a/workflow/dwc/rechnungseingang-sachrechnung-dwc-1.0.3-draft.bpmn b/workflow/dwc/rechnungseingang-sachrechnung-dwc-1.0.3-draft.bpmn index 90ba3ea..3c22450 100644 --- a/workflow/dwc/rechnungseingang-sachrechnung-dwc-1.0.3-draft.bpmn +++ b/workflow/dwc/rechnungseingang-sachrechnung-dwc-1.0.3-draft.bpmn @@ -3308,7 +3308,7 @@ Betrag: _amount (Brutto € _amount_brutto - +