From 2a31a88c1d737f246f7ae079b3d92e6940d18a16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Gla=CC=88ser?= Date: Sun, 6 Sep 2026 14:21:58 +0200 Subject: [PATCH] OTC-Zahlungssummen als Verkaufspreis verwenden --- modules/erp/direktverkauf/api/otc-order.php | 13 +++++-------- modules/shared/auth/ui/home.php | 21 ++------------------- 2 files changed, 7 insertions(+), 27 deletions(-) diff --git a/modules/erp/direktverkauf/api/otc-order.php b/modules/erp/direktverkauf/api/otc-order.php index 9ea4085..f323943 100644 --- a/modules/erp/direktverkauf/api/otc-order.php +++ b/modules/erp/direktverkauf/api/otc-order.php @@ -30,7 +30,7 @@ if (!is_array($data)) { json_response(400, ['ok' => false, 'error' => 'JSON object expected']); } -$required = ['products', 'totalPrice', 'orderDate', 'payments', 'billing']; +$required = ['products', 'orderDate', 'payments', 'billing']; foreach ($required as $field) { if (!array_key_exists($field, $data)) { json_response(422, ['ok' => false, 'error' => "Missing field: {$field}"]); @@ -38,7 +38,6 @@ foreach ($required as $field) { } $products = $data['products']; -$totalPrice = parse_number($data['totalPrice']); $orderDate = trim((string) $data['orderDate']); $payments = $data['payments']; $billing = is_array($data['billing']) ? $data['billing'] : []; @@ -51,10 +50,6 @@ if (!is_array($payments) || count($payments) === 0) { json_response(422, ['ok' => false, 'error' => 'No payment methods specified']); } -if ($totalPrice === null || $totalPrice <= 0) { - json_response(422, ['ok' => false, 'error' => 'Invalid total price']); -} - $orderDateTime = DateTimeImmutable::createFromFormat('!Y-m-d', $orderDate); $orderDateErrors = DateTimeImmutable::getLastErrors(); if ($orderDateTime === false) { @@ -109,10 +104,12 @@ foreach ($payments as $payment) { $paymentTotal = round($paymentTotal + (float) $amount, 2); } -if (abs($paymentTotal - (float) $totalPrice) > 0.005) { - json_response(422, ['ok' => false, 'error' => 'Payment amounts must equal total price']); +if ($paymentTotal <= 0) { + json_response(422, ['ok' => false, 'error' => 'Payment total must be greater than zero']); } +$totalPrice = $paymentTotal; + try { $env = expand_env_values(parse_env_file(__DIR__ . '/../../../../.env')); $pdo = connect_database($env); diff --git a/modules/shared/auth/ui/home.php b/modules/shared/auth/ui/home.php index 129a42c..ab9ba62 100644 --- a/modules/shared/auth/ui/home.php +++ b/modules/shared/auth/ui/home.php @@ -563,14 +563,6 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo '

PRODUKTE

'; echo $otcProductRows; echo ''; - echo '
'; - echo '

Preis

'; - echo '
'; - echo ''; - echo ''; - echo '

Der Preis wird durch die Anzahl aller Flaschen geteilt und das Ergebnis ist der Preis jeder einzelnen Flasche.

'; - echo '
'; - echo '
'; echo '
'; echo '

Datum

'; echo '
'; @@ -1227,7 +1219,6 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo " if (!overlay) { return; }"; echo " const form = overlay.querySelector('[data-otc-order-form]');"; echo " const productInputs = Array.from(form.querySelectorAll('[data-otc-order-product]'));"; - echo " const totalPriceInput = form.querySelector('[data-otc-order-total-price]');"; echo " const orderDateInput = form.querySelector('[data-otc-order-date]');"; echo " const orderDateDefaultValue = orderDateInput ? orderDateInput.value : '';"; echo " const paymentRows = form.querySelector('[data-otc-payment-rows]');"; @@ -1278,7 +1269,7 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo " clearSuccess();"; echo " ensureCurrentOrderDate();"; echo " requestAnimationFrame(() => {"; - echo " (productInputs[0] || totalPriceInput || submitBtn)?.focus();"; + echo " (productInputs[0] || submitBtn)?.focus();"; echo " });"; echo " return;"; echo " }"; @@ -1290,9 +1281,7 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo " const updatePaymentAddButton = () => { addPaymentButton.disabled = paymentRows.querySelectorAll('[data-otc-payment-row]').length >= paymentOptionValues.length; };"; echo " const updateFormState = () => {"; echo " const totalQty = productInputs.reduce((sum, input) => sum + getInputValue(input), 0);"; - echo " const totalPrice = parseFloat(totalPriceInput.value || '0') || 0;"; echo " const isValid = totalQty > 0"; - echo " && totalPrice > 0"; echo " && !!getFieldValue(orderDateInput)"; echo " && paymentRows.querySelectorAll('[data-otc-payment-row]').length > 0"; echo " && !!getFieldValue(firstNameInput)"; @@ -1304,12 +1293,8 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo " let errorMsg = '';"; echo " if (totalQty === 0) {"; echo " errorMsg = 'Mindestens ein Produkt mit Menge > 0 erforderlich.';"; - echo " } else if (totalPrice <= 0) {"; - echo " errorMsg = 'Preis muss größer als 0 sein.';"; echo " } else if (!getFieldValue(orderDateInput)) {"; echo " errorMsg = 'Bestelldatum auswählen.';"; - echo " } else if (getPaymentTotal() !== totalPrice) {"; - echo " errorMsg = 'Die Zahlungsbeträge müssen dem Gesamtbetrag entsprechen.';"; echo " } else if (!getFieldValue(firstNameInput) || !getFieldValue(lastNameInput) || !getFieldValue(streetInput) || !getFieldValue(houseNumberInput) || !getFieldValue(zipInput) || !getFieldValue(cityInput)) {"; echo " errorMsg = 'Alle Rechnungsadress-Felder ausfüllen.';"; echo " }"; @@ -1357,7 +1342,7 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo " toggleOverlay(false);"; echo " }"; echo " });"; - echo " [totalPriceInput, orderDateInput, firstNameInput, lastNameInput, streetInput, houseNumberInput, zipInput, cityInput].forEach((input) => {"; + echo " [orderDateInput, firstNameInput, lastNameInput, streetInput, houseNumberInput, zipInput, cityInput].forEach((input) => {"; echo " if (!input) { return; }"; echo " input.addEventListener('input', updateFormState);"; echo " input.addEventListener('change', updateFormState);"; @@ -1366,7 +1351,6 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo " input.addEventListener('input', updateFormState);"; echo " input.addEventListener('change', updateFormState);"; echo " });"; - echo " const getPaymentTotal = () => Math.round(Array.from(paymentRows.querySelectorAll('[data-otc-payment-amount]')).reduce((sum, input) => sum + (parseFloat(input.value || '0') || 0), 0) * 100) / 100;"; echo " const bindPaymentRow = (row) => {"; echo " row.querySelectorAll('select, input').forEach((input) => { input.addEventListener('input', updateFormState); input.addEventListener('change', updateFormState); });"; echo " };"; @@ -1397,7 +1381,6 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best echo " .map((input) => ({ productId: parseInt(input.dataset.productId || '0', 10), qty: getInputValue(input) }));"; echo " const orderData = {"; echo " products: products,"; - echo " totalPrice: parseFloat(totalPriceInput.value || '0') || 0,"; echo " orderDate: orderDateInput ? orderDateInput.value : '',"; echo " payments: Array.from(paymentRows.querySelectorAll('[data-otc-payment-row]')).map((row) => ({ paymentMethod: row.querySelector('[data-otc-payment-method]').value, amount: parseFloat(row.querySelector('[data-otc-payment-amount]').value || '0') || 0 })),"; echo " billing: {";