<?php
if($p==='parametros_generales'){
 require_permission('parametros_generales');
 if($_SERVER['REQUEST_METHOD']==='POST'){
  check_csrf();
  if(isset($_POST['nuevo_origen'])){$nombre=poststr('origen_nombre');if($nombre==='')throw new RuntimeException('Indique el origen del capital.');$st=db()->prepare("INSERT INTO origenes_capital(nombre,activo) VALUES(?,1) ON DUPLICATE KEY UPDATE activo=1");$st->bind_param('s',$nombre);$st->execute();flash('success','Origen del capital guardado.');}
  else{$calcula=isset($_POST['calcula_gastos_bcp'])?1:0;$salario=postfloat('salario_minimo');$divisor=postfloat('divisor_prestamo');if($salario<=0||$divisor<=0)throw new RuntimeException('Salario mínimo y divisor deben ser mayores a cero.');$gd=poststr('guaranies_descripcion');$gs=poststr('guaranies_simbolo');$dd=poststr('dolares_descripcion');$ds=poststr('dolares_simbolo');$st=db()->prepare("UPDATE parametros_generales SET calcula_gastos_bcp=?,salario_minimo=?,divisor_prestamo=?,moneda_guaranies_descripcion=?,moneda_guaranies_simbolo=?,moneda_dolares_descripcion=?,moneda_dolares_simbolo=? WHERE id=1");$st->bind_param('iddssss',$calcula,$salario,$divisor,$gd,$gs,$dd,$ds);$st->execute();$st=db()->prepare("UPDATE monedas SET nombre=?,simbolo=? WHERE codigo='PYG'");$st->bind_param('ss',$gd,$gs);$st->execute();$st=db()->prepare("UPDATE monedas SET nombre=?,simbolo=? WHERE codigo='USD'");$st->bind_param('ss',$dd,$ds);$st->execute();flash('success','Parámetros generales actualizados.');}
  redirect('app.php?p=parametros_generales');
 }
 $g=general_params();page_start('Parámetros Generales');?>
 <h2>Parámetros Generales</h2><div class="card mb-4"><div class="card-body"><form method="post"><input type="hidden" name="csrf" value="<?=csrf()?>"><div class="row g-3"><div class="col-md-4"><div class="form-check form-switch mt-4"><input class="form-check-input" type="checkbox" name="calcula_gastos_bcp" id="calculaBCP" <?=$g['calcula_gastos_bcp']?'checked':''?>><label class="form-check-label" for="calculaBCP">Calcular Gastos BCP</label></div><small class="text-muted">Desactivado: el gasto operativo será siempre 0.</small></div><div class="col-md-4"><label class="form-label required">Salario mínimo actual</label><input type="number" step="0.01" min="1" class="form-control" name="salario_minimo" value="<?=e($g['salario_minimo'])?>" required></div><div class="col-md-4"><label class="form-label required">Divisor del préstamo</label><input type="number" step="0.01" min="1" class="form-control" name="divisor_prestamo" value="<?=e($g['divisor_prestamo'])?>" required><small class="text-muted">Los cálculos dividen por este valor × 100.</small></div><div class="col-md-3"><label class="form-label">Descripción Guaraníes</label><input class="form-control" name="guaranies_descripcion" value="<?=e($g['moneda_guaranies_descripcion'])?>" required></div><div class="col-md-3"><label class="form-label">Símbolo Guaraníes</label><input class="form-control" name="guaranies_simbolo" value="<?=e($g['moneda_guaranies_simbolo'])?>" required></div><div class="col-md-3"><label class="form-label">Descripción Dólares</label><input class="form-control" name="dolares_descripcion" value="<?=e($g['moneda_dolares_descripcion'])?>" required></div><div class="col-md-3"><label class="form-label">Símbolo Dólares</label><input class="form-control" name="dolares_simbolo" value="<?=e($g['moneda_dolares_simbolo'])?>" required></div></div><button class="btn btn-primary mt-3">Guardar parámetros</button></form></div></div>
 <div class="card"><div class="card-header">Orígenes del Capital</div><div class="card-body"><form method="post" class="row g-2"><input type="hidden" name="csrf" value="<?=csrf()?>"><div class="col-md-8"><input class="form-control" name="origen_nombre" placeholder="Nuevo origen"></div><div class="col-md-4"><button class="btn btn-primary" name="nuevo_origen" value="1">Agregar</button></div></form><div class="mt-3"><?php foreach(opts('origenes_capital') as $o):?><span class="badge text-bg-light border me-2 p-2"><?=e($o['nombre'])?></span><?php endforeach;?></div></div></div><?php page_end();exit;
}

