<?php
require_once __DIR__.'/../../config/auth.php';require_once __DIR__.'/_finanzas.php';$error='';
if(($_SERVER['REQUEST_METHOD']??'GET')==='POST'){
 $fecha=$_POST['fecha']??'';$origen=$_POST['origen']??'';$ie=(int)($_POST['ingreso_egreso_id']??0);$concepto=limpiar($_POST['concepto_cuenta']??'');$banco=(int)($_POST['cuenta_bancaria_id']??0);$tipo=$_POST['tipo']??'';$descripcion=limpiar($_POST['descripcion']??'');$monto=monto_formulario($_POST['monto']??0);
 if(!$fecha||!in_array($origen,['Ingreso/Egreso','Cuenta'],true)||!$banco||$monto<=0||!$descripcion)$error='Complete correctamente todos los campos.';
 else{$conn->begin_transaction();try{
   $s=$conn->prepare("SELECT saldo_actual FROM cuentas_bancarias WHERE id=? AND categoria='Banco' AND estado='Activa' FOR UPDATE");$s->bind_param('i',$banco);$s->execute();$cuenta=$s->get_result()->fetch_assoc();if(!$cuenta)throw new Exception('Seleccione una cuenta bancaria activa.');
   if($origen==='Ingreso/Egreso'){$q=$conn->prepare('SELECT naturaleza,monto FROM ingresos_egresos WHERE id=? FOR UPDATE');$q->bind_param('i',$ie);$q->execute();$doc=$q->get_result()->fetch_assoc();if(!$doc)throw new Exception('Seleccione un Ingreso/Egreso válido.');$q=$conn->prepare('SELECT COALESCE(SUM(monto),0) pagado FROM caja_movimientos WHERE ingreso_egreso_id=?');$q->bind_param('i',$ie);$q->execute();$pagado=(float)$q->get_result()->fetch_assoc()['pagado'];$saldo=(float)$doc['monto']-$pagado;if($monto>$saldo)throw new Exception('El pago supera el saldo pendiente.');$tipo=$doc['naturaleza']==='A Cobrar'?'Ingreso':'Egreso';$concepto=null;}
   else{if(!$concepto||!in_array($tipo,['Ingreso','Egreso'],true))throw new Exception('Indique la cuenta/concepto y el tipo de movimiento.');$ie=null;}
   $codigo=nuevo_codigo($conn,'caja_movimientos','CJ');$uid=usuario_actual_id();$s=$conn->prepare('INSERT INTO caja_movimientos(codigo,fecha,origen,ingreso_egreso_id,concepto_cuenta,cuenta_bancaria_id,tipo,descripcion,monto,usuario_id) VALUES(?,?,?,?,?,?,?,?,?,?)');$s->bind_param('sssisissdi',$codigo,$fecha,$origen,$ie,$concepto,$banco,$tipo,$descripcion,$monto,$uid);$s->execute();$cajaId=$s->insert_id;
   $impacto=$tipo==='Ingreso'?$monto:-$monto;$s=$conn->prepare('UPDATE cuentas_bancarias SET saldo_actual=saldo_actual+? WHERE id=?');$s->bind_param('di',$impacto,$banco);$s->execute();
   $s=$conn->prepare('INSERT INTO movimientos_bancarios(cuenta_id,descripcion,monto,tipo,fecha,usuario_id) VALUES(?,?,?,?,?,?)');$tipoBanco=$tipo;$s->bind_param('isdssi',$banco,$descripcion,$impacto,$tipoBanco,$fecha,$uid);$s->execute();registrar_auditoria($conn,'INSERT','caja_movimientos',$cajaId,$codigo);$conn->commit();header('Location: caja.php');exit;
 }catch(Throwable $e){$conn->rollback();$error=$e->getMessage();}}
}
$verCero=($_GET['estado']??'pendientes')==='todos';$having=$verCero?'':' HAVING saldo>0';$resultado=$conn->query("SELECT ie.id,ie.codigo,ie.fecha,ie.fecha_vencimiento,ie.descripcion,ie.naturaleza,COALESCE(c.nombre,p.nombre) tercero,ie.monto-COALESCE(SUM(cm.monto),0) saldo FROM ingresos_egresos ie LEFT JOIN clientes c ON c.id=ie.cliente_id LEFT JOIN proveedores p ON p.id=ie.proveedor_id LEFT JOIN caja_movimientos cm ON cm.ingreso_egreso_id=ie.id GROUP BY ie.id $having ORDER BY ie.fecha_vencimiento,ie.id");$documentos=[];while($x=$resultado->fetch_assoc())$documentos[]=$x;$bancos=$conn->query("SELECT id,nombre,tipo_cuenta,nro_cuenta FROM cuentas_bancarias WHERE categoria='Banco' AND estado='Activa' ORDER BY nombre");
include __DIR__.'/../../includes/header.php';include __DIR__.'/../../includes/sidebar.php';?>
<main class="main"><?php include __DIR__.'/../../includes/topbar.php';?><div class="content"><h3 class="page-title">Caja</h3><p class="text-muted">Cobros, pagos y movimientos directos con impacto bancario.</p><?php if($error):?><div class="alert alert-danger"><?=e($error)?></div><?php endif;?><div class="card card-hm mb-3"><div class="card-body"><form method="post" class="row g-3"><div class="col-md-2"><label>Fecha</label><input type="date" class="form-control" name="fecha" value="<?=date('Y-m-d')?>" required></div><div class="col-md-3"><label>Origen</label><select class="form-select" name="origen" id="origen"><option>Ingreso/Egreso</option><option>Cuenta</option></select></div><div class="col-md-4" id="grupoIE"><label>Documento pendiente</label><input class="form-control" list="docs" id="docTexto" autocomplete="off"><input type="hidden" name="ingreso_egreso_id" id="docId"><datalist id="docs"><?php foreach($documentos as $x):?><option data-id="<?=$x['id']?>" value="<?=e($x['codigo'].' · '.$x['tercero'].' · '.$x['naturaleza'].' · '.$x['descripcion'].' · Saldo '.numero_py($x['saldo']))?>"><?php endforeach;?></datalist></div><div class="col-md-3 d-none" id="grupoCuenta"><label>Cuenta/concepto</label><input class="form-control" name="concepto_cuenta"></div><div class="col-md-3"><label>Cuenta bancaria / moneda</label><select class="form-select" name="cuenta_bancaria_id" required><option value="">Seleccione</option><?php while($b=$bancos->fetch_assoc()):?><option value="<?=$b['id']?>"><?=e($b['nombre'].' · '.$b['tipo_cuenta'].' '.$b['nro_cuenta'])?></option><?php endwhile;?></select></div><div class="col-md-2 d-none" id="grupoTipo"><label>Tipo</label><select class="form-select" name="tipo"><option>Ingreso</option><option>Egreso</option></select></div><div class="col-md-7"><label>Descripción</label><input class="form-control" name="descripcion" required></div><div class="col-md-3"><label>Monto</label><input class="form-control numero-miles text-end" name="monto" required></div><div class="col-12"><button class="btn btn-hm">Aplicar movimiento</button></div></form></div></div><div class="d-flex gap-2 mb-3"><input id="buscar" class="form-control" placeholder="Buscar incrementalmente por cualquier dato"><a class="btn btn-outline-secondary" href="?estado=<?=$verCero?'pendientes':'todos'?>"><?=$verCero?'Sólo pendientes':'Ver saldo 0'?></a></div><div class="card card-hm"><div class="card-body table-responsive"><table class="table table-hover" id="tablaDocs"><thead><tr><th>Código</th><th>Fecha</th><th>Cliente/Proveedor</th><th>Descripción</th><th>Tipo</th><th>Vencimiento</th><th class="text-end">Saldo</th></tr></thead><tbody><?php foreach($documentos as $x):$texto=$x['codigo'].' · '.$x['tercero'].' · '.$x['naturaleza'].' · '.$x['descripcion'].' · Saldo '.numero_py($x['saldo']);?><tr role="button" data-id="<?=$x['id']?>" data-texto="<?=e($texto)?>"><td><?=e($x['codigo'])?></td><td><?=e($x['fecha'])?></td><td><?=e($x['tercero'])?></td><td><?=e($x['descripcion'])?></td><td><?=e($x['naturaleza'])?></td><td><?=e($x['fecha_vencimiento'])?></td><td class="text-end"><?=numero_py($x['saldo'])?></td></tr><?php endforeach;?></tbody></table></div></div></div></main>
<script>origen.onchange=()=>{const cuenta=origen.value==='Cuenta';grupoIE.classList.toggle('d-none',cuenta);grupoCuenta.classList.toggle('d-none',!cuenta);grupoTipo.classList.toggle('d-none',!cuenta)};docTexto.oninput=()=>{const o=[...document.querySelectorAll('#docs option')].find(x=>x.value===docTexto.value);docId.value=o?.dataset.id||''};buscar.oninput=()=>document.querySelectorAll('#tablaDocs tbody tr').forEach(x=>x.hidden=!x.innerText.toLowerCase().includes(buscar.value.toLowerCase()));document.querySelectorAll('#tablaDocs tbody tr').forEach(x=>x.onclick=()=>{docId.value=x.dataset.id;docTexto.value=x.dataset.texto;window.scrollTo({top:0,behavior:'smooth'})});</script><?php include __DIR__.'/../../includes/footer.php';?>
