$p) { $modo = $p['modo'] ?? ''; $monto = (float)($p['monto'] ?? 0); if (!in_array($modo, $modosValidos, true)) jsonError("Método de pago inválido en fila " . ($i + 1)); if ($monto <= 0) jsonError("El monto debe ser mayor a 0 en fila " . ($i + 1)); $pagos[] = [ 'modo' => $modo, 'monto' => $monto, 'notas' => isset($p['notas']) && $p['notas'] !== '' ? trim($p['notas']) : null, ]; } } $adminId = adminId(); $dom = new Domicilio(); $db = Database::getInstance(); // Verificar que existe $exist = $db->fetch('SELECT id, pago_estado FROM lab_domicilios WHERE id = ?', [$domId]); if (!$exist) jsonError("Domicilio #$domId no encontrado"); // ── Persistir parcialidades ────────────────────────────────────────── // Eliminar registros previos y reinsertar (permite editar el pago) $db->execute('DELETE FROM lab_domicilio_pagos WHERE domicilio_id = ?', [$domId]); $totalMonto = 0; $primerModo = null; $notasGeneral = !empty($datos['pago_notas']) ? trim($datos['pago_notas']) : null; if ($estado === 'pagado') { foreach ($pagos as $p) { $db->execute( 'INSERT INTO lab_domicilio_pagos (domicilio_id, modo, monto, notas) VALUES (?, ?, ?, ?)', [$domId, $p['modo'], $p['monto'], $p['notas']] ); $totalMonto += $p['monto']; if ($primerModo === null) $primerModo = $p['modo']; } } // ── Actualizar campos resumen en lab_domicilios ───────────────────── // pago_modo guarda el primer método (o el único); pago_monto guarda el total. $campos = [ 'pago_estado' => $estado, 'pago_modo' => ($estado === 'pagado') ? $primerModo : null, 'pago_monto' => ($estado === 'pagado') ? $totalMonto : null, 'pago_fecha' => ($estado === 'pagado') ? date('Y-m-d H:i:s') : null, 'pago_notas' => $notasGeneral, 'pago_registrado_por' => $adminId, ]; $dom->actualizar($domId, $campos, $adminId); jsonOk([ 'domicilio_id' => $domId, 'pago_estado' => $estado, 'pago_total' => $totalMonto, 'pagos' => $pagos, ], 'Pago registrado correctamente'); } catch (InvalidArgumentException $e) { jsonError($e->getMessage()); } catch (Exception $e) { jsonError($e->getMessage(), 500); }