if($p==='parametros_empresa'){
 require_permission('parametros_empresa');
 if($_SERVER['REQUEST_METHOD']==='POST'){check_csrf();$fields=['nombre','ruc','email','telefono','direccion','ciudad','pais','sitio_web','representante_legal','observaciones'];$values=array_map(fn($f)=>poststr($f),$fields);if($values[0]===''||$values[1]===''||$values[2]==='')throw new RuntimeException('Nombre, RUC y email son obligatorios.');$st=db()->prepare("UPDATE parametros_empresa SET nombre=?,ruc=?,email=?,telefono=?,direccion=?,ciudad=?,pais=?,sitio_web=?,representante_legal=?,observaciones=? WHERE id=1");$st->bind_param('ssssssssss',...$values);$st->execute();flash('success','Datos de la empresa actualizados.');redirect('app.php?p=parametros_empresa');}
 $e=rows("SELECT * FROM parametros_empresa WHERE id=1")[0]??[];page_start('Parámetros Empresa');?>
 <h2>Parámetros Empresa</h2><div class="card"><div class="card-body"><form method="post"><input type="hidden" name="csrf" value="<?=csrf()?>"><div class="row g-3"><?php foreach(['nombre'=>'Nombre o razón social','ruc'=>'RUC','email'=>'Email','telefono'=>'Teléfono','direccion'=>'Dirección','ciudad'=>'Ciudad','pais'=>'País','sitio_web'=>'Sitio web','representante_legal'=>'Representante legal'] as $f=>$label):?><div class="col-md-<?=in_array($f,['nombre','direccion'])?'6':'4'?>"><label class="form-label <?=in_array($f,['nombre','ruc','email'])?'required':''?>"><?=e($label)?></label><input type="<?=$f==='email'?'email':'text'?>" class="form-control" name="<?=$f?>" value="<?=e($e[$f]??'')?>" <?=in_array($f,['nombre','ruc','email'])?'required':''?>></div><?php endforeach;?><div class="col-12"><label class="form-label">Observaciones</label><textarea class="form-control" name="observaciones"><?=e($e['observaciones']??'')?></textarea></div></div><button class="btn btn-primary mt-3">Guardar empresa</button></form></div></div><?php page_end();exit;
}

if($p==='informe_clientes'){
 require_permission('informe_clientes');$cid=(int)($_GET['cliente_id']??0);page_start('Informe de Clientes');?>
 <h2>Informe de saldos por cliente</h2><form class="card card-body mb-4"><input type="hidden" name="p" value="informe_clientes"><div class="row"><div class="col-md-8 autocomplete"><label class="form-label">Cliente</label><input class="form-control lookup" placeholder="Buscar cliente"><input type="hidden" name="cliente_id" value="<?=$cid?>"><div class="autocomplete-results"></div></div><div class="col-md-2 align-self-end"><button class="btn btn-primary">Consultar</button></div></div></form>
 <?php if($cid):?><div class="card"><div class="table-responsive"><table class="table mb-0"><thead><tr><th>Operación</th><th>Documento</th><th>Saldo</th><th>Moratorio</th><th>Punitorio</th><th>G. cobranza</th><th>Total</th><th></th></tr></thead><tbody><?php $last='';foreach(rows("SELECT d.id,m.codigo,m.nombre moneda,m.simbolo,m.decimales FROM operacion_detalles d JOIN operaciones o ON o.id=d.operacion_id JOIN monedas m ON m.id=o.moneda_id WHERE o.cliente_id=$cid ORDER BY m.orden,d.id DESC") as $item):$r=estado_deuda((int)$item['id']);if($last!==$item['codigo']):$last=$item['codigo'];?><tr class="table-primary"><th colspan="8"><?=e($item['moneda'])?></th></tr><?php endif;?><tr><td>#<?=$r['operacion_id']?></td><td><?=money_currency((float)$r['importe'],$item)?></td><td><?=money_currency((float)$r['saldo'],$item)?></td><td><?=money_currency((float)$r['moratorio'],$item)?></td><td><?=money_currency((float)$r['punitorio'],$item)?></td><td><?=money_currency((float)$r['gastos_cobranza'],$item)?></td><td class="fw-bold"><?=money_currency((float)$r['total_adeudado'],$item)?></td><td><a class="btn btn-sm btn-outline-primary" href="?p=operaciones&view=<?=$r['operacion_id']?>">Ver detalle</a></td></tr><?php endforeach;?></tbody></table></div></div><?php endif;?><script>window.BASE_URL='<?=BASE_URL?>';let x=document.querySelector('.lookup');autocomplete(x,x.nextElementSibling,'clientes');</script><?php page_end();exit;
}

