138 lines
5 KiB
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;
|
|
}
|
|
}
|