@extends('fragments.fullTemplate') @section('titulo') Pagos programados Bancos @endsection @section('estilos') @include('Bancos.Real.partials._styles') @endsection @section('contenido') @php $activePage = 'programados'; $money = function ($amount, $currency = 'MXN') { return ($currency === 'USD' ? 'US$' : '$') . number_format((float) $amount, 2, '.', ','); }; $fmt = function ($date) { return \App\Services\BancoFechaService::formatoVista($date); }; $inputDateTime = function ($date) { return $date ? str_replace(' ', 'T', \App\Services\BancoFechaService::normalizarEntrada($date)) : ''; }; $areaNegocioValue = function ($area) use ($catalogos) { $areaNormalizada = trim((string) $area); $unidad = collect($catalogos['unidades_negocio'] ?? [])->first(function ($item) use ($areaNormalizada) { return (string) $item['id'] === $areaNormalizada || mb_strtolower((string) $item['clave']) === mb_strtolower($areaNormalizada) || mb_strtolower((string) $item['nombre']) === mb_strtolower($areaNormalizada); }); return $unidad ? $unidad['id'] : $areaNormalizada; }; $programStatusClass = function ($status) { if ($status === 'Activa') return 'status-ok'; if ($status === 'Pausada') return 'status-warn'; if ($status === 'Finalizada') return 'status-blue'; return 'status-danger'; }; $movementStatusClass = function ($status) { if (in_array($status, ['Aplicado', 'Generado'], true)) return 'status-ok'; if (in_array($status, ['Pendiente', 'Programado', 'Pendiente de autorizacion', 'Pendiente importe variable'], true)) return 'status-warn'; if ($status === 'Detenido') return 'status-danger'; if ($status === 'Cancelado') return 'status-danger'; return 'status-muted'; }; $movementStatusLabel = function ($status) { if ($status === 'Pendiente de autorizacion') return 'Pendiente de autorizacion'; if ($status === 'Pendiente importe variable') return 'Pendiente de importe variable'; return $status ?: '-'; }; $programacionesConAlerta = $pagosProgramados->filter(function ($programado) { $cuentaConProblema = $programado->cuenta && in_array($programado->cuenta->estatus, ['Bloqueada', 'Inactiva'], true); $detenidas = $programado->movimientosGenerados->where('estatus', 'Detenido')->count() > 0; $variablesPendientes = $programado->tipo_pago === 'Variable' && $programado->movimientosGenerados->where('estatus', 'Pendiente importe variable')->count() > 0; $vencidasSinGenerar = $programado->movimientosGenerados->filter(function ($ejecucion) { return !$ejecucion->id_banco_movimiento && in_array($ejecucion->estatus, ['Pendiente', 'Pendiente importe variable'], true) && \App\Services\BancoFechaService::normalizarEntrada($ejecucion->fecha_programada) <= \App\Services\BancoFechaService::ahoraSql(); })->count() > 0; $autorizacionPendiente = $programado->autorizaciones ? $programado->autorizaciones->where('estatus', 'Pendiente')->count() > 0 : false; return $cuentaConProblema || $detenidas || $variablesPendientes || $vencidasSinGenerar || $autorizacionPendiente; })->count(); $programadosJson = $pagosProgramados->mapWithKeys(function ($programado) use ($inputDateTime, $areaNegocioValue, $fmt) { return [$programado->id_banco_pago_programado => [ 'id_banco_pago_programado' => $programado->id_banco_pago_programado, 'nombre_programacion' => $programado->nombre_programacion, 'tipo_pago' => $programado->tipo_pago, 'tipo_movimiento' => $programado->tipo_movimiento, 'estatus' => $programado->estatus, 'id_banco_cuenta' => $programado->id_banco_cuenta, 'area_negocio' => $areaNegocioValue($programado->area_negocio), 'entidad_tipo' => $programado->entidad_tipo, 'entidad_id' => $programado->entidad_id, 'entidad_nombre' => $programado->entidad_nombre, 'concepto' => $programado->concepto, 'descripcion' => $programado->descripcion, 'monto_base' => $programado->monto_base, 'moneda' => $programado->moneda, 'periodicidad' => $programado->periodicidad, 'vigencia_tipo' => $programado->vigencia_tipo ?: 'fecha', 'fecha_inicio' => $inputDateTime($programado->fecha_inicio), 'fecha_termino' => $inputDateTime($programado->fecha_termino), 'numero_pagos' => $programado->numero_pagos, 'proxima_ejecucion' => $inputDateTime($programado->proxima_ejecucion), 'preautorizado' => (int) $programado->preautorizado, 'fecha_autorizacion' => $inputDateTime($programado->fecha_autorizacion), 'fecha_autorizacion_vista' => $programado->fecha_autorizacion ? $fmt($programado->fecha_autorizacion) : '', 'creado_por_nombre' => $programado->creador ? $programado->creador->nombre_completo : '', 'autorizado_por_nombre' => $programado->autorizadoPor ? $programado->autorizadoPor->nombre_completo : '', 'monto_maximo_permitido' => $programado->monto_maximo_permitido, 'requiere_autorizacion_si_excede' => (int) $programado->requiere_autorizacion_si_excede, 'observaciones' => $programado->observaciones, 'calendario' => $programado->movimientosGenerados->sortBy('fecha_programada')->map(function ($generado) { return [ 'fecha_programada' => \App\Services\BancoFechaService::normalizarEntrada($generado->fecha_programada), 'estatus' => $generado->estatus, 'bloqueado' => $generado->id_banco_movimiento ? 1 : 0, ]; })->values()->all(), 'update_url' => route('bancos.real.programados.update', $programado->id_banco_pago_programado), ]]; }); @endphp
@include('Bancos.Real.partials._notificaciones')
@include('Bancos.Real.partials._toolbar') @if(session('success'))
{{ session('success') }}
@endif @if(session('error'))
{{ session('error') }}
@endif