if($p==='inventario_cartera'){
 require_permission('inventario_cartera');$clienteId=(int)($_GET['cliente_id']??0);$operacionId=(int)($_GET['operacion_id']??0);$monedaId=(int)($_GET['moneda_id']??0);$tipo=isset($_GET['tipo']);page_start('Inventario de Cartera');?>
 <div class="d-flex justify-content-between mb-3"><div><h2>Inventario de Cartera</h2><p class="text-muted">Saldos vigentes de documentos, separados por moneda.</p></div><?php if($operacionId):?><a class="btn btn-outline-secondary" href="?p=inventario_cartera&cliente_id=<?=$clienteId?>&moneda_id=<?=$monedaId?>">Volver a operaciones</a><?php elseif($clienteId):?><a class="btn btn-outline-secondary" href="?p=inventario_cartera&tipo=descuento&moneda_id=<?=$monedaId?>">Volver a clientes</a><?php endif;?></div>
 <?php if($operacionId):$op=rows("SELECT o.*,m.codigo,m.nombre moneda,m.simbolo,m.decimales,CONCAT(c.nombres,' ',c.apellidos) cliente FROM operaciones o JOIN monedas m ON m.id=o.moneda_id JOIN clientes c ON c.id=o.cliente_id WHERE o.id=$operacionId AND o.cliente_id=$clienteId AND o.moneda_id=$monedaId")[0]??null;if($op):?><div class="card"><div class="card-header">Operación #<?=$operacionId?> · <?=e($op['cliente'])?> · <?=e($op['moneda'])?></div><table class="table mb-0"><thead><tr><th>Documento</th><th>Vencimiento</th><th>Importe</th><th>Saldo</th></tr></thead><tbody><?php $total=0;foreach(rows("SELECT id,vencimiento FROM operacion_detalles WHERE operacion_id=$operacionId ORDER BY vencimiento,id") as $d):$ed=estado_deuda((int)$d['id']);$total+=(float)$ed['saldo'];?><tr><td>#<?=$d['id']?></td><td><?=e($d['vencimiento'])?></td><td><?=money_currency((float)$ed['importe'],$op)?></td><td class="fw-bold"><?=money_currency((float)$ed['saldo'],$op)?></td></tr><?php endforeach;?><tr class="table-primary fw-bold"><td colspan="3">Total operación</td><td><?=money_currency($total,$op)?></td></tr></tbody></table></div><?php endif;
 elseif($clienteId):$cl=rows("SELECT * FROM clientes WHERE id=$clienteId")[0]??null;$moneda=rows("SELECT * FROM monedas WHERE id=$monedaId")[0]??null;if($cl&&$moneda):?><div class="card"><div class="card-header"><?=e($cl['razon_social']?:trim($cl['nombres'].' '.$cl['apellidos']))?> · <?=e($moneda['nombre'])?></div><table class="table mb-0"><thead><tr><th>Operación</th><th>Fecha</th><th>Moneda</th><th>Saldo</th><th></th></tr></thead><tbody><?php foreach(rows("SELECT o.id,o.fecha,m.codigo,m.nombre moneda,m.simbolo,m.decimales FROM operaciones o JOIN monedas m ON m.id=o.moneda_id WHERE o.cliente_id=$clienteId AND o.moneda_id=$monedaId ORDER BY o.id DESC") as $o):$saldo=total_saldos('o.id='.(int)$o['id']);if($saldo<=.009)continue;?><tr><td>#<?=$o['id']?></td><td><?=e($o['fecha'])?></td><td><?=e($o['moneda'])?></td><td class="fw-bold"><?=money_currency($saldo,$o)?></td><td><a class="btn btn-sm btn-outline-primary" href="?p=inventario_cartera&cliente_id=<?=$clienteId?>&operacion_id=<?=$o['id']?>&moneda_id=<?=$monedaId?>">Ver documentos</a></td></tr><?php endforeach;?></tbody></table></div><?php endif;
 elseif($tipo&&$monedaId):$moneda=rows("SELECT * FROM monedas WHERE id=$monedaId AND activo=1")[0]??null;if($moneda):?><div class="card"><div class="card-header fw-bold">Descuento de Documentos · <?=e($moneda['nombre'])?></div><table class="table mb-0"><thead><tr><th>Cliente</th><th>Documento</th><th>Moneda</th><th>Saldo</th><th></th></tr></thead><tbody><?php foreach(rows("SELECT DISTINCT c.id,c.documento,c.nombres,c.apellidos,c.razon_social,m.id moneda_id,m.codigo,m.nombre moneda,m.simbolo,m.decimales FROM clientes c JOIN operaciones o ON o.cliente_id=c.id JOIN monedas m ON m.id=o.moneda_id WHERE o.moneda_id=$monedaId ORDER BY c.nombres,c.apellidos") as $cl):$saldo=total_saldos('o.cliente_id='.(int)$cl['id'].' AND o.moneda_id='.(int)$cl['moneda_id']);if($saldo<=.009)continue;?><tr><td><?=e($cl['razon_social']?:trim($cl['nombres'].' '.$cl['apellidos']))?></td><td><?=e($cl['documento'])?></td><td><?=e($cl['moneda'])?></td><td class="fw-bold"><?=money_currency($saldo,$cl)?></td><td><a class="btn btn-sm btn-outline-primary" href="?p=inventario_cartera&cliente_id=<?=$cl['id']?>&moneda_id=<?=$monedaId?>">Ver operaciones</a></td></tr><?php endforeach;?></tbody></table></div><?php endif;
 else:?><div class="row g-3"><?php foreach(rows("SELECT * FROM monedas WHERE activo=1 ORDER BY orden") as $m):$saldo=total_saldos('o.moneda_id='.(int)$m['id']);?><div class="col-md-6"><a class="text-decoration-none" href="?p=inventario_cartera&tipo=descuento&moneda_id=<?=$m['id']?>"><div class="card"><div class="card-body"><h5>Descuento de Documentos · <?=e($m['nombre'])?></h5><div class="display-6 fw-bold text-primary"><?=money_currency($saldo,$m)?></div></div></div></a></div><?php endforeach;?></div><?php endif;page_end();exit;
}

