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

View file

@ -160,6 +160,10 @@ public class InvoiceUtil {
*
* 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
* @return
*/
@ -168,10 +172,29 @@ public class InvoiceUtil {
// no data
return key;
}
if (key.startsWith("BP")) {
return key;
}
key = key.toUpperCase();
if (key.startsWith("D") || key.startsWith("K")) {
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")) {
// cut first digit (debitor/creditor)
key = "BP" + key.substring(1);

View file

@ -68,11 +68,19 @@ import jakarta.enterprise.event.Observes;
* Business partner erstmals neu angelegt wird.
* <p>
* 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>
* Im Cargosoft Entity wird zusätzlich das flag NOSNAPSHOT=true gesetzt. Dies
* 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
*
*/
@ -90,9 +98,9 @@ public class BusinessPartnerImportService {
public static final String TYPE_CARGOSOFTKREDITOR = "cargosoftkreditor";
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 REGEX_IMPORTTEXTPATTERN = "^R[1-8] .*$";
// 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 REGEX_IMPORTTEXTPATTERN = "^R[1-8] .*$";
@EJB
WorkflowService workflowService;
@ -135,17 +143,25 @@ public class BusinessPartnerImportService {
}
/**
* Syncnrhonisert ein drecks Cargosoft Objekt mit dem neuen Busienss partner
* objekt
* Synchronisiert ein Cargosoft Objekt mit dem neuen Business partner
* 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
*/
public boolean syncCargosoftCreditorBusinessPartner(ItemCollection importDoc) {
String name = importDoc.getItemValueString("name");
boolean isCreditor = name.toUpperCase().startsWith("K");
String partnerID = InvoiceUtil.buildBPID(name);
String cargosoftID = importDoc.getItemValueString("name");
// K bedeutet Kreditor D bedeutet Debitor - beides kann vorkommen
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?
ItemCollection businesspartner = lookupBusinessPartner(partnerID);
@ -158,12 +174,12 @@ public class BusinessPartnerImportService {
businesspartner.setItemValue("name", partnerID);
businesspartner.setItemValue("partner.id", partnerID);
if (isCreditor) {
businesspartner.setItemValue("cdtr.number", name);
businesspartner.setItemValue("cdtr.number", cargosoftID);
if (businesspartner.isItemEmpty("cdtr.mail")) {
businesspartner.setItemValue("cdtr.mail", importDoc.getItemValueString("_vendor_email"));
}
} else {
businesspartner.setItemValue("dbtr.number", name);
businesspartner.setItemValue("dbtr.number", cargosoftID);
if (businesspartner.isItemEmpty("dbtr.mail")) {
businesspartner.setItemValue("dbtr.mail", importDoc.getItemValueString("_vendor_email"));
}
@ -207,7 +223,7 @@ public class BusinessPartnerImportService {
try {
workflowService.processWorkItemByNewTransaction(businesspartner);
} 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;
} else {
@ -220,7 +236,7 @@ public class BusinessPartnerImportService {
*
* @return
*/
private ItemCollection createBusinessPartner(String partnerID) {
private ItemCollection createBusinessPartner(String cargosoftID) {
ItemCollection businessPartner = new ItemCollection();
businessPartner.setType("workitem");
businessPartner.setWorkflowGroup("Business Partner");
@ -228,9 +244,8 @@ public class BusinessPartnerImportService {
// Hier migrieren wir jetzt auch die alten IBAN/BIC Daten
try {
String cargoShortID = partnerID.substring(2);
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);

View file

@ -28,7 +28,17 @@
<h:inputText value="#{workitem.item['partner.id']}" pt:data-item="partner.id" />
<h:inputHidden value="#{workitem.item['partner.name']}" pt:data-item="partner.name" />
<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">
/*<![CDATA[*/
// init input fields...

View file

@ -147,6 +147,44 @@ public class InvoiceImportTester {
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
*