From e350ece8f35b4fe56821afe0ae03af270f2b136b Mon Sep 17 00:00:00 2001 From: Ralph Soika Date: Wed, 25 Jun 2025 09:54:33 +0200 Subject: [PATCH] zoho credit note interface --- .../zoho/ZohoAPIService.java | 119 +- .../zoho/dto/ZohoCreditnote.java | 22 + .../zoho/dto/ZohoCreditnoteInvoiceItem.java | 49 + .../zoho/dto/ZohoInvoice.java | 11 + .../zoho/dto/ZohoInvoiceFindResponse.java | 41 + workflow/dwc/rechnungsausgang-dwc-1.0.6.bpmn | 2687 +++++++++++++++++ 6 files changed, 2926 insertions(+), 3 deletions(-) create mode 100644 office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/dto/ZohoCreditnoteInvoiceItem.java create mode 100644 office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/dto/ZohoInvoiceFindResponse.java create mode 100644 workflow/dwc/rechnungsausgang-dwc-1.0.6.bpmn diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/ZohoAPIService.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/ZohoAPIService.java index d456877..83f74cd 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/ZohoAPIService.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/ZohoAPIService.java @@ -20,6 +20,7 @@ import java.util.stream.Collectors; import org.imixs.workflow.FileData; import org.imixs.workflow.ItemCollection; +import org.imixs.workflow.engine.DocumentService; import org.imixs.workflow.exceptions.PluginException; import com.alexanderlogistics.InvoiceUtil; @@ -33,6 +34,7 @@ import com.alexanderlogistics.zoho.dto.ZohoCreditnote; import com.alexanderlogistics.zoho.dto.ZohoCreditnoteCreateResponse; import com.alexanderlogistics.zoho.dto.ZohoInvoice; import com.alexanderlogistics.zoho.dto.ZohoInvoiceCreateResponse; +import com.alexanderlogistics.zoho.dto.ZohoInvoiceFindResponse; import com.alexanderlogistics.zoho.dto.ZohoInvoiceItem; import com.alexanderlogistics.zoho.dto.ZohoTax; import com.alexanderlogistics.zoho.dto.ZohoTaxListResponse; @@ -75,6 +77,9 @@ public class ZohoAPIService { @Inject ZohoOAuthManager zohoOAuthManager; + @Inject + DocumentService documentService; + @PostConstruct void init() { this.httpClient = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(10)).build(); @@ -144,6 +149,61 @@ public class ZohoAPIService { } + /** + * This finder method returns the invoice ID to a given invoice.number + * The method returns null if no invoice with this nubmer exists + * + * @param companyName + * @param accessToken + * @return + * @throws PluginException + */ + public ZohoInvoice findInvoiceIDByInvoiceNumber(String invoiceNumber, String accessToken) + throws PluginException { + + // Print JSON to console for verification + logger.info("├── Zoho lookup invoice '" + invoiceNumber + "'..."); + try { + // https://www.zohoapis.com/books/v3/contacts?organization_id=10234695&company_name=xxx' + String uri = zohoOAuthManager.getBaseURI() + "invoices?organization_id=" + + zohoOAuthManager.getOrganization() + "&invoice_number=" + + URLEncoder.encode(invoiceNumber, StandardCharsets.UTF_8); + logger.fine("│ ├── uri= " + uri); + logger.fine("│ ├── accessToken=" + accessToken); + HttpRequest request = HttpRequest.newBuilder().uri(URI.create(uri)) + .header("Authorization", "Zoho-oauthtoken " + accessToken) + .header("Content-Type", "application/json").GET().build(); + + HttpResponse response; + + response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + + // Print response details to console + logger.fine("├── Zoho Response:"); + logger.fine("│ ├── Status Code: " + response.statusCode()); + logger.fine("│ ├── Response Body: " + response.body()); + if (response.statusCode() >= 300) { + throw new PluginException(this.getClass().getName(), "Zoho API error", + "Failed to find invoice - Status code: " + response.statusCode() + ", Response: " + + response.body()); + } + + ZohoInvoiceFindResponse invoicesResponse = jsonb.fromJson(response.body(), ZohoInvoiceFindResponse.class); + + if (invoicesResponse != null && invoicesResponse.getInvoices() != null + && invoicesResponse.getInvoices().size() > 0) { + // return 1 entry + ZohoInvoice invoice = invoicesResponse.getInvoices().get(0); + return invoice; + } + } catch (IOException | InterruptedException e) { + throw new PluginException(this.getClass().getName(), "Zoho API error", + "Failed to find Contacts: " + e.getMessage()); + } + return null; + + } + /** * Exports an invocie document * @@ -231,8 +291,19 @@ public class ZohoAPIService { String currencyID = lookupCurrency(invoice.getItemValueString("invoice.currency"), accessToken); + // Lookup die Invoice ID in zOho + + ZohoInvoice invoiceZoho = null; + String invoiceRefID = invoice.getItemValueString("invoice.ref"); + ItemCollection invoiceRef = documentService.load(invoiceRefID); + if (invoiceRef != null) { + invoiceZoho = findInvoiceIDByInvoiceNumber(invoiceRef.getItemValueString("invoice.number"), + accessToken); + logger.info("├── Zoho fond invoice zoho ref: " + invoiceZoho.getInvoiceId()); + } + // Konvertiere ItemCollection zu ZohoInvoiceDTO - ZohoCreditnote zohoCreditnote = convertToZohoCreditnote(invoice, contactID, currencyID); + ZohoCreditnote zohoCreditnote = convertToZohoCreditnote(invoice, contactID, currencyID, invoiceZoho); try { String requestBody = jsonb.toJson(zohoCreditnote); @@ -244,6 +315,10 @@ public class ZohoAPIService { // https://www.zohoapis.com/books/v3/creditnotes?organization_id=10234695' String uri = zohoOAuthManager.getBaseURI() + "creditnotes?organization_id=" + zohoOAuthManager.getOrganization(); + + if (zohoCreditnote != null) { + uri = uri + "&invoice_id=" + invoiceZoho.getInvoiceId(); + } logger.fine("│ ├── uri= " + uri); logger.fine("│ ├── accessToken=" + accessToken); HttpRequest request = HttpRequest.newBuilder().uri(URI.create(uri)) @@ -565,14 +640,15 @@ public class ZohoAPIService { * @return * @throws PluginException */ - private ZohoCreditnote convertToZohoCreditnote(ItemCollection invoice, String contactID, String currencyID) + private ZohoCreditnote convertToZohoCreditnote(ItemCollection invoice, String contactID, String currencyID, + ZohoInvoice zohoInvoice) throws PluginException { ZohoCreditnote zohoCreditnote = new ZohoCreditnote(); // Basisinformationen zohoCreditnote.setCreditNoteNumber(invoice.getItemValueString("invoice.number")); - zohoCreditnote.setReferenceNumber(invoice.getItemValueString("invoice.number")); + zohoCreditnote.setDate( LocalDate.ofInstant(invoice.getItemValueDate("invoice.date").toInstant(), ZoneId.systemDefault())); // zohoCreditnote.setDueDate( @@ -586,6 +662,19 @@ public class ZohoAPIService { zohoCreditnote.setCurrencyId(currencyID); } + // do we have an invoice? + if (zohoInvoice != null) { + String placeOfSupply = zohoInvoice.getPlaceOfSupply(); + if (placeOfSupply == null) { + placeOfSupply = "DU"; + } + logger.info("│ ├── set place of supply=" + placeOfSupply); + zohoCreditnote.setPlaceOfSupply(placeOfSupply); + // logger.info("....assign invoice"); + // ZohoCreditnoteInvoiceItem zcii = new ZohoCreditnoteInvoiceItem(zohoInvoice); + // zohoCreditnote.setInvoices(java.util.Arrays.asList(zcii)); + } + // convert total by rate - negativer betrag! zohoCreditnote.setTotal(Math.abs(invoice.getItemValueDouble("invoice.total"))); // set exchange Rate @@ -606,6 +695,30 @@ public class ZohoAPIService { }).collect(Collectors.toList()); zohoCreditnote.setLineItems(lineItems); + + // add line items... + // changes 24.06.2025 - Keine einzelPositionen mehr an Zoho senden, da diese von + // Cargosoft unbrauchbar sind. + // List positionen = InvoiceUtil.explodeChildList(invoice); + // List lineItems = positionen.stream().map(item -> { + // ItemCollection itemCol = (ItemCollection) item; + // ZohoInvoiceItem lineItem = new ZohoInvoiceItem(); + // lineItem.setName(itemCol.getItemValueString("datev.text")); + // lineItem.setDescription(itemCol.getItemValueString("billingtext")); + // lineItem.setRate(itemCol.getItemValueDouble("datev.umsatz")); + // lineItem.setQuantity(1); + // return lineItem; + // }).collect(Collectors.toList()); + // List lineItems = new ArrayList<>(); + + // create only one single item! + ZohoInvoiceItem lineItem = new ZohoInvoiceItem(); + lineItem.setName(invoice.getItemValueString("invoice.text")); + lineItem.setDescription(""); + lineItem.setRate(invoice.getItemValueDouble("invoice.total")); + lineItem.setQuantity(1); + lineItems.add(lineItem); + return zohoCreditnote; } diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/dto/ZohoCreditnote.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/dto/ZohoCreditnote.java index 8f80001..1b708ee 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/dto/ZohoCreditnote.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/dto/ZohoCreditnote.java @@ -25,12 +25,18 @@ public class ZohoCreditnote { @JsonbProperty("reference_number") private String referenceNumber; + @JsonbProperty("place_of_supply") + private String placeOfSupply; + @JsonbProperty("line_items") private List lineItems; @JsonbProperty("exchange_rate") private double exchangeRate; + @JsonbProperty("invoices") + private List invoices; + private double total; // Getter und Setter @@ -106,4 +112,20 @@ public class ZohoCreditnote { public void setReferenceNumber(String referenceNumber) { this.referenceNumber = referenceNumber; } + + public List getInvoices() { + return invoices; + } + + public void setInvoices(List invoices) { + this.invoices = invoices; + } + + public String getPlaceOfSupply() { + return placeOfSupply; + } + + public void setPlaceOfSupply(String placeOfSupply) { + this.placeOfSupply = placeOfSupply; + } } diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/dto/ZohoCreditnoteInvoiceItem.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/dto/ZohoCreditnoteInvoiceItem.java new file mode 100644 index 0000000..12e7030 --- /dev/null +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/dto/ZohoCreditnoteInvoiceItem.java @@ -0,0 +1,49 @@ +package com.alexanderlogistics.zoho.dto; + +import jakarta.json.bind.annotation.JsonbProperty; + +/** + * Referenz von Invoices in einer CreditNote + */ +public class ZohoCreditnoteInvoiceItem { + + @JsonbProperty("invoice_id") + private String invoiceId; + + @JsonbProperty("invoice_number") + private String invoiceNumber; + + private double amount; + + public ZohoCreditnoteInvoiceItem(ZohoInvoice invoice) { + this.invoiceId = invoice.getInvoiceId(); + this.invoiceNumber = invoice.getInvoiceNumber(); + this.amount = invoice.getTotal(); + } + + // Getter und Setter + public String getInvoiceId() { + return invoiceId; + } + + public void setInvoiceId(String invoiceId) { + this.invoiceId = invoiceId; + } + + public String getInvoiceNumber() { + return invoiceNumber; + } + + public void setInvoiceNumber(String invoiceNumber) { + this.invoiceNumber = invoiceNumber; + } + + public double getAmount() { + return amount; + } + + public void setAmount(double amount) { + this.amount = amount; + } + +} diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/dto/ZohoInvoice.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/dto/ZohoInvoice.java index d4b0650..c656787 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/dto/ZohoInvoice.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/dto/ZohoInvoice.java @@ -33,6 +33,9 @@ public class ZohoInvoice { @JsonbProperty("exchange_rate") private double exchangeRate; + @JsonbProperty("place_of_supply") + private String placeOfSupply; + private double total; // Getter und Setter @@ -108,4 +111,12 @@ public class ZohoInvoice { public void setExchangeRate(double exchangeRate) { this.exchangeRate = exchangeRate; } + + public String getPlaceOfSupply() { + return placeOfSupply; + } + + public void setPlaceOfSupply(String placeOfSupply) { + this.placeOfSupply = placeOfSupply; + } } diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/dto/ZohoInvoiceFindResponse.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/dto/ZohoInvoiceFindResponse.java new file mode 100644 index 0000000..876947b --- /dev/null +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/zoho/dto/ZohoInvoiceFindResponse.java @@ -0,0 +1,41 @@ +package com.alexanderlogistics.zoho.dto; + +import java.util.List; + +import jakarta.json.bind.annotation.JsonbProperty; + +public class ZohoInvoiceFindResponse { + @JsonbProperty("code") + private int code; + + @JsonbProperty("message") + private String message; + + @JsonbProperty("invoices") + private List invoices; + + // Getter und Setter + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public List getInvoices() { + return invoices; + } + + public void setInvoices(List invoices) { + this.invoices = invoices; + } +} diff --git a/workflow/dwc/rechnungsausgang-dwc-1.0.6.bpmn b/workflow/dwc/rechnungsausgang-dwc-1.0.6.bpmn new file mode 100644 index 0000000..838e588 --- /dev/null +++ b/workflow/dwc/rechnungsausgang-dwc-1.0.6.bpmn @@ -0,0 +1,2687 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + +<itemvalue>$workflowstatus</itemvalue> + +]]> + + + In case you have already made the payment, please disregard this notice. If you require any information regarding your account, please do not hesitate to contact us.

+

Thank you for your cooperation.

+

 

+

Kind regards
Alexander Global Logistics GmbH

+ +]]>
+
+ + + + + + + + + + + + + Task_2 + ExclusiveGateway_1 + StartEvent_1 + IntermediateCatchEvent_6 + EventBasedGateway_1 + IntermediateThrowEvent_11 + IntermediateThrowEvent_8 + IntermediateCatchEvent_5000-20 + Task_8 + Task_6 + Task_5 + IntermediateCatchEvent_23 + IntermediateCatchEvent_27 + EndEvent_1 + EndEvent_3 + EndEvent_2 + IntermediateCatchEvent_3 + ExclusiveGateway_5 + IntermediateCatchEvent_18 + IntermediateCatchEvent_17 + IntermediateCatchEvent_2 + IntermediateCatchEvent_5 + + TextAnnotation_1 + DataObject_2 + task_LqbtSQ + gateway_k30TvQ + event_Rou0Sw + event_0zodvw + textAnnotation_QBZ00w + event_iUSXSg + gateway_SqNU2A + task_qiTRPA + event_Ce0BTw + event_PbP1JQ + event_imKUgQ + task_f2ZOng + gateway_U56SPA + event_2600MQ + dataObject_0vfcFQ + event_9aqjsQ + gateway_9PCLzw + event_QPRkjA + + + Task_1 + IntermediateCatchEvent_9 + ExclusiveGateway_3 + IntermediateThrowEvent_10 + IntermediateThrowEvent_9 + + TextAnnotation_2 + IntermediateCatchEvent_1 + event_ecAXHQ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + home]]> + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + SequenceFlow_22 + SequenceFlow_27 + + + + SequenceFlow_33 + + SequenceFlow_15 + sequenceFlow_EGQ0og + + + + + + SequenceFlow_0 + + + + + + + + + + + + txtlastcomment]]> + + + + + + + + + _imginvoice.number dbtr.number dbtr.name (invoice.currency invoice.total) ]]> + + + true + + + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_33 + SequenceFlow_14 + SequenceFlow_39 + SequenceFlow_22 + sequenceFlow_OttgXA + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + txtlastcomment]]> + + + + + + + + + _imginvoice.number dbtr.number dbtr.name (invoice.currency invoice.total) ]]> + + + true + + + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_52 + SequenceFlow_11 + SequenceFlow_47 + sequenceFlow_cX24AA + + + SequenceFlow_47 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Dunning]]> + + + + + + + + + + + + false + + + + SequenceFlow_21 + + + + + + + + + + + + + txtlastcomment]]> + + + + + + + + + _imginvoice.number dbtr.number dbtr.name (invoice.currency invoice.total) ]]> + + + true + + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_27 + SequenceFlow_18 + SequenceFlow_34 + sequenceFlow_zhcE7Q + sequenceFlow_BLgAIQ + + + SequenceFlow_61 + + + + SequenceFlow_39 + SequenceFlow_17 + SequenceFlow_65 + SequenceFlow_13 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + + + false + + + + SequenceFlow_52 + + + + + + + + + SequenceFlow_18 + SequenceFlow_25 + SequenceFlow_64 + SequenceFlow_9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + + + false + + + + + + + SequenceFlow_42 + SequenceFlow_8 + + + + + + + + + + SequenceFlow_42 + + + + + SequenceFlow_8 + SequenceFlow_10 + SequenceFlow_12 + + + + + + + + + invoice.saldo]]> + + + + + + SequenceFlow_10 + SequenceFlow_11 + + + + + + + + + + + + + invoice.saldo]]> + + + + + + SequenceFlow_12 + SequenceFlow_14 + + + + + + + + + + SequenceFlow_17 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + home]]> + + + + + + + + + + + + false + + + + + SequenceFlow_34 + SequenceFlow_15 + + + + + + SequenceFlow_25 + + + + + + + + + + + + + + + + cdtr.name invoice.number]]> + + + + + + + + + cdtr.name +Rechnungsnummer: invoice.number +Betrag: invoice.total invoice.currency + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + 7 +1. Dunning + +]]> + + + + + + + + + + + + false + + + + + + + + + sequenceFlow_zhcE7Q + association_P36Fzw + + + + + + + + + txtlastcomment]]> + + + + + + + + + _imginvoice.number dbtr.number dbtr.name (invoice.currency invoice.total) ]]> + + + true + + + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_60 + SequenceFlow_61 + + + + + invoice.saldo]]> + + + + + + SequenceFlow_60 + + + + + + + + + + SequenceFlow_64 + + + + + + + + SequenceFlow_65 + + + + + + + + + + + + + + + + _subject]]> + + + + + + + + + _amount (Brutto € _amount_brutto) +_description]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + home]]> + + + + + + + + + + + + false + + + + + + + SequenceFlow_9 + SequenceFlow_13 + SequenceFlow_5 + + + + + + + + + + + + + + + + + txtlastcomment]]> + + + + + + + + + _imginvoice.number dbtr.number dbtr.name (invoice.currency invoice.total) ]]> + + + true + + + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_5 + SequenceFlow_19 + + + SequenceFlow_19 + + + + + + + + + + Trigger über ZahlungseingangsSaldoAdapter + + + + + + + Triggered by MahnlaufExecuteAdapter + +Wiedervorlage wird um 7 bzw. 5 Tage erhöht + + + + + + + + + + + + + + + txtlastcomment]]> + + + + + + + + + _imginvoice.number dbtr.number dbtr.name (invoice.currency invoice.total) ]]> + + + true + + + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_14 + SequenceFlow_22 + sequenceFlow_m0aH7g + sequenceFlow_di0Bhg + + + SequenceFlow_21 + + sequenceFlow_m0aH7g + SequenceFlow_21 + SequenceFlow_0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + DataOutput_1 + + + DataOutput_1 + + + sequenceFlow_0g2PeQ + sequenceFlow_38nBkg + sequenceFlow_0Lemag + sequenceFlow_dj2M5w + + + + + + + + + + + sequenceFlow_38nBkg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + + + false + + + + sequenceFlow_OttgXA + + + + + + + + + + + + + sequenceFlow_0g2PeQ + sequenceFlow_0g2PeQ + sequenceFlow_aHlk3g + sequenceFlow_EGQ0og + + + + + + + + txtlastcomment]]> + + + + + + + + + _imginvoice.number dbtr.number dbtr.name (invoice.currency invoice.total) ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + sequenceFlow_m0aH7g + sequenceFlow_di0Bhg + sequenceFlow_7ba4gA + sequenceFlow_IIxHJw + sequenceFlow_isICvQ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + sequenceFlow_7ba4gA + sequenceFlow_jmkU1w + + + + + + + + + + + + + + + + + adapter.error_code - $workflowgroup : invoice.number]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + adapter.error_code: adapter.error_message]]> + + + + + + + + + + + + + + + + adapter.error_code + +adapter.error_message + + +See details: application.urlindex.jsf?workitem=$uniqueid]]> + + + + + + + + + + + + + + + + + + + sequenceFlow_aHlk3g + sequenceFlow_IIxHJw + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + DataOutput_1 + + + DataOutput_1 + + + sequenceFlow_38nBkg + sequenceFlow_cX24AA + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + DataOutput_1 + + + DataOutput_1 + + + sequenceFlow_38nBkg + sequenceFlow_BLgAIQ + + + + + + + + + + + txtlastcomment]]> + + + + + + + + + _imginvoice.number dbtr.number dbtr.name (invoice.currency invoice.total) ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_14 + SequenceFlow_22 + sequenceFlow_kqe1mA + sequenceFlow_JLmxIw + sequenceFlow_o7OFEw + + + + sequenceFlow_0g2PeQ + sequenceFlow_EGQ0og + sequenceFlow_Mkcrqg + sequenceFlow_JLmxIw + sequenceFlow_0Lemag + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + sequenceFlow_di0Bhg + sequenceFlow_Mkcrqg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]]> + + association_NKLN0w + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + + sequenceFlow_o7OFEw + sequenceFlow_5v0OgQ + + + + + + + + + + sequenceFlow_Mkcrqg + sequenceFlow_JLmxIw + sequenceFlow_5v0OgQ + sequenceFlow_jmkU1w + sequenceFlow_dj2M5w + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ]]> + + + + + + + + + + + + false + + + + sequenceFlow_isICvQ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +