support von 5-stelligen BP Nummern

This commit is contained in:
Ralph Soika 2025-08-24 10:34:51 +02:00
parent 6620f7ce7c
commit 52ac50f204
5 changed files with 112 additions and 29 deletions

View file

@ -345,7 +345,7 @@ public class BusinessPartnerController implements Serializable {
ItemCollection businessPartner = businessPartnerService.getBusinessPartnerByID(bpid); ItemCollection businessPartner = businessPartnerService.getBusinessPartnerByID(bpid);
searchResult = null; searchResult = null;
if (businessPartner != null) { if (businessPartner != null) {
workitem.setItemValue("partner.ref", businessPartner.getUniqueID());
// Eingangsrechnung // Eingangsrechnung
if (InvoiceUtil.isCreditorInvoice(workitem)) { if (InvoiceUtil.isCreditorInvoice(workitem)) {
workitem.setItemValue("cdtr.number", workitem.setItemValue("cdtr.number",
@ -369,33 +369,30 @@ public class BusinessPartnerController implements Serializable {
} }
} }
} else } else if (InvoiceUtil.isDebitorInvoice(workitem)) {
// Ausgangsrechnung // Ausgangsrechnung
if (InvoiceUtil.isDebitorInvoice(workitem)) {
workitem.setItemValue("dbtr.number", workitem.setItemValue("dbtr.number",
businessPartner.getItemValueString("dbtr.number")); businessPartner.getItemValueString("dbtr.number"));
workitem.setItemValue("dbtr.name", workitem.setItemValue("dbtr.name",
businessPartner.getItemValueString("partner.name")); businessPartner.getItemValueString("partner.name"));
workitem.setItemValue("dbtr.mail", businessPartner.getItemValue("dbtr.mail")); workitem.setItemValue("dbtr.mail", businessPartner.getItemValue("dbtr.mail"));
} else } else if (workitem.getModelVersion().startsWith("zahlungseingang")) {
// Zahlungseingang // Zahlungseingang
if (workitem.getModelVersion().startsWith("zahlungseingang")) {
workitem.setItemValue("dbtr.number", workitem.setItemValue("dbtr.number",
businessPartner.getItemValueString("dbtr.number")); businessPartner.getItemValueString("dbtr.number"));
workitem.setItemValue("dbtr.name", workitem.setItemValue("dbtr.name",
businessPartner.getItemValueString("partner.name")); businessPartner.getItemValueString("partner.name"));
workitem.setItemValue("dbtr.mail", businessPartner.getItemValue("dbtr.mail")); workitem.setItemValue("dbtr.mail", businessPartner.getItemValue("dbtr.mail"));
} else } else if (workitem.getModelVersion().startsWith("analyse-debitor")) {
// Analyse Debitor // Analyse Debitor
if (workitem.getModelVersion().startsWith("analyse-debitor")) {
workitem.setItemValue("dbtr.number", workitem.setItemValue("dbtr.number",
businessPartner.getItemValueString("dbtr.number")); businessPartner.getItemValueString("dbtr.number"));
workitem.setItemValue("dbtr.name", workitem.setItemValue("dbtr.name",
businessPartner.getItemValueString("partner.name")); businessPartner.getItemValueString("partner.name"));
workitem.setItemValue("dbtr.mail", businessPartner.getItemValue("dbtr.mail")); workitem.setItemValue("dbtr.mail", businessPartner.getItemValue("dbtr.mail"));
} else { } else {
// default behavior
if (workitem.getItemValueString("dbtr.number").isEmpty()) { if (workitem.getItemValueString("dbtr.number").isEmpty()) {
// default behavior
String number = businessPartner.getItemValueString("dbtr.number"); String number = businessPartner.getItemValueString("dbtr.number");
workitem.setItemValue("dbtr.number", number); workitem.setItemValue("dbtr.number", number);
if (number.length() > 1) { if (number.length() > 1) {

View file

@ -160,6 +160,10 @@ public class InvoiceUtil {
* *
* Aus Kreditor K70153 und Debitor D10153 wird die einheitliche ID: BP0153 * Aus Kreditor K70153 und Debitor D10153 wird die einheitliche ID: BP0153
* *
* Wir untersützen heir auch K8 und D2 Nummern
* D.h. K70725 => BP0725 bzw. D10725 => BP0725
* D.h. K80725 => BP10725 bzw. D20725 => BP10725
*
* @param key * @param key
* @return * @return
*/ */
@ -168,10 +172,29 @@ public class InvoiceUtil {
// no data // no data
return key; return key;
} }
if (key.startsWith("BP")) {
return key;
}
key = key.toUpperCase(); key = key.toUpperCase();
if (key.startsWith("D") || key.startsWith("K")) { if (key.startsWith("D") || key.startsWith("K")) {
key = key.substring(1); key = key.substring(1);
} }
// 5 Stellig und Starts 8 (K80153 )
if (key.length() == 5 && key.startsWith("2")) {
key = "x1" + key.substring(1);
}
if (key.length() == 5 && key.startsWith("3")) {
key = "x2" + key.substring(1);
}
if (key.length() == 5 && key.startsWith("8")) {
key = "x1" + key.substring(1);
}
if (key.length() == 5 && key.startsWith("9")) {
key = "x2" + key.substring(1);
}
if (!key.startsWith("BP")) { if (!key.startsWith("BP")) {
// cut first digit (debitor/creditor) // cut first digit (debitor/creditor)
key = "BP" + key.substring(1); key = "BP" + key.substring(1);

View file

@ -68,11 +68,19 @@ import jakarta.enterprise.event.Observes;
* Business partner erstmals neu angelegt wird. * Business partner erstmals neu angelegt wird.
* <p> * <p>
* Falls bei der ersten Migration erkannt wird, dass die IBAN Nummern nicht * Falls bei der ersten Migration erkannt wird, dass die IBAN Nummern nicht
* eindeutig sind wir der BusinessParter mit dem Event 300 angelegt. * eindeutig sind wir der BusinessPartner mit dem Event 300 angelegt.
* <p> * <p>
* Im Cargosoft Entity wird zusätzlich das flag NOSNAPSHOT=true gesetzt. Dies * Im Cargosoft Entity wird zusätzlich das flag NOSNAPSHOT=true gesetzt. Dies
* ist nur eine Performance Optimierung. * ist nur eine Performance Optimierung.
* * <p>
* Die Umsetzung erfolgt nach folgendem Prinzip:
* Die K- bzw. D-Nummer (K70725 , D10725 ) werden die ersten beiden Stellen
* abgeschnitten und mit BP ersetzt.
* D.h. K70725 => BP0725 bzw. D10725 => BP0725
* Change: 24.8.2025: Da nun auch K8 und D2 Nummern auftauchen können wird in
* diesen Fällen die Nummer hinter BP um 1 erweitert. Also nun auch
* D.h. K80725 => BP10725 bzw. D20725 => BP10725
*
* @author rsoika * @author rsoika
* *
*/ */
@ -90,9 +98,9 @@ public class BusinessPartnerImportService {
public static final String TYPE_CARGOSOFTKREDITOR = "cargosoftkreditor"; public static final String TYPE_CARGOSOFTKREDITOR = "cargosoftkreditor";
public static final String OPTION_MANDANT_ID = "mandant.id"; // public static final String OPTION_MANDANT_ID = "mandant.id";
public static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss"; // public static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
public static final String REGEX_IMPORTTEXTPATTERN = "^R[1-8] .*$"; // public static final String REGEX_IMPORTTEXTPATTERN = "^R[1-8] .*$";
@EJB @EJB
WorkflowService workflowService; WorkflowService workflowService;
@ -135,17 +143,25 @@ public class BusinessPartnerImportService {
} }
/** /**
* Syncnrhonisert ein drecks Cargosoft Objekt mit dem neuen Busienss partner * Synchronisiert ein Cargosoft Objekt mit dem neuen Business partner
* objekt * Objekt
*
* Die K- bzw. D-Nummer (K70725 , D10725 ) werden die ersten beiden Stellen
* abgeschnitten und mit BP ersetzt.
* D.h. K70725 => BP0725 bzw. D10725 => BP0725
* D.h. K80725 => BP10725 bzw. D20725 => BP10725
* *
* Gibt true urück wenn sich was verädnert hat * Die Methode gibt true zurück wenn sich das BusinessPartner Objekt geändert
* oder neu erstellt wurde.
* *
* @param creditor * @param creditor
*/ */
public boolean syncCargosoftCreditorBusinessPartner(ItemCollection importDoc) { public boolean syncCargosoftCreditorBusinessPartner(ItemCollection importDoc) {
String name = importDoc.getItemValueString("name"); String cargosoftID = importDoc.getItemValueString("name");
boolean isCreditor = name.toUpperCase().startsWith("K"); // K bedeutet Kreditor D bedeutet Debitor - beides kann vorkommen
String partnerID = InvoiceUtil.buildBPID(name); boolean isCreditor = cargosoftID.toUpperCase().startsWith("K");
// Konvertiere die KNummer in eine BP Nummer
String partnerID = InvoiceUtil.buildBPID(cargosoftID);
// Prüfen ob es diesen partner schon gibt? // Prüfen ob es diesen partner schon gibt?
ItemCollection businesspartner = lookupBusinessPartner(partnerID); ItemCollection businesspartner = lookupBusinessPartner(partnerID);
@ -158,12 +174,12 @@ public class BusinessPartnerImportService {
businesspartner.setItemValue("name", partnerID); businesspartner.setItemValue("name", partnerID);
businesspartner.setItemValue("partner.id", partnerID); businesspartner.setItemValue("partner.id", partnerID);
if (isCreditor) { if (isCreditor) {
businesspartner.setItemValue("cdtr.number", name); businesspartner.setItemValue("cdtr.number", cargosoftID);
if (businesspartner.isItemEmpty("cdtr.mail")) { if (businesspartner.isItemEmpty("cdtr.mail")) {
businesspartner.setItemValue("cdtr.mail", importDoc.getItemValueString("_vendor_email")); businesspartner.setItemValue("cdtr.mail", importDoc.getItemValueString("_vendor_email"));
} }
} else { } else {
businesspartner.setItemValue("dbtr.number", name); businesspartner.setItemValue("dbtr.number", cargosoftID);
if (businesspartner.isItemEmpty("dbtr.mail")) { if (businesspartner.isItemEmpty("dbtr.mail")) {
businesspartner.setItemValue("dbtr.mail", importDoc.getItemValueString("_vendor_email")); businesspartner.setItemValue("dbtr.mail", importDoc.getItemValueString("_vendor_email"));
} }
@ -207,7 +223,7 @@ public class BusinessPartnerImportService {
try { try {
workflowService.processWorkItemByNewTransaction(businesspartner); workflowService.processWorkItemByNewTransaction(businesspartner);
} catch (AccessDeniedException | ProcessingErrorException | PluginException | ModelException e) { } catch (AccessDeniedException | ProcessingErrorException | PluginException | ModelException e) {
logger.warning("Failed to update Business Partner Object " + name + " - " + e.getMessage()); logger.warning("Failed to update Business Partner Object " + cargosoftID + " - " + e.getMessage());
} }
return true; return true;
} else { } else {
@ -220,7 +236,7 @@ public class BusinessPartnerImportService {
* *
* @return * @return
*/ */
private ItemCollection createBusinessPartner(String partnerID) { private ItemCollection createBusinessPartner(String cargosoftID) {
ItemCollection businessPartner = new ItemCollection(); ItemCollection businessPartner = new ItemCollection();
businessPartner.setType("workitem"); businessPartner.setType("workitem");
businessPartner.setWorkflowGroup("Business Partner"); businessPartner.setWorkflowGroup("Business Partner");
@ -228,9 +244,8 @@ public class BusinessPartnerImportService {
// Hier migrieren wir jetzt auch die alten IBAN/BIC Daten // Hier migrieren wir jetzt auch die alten IBAN/BIC Daten
try { try {
String cargoShortID = partnerID.substring(2);
String query = "(type:" + TYPE_CARGOSOFTKREDITOR + ")"; String query = "(type:" + TYPE_CARGOSOFTKREDITOR + ")";
query = query + " AND ( name:K7" + cargoShortID + " OR name:D1" + cargoShortID + " )"; query = query + " AND ( name:" + cargosoftID + " )";
List<ItemCollection> oldList = documentService.find(query, 2, 0); List<ItemCollection> oldList = documentService.find(query, 2, 0);

View file

@ -28,7 +28,17 @@
<h:inputText value="#{workitem.item['partner.id']}" pt:data-item="partner.id" /> <h:inputText value="#{workitem.item['partner.id']}" pt:data-item="partner.id" />
<h:inputHidden value="#{workitem.item['partner.name']}" pt:data-item="partner.name" /> <h:inputHidden value="#{workitem.item['partner.name']}" pt:data-item="partner.name" />
<br /> <br />
<span id='businsspartner-konto-id' class='small'>#{workitem.item['partner.name']}</span> <ui:fragment rendered="#{empty workitem.item['partner.ref']}">
<span id='businsspartner-konto-id' class='small'>#{workitem.item['partner.name']}</span>
</ui:fragment>
<ui:fragment rendered="#{!empty workitem.item['partner.ref']}">
<span id='businsspartner-konto-id' class='small'>
<h:outputLink style="margin-left:5px;" target="_blank"
value="#{facesContext.externalContext.requestContextPath}/pages/workitems/workitem.xhtml?id=#{workitem.item['partner.ref']}">
#{workitem.item['partner.name']}</h:outputLink>
</span>
</ui:fragment>
<script type="text/javascript"> <script type="text/javascript">
/*<![CDATA[*/ /*<![CDATA[*/
// init input fields... // init input fields...

View file

@ -147,6 +147,44 @@ public class InvoiceImportTester {
assertEquals(161.61, row2.getItemValueDouble("datev.umsatz"), 0.0); assertEquals(161.61, row2.getItemValueDouble("datev.umsatz"), 0.0);
} }
/**
* Testet die Umwandlung von Cargosoft nummern in BP Nummern
*
* Die K- bzw. D-Nummer (K70725 , D10725 ) werden die ersten beiden Stellen
* abgeschnitten und mit BP ersetzt.
* D.h. K70725 => BP0725 bzw. D10725 => BP0725
* D.h. K80725 => BP10725 bzw. D20725 => BP10725
*
* @throws Exception
*/
@Test
public void testBPConverter() throws Exception {
assertEquals("BP0725", InvoiceUtil.buildBPID("K70725"));
assertEquals("BP0725", InvoiceUtil.buildBPID("D10725"));
// test getBPid
ItemCollection invoice = new ItemCollection();
invoice.model("rechnungseingang-123");
invoice.setItemValue("dbtr.number", "D10999");
invoice.setItemValue("cdtr.number", "K70725");
assertEquals("BP0725", InvoiceUtil.getBPID(invoice));
invoice = new ItemCollection();
invoice.model("rechnungsausgang-123");
invoice.setItemValue("cdtr.number", "K70999");
invoice.setItemValue("dbtr.number", "D10725");
assertEquals("BP0725", InvoiceUtil.getBPID(invoice));
// Teste 5 Stellige BP Nummern
// K80725 => BP10725 bzw. D20725 => BP10725
assertEquals("BP10725", InvoiceUtil.buildBPID("K80725"));
assertEquals("BP10725", InvoiceUtil.buildBPID("D20725"));
assertEquals("BP20725", InvoiceUtil.buildBPID("K90725"));
assertEquals("BP20725", InvoiceUtil.buildBPID("D30725"));
}
/** /**
* Hilfsmethode zum einlesen einer xml test datei * Hilfsmethode zum einlesen einer xml test datei
* *