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 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(4); } 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 { // für ausgangsrechnungen skippen wir die Cargosoft XML Datei if (fileName.toLowerCase().endsWith(".xml")) { return fileName; } // für die PDF Datei bauen wir einen neuen Namen result = result + workitem.getItemValueString("invoice.positions"); } if (counter > 0) { result = result + "_" + counter; } result = result + fileName.substring(fileName.lastIndexOf(".")); return result; } }