101 lines
3.8 KiB
PHP
101 lines
3.8 KiB
PHP
<?php
|
|
/**
|
|
* POST /api/lab/registrar_pago.php
|
|
* Registra el pago de un domicilio por parte del cliente.
|
|
* Soporta múltiples métodos de pago (pagos parciales).
|
|
*
|
|
* Body JSON:
|
|
* {
|
|
* domicilio_id: int,
|
|
* pago_estado: 'pagado' | 'exento' | 'pendiente',
|
|
* pagos: [ (requerido si pagado)
|
|
* { modo: 'efectivo'|'transferencia'|'otro', monto: float, notas: string|null },
|
|
* ...
|
|
* ],
|
|
* pago_notas: string|null (nota general, opcional)
|
|
* }
|
|
*/
|
|
require_once __DIR__ . '/_helpers.php';
|
|
requireMethod('POST');
|
|
|
|
try {
|
|
$datos = inputJson();
|
|
|
|
$domId = (int)($datos['domicilio_id'] ?? 0);
|
|
$estado = $datos['pago_estado'] ?? '';
|
|
|
|
if (!$domId) jsonError('domicilio_id requerido');
|
|
if (!in_array($estado, ['pagado', 'exento', 'pendiente'], true))
|
|
jsonError('pago_estado inválido (pagado|exento|pendiente)');
|
|
|
|
$pagos = [];
|
|
if ($estado === 'pagado') {
|
|
$raw = $datos['pagos'] ?? [];
|
|
if (!is_array($raw) || empty($raw)) jsonError('Se requiere al menos un método de pago');
|
|
$modosValidos = ['efectivo', 'transferencia', 'otro'];
|
|
foreach ($raw as $i => $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);
|
|
}
|