if($p==='cheques_depositar'){
 require_permission('cheques_depositar');$desde=$_GET['desde']??date('Y-m-01');$hasta=$_GET['hasta']??date('Y-m-t');page_start('Lista de Cheques a Depositar');?>
 <h2>Lista de Cheques a Depositar</h2><form class="card card-body mb-4"><input type="hidden" name="p" value="cheques_depositar"><div class="row g-3"><div class="col-md-4"><label class="form-label">Desde</label><input type="date" class="form-control" name="desde" value="<?=e($desde)?>" required></div><div class="col-md-4"><label class="form-label">Hasta</label><input type="date" class="form-control" name="hasta" value="<?=e($hasta)?>" required></div><div class="col-md-2 align-self-end"><button class="btn btn-primary">Consultar</button></div></div></form>
 <?php $st=db()->prepare("SELECT d.id,d.importe,d.vencimiento,d.nro_cheque,d.cuenta_corriente,o.id operacion_id,m.codigo,m.nombre moneda,m.simbolo,m.decimales,COALESCE(b.nombre,'') banco,CONCAT(c.nombres,' ',c.apellidos) cliente,COALESCE(NULLIF(TRIM(CONCAT(f.nombres,' ',f.apellidos)),''),f.razon_social,'') firmante FROM operacion_detalles d JOIN operaciones o ON o.id=d.operacion_id JOIN monedas m ON m.id=o.moneda_id JOIN clientes c ON c.id=o.cliente_id LEFT JOIN bancos b ON b.id=d.banco_id LEFT JOIN clientes f ON f.id=d.firmante_id WHERE d.vencimiento BETWEEN ? AND ? AND COALESCE(d.nro_cheque,'')<>'' ORDER BY m.orden,d.vencimiento,o.id");$st->bind_param('ss',$desde,$hasta);$st->execute();$items=$st->get_result()->fetch_all(MYSQLI_ASSOC);$visible=[];foreach($items as $item){$deuda=estado_deuda((int)$item['id']);if(($deuda['saldo']??0)>0.009)$visible[]=$item;}?>
 <div class="card"><div class="table-responsive"><table class="table table-hover mb-0"><thead><tr><th>Vencimiento</th><th>Cliente</th><th>Operación</th><th>Importe documento</th><th>Banco</th><th>Nro. cheque</th><th>Cuenta corriente</th><th>Firmante</th></tr></thead><tbody><?php $last='';foreach($visible as $r):if($last!==$r['codigo']):$last=$r['codigo'];?><tr class="table-primary"><th colspan="8"><?=e($r['moneda'])?></th></tr><?php endif;?><tr><td><?=e($r['vencimiento'])?></td><td><?=e($r['cliente'])?></td><td>#<?=$r['operacion_id']?></td><td><?=money_currency((float)$r['importe'],$r)?></td><td><?=e($r['banco'])?></td><td><?=e($r['nro_cheque'])?></td><td><?=e($r['cuenta_corriente'])?></td><td><?=e($r['firmante'])?></td></tr><?php endforeach;if(!$visible):?><tr><td colspan="8" class="text-center text-muted py-4">No hay cheques con saldo en el período.</td></tr><?php endif;?></tbody></table></div></div><?php page_end();exit;
}