Pagos programados

Pagos fijos y variables conectados al módulo Bancos.
El calendario se genera con periodicidad, fecha de inicio y fecha de término; los pagos variables quedan pendientes hasta capturar importe.
{{ csrf_field() }}
Activas
{{ $pagosProgramados->where('estatus', 'Activa')->count() }}
Generan según calendario si la cuenta lo permite.
Variables
{{ $pagosProgramados->where('tipo_pago', 'Variable')->count() }}
Requieren captura de importe antes de aplicar.
Preautorizadas
{{ $pagosProgramados->where('preautorizado', 1)->count() }}
Ejecuciones sin autorización adicional salvo reglas configuradas.
Con alerta
{{ $programacionesConAlerta }}
Programaciones que requieren revisión antes de generar movimientos.
@forelse($pagosProgramados as $programado) @php $cuentaEstatus = $programado->cuenta ? $programado->cuenta->estatus : 'No disponible'; $cuentaStatusClass = $cuentaEstatus === 'Bloqueada' ? 'status-bloqueada' : ($cuentaEstatus === 'Inactiva' ? 'status-danger' : 'status-ok'); @endphp @empty @endforelse
Nombre de programación Tipo de importe Tipo de movimiento Cuenta Entidad relacionada Concepto Monto base Periodicidad Fecha inicio Fecha término Número de pagos Próxima ejecución Pagos generados Pagos restantes Estatus Preautorizado Acciones
{{ $programado->nombre_programacion }}
{{ $programado->folio }}
{{ $programado->tipo_pago }} {{ $programado->tipo_movimiento }} {{ $programado->cuenta ? $programado->cuenta->nombre_cuenta : '-' }}
{{ $cuentaEstatus }} @if(in_array($cuentaEstatus, ['Bloqueada', 'Inactiva'], true))
No genera movimientos.
@endif
{{ $programado->entidad_nombre ?: '-' }} {{ $programado->concepto }} {{ $programado->tipo_pago === 'Variable' && (float) $programado->monto_base <= 0 ? 'Variable' : $money($programado->monto_base, $programado->moneda) }} {{ $programado->periodicidad }} {{ $fmt($programado->fecha_inicio) }} {{ $fmt($programado->fecha_termino) }} {{ $programado->numero_pagos }} {{ $fmt($programado->proxima_ejecucion) }} {{ $programado->pagos_generados }} {{ $programado->pagos_restantes }} {{ $programado->estatus }} {{ $programado->preautorizado ? 'Preautorizado' : 'Requiere revision' }} @if($programado->tipo_pago === 'Variable')
Max: {{ $money($programado->monto_maximo_permitido, $programado->moneda) }}
@endif
@if($programado->estatus === 'Pausada')
{{ csrf_field() }}
@else
{{ csrf_field() }}
@endif
{{ csrf_field() }}
Sin pagos programados registrados.

Historial de ejecuciones por programación

@forelse($movimientosProgramados as $movimientoProgramado) @empty @endforelse
Folio de programación Nombre de programación Próximo no. pago Próxima fecha programada Fecha ejecución real Movimiento bancario Estatus Cuenta Monto Usuario/proceso Acciones
{{ $movimientoProgramado->programacion_folio }} {{ $movimientoProgramado->nombre }} {{ $movimientoProgramado->numero_pago }} {{ $fmt($movimientoProgramado->fecha_programada) }} {{ $fmt($movimientoProgramado->fecha_generacion) }} {{ $movimientoProgramado->movimiento }} {{ $movementStatusLabel($movimientoProgramado->estatus) }} {{ $movimientoProgramado->cuenta }} {{ $money($movimientoProgramado->monto, $movimientoProgramado->moneda) }} {{ $movimientoProgramado->usuario }}
Sin calendario de ejecuciones registrado.
@foreach($pagosProgramados as $programadoDetalle) @endforeach @include('Bancos.Real.partials._modal_pago_programado') @include('Bancos.Real.partials._security_timer') @include('Bancos.Real.partials._highlight_row')
@endsection