OTC-Zahlungssummen als Verkaufspreis verwenden

This commit is contained in:
gitea_admin committed 2026-09-06 14:21:58 +02:00
1 parent 3957d57a3a
commit 2a31a88c1d
2 files changed
+7 -27

No files matched your search

+5 -8
View File
@@ -30,7 +30,7 @@ if (!is_array($data)) {
json_response(400, ['ok' => false, 'error' => 'JSON object expected']); json_response(400, ['ok' => false, 'error' => 'JSON object expected']);
} }
$required = ['products', 'totalPrice', 'orderDate', 'payments', 'billing']; $required = ['products', 'orderDate', 'payments', 'billing'];
foreach ($required as $field) { foreach ($required as $field) {
if (!array_key_exists($field, $data)) { if (!array_key_exists($field, $data)) {
json_response(422, ['ok' => false, 'error' => "Missing field: {$field}"]); json_response(422, ['ok' => false, 'error' => "Missing field: {$field}"]);
@@ -38,7 +38,6 @@ foreach ($required as $field) {
} }
$products = $data['products']; $products = $data['products'];
$totalPrice = parse_number($data['totalPrice']);
$orderDate = trim((string) $data['orderDate']); $orderDate = trim((string) $data['orderDate']);
$payments = $data['payments']; $payments = $data['payments'];
$billing = is_array($data['billing']) ? $data['billing'] : []; $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']); 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); $orderDateTime = DateTimeImmutable::createFromFormat('!Y-m-d', $orderDate);
$orderDateErrors = DateTimeImmutable::getLastErrors(); $orderDateErrors = DateTimeImmutable::getLastErrors();
if ($orderDateTime === false) { if ($orderDateTime === false) {
@@ -109,10 +104,12 @@ foreach ($payments as $payment) {
$paymentTotal = round($paymentTotal + (float) $amount, 2); $paymentTotal = round($paymentTotal + (float) $amount, 2);
} }
if (abs($paymentTotal - (float) $totalPrice) > 0.005) { if ($paymentTotal <= 0) {
json_response(422, ['ok' => false, 'error' => 'Payment amounts must equal total price']); json_response(422, ['ok' => false, 'error' => 'Payment total must be greater than zero']);
} }
$totalPrice = $paymentTotal;
try { try {
$env = expand_env_values(parse_env_file(__DIR__ . '/../../../../.env')); $env = expand_env_values(parse_env_file(__DIR__ . '/../../../../.env'));
$pdo = connect_database($env); $pdo = connect_database($env);
+2 -19
View File
@@ -563,14 +563,6 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best
echo '<h2 id="otc-products-title" class="sg-strong sg-form-sections-card__chapter-title">PRODUKTE</h2>'; echo '<h2 id="otc-products-title" class="sg-strong sg-form-sections-card__chapter-title">PRODUKTE</h2>';
echo $otcProductRows; echo $otcProductRows;
echo '</section>'; echo '</section>';
echo '<section class="sg-form-sections-card__chapter" aria-labelledby="otc-total-price-title">';
echo '<h2 id="otc-total-price-title" class="sg-strong sg-form-sections-card__chapter-title">Preis</h2>';
echo '<div class="sg-form-sections-card__field-group">';
echo '<label class="sg-label" for="otc-total-price">Preis alle Flaschen brutto (CHF)</label>';
echo '<input class="sg-interaction-element sg-input-single-line" type="number" id="otc-total-price" min="0" step="0.01" data-otc-order-total-price>';
echo '<p class="sg-body sg-form-sections-card__sentence">Der Preis wird durch die Anzahl aller Flaschen geteilt und das Ergebnis ist der Preis jeder einzelnen Flasche.</p>';
echo '</div>';
echo '</section>';
echo '<section class="sg-form-sections-card__chapter" aria-labelledby="otc-order-date-title">'; echo '<section class="sg-form-sections-card__chapter" aria-labelledby="otc-order-date-title">';
echo '<h2 id="otc-order-date-title" class="sg-strong sg-form-sections-card__chapter-title">Datum</h2>'; echo '<h2 id="otc-order-date-title" class="sg-strong sg-form-sections-card__chapter-title">Datum</h2>';
echo '<div class="sg-form-sections-card__field-group">'; echo '<div class="sg-form-sections-card__field-group">';
@@ -1227,7 +1219,6 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best
echo " if (!overlay) { return; }"; echo " if (!overlay) { return; }";
echo " const form = overlay.querySelector('[data-otc-order-form]');"; echo " const form = overlay.querySelector('[data-otc-order-form]');";
echo " const productInputs = Array.from(form.querySelectorAll('[data-otc-order-product]'));"; 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 orderDateInput = form.querySelector('[data-otc-order-date]');";
echo " const orderDateDefaultValue = orderDateInput ? orderDateInput.value : '';"; echo " const orderDateDefaultValue = orderDateInput ? orderDateInput.value : '';";
echo " const paymentRows = form.querySelector('[data-otc-payment-rows]');"; 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 " clearSuccess();";
echo " ensureCurrentOrderDate();"; echo " ensureCurrentOrderDate();";
echo " requestAnimationFrame(() => {"; echo " requestAnimationFrame(() => {";
echo " (productInputs[0] || totalPriceInput || submitBtn)?.focus();"; echo " (productInputs[0] || submitBtn)?.focus();";
echo " });"; echo " });";
echo " return;"; echo " return;";
echo " }"; 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 updatePaymentAddButton = () => { addPaymentButton.disabled = paymentRows.querySelectorAll('[data-otc-payment-row]').length >= paymentOptionValues.length; };";
echo " const updateFormState = () => {"; echo " const updateFormState = () => {";
echo " const totalQty = productInputs.reduce((sum, input) => sum + getInputValue(input), 0);"; 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 " const isValid = totalQty > 0";
echo " && totalPrice > 0";
echo " && !!getFieldValue(orderDateInput)"; echo " && !!getFieldValue(orderDateInput)";
echo " && paymentRows.querySelectorAll('[data-otc-payment-row]').length > 0"; echo " && paymentRows.querySelectorAll('[data-otc-payment-row]').length > 0";
echo " && !!getFieldValue(firstNameInput)"; echo " && !!getFieldValue(firstNameInput)";
@@ -1304,12 +1293,8 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best
echo " let errorMsg = '';"; echo " let errorMsg = '';";
echo " if (totalQty === 0) {"; echo " if (totalQty === 0) {";
echo " errorMsg = 'Mindestens ein Produkt mit Menge > 0 erforderlich.';"; 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 " } else if (!getFieldValue(orderDateInput)) {";
echo " errorMsg = 'Bestelldatum auswählen.';"; 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 " } else if (!getFieldValue(firstNameInput) || !getFieldValue(lastNameInput) || !getFieldValue(streetInput) || !getFieldValue(houseNumberInput) || !getFieldValue(zipInput) || !getFieldValue(cityInput)) {";
echo " errorMsg = 'Alle Rechnungsadress-Felder ausfüllen.';"; echo " errorMsg = 'Alle Rechnungsadress-Felder ausfüllen.';";
echo " }"; echo " }";
@@ -1357,7 +1342,7 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best
echo " toggleOverlay(false);"; echo " toggleOverlay(false);";
echo " }"; echo " }";
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 " if (!input) { return; }";
echo " input.addEventListener('input', updateFormState);"; echo " input.addEventListener('input', updateFormState);";
echo " input.addEventListener('change', 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('input', updateFormState);";
echo " input.addEventListener('change', updateFormState);"; echo " input.addEventListener('change', updateFormState);";
echo " });"; 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 " const bindPaymentRow = (row) => {";
echo " row.querySelectorAll('select, input').forEach((input) => { input.addEventListener('input', updateFormState); input.addEventListener('change', updateFormState); });"; echo " row.querySelectorAll('select, input').forEach((input) => { input.addEventListener('input', updateFormState); input.addEventListener('change', updateFormState); });";
echo " };"; 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 " .map((input) => ({ productId: parseInt(input.dataset.productId || '0', 10), qty: getInputValue(input) }));";
echo " const orderData = {"; echo " const orderData = {";
echo " products: products,"; echo " products: products,";
echo " totalPrice: parseFloat(totalPriceInput.value || '0') || 0,";
echo " orderDate: orderDateInput ? orderDateInput.value : '',"; 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 " 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: {"; echo " billing: {";