if($p==='borrado_especial'){
 require_permission('borrado_especial');$cid=(int)($_GET['cliente_id']??$_POST['cliente_id']??0);$oid=(int)($_GET['operacion_id']??$_POST['operacion_id']??0);
 if($_SERVER['REQUEST_METHOD']==='POST'&&isset($_POST['eliminar'])){check_csrf();$check=rows("SELECT id FROM operaciones WHERE id=$oid AND cliente_id=$cid")[0]??null;if(!$check)throw new RuntimeException('La operación seleccionada no corresponde al cliente.');$cn=db();$cn->begin_transaction();try{$cn->query("DELETE ca FROM cobro_aplicaciones ca JOIN cobros co ON co.id=ca.cobro_id JOIN operacion_detalles d ON d.id=co.operacion_detalle_id WHERE d.operacion_id=$oid");$cn->query("DELETE co FROM cobros co JOIN operacion_detalles d ON d.id=co.operacion_detalle_id WHERE d.operacion_id=$oid");$cn->query("DELETE FROM operaciones WHERE id=$oid");$cn->commit();audit('BORRADO ESPECIAL','operaciones',$oid,'Operación, detalles y pagos eliminados');flash('success','Operación, detalles y pagos eliminados.');redirect('app.php?p=borrado_especial');}catch(Throwable $e){$cn->rollback();throw $e;}}
 page_start('Eliminar Operación');?>
 <h2>Eliminar Operación</h2><div class="alert alert-warning"><strong>Atención:</strong> esta opción elimina definitivamente la operación, sus documentos y todos sus pagos.</div><form method="get" class="card card-body mb-4"><input type="hidden" name="p" value="borrado_especial"><div class="row g-3"><div class="col-md-8 autocomplete"><label class="form-label required">Cliente</label><input class="form-control lookup" placeholder="Buscar cliente"><input type="hidden" name="cliente_id" value="<?=$cid?>"><div class="autocomplete-results"></div></div><div class="col-md-2 align-self-end"><button class="btn btn-primary">Ver operaciones</button></div></div></form><?php if($cid):?><div class="card"><div class="table-responsive"><table class="table mb-0"><thead><tr><th>Operación</th><th>Fecha</th><th>Moneda</th><th>Importe</th><th></th></tr></thead><tbody><?php foreach(rows("SELECT o.*,m.nombre moneda,m.codigo,m.simbolo,m.decimales FROM operaciones o JOIN monedas m ON m.id=o.moneda_id WHERE o.cliente_id=$cid ORDER BY m.orden,o.id DESC") as $o):?><tr><td>#<?=$o['id']?></td><td><?=e($o['fecha'])?></td><td><?=e($o['moneda'])?></td><td><?=money_currency((float)$o['total_importe'],$o)?></td><td><form method="post" onsubmit="return confirm('¿Eliminar definitivamente esta operación, todos sus documentos y pagos?')"><input type="hidden" name="csrf" value="<?=csrf()?>"><input type="hidden" name="cliente_id" value="<?=$cid?>"><input type="hidden" name="operacion_id" value="<?=$o['id']?>"><button class="btn btn-sm btn-danger" name="eliminar" value="1">Eliminar</button></form></td></tr><?php endforeach;?></tbody></table></div></div><?php endif;?><script>window.BASE_URL='<?=BASE_URL?>';let x=document.querySelector('.lookup');autocomplete(x,x.nextElementSibling,'clientes');</script><?php page_end();exit;
}
