office-alexander-logistics/src/main/java/com/alexanderlogistics/RenameFilenamesAdapter.java

138 lines
5 KiB
Java

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(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;
}
}