From b6e56958ec1a7b57ea32b2159a7cad3164054536 Mon Sep 17 00:00:00 2001 From: Ralph Soika Date: Mon, 27 Jul 2026 20:03:05 +0200 Subject: [PATCH] logging, configuraiton BR --- doc/FTP.md | 2 +- .../com/alexanderlogistics/FTPConnector.java | 18 +- .../cargosoft/cargosoft-1.0.0-br.imixs-report | 250 ++++++++++++++++++ reports/cargosoft/cargosoft-1.0.0-br.xsl | 231 ++++++++++++++++ templates/sepa/sepa-br.xlsx | Bin 0 -> 5343 bytes 5 files changed, 496 insertions(+), 5 deletions(-) create mode 100644 reports/cargosoft/cargosoft-1.0.0-br.imixs-report create mode 100644 reports/cargosoft/cargosoft-1.0.0-br.xsl create mode 100644 templates/sepa/sepa-br.xlsx diff --git a/doc/FTP.md b/doc/FTP.md index 13c4435..46356ce 100644 --- a/doc/FTP.md +++ b/doc/FTP.md @@ -96,4 +96,4 @@ Der Export erfolgt automatisch nach Empfang der Rechnung bzw. nach Prüfung der Server: u248962.your-storagebox.de Pfad: /office-alexander-logistics/cargosoft-br Benutzername: u248962-sub13 - Passwort: ~AXh§#6n9XJPk~Z + Passwort: YjQ5u5Nzz535-eGR diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/FTPConnector.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/FTPConnector.java index 6e55c3c..a869ce8 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/FTPConnector.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/FTPConnector.java @@ -113,7 +113,10 @@ public class FTPConnector { FTPClient ftpClient = null; try { logger.info("├── 🔜 uploading " + fileName + " to FTP server: " + ftpServer + " ..."); + logger.info("│ ├── port=" + ftpPort.get().intValue()); logger.info("│ ├── working directory=" + ftpWorkingPath); + logger.info("│ ├── user=" + ftpUser.get()); + // logger.info("│ ├── password=" + ftpPassword.get()); ftpClient = new FTPSClient("TLS", false); ftpClient.setBufferSize(8192); ftpClient.connect(ftpServer.get(), ftpPort.get().intValue()); @@ -150,11 +153,17 @@ public class FTPConnector { } logger.info("│ └── ✓ ftp transfer completed."); - } catch (IOException e) { + } catch (IOException | PluginException e) { + // Log the real cause immediately, before the finally block runs - + // otherwise a cleanup failure could overwrite/hide this exception. + logger.warning("│ ├── ⚠️ FTP connection error: " + e.getMessage()); + if (e instanceof PluginException) { + throw (PluginException) e; + } throw new PluginException(CargosoftExportAdapter.class.getSimpleName(), FTP_ERROR, "FTP file transfer failed: " + e.getMessage(), e); } finally { - // Cleanup + // Cleanup - never let a cleanup failure mask the primary exception try { if (writer != null) { writer.close(); @@ -163,9 +172,10 @@ public class FTPConnector { ftpClient.logout(); ftpClient.disconnect(); } - } catch (IOException e) { + } catch (IOException cleanupException) { throw new PluginException(CargosoftExportAdapter.class.getSimpleName(), FTP_ERROR, - "FTP file transfer failed during cleanup: " + e.getMessage(), e); + "FTP file transfer failed during cleanup: " + cleanupException.getMessage(), + cleanupException); } } } diff --git a/reports/cargosoft/cargosoft-1.0.0-br.imixs-report b/reports/cargosoft/cargosoft-1.0.0-br.imixs-report new file mode 100644 index 0000000..59b0591 --- /dev/null +++ b/reports/cargosoft/cargosoft-1.0.0-br.imixs-report @@ -0,0 +1,250 @@ +2024-02-02T13:13:38.991+01:00true2026-07-27T15:14:40.666+02:00806f9b2f-07ff-43d1-9b0d-1038804cc71c-1785158080668806f9b2f-07ff-43d1-9b0d-1038804cc71c2$uniqueid$workflowgroup$taskid$workflowsummaryinvoice.numberinvoice.dateinvoice.totalinvoice.currencycdtr.namecdtr.ibancdtr.bicdbtr.namedbtr.ibandbtr.bicpayment.typeinvoice.servicedateUTF-8Cargosoft Export - only the XSL Template is needed here!cargosoftReportEntity<?xml version="1.0" encoding="UTF-8" + standalone="yes"?> + <xsl:stylesheet + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:xs="http://www.w3.org/2001/XMLSchema" + version="2.0"> + <xsl:strip-space elements="*" /> + <xsl:output method="xml" indent="yes" encoding="UTF-8" + standalone="yes" /> + + <xsl:template match="/"> + + <xsl:variable name="date" + select="/data/document/item[@name='$modified']/value" /> + + <Invoices version="2020.2" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + + <Message> + <SenderID>Imixs-Office-Workflow</SenderID> + <ReceiverID>Cargosoft</ReceiverID> + <MessageID> + <xsl:value-of select="/data/document/item[@name='$uniqueid']/value" + /> + </MessageID> + <MessageDate> + <DateTime> + <xsl:value-of select="$date" /> + </DateTime> + </MessageDate> + </Message> + + <xsl:apply-templates + select="/data/document[normalize-space(item[@name = '$workflowgroup']/value) = + 'Cargosoft-Export']" /> + </Invoices> + + </xsl:template> + + <!-- This template builds invoice info --> + <xsl:template + match="/data/document[normalize-space(item[@name = '$workflowgroup']/value) = + 'Cargosoft-Export']"> + + <xsl:variable name="date" select="item[@name='$modified']/value" /> + <xsl:variable + name="currency" select="item[@name='invoice.currency']/value" /> + + + <Invoice> + <InvoiceHeader> + <Client> + <Codes> + <!-- Als Typ muss „cs“ übermittelt werden und im Code wird + dann der Cargosoft Mandant erwartet. --> + <Code Type="cs">008</Code> + </Codes> + </Client> + <!-- Hier muss eine eindeutige Belegnummer für jeden einzelnen + Beleg übermittelt werden. Es muss sich um eine Nummer + handeln, die pro Beleg hochgezählt wird und darf sich nicht + überschneiden mit dem CargoSoft Belegnummernkreis. + Daher den Nummernkreis vorher mit CargoSoft absprechen. --> + <InvoiceNumber> + <xsl:value-of select="item[@name='numsequencenumber']/value" + /> + </InvoiceNumber> + + <!-- Belegart - bei Gutschriften 'CREDIT' andernfalls 'INVOICE --> + <InvoiceType> + <Codes> + <xsl:choose> + <xsl:when test="item[@name='payment.type']/value = 'credit'"> + <Code Type="cs">CREDIT</Code> + </xsl:when> + <xsl:otherwise> + <Code Type="cs">INVOICE</Code> + </xsl:otherwise> + </xsl:choose> + </Codes> + </InvoiceType> + <InvoiceCurrency> + <Codes> + <Code Type="cs"> + <xsl:value-of select="$currency" /> + </Code> + </Codes> + </InvoiceCurrency> + <InvoiceAmount> + <NetAmount> + <Amount> + <Currency> + <Codes> + <Code Type="cs"> + <xsl:value-of select="$currency" /> + </Code> + </Codes> + </Currency> + <Value> + <xsl:value-of select="item[@name='order.total.netto']/value" + /> + </Value> + <!-- exchange rate nur ausgeben wenn vorhanden --> + <xsl:if + test="string-length(item[@name='invoice.exchangerate']/value) >0"> + <ExchangeRate> + <xsl:value-of select="item[@name='invoice.exchangerate']/value" + /> + </ExchangeRate> + </xsl:if> + </Amount> + </NetAmount> + <VATInformation> + <VATAmount> + <Amount> + <Currency> + <Codes> + <Code Type="cs"> + <xsl:value-of select="$currency" /> + </Code> + </Codes> + </Currency> + <Value> + <xsl:value-of select="item[@name='order.total.tax']/value" + /> + </Value> + <!-- exchange rate nur ausgeben wenn vorhanden --> + <xsl:if + test="string-length(item[@name='invoice.exchangerate']/value) > + 0"> + <ExchangeRate> + <xsl:value-of + select="item[@name='invoice.exchangerate']/value" + /> + </ExchangeRate> + </xsl:if> + </Amount> + </VATAmount> + </VATInformation> + </InvoiceAmount> + <CollectionInvoice>false</CollectionInvoice> + <xsl:if test="string-length(item[@name='invoice.period']/value) > 0"> + <BookingPeriod> + <xsl:value-of select="item[@name='invoice.period']/value" + /> + </BookingPeriod> + </xsl:if> + <Booked>false</Booked> + <InvoiceDate> + <xsl:value-of select="item[@name='invoice.date']/value" + /> + </InvoiceDate> + + + <InvoiceAddress type="CN"> + <Codes> + <Code Type="cs"> + <xsl:value-of select="item[@name='cdtr.number']/value" + /> + </Code> + </Codes> + </InvoiceAddress> + + <References> + <Reference type="cs"> + <xsl:value-of select="item[@name='invoice.number']/value" + /> + </Reference> + </References> + + <!-- Attachements --> + <xsl:if test="item[@name='$file.count']/value > 0"> + <Attachments> + <xsl:for-each + select="item[@name='$file']/value/item"> + <Attachment> + <xsl:attribute name="id"><xsl:value-of + select="./value/item[@name='md5checksum']/value" /></xsl:attribute> + <xsl:attribute name="version">1</xsl:attribute> + <Filename> + <xsl:value-of select="lower-case(./@name)" + /> + </Filename> + <Description>Imixs-Office-Workflow</Description> + <Content> + <xsl:value-of select="./value[2]" /> + </Content> + </Attachment> + </xsl:for-each> + </Attachments> + </xsl:if> + + </InvoiceHeader> + <InvoiceRows> + + <xsl:for-each + select="item[@name='_childitems']/value"> + <InvoiceRow> + <Row> + <xsl:value-of select="./item[@name='numpos']/value" /> + </Row> + <FileNumber> + <xsl:value-of select="./item[@name='name']/value" + /> + </FileNumber> + <InvoiceAmount> + <NetAmount> + <Amount> + <Currency> + <Codes> + <Code Type="cs"> + <xsl:value-of select="$currency" /> + </Code> + </Codes> + </Currency> + <Value> + <xsl:value-of select="./item[@name='amount']/value" + /> + </Value> + </Amount> + </NetAmount> + <VATInformation> + <VAT> + <Codes> + <Code Type="cs"> + <xsl:value-of select="./item[@name='tax']/value" + /> + </Code> + </Codes> + </VAT> + </VATInformation> + </InvoiceAmount> + <ActivityType> + <Codes> + <Code Type="cs"> + <xsl:value-of select="./item[@name='category']/value" + /> + </Code> + </Codes> + </ActivityType> + </InvoiceRow> + </xsl:for-each> + </InvoiceRows> + </Invoice> + + </xsl:template> + + + </xsl:stylesheet> + /office-alexander-logistics/reports/cargosoft/cargosoft-1.0.6.xsl \ No newline at end of file diff --git a/reports/cargosoft/cargosoft-1.0.0-br.xsl b/reports/cargosoft/cargosoft-1.0.0-br.xsl new file mode 100644 index 0000000..784363b --- /dev/null +++ b/reports/cargosoft/cargosoft-1.0.0-br.xsl @@ -0,0 +1,231 @@ + + + + + + + + + + + + Imixs-Office-Workflow + Cargosoft + + + + + + + + + + + + + + + + + + + + + + + + + + + 008 + + + + + + + + + + + + + CREDIT + + + INVOICE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + Imixs-Office-Workflow + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/templates/sepa/sepa-br.xlsx b/templates/sepa/sepa-br.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0b8a0d77c4bc83473012d6eb10f0809da35753d5 GIT binary patch literal 5343 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 literal 0 HcmV?d00001