some minor fixes

This commit is contained in:
Ralph Soika 2025-11-28 20:02:52 +01:00
parent 96477feb74
commit fecb9e8813
3 changed files with 25 additions and 10 deletions

View file

@ -172,6 +172,7 @@ The implementation uses `PluginException` for error handling with two error type
- [Upload Invoice](https://ksef-test.mf.gov.pl/docs/v2/index.html#tag/Wysylka-interaktywna/paths/~1api~1v2~1sessions~1online~1%7BreferenceNumber%7D~1invoices/post)
- [Facture Details](https://github.com/CIRFMF/ksef-docs/blob/main/sesja-interaktywna.md#2-wys%C5%82anie-faktury)
- [XML Invoice Example](https://github.com/CIRFMF/ksef-docs/blob/main/faktury/weryfikacja-faktury.md)
- [QR Code](https://github.com/CIRFMF/ksef-docs/blob/main/kody-qr.md)
- [Github Discussions](https://github.com/CIRFMF/ksef-docs/issues/351#issuecomment-3538013805)
- [Github Discussions](https://github.com/CIRFMF/ksef-docs/issues/399)

View file

@ -72,6 +72,8 @@ public class KSeFAdapter implements SignalAdapter {
final String TYPE_TEXTBLOCK = "textblock";
public static final String DOCUMENT_ERROR = "DOCUMENT_ERROR";
public static final String CONFIG_ERROR = "CONFIG_ERROR";
public static final String API_ERROR = "API_ERROR";
public static final String BUSINESSPARTNER_ERROR = "BUSINESSPARTNER_ERROR";
public static final String LINE_ITEMS_PROPERTY = "invoice.items";
private static Logger logger = Logger.getLogger(EInvoiceAdapter.class.getName());
@ -151,7 +153,7 @@ public class KSeFAdapter implements SignalAdapter {
model.setDueDateTime(workitem.getItemValueLocalDate("invoice.duedate"));
// Update Addresses
TradeParty billingAddress = buildAddress(workitem.getItemValueString("partner.id"), "buyer", model);
TradeParty billingAddress = buildAddress(workitem, "buyer", model);
model.setTradeParty(billingAddress);
// Update Invoice Type (RodzajFaktury) -> VAT | KOR
@ -221,7 +223,9 @@ public class KSeFAdapter implements SignalAdapter {
* @param type Der Typ der TradeParty
* @return TradeParty
*/
public TradeParty buildAddress(String partnerID, String type, EInvoiceModel model) throws PluginException {
public TradeParty buildAddress(ItemCollection workitem, String type, EInvoiceModel model) throws PluginException {
String partnerID = workitem.getItemValueString("partner.id");
if (partnerID == null || partnerID.isEmpty()) {
throw new PluginException(this.getClass().getName(), DOCUMENT_ERROR, "Missing partnerID");
}
@ -273,7 +277,14 @@ public class KSeFAdapter implements SignalAdapter {
tradeParty.setStreetAddress(businessPartner.getItemValueString("partner.address"));
if ("buyer".equals(type)) {
tradeParty.setVatNumber(businessPartner.getItemValueString("partner.vat"));
// if we do NOT have a partner.vat we can not upload the invoice!
String partnerVAT = businessPartner.getItemValueString("partner.vat");
if (partnerVAT.isBlank()) {
throw new PluginException(this.getClass().getName(), BUSINESSPARTNER_ERROR,
"Business Partner ID '" + partnerID + "' does not contain a VAT ID !");
}
workitem.setItemValue("partner.vat", partnerVAT);
tradeParty.setVatNumber(partnerVAT);
// Update or create NrKlienta element directly under Podmiot2
Element podmiot2 = model.findOrCreateChildNode(model.getRoot(), EInvoiceNS.KSEF, "Podmiot2");
model.updateElementValue(podmiot2, EInvoiceNS.KSEF, "NrKlienta",

View file

@ -239,6 +239,8 @@ public class KSeFAPIService {
// if status code 200 and if we have a ksef.upo.referencenumber we download the
// document
if (code == 200 && !referenceNumber.isEmpty()) {
checkSessionStatusInvoices(workitem);
FileData upoFileData = downloadUOPXML(workitem);
workitem.addFileData(upoFileData);
@ -278,7 +280,6 @@ public class KSeFAPIService {
int httpResponse = -1;
int statusCode = -1;
String statusDescription;
String statusDetails;
logger.info("│ ├── GET: " + uri);
HttpResponse<String> response = null;
try {
@ -306,27 +307,29 @@ public class KSeFAPIService {
JsonArray invoicesArray = jsonObject.getJsonArray("invoices");
if (invoicesArray != null && !invoicesArray.isEmpty()) {
JsonObject firstInvoice = invoicesArray.getJsonObject(0);
if (firstInvoice.containsKey("ksefNumber")) {
String ksefNumber = firstInvoice.getString("ksefNumber");
logger.info("│ ├── ksefNumber: " + ksefNumber);
workitem.setItemValue("ksef.number", ksefNumber);
}
// Status Code aus dem status-Objekt extrahieren
if (firstInvoice.containsKey("status")) {
JsonObject statusObject = firstInvoice.getJsonObject("status");
if (statusObject.containsKey("code")) {
statusCode = statusObject.getInt("code");
statusDescription = statusObject.getString("description");
// Convert details array to a single string
statusDetails = "";
if (statusObject.containsKey("details")) {
JsonArray detailsArray = statusObject.getJsonArray("details");
statusDetails = detailsArray.stream()
String details = detailsArray.stream()
.map(v -> ((JsonString) v).getString())
.collect(Collectors.joining("; "));
statusDescription = statusDescription + ": " + details;
}
logger.info("│ ├── Status Code: " + statusCode);
logger.info("│ ├── Status details: " + statusDetails);
workitem.setItemValue("ksef.status.code", statusCode);
workitem.setItemValue("ksef.status.description", statusDescription + ": "
+ statusDetails);
workitem.setItemValue("ksef.status.description", statusDescription);
}
}
} else {