diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/ZahlungseingangSaldoAdapter.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/ZahlungseingangSaldoAdapter.java index c9e3af5..28be94a 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/ZahlungseingangSaldoAdapter.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/ZahlungseingangSaldoAdapter.java @@ -29,102 +29,123 @@ import org.imixs.workflow.exceptions.PluginException; */ public class ZahlungseingangSaldoAdapter implements SignalAdapter { - private static Logger logger = Logger.getLogger(ZahlungseingangSaldoAdapter.class.getName()); + private static Logger logger = Logger.getLogger(ZahlungseingangSaldoAdapter.class.getName()); - @Inject - ZahlungseingangService zahlungseingangService; + @Inject + ZahlungseingangService zahlungseingangService; - /** - * This method finds the outgoing invoicdes and updates the saldo - * (payment.total). - * - * @throws PluginException - */ - @Override - public ItemCollection execute(ItemCollection document, ItemCollection event) - throws AdapterException, PluginException { + /** + * This method finds the outgoing invoicdes and updates the saldo + * (payment.total). + * + * @throws PluginException + */ + @Override + public ItemCollection execute(ItemCollection document, ItemCollection event) + throws AdapterException, PluginException { - updateSaldo(document); + updateSaldo(document); - return document; - } + return document; + } - /** - * Diese method hängt eine referenz der aktuellen Rechnung an den Zahlungsavis - * - * @param document - * @throws PluginException - */ - private void updateSaldo(ItemCollection document) throws PluginException { + /** + * Diese method hängt eine referenz der aktuellen Rechnung an den Zahlungsavis + * + * @param document + * @throws PluginException + */ + private void updateSaldo(ItemCollection document) throws PluginException { - // payment currency - String paymentCurrency = document.getItemValueString("payment.currency"); - double masterPaymentAmount = document.getItemValueDouble("payment.amount"); - String paymentWarning = document.getItemValueString("payment.warning"); + // payment currency + String paymentCurrency = document.getItemValueString("payment.currency"); + double masterPaymentAmount = document.getItemValueDouble("payment.amount"); + String paymentWarning = document.getItemValueString("payment.warning"); - List paymentDetails = zahlungseingangService.loadPaymentDetails(document); + List paymentDetails = zahlungseingangService.loadPaymentDetails(document); - if (paymentDetails.size() == 0) { - throw new PluginException(PluginException.class.getName(), - ZahlungseingangService.ERROR_PAYMENT_BOOKING_FAILED, - "Bitte wählen Sie die zugeordneten Rechnungen aus."); - } + if (paymentDetails.size() == 0) { + throw new PluginException(PluginException.class.getName(), + ZahlungseingangService.ERROR_PAYMENT_BOOKING_FAILED, + "Bitte wählen Sie die zugeordneten Rechnungen aus."); + } - logger.info("......Updating " + paymentDetails.size() + " outgoing invoices...."); - double einzelPayments = 0; - for (ItemCollection payment : paymentDetails) { + logger.info("......Updating " + paymentDetails.size() + " outgoing invoices...."); - ItemCollection invoice = zahlungseingangService.findInvoice(payment.getUniqueID()); + // Erst müssen wir einmal prüfen ob alle einzel salden ungleich dem + // MasterPamyneAmmoutn sind! + double einzelPayments = 0; + for (ItemCollection payment : paymentDetails) { + einzelPayments = einzelPayments + payment.getItemValueFloat("payment.amount"); + } + // Prüfe auf Plausisbilität + if (paymentWarning.isEmpty()) { + // falls mehr einzelsummen eingeben wurden als der oben angegeben Total Pamyment + // dann soll eine Warnung ausgegen werden. + if (masterPaymentAmount != einzelPayments) { + document.setItemValue("payment.warning", "invalid saldo"); + throw new PluginException(PluginException.class.getName(), + ZahlungseingangService.ERROR_PAYMENT_BOOKING_FAILED, + "Der Zahlungseingang ist nicht identisch mit den ausgebuchten Rechnungssalden. Sollte die Eingabe korrekt sein, wiederholen Sie die Aktion."); + } - if (invoice != null) { - String invoiceNumber = invoice.getItemValueString("invoice.number"); - String invoiceCurrency = invoice.getItemValueString("invoice.currency"); + } - if (!invoiceCurrency.equals(paymentCurrency)) { - throw new PluginException(PluginException.class.getName(), - ZahlungseingangService.ERROR_PAYMENT_BOOKING_FAILED, - "Der Zahlungseingang kann nicht verbucht werden, da die Währung " + paymentCurrency - + " nicht mit der Währung der Rechnung " + invoiceNumber + " übereinstimmt!"); - } + einzelPayments = 0; + for (ItemCollection payment : paymentDetails) { - float invoiceSaldo = invoice.getItemValueFloat("invoice.saldo"); - float paymentAmount = payment.getItemValueFloat("payment.amount"); - einzelPayments = einzelPayments + paymentAmount; + ItemCollection invoice = zahlungseingangService.findInvoice(payment.getUniqueID()); - - // vergeiche Beträge - if (Math.abs(paymentAmount) > Math.abs(invoiceSaldo)) { - throw new PluginException(PluginException.class.getName(), - ZahlungseingangService.ERROR_PAYMENT_BOOKING_FAILED, - "Der Zahlungseingang kann nicht verbucht werden, da der Restsaldo der Rechnung " - + invoiceNumber + " kleiner als der Zahlbetrag ist!"); - } - - - // Prüfe auf Plausisbilität - if (paymentWarning.isEmpty()) { - // falls mehr einzelsummen eingeben wurden als der oben angegeben Total Pamyment - // dann soll eine Warnung ausgegen werden. - if (masterPaymentAmount > einzelPayments) { - document.setItemValue("payment.warning", "invalid saldo"); - throw new PluginException(PluginException.class.getName(), - ZahlungseingangService.ERROR_PAYMENT_BOOKING_FAILED, - "Der Zahlungseingang ist größer als die ausgebuchten Rechnungssalden. Sollte die Eingabe korrekt sein, wiederholen Sie die Aktion."); - } + if (invoice != null) { + String invoiceNumber = invoice.getItemValueString("invoice.number"); + String invoiceCurrency = invoice.getItemValueString("invoice.currency"); + float invoiceSaldo = invoice.getItemValueFloat("invoice.saldo"); + float paymentAmount = payment.getItemValueFloat("payment.amount"); + float invoiceRate = invoice.getItemValueFloat("invoice.rate"); - } + /** + * Falls die Währung der Rechnung von der Währung der Zahlung abweicht, dann + * rechnen wir den PaymentAmmout mit der Rate aus. + */ + if (!invoiceCurrency.equals(paymentCurrency)) { + if (invoiceRate == 0) { + throw new PluginException(PluginException.class.getName(), + ZahlungseingangService.ERROR_PAYMENT_BOOKING_FAILED, + "Der Zahlungseingang kann nicht verbucht werden, da die Währung " + paymentCurrency + + " nicht mit der Währung der Rechnung " + invoiceNumber + " übereinstimmt!"); + } + } - invoiceSaldo = invoiceSaldo - paymentAmount; - invoice.setItemValue("invoice.saldo", invoiceSaldo); - invoice.event(ZahlungseingangService.EVENT_UPDATE_INVOICE); - zahlungseingangService.processInvoice(invoice); + einzelPayments = einzelPayments + paymentAmount; - } else { - throw new PluginException(PluginException.class.getName(), - ZahlungseingangService.ERROR_PAYMENT_BOOKING_FAILED, "Rechnung konnte nicht gefunden werden!"); - } - } + // vergeiche Beträge + if (Math.abs(paymentAmount) > Math.abs(invoiceSaldo)) { + throw new PluginException(PluginException.class.getName(), + ZahlungseingangService.ERROR_PAYMENT_BOOKING_FAILED, + "Der Zahlungseingang kann nicht verbucht werden, da der Restsaldo der Rechnung " + + invoiceNumber + " kleiner als der Zahlbetrag ist!"); + } - } + // Saldoberechnung in Fremdwärung? + if (!invoiceCurrency.equals(paymentCurrency) && invoiceRate != 0) { + // Wenn es eien Fremdwährung war korregieren wir den Saldo auf basis des + // Umrechnungskurses + invoiceSaldo = invoiceSaldo - (paymentAmount * invoiceRate); + } else { + invoiceSaldo = invoiceSaldo - paymentAmount; + } + + invoice.setItemValue("invoice.saldo", invoiceSaldo); + invoice.event(ZahlungseingangService.EVENT_UPDATE_INVOICE); + zahlungseingangService.processInvoice(invoice); + + } else { + throw new PluginException(PluginException.class.getName(), + ZahlungseingangService.ERROR_PAYMENT_BOOKING_FAILED, "Rechnung konnte nicht gefunden werden!"); + } + + } + + } } \ No newline at end of file diff --git a/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/section_datevbuchung.xhtml b/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/section_datevbuchung.xhtml index d764212..8486bc8 100644 --- a/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/section_datevbuchung.xhtml +++ b/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/section_datevbuchung.xhtml @@ -71,6 +71,19 @@ + + + + + Saldo: + + + + + + + diff --git a/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/section_payments.xhtml b/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/section_payments.xhtml index 409c519..a2f01c3 100644 --- a/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/section_payments.xhtml +++ b/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/section_payments.xhtml @@ -23,8 +23,7 @@ Referenz Betrag Zahlung - Währung - + Währungsumsatz - + @@ -59,29 +58,30 @@ - + + + + + + + + + + + + - + - - - - - Saldo: - - - - - - +