neuer File Export DWC

This commit is contained in:
Ralph Soika 2025-01-29 14:43:30 +01:00
parent 66b674afaf
commit d2a2d506d2
7 changed files with 11974 additions and 72 deletions

View file

@ -1,13 +1,10 @@
# Cargosoft Schnittstelle
Für den Austausch von Daten mit Cargosoft verwenden wir verschiedene Subaccounts auf unseren FTP Servern.
# Cargosoft Schnittstelle (Bremen - Mandant 001) ## Server Verbindungsdaten
Für den Austasuch von Daten mit Cargosoft verwenden wir einen Subaccount `u248962-sub2` der auf das Verzeichnis `/office-alexander-logistics/cargosoft` zeigt: Details siehe [FTP Server](FTP.md)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft
Benutzername: u248962-sub2
Passwort: aXa61n9Un3jDNQlL
## Ausgangsrechnungen ## Ausgangsrechnungen
@ -21,48 +18,3 @@ Technisch wird das über die CDI Bean `com.alexanderlogistics.xml.CargosoftXMLIn
Die Kreditoren/Debitoren Stammdaten werden von Cargosoft im Verzeichnis `/fromCargosoft/stammdaten/` über die Datei `Vendors.csv` bereitgestellt Die Kreditoren/Debitoren Stammdaten werden von Cargosoft im Verzeichnis `/fromCargosoft/stammdaten/` über die Datei `Vendors.csv` bereitgestellt
Über den Document Importer `CSV` werden die Dokumente regelmäßig importiert bzw. aktualisert Über den Document Importer `CSV` werden die Dokumente regelmäßig importiert bzw. aktualisert
# Cargosoft Schnittstelle (Bremen Mandant 001)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft
Benutzername: u248962-sub2
Passwort: aXa61n9Un3jDNQlL
# Cargosoft Schnittstelle (Bremerhaven Mandant 005)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-bhv
Benutzername: u248962-sub5
Passwort: 5hKKzv6TFCKRrAdR
# Cargosoft Schnittstelle (Polen Mandant 003)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-pl
Benutzername: u248962-sub7
Passwort: PGPzzqmtZ8BSxkbs
# Cargosoft Schnittstelle (Dubai Mandant 006)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-dwc
Benutzername: u248962-sub3
Passwort: enHjxs9h4nJ6EgsZ
# Cargosoft Schnittstelle (USA Mandant 004)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-usa
Benutzername: u248962-sub9
Passwort: GMk7NgDBrmb2QqXg
# Cargosoft Schnittstelle (China Mandant 007)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-chn
Benutzername: u248962-sub10
Passwort: yswBeN83jMqkMqJa

76
doc/FTP.md Normal file
View file

@ -0,0 +1,76 @@
# FTP Server
Wir stellen verschiedene FTP Laufwerke auf dem Hetzner bereit um Daten mit Cargosoft und anderen Partnern auszutauschen
# Cargosoft
## Cargosoft Schnittstelle (Bremen - Mandant 001)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft
Benutzername: u248962-sub2
Passwort: aXa61n9Un3jDNQlL
## Cargosoft Schnittstelle (Bremerhaven Mandant 005)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-bhv
Benutzername: u248962-sub5
Passwort: 5hKKzv6TFCKRrAdR
## Cargosoft Schnittstelle (Polen Mandant 003)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-pl
Benutzername: u248962-sub7
Passwort: PGPzzqmtZ8BSxkbs
## Cargosoft Schnittstelle (Dubai Mandant 006)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-dwc
Benutzername: u248962-sub3
Passwort: enHjxs9h4nJ6EgsZ
## Cargosoft Schnittstelle (USA Mandant 004)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-usa
Benutzername: u248962-sub9
Passwort: GMk7NgDBrmb2QqXg
## Cargosoft Schnittstelle (China Mandant 007)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-chn
Benutzername: u248962-sub10
Passwort: yswBeN83jMqkMqJa
# Dubai
Wir stellen Herrn Hoelzl in Dubai ein eigenes FTP Laufwerk bereit, in das wir die Rechnungen per Imixs-Exporter verschieben. Herr Hoelzl überträgt dann die Daten in eine app von einer Steuerkanzlei.
Es wird dazu ein FTP Server bereitgestellt der von Herrn Hölzl und Frau Geisler lokal eingebunden werden kann.
Der aktuelle Workflow für Eingangs- und Ausgangsrechnungen wird dahingehend angepasst, dass die Belege automatisch nach folgenden Format exportiert werden:
```
├── invoice-out
│ ├── 2024
│ │ ├── 06
│ │ │ ├── 198_EX-DWC-2406-013.pdf
│ │ │ ├── 199_EX-DWC-2406-013.pdf
│ │ ├── 07
│ │ │ ├── 200_IM-DWC-2407-010.pdf
├── invoice-in
│ ├── 2024
│ │ ├── 06
│ │ │ ├── 700045_EX-DWC-2406-005.pdf
│ │ │ ├── 700045_59475.pdf
```
sequencenumer +
firmename + positionsnummer + rechnungsnummer +
Der Export erfolgt automatisch nach Empfang der Rechnung bzw. nach Prüfung der Rechnung (Review->Approved). Die Dateinamen werden vom System berechnet (siehe oben). Bei Sachrechnungen wird das Rechnungsdatum verwendet um die Buchungsperiode zu berechnen.

View file

@ -1,6 +1,5 @@
version: '3.6' version: "3.6"
services: services:
############################################### ###############################################
# Postgres DB # Postgres DB
############################################### ###############################################
@ -49,7 +48,6 @@ services:
volumes: volumes:
- ./docker/deployments:/opt/jboss/wildfly/standalone/deployments/ - ./docker/deployments:/opt/jboss/wildfly/standalone/deployments/
############################################### ###############################################
# Tika OCR Service # Tika OCR Service
############################################### ###############################################
@ -62,7 +60,27 @@ services:
ports: ports:
- "9998:9998" - "9998:9998"
##################
# Exporter Service
##################
imixsexporter-app:
image: imixs/imixs-archive-exporter
environment:
# EXAMPLE SETUP
WORKFLOW_SERVICE_ENDPOINT: "http://app:8080/api"
WORKFLOW_SERVICE_USER: "admin"
WORKFLOW_SERVICE_PASSWORD: "adminadmin"
WORKFLOW_SERVICE_AUTHMETHOD: "form"
METRICS_ENDPOINT: "http://localhost:9991/metrics"
HEALTH_ENDPOINT: "http://localhost:9991/health"
EXPORT_PATH: "/agl/dwc-test"
EXPORT_FTP_HOST: "u248962.your-storagebox.de"
EXPORT_FTP_PORT: "21"
EXPORT_FTP_USER: "u248962-sub4"
EXPORT_FTP_PASSWORD: "en4g3f1Jw0WlQ9Yb"
ports:
- "8081:8080"
- "8788:8787"
############################################### ###############################################
# Imixs-Admin # Imixs-Admin
@ -90,7 +108,6 @@ services:
- ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheusdata:/prometheus/ - prometheusdata:/prometheus/
grafana: grafana:
image: grafana/grafana:latest image: grafana/grafana:latest
ports: ports:
@ -99,7 +116,3 @@ services:
volumes: volumes:
dbdata: dbdata:
prometheusdata: prometheusdata:

View file

@ -242,4 +242,18 @@ public class InvoiceUtil {
} }
return result; return result;
} }
/**
* Gibt true zurück wenn es sich um eine Kreditoren Sachrechnung handelt.
*
* @param invoice
* @return
*/
public static boolean isSachrechnung(ItemCollection invoice) {
boolean result = false;
if (invoice.getModelVersion().startsWith("rechnungseingang-sachrechnung")) {
result = true;
}
return result;
}
} }

View file

@ -0,0 +1,134 @@
package com.alexanderlogistics;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.logging.Logger;
import org.imixs.archive.core.SnapshotService;
import org.imixs.workflow.FileData;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.SignalAdapter;
import org.imixs.workflow.exceptions.AdapterException;
import org.imixs.workflow.exceptions.PluginException;
import jakarta.inject.Inject;
/**
* Der RenameFilenamesAdapter kann optional eingesetzt werden. Dieser Adapter
* verändert den Dateinamen von angehangenen Rechnungen
*
* Der Adapter wir beispielweise in DWC eingesetzt bevor die Dateien in einen
* FTP Server hochgeladen werden.
*
* Die Dateinamen werden vom System berechnet.
*
* sequencenumber + "_" +invoice.positions+".pdf"
*
*
* Bei Sachrechnungen
*
* sequencenumber + "_" + invoice.number.stripped + ".pdf"
* wird das Rechnungsdatum verwendet um die Buchungsperiode zu berechnen.
*
*
*
* @author rsoika
* @version 1.0
*
*/
public class RenameFilenamesAdapter implements SignalAdapter {
private static Logger logger = Logger.getLogger(RenameFilenamesAdapter.class.getName());
@Inject
SnapshotService snapshotService;
/**
* Rename Filenames
*
* @throws PluginException
*
**/
@Override
public ItemCollection execute(ItemCollection workitem, ItemCollection event)
throws AdapterException, PluginException {
int fileNameCounter = 0; // for multiple files
List<FileData> fileDataSet = workitem.getFileData();
for (FileData fileData : fileDataSet) {
String fileName = fileData.getName();
// only PDF files and X-Rechnung
if ((fileName.toLowerCase().endsWith(".pdf")
|| fileName.toLowerCase().endsWith(".xml"))) {
// Build new Filename
String newFileName = buildFileName(fileName, workitem, fileNameCounter);
if (!newFileName.equals(fileName)) {
logger.info("Rename file name " + fileName + " -> " + newFileName);
// do we have content
if (fileData.getContent().length < 10) {
// fetch snaphot data
FileData snapShotFileData = snapshotService.getWorkItemFile(workitem.getUniqueID(), fileName);
// remove old data
workitem.removeFile(fileName);
snapShotFileData.setName(newFileName);
workitem.addFileData(snapShotFileData);
} else {
fileData.setName(newFileName);
}
fileNameCounter++;
}
// Update FTP Target path information
String targetPath = "";
if (InvoiceUtil.isCreditorInvoice(workitem)) {
targetPath = "invoice-in/";
String bookingPath = workitem.getItemValueString("invoice.period");
// Sachrechnung
if (bookingPath.isEmpty()) {
// build period from invoice.date
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMM");
LocalDate invoiceDate = workitem.getItemValueLocalDate("invoice.date");
bookingPath = invoiceDate.format(formatter);
}
if (bookingPath.length() > 4) {
targetPath = targetPath + bookingPath.substring(0, 4) + "/" + bookingPath.substring(4);
}
} else {
targetPath = "invoice-out/";
String bookingPath = workitem.getItemValueString("invoice.bookingperiod");
targetPath = targetPath + bookingPath.substring(0, 4) + "/" + bookingPath.substring(5);
}
workitem.setItemValue("ftp.target.path", targetPath + "/");
}
}
return workitem;
}
/**
* Baut einen Filenamen aus verschiedenen Attributen zusammen.
*
*
* @param workitem
* @return
*/
private String buildFileName(String fileName, ItemCollection workitem, int counter) {
String result = workitem.getItemValueString("sequencenumber") + "_";
if (InvoiceUtil.isSachrechnung(workitem)) {
result = result + workitem.getItemValueString("invoice.number.stripped");
} else {
result = result + workitem.getItemValueString("invoice.positions");
}
if (counter > 0) {
result = result + "_" + counter;
}
result = result + fileName.substring(fileName.lastIndexOf("."));
return result;
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff