Erlaube mehrere OTC-Zahlungsarten
This commit is contained in:
1 parent
5fede22267
commit
99dd615f01
4 files changed
+97
-20
No files matched your search
@@ -30,7 +30,7 @@ if (!is_array($data)) {
|
||||
json_response(400, ['ok' => false, 'error' => 'JSON object expected']);
|
||||
}
|
||||
|
||||
$required = ['products', 'totalPrice', 'orderDate', 'paymentMethod', 'billing'];
|
||||
$required = ['products', 'totalPrice', 'orderDate', 'payments', 'billing'];
|
||||
foreach ($required as $field) {
|
||||
if (!array_key_exists($field, $data)) {
|
||||
json_response(422, ['ok' => false, 'error' => "Missing field: {$field}"]);
|
||||
@@ -40,13 +40,17 @@ foreach ($required as $field) {
|
||||
$products = $data['products'];
|
||||
$totalPrice = parse_number($data['totalPrice']);
|
||||
$orderDate = trim((string) $data['orderDate']);
|
||||
$paymentMethodCode = trim((string) $data['paymentMethod']);
|
||||
$payments = $data['payments'];
|
||||
$billing = is_array($data['billing']) ? $data['billing'] : [];
|
||||
|
||||
if (!is_array($products) || count($products) === 0) {
|
||||
json_response(422, ['ok' => false, 'error' => 'No products specified']);
|
||||
}
|
||||
|
||||
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']);
|
||||
}
|
||||
@@ -85,6 +89,30 @@ if ($totalQty <= 0) {
|
||||
json_response(422, ['ok' => false, 'error' => 'No product quantity specified']);
|
||||
}
|
||||
|
||||
$resolvedPayments = [];
|
||||
$paymentTotal = 0.0;
|
||||
foreach ($payments as $payment) {
|
||||
if (!is_array($payment) || !isset($payment['paymentMethod'], $payment['amount'])) {
|
||||
json_response(422, ['ok' => false, 'error' => 'Payment missing paymentMethod or amount']);
|
||||
}
|
||||
|
||||
$paymentMethodCode = trim((string) $payment['paymentMethod']);
|
||||
$amount = parse_number($payment['amount']);
|
||||
if ($paymentMethodCode === '' || $amount === null || $amount <= 0) {
|
||||
json_response(422, ['ok' => false, 'error' => 'Invalid payment method or amount']);
|
||||
}
|
||||
|
||||
$resolvedPayments[] = [
|
||||
'paymentMethodCode' => $paymentMethodCode,
|
||||
'amount' => round((float) $amount, 2),
|
||||
];
|
||||
$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']);
|
||||
}
|
||||
|
||||
try {
|
||||
$env = expand_env_values(parse_env_file(__DIR__ . '/../../../../.env'));
|
||||
$pdo = connect_database($env);
|
||||
@@ -92,9 +120,13 @@ try {
|
||||
|
||||
$locations = get_default_location_ids($pdo);
|
||||
|
||||
$paymentMethodId = lookup_method_id($pdo, 'payment_method', $paymentMethodCode);
|
||||
if ($paymentMethodId === null) {
|
||||
throw new RuntimeException('Invalid payment method');
|
||||
$paymentMethodIds = [];
|
||||
foreach ($resolvedPayments as $payment) {
|
||||
$paymentMethodId = lookup_method_id($pdo, 'payment_method', $payment['paymentMethodCode']);
|
||||
if ($paymentMethodId === null) {
|
||||
throw new RuntimeException('Invalid payment method');
|
||||
}
|
||||
$paymentMethodIds[] = $paymentMethodId;
|
||||
}
|
||||
|
||||
$partyId = find_or_create_party($pdo, $billing);
|
||||
@@ -102,7 +134,7 @@ try {
|
||||
|
||||
$order = create_direct_sales_order($pdo, [
|
||||
':party_id' => $partyId,
|
||||
':payment_method_id' => $paymentMethodId,
|
||||
':payment_method_id' => count($paymentMethodIds) === 1 ? $paymentMethodIds[0] : null,
|
||||
':amount_net' => $totalPrice,
|
||||
':total_amount' => $totalPrice,
|
||||
':order_date' => $orderDateTime->format('Y-m-d H:i:s'),
|
||||
@@ -111,6 +143,18 @@ try {
|
||||
$orderId = (int) $order['id'];
|
||||
$externalRef = (string) $order['external_ref'];
|
||||
|
||||
$paymentStmt = $pdo->prepare(
|
||||
'INSERT INTO sales_order_payment (sales_order_id, payment_method_id, amount, created_at, updated_at)
|
||||
VALUES (:sales_order_id, :payment_method_id, :amount, NOW(), NOW())'
|
||||
);
|
||||
foreach ($resolvedPayments as $index => $payment) {
|
||||
$paymentStmt->execute([
|
||||
':sales_order_id' => $orderId,
|
||||
':payment_method_id' => $paymentMethodIds[$index],
|
||||
':amount' => $payment['amount'],
|
||||
]);
|
||||
}
|
||||
|
||||
$remainingTotal = round((float) $totalPrice, 2);
|
||||
$lineNo = 0;
|
||||
|
||||
|
||||
Reference in new issue
Block a user