überarbeitung KSeF

This commit is contained in:
Ralph Soika 2025-12-08 11:44:59 +01:00
parent b3c935132b
commit 5b445adee0
3 changed files with 199 additions and 0 deletions

View file

@ -77,6 +77,22 @@ public class InvoiceService {
@Inject
DocumentService documentService;
public ItemCollection findOutboundInvoiceByNumber(String invoiceNumber) {
ItemCollection result = null;
try {
String query = "($modelversion:rechnungsausgang*) AND (invoice.number:" + invoiceNumber + ")";
List<ItemCollection> list;
list = documentService.find(query, 1, 0);
if (list != null && list.size() > 0) {
result = list.get(0);
}
} catch (QueryException e) {
e.printStackTrace();
}
return result;
}
/**
* Liefert die Liste der Ausgehenden Währungen
*

View file

@ -5,6 +5,7 @@ import java.io.FileNotFoundException;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.logging.Logger;
@ -31,6 +32,7 @@ import org.imixs.workflow.util.XMLParser;
import org.w3c.dom.Element;
import com.alexanderlogistics.BusinessPartnerService;
import com.alexanderlogistics.InvoiceService;
import com.alexanderlogistics.InvoiceUtil;
import jakarta.inject.Inject;
@ -93,6 +95,9 @@ public class KSeFAdapter implements SignalAdapter {
@Inject
BusinessPartnerService businessPartnerService;
@Inject
InvoiceService invoiceService;
/**
* This method
*
@ -156,12 +161,45 @@ public class KSeFAdapter implements SignalAdapter {
TradeParty billingAddress = buildAddress(workitem, "buyer", model);
model.setTradeParty(billingAddress);
// set Tax Type based on vatID
((EInvoiceModelKSeF) model).setTaxType(workitem.getItemValueString("partner.vat"));
// Update Invoice Type (RodzajFaktury) -> VAT | KOR
Element elementFa = model.findOrCreateChildNode(model.getRoot(), EInvoiceNS.KSEF, "Fa");
if (isKorrekturRechnung(workitem)) {
((EInvoiceModelKSeF) model).setRodzajFaktury("KOR");
logger.info("│ ├── invoice type=KOR");
// Set correction data (DaneFaKorygowanej) - required for KOR invoices
Element daneFaKorygowanej = model.findOrCreateChildNodeAfter(
elementFa, EInvoiceNS.KSEF, "DaneFaKorygowanej", "RodzajFaktury");
Date correctionInvoiceDate = workitem.getItemValueDate("invoice.date");
// try to lookup original invoice by invoice.CorrectionInvoiceNumber
ItemCollection correctionInvoice = invoiceService
.findOutboundInvoiceByNumber(workitem.getItemValueString("invoice.CorrectionInvoiceNumber"));
if (correctionInvoice != null) {
correctionInvoiceDate = correctionInvoice.getItemValueDate("invoice.date");
logger.info("│ ├── found original invoice, date: " + correctionInvoiceDate);
} else {
logger.info("│ ├── ⚠️ original invoice not found, using current date as fallback");
}
// Original invoice date (DataWystFaKorygowanej) - required
if (correctionInvoiceDate != null) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String sCorrectionDate = formatter.format(correctionInvoiceDate);
model.updateElementValue(daneFaKorygowanej, EInvoiceNS.KSEF,
"DataWystFaKorygowanej", sCorrectionDate);
}
// Original invoice number (NrFaKorygowanej) - required
model.updateElementValue(daneFaKorygowanej, EInvoiceNS.KSEF,
"NrFaKorygowanej", workitem.getItemValueString("invoice.CorrectionInvoiceNumber"));
// NrKSeFN = 1 means the original invoice was issued outside KSeF
model.updateElementValue(daneFaKorygowanej, EInvoiceNS.KSEF, "NrKSeFN", "1");
} else {
// normale rechnung
((EInvoiceModelKSeF) model).setRodzajFaktury("VAT");

View file

@ -0,0 +1,145 @@
<?xml version="1.0" encoding="UTF-8"?>
<Faktura xmlns="http://crd.gov.pl/wzor/2025/06/25/13775/"
xmlns:etd="http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2022/01/05/eD/DefinicjeTypy/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Naglowek>
<KodFormularza kodSystemowy="FA (3)" wersjaSchemy="1-0E">FA</KodFormularza>
<WariantFormularza>3</WariantFormularza>
<DataWytworzeniaFa>2025-12-04T17:00:46.126282515Z</DataWytworzeniaFa>
<SystemInfo>Imixs eInvoice</SystemInfo>
</Naglowek>
<!-- Seller (Your Polish Company - Pre-filled) -->
<Podmiot1>
<DaneIdentyfikacyjne>
<NIP>9552521552</NIP>
<Nazwa>Alexander Global Logistics</Nazwa>
</DaneIdentyfikacyjne>
<Adres>
<KodKraju>PL</KodKraju>
<AdresL1>Gdanska 36</AdresL1>
<AdresL2>70-660 Szczecin</AdresL2>
</Adres>
<DaneKontaktowe>
<Email>MBudas@alexander-logistics.com</Email>
</DaneKontaktowe>
</Podmiot1>
<!-- Buyer (Customer - Empty, to be filled) -->
<Podmiot2>
<DaneIdentyfikacyjne>
<!-- NIP falls eine PL Ust Vorliegt
ansonsten NrID - geht immer -->
<!-- <Nazwa>#Customer Name#</Nazwa> -->
<NrID>DE814745205</NrID>
<Nazwa>Profor Fibre GmbH</Nazwa>
</DaneIdentyfikacyjne>
<Adres>
<KodKraju>DE</KodKraju>
<AdresL1>Domstraße 18</AdresL1>
<AdresL2>20095 Hamburg</AdresL2>
</Adres>
<!---
Contact information from buyer can be left
<DaneKontaktowe>
<Email></Email>
<Telefon></Telefon>
</DaneKontaktowe>
-->
<NrKlienta>D13006</NrKlienta>
<JST>2</JST>
<!-- fixed -->
<GV>2</GV>
<!-- fixed -->
</Podmiot2>
<!-- Invoice Data -->
<Fa>
<KodWaluty>EUR</KodWaluty>
<P_1>2025-12-04</P_1>
<!-- Invoice Date -->
<P_2>6543</P_2>
<!-- Invoice Number -->
<P_6>2026-01-03</P_6>
<!-- Due Date -->
<!-- Totals -->
<P_13_6_1>390.89</P_13_6_1>
<!-- Total Net -->
<!-- Total VAT -->
<P_15>390.89</P_15>
<!-- Total Gross -->
<Adnotacje>
<!-- 1 yes - 2 no -->
<P_16>2</P_16>
<!-- Keine Selbstfakturierung -->
<P_17>2</P_17>
<!-- Kein Reverse Charge -->
<P_18>2</P_18>
<!-- Kein Split Payment (Rechnung unter 15.000 PLN/EUR) -->
<P_18A>2</P_18A>
<!-- Keine Steuerbefreiung -->
<Zwolnienie>
<P_19N>1</P_19N>
</Zwolnienie>
<!-- Keine neuen Verkehrsmittel -->
<NoweSrodkiTransportu>
<P_22N>1</P_22N>
</NoweSrodkiTransportu>
<!-- Kein vereinfachtes Verfahren nach Art. 135 -->
<P_23>2</P_23>
<!-- Keine Margenregelung -->
<PMarzy>
<P_PMarzyN>1</P_PMarzyN>
</PMarzy>
</Adnotacje>
<!-- Invoice Type (VAT) -->
<RodzajFaktury>KOR</RodzajFaktury>
<!-- Invoice Positions: FaWiersz -->
<FaWiersz>
<NrWierszaFa>1</NrWierszaFa>
<UU_ID>0f8b3274-02f5-4e7c-a2f3-af1d2c48e6e8</UU_ID>
<P_7>IM-POL-2510-059</P_7>
<P_8A>szt.</P_8A>
<P_8B>1</P_8B>
<P_9A>0.00</P_9A>
<P_11>0.00</P_11>
</FaWiersz>
<FaWiersz>
<NrWierszaFa>2</NrWierszaFa>
<UU_ID>7186ad2c-6a5f-4df2-9d66-f5d496c9c5a1</UU_ID>
<P_7>IM-POL-2510-059</P_7>
<P_8A>szt.</P_8A>
<P_8B>1</P_8B>
<P_9A>-2052.20</P_9A>
<P_11>-2052.20</P_11>
</FaWiersz>
<FaWiersz>
<NrWierszaFa>3</NrWierszaFa>
<UU_ID>931a7d53-e50c-4cd1-82ab-480f2c7765e8</UU_ID>
<P_7>IM-POL-2510-059</P_7>
<P_8A>szt.</P_8A>
<P_8B>1</P_8B>
<P_9A>0.00</P_9A>
<P_11>0.00</P_11>
</FaWiersz>
<FaWiersz>
<NrWierszaFa>4</NrWierszaFa>
<UU_ID>d0805423-d2e1-42f0-80bd-9ca0171f2764</UU_ID>
<P_7>IM-POL-2510-059</P_7>
<P_8A>szt.</P_8A>
<P_8B>1</P_8B>
<P_9A>2443.09</P_9A>
<P_11>2443.09</P_11>
</FaWiersz>
<FaWiersz>
<NrWierszaFa>5</NrWierszaFa>
<UU_ID>d94d9030-4992-49f4-9e46-973a6f2b63e2</UU_ID>
<P_7>IM-POL-2510-059</P_7>
<P_8A>szt.</P_8A>
<P_8B>1</P_8B>
<P_9A>0.00</P_9A>
<P_11>0.00</P_11>
</FaWiersz>
</Fa>
</Faktura>