Fix búsqueda en tiempo real, paginación, OneSignal, bancos/categorías y vistas auth

- ajaxcrud.js: fix race condition en búsqueda, abort de requests en vuelo
- Layout: mover @yield('js') después de app.js para corregir orden de carga
- Paginación: useBootstrapFour() + eliminar wrappers <ul> duplicados en 17 vistas
- OneSignal: migrar de UserTag iChamba_ID a ExternalId en controladores
- API: agregar endpoint GET /api/banks y campos rfc/bank/bank_account/fee en hero()
- Seeders: BanksSeeder (239 bancos) y CategoriesSeeder (100 categorías)
- Auth views: corregir padding/scroll en register, login, password reset

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-16 21:21:44 -06:00
parent fb5caeab6e
commit b34622b289
71 changed files with 3303 additions and 1576 deletions

View File

@@ -12,5 +12,5 @@
@endsection
@section('js')
<script src="{{ asset('js/ajaxcrud.js') }}"></script>
<script src="{{ asset('js/ajaxcrud.js') }}?v={{ filemtime(public_path('js/ajaxcrud.js')) }}"></script>
@endsection

View File

@@ -1,103 +1,73 @@
@extends('layouts.app')
@section('content')
@if (Auth::user()->role_id >= 5)
<div class="container-fluid" style="height:100%">
@include('sidebar')
<div style="width:90%; float: left; margin:1em 0 0 1em">
<div>
@else
<div class="container" style="margin:0 1em">
@endif
@php
$currentField = request('field', 'total_amount');
$currentSort = request('sort', 'desc');
$nextSort = $currentSort === 'asc' ? 'desc' : 'asc';
$sortUrl = fn($f) => url('payments') . '?' . http_build_query(array_filter(['date_from' => $dateFrom, 'date_to' => $dateTo, 'field' => $f, 'sort' => $currentField === $f ? $nextSort : 'desc']));
@endphp
<div class="row">
<div class="col-sm-7">
<h3>Pagos</h3>
</div>
<div class="col-sm-5">
<h3>Pagos a Proveedores</h3>
</div>
<div class="col-sm-7">
<div class="pull-right">
{!! Form::open(['method'=>'GET','url'=>'finishedcontracts','class'=>'navbar-form navbar-left','role'=>'search']) !!}
<div class="input-group">
<input class="form-control" id="search"
value="{{ request()->session()->get('search') }}"
placeholder="Buscar" name="search"
type="text" id="search"/>
<div class="input-group-btn">
<button type="submit" class="btn btn-primary">
<i class="fa fa-search" aria-hidden="true"></i>
</button>
</div>
</div>
{!! Form::open(['method' => 'GET', 'url' => 'payments', 'class' => 'form-inline', 'role' => 'search']) !!}
<label class="mr-2 mb-0">Filtrar</label>
<input type="date" class="form-control mr-1" name="date_from" value="{{ $dateFrom }}">
<input type="date" class="form-control mr-1" name="date_to" value="{{ $dateTo }}">
<button type="submit" class="btn btn-primary mr-1">
<i class="fa fa-filter" aria-hidden="true"></i>
</button>
<a href="{{ url('payments') }}" class="btn btn-default">
<i class="fa fa-times" aria-hidden="true"></i>
</a>
{!! Form::close() !!}
</div>
</div>
</div>
<table class="table">
<thead>
<tr>
<th style="vertical-align: middle"><a href="{{url('payment?field=id&sort='.(request()->session()->get('sort')=='asc'?'desc':'asc'))}}">ID</a></th>
{{request()->session()->get('field')=='id'?(request()->session()->get('sort')=='asc'?'':''):''}}
<th style="vertical-align: middle"><a href="{{url('payment?field=user_id&sort='.(request()->session()->get('sort')=='asc'?'desc':'asc'))}}">Usuario</a></th>
{{request()->session()->get('field')=='user_id'?(request()->session()->get('sort')=='asc'?'':''):''}}
<th style="vertical-align: middle"><a href="{{url('payment?field=membership&sort='.(request()->session()->get('sort')=='asc'?'desc':'asc'))}}">Email</a></th>
{{request()->session()->get('field')=='membership'?(request()->session()->get('sort')=='asc'?'':''):''}}
<th style="vertical-align: middle"><a href="{{url('payment?field=RFC&sort='.(request()->session()->get('sort')=='asc'?'desc':'asc'))}}">RFC o CURP</a></th>
{{request()->session()->get('field')=='RFC'?(request()->session()->get('sort')=='asc'?'':''):''}}
<th style="vertical-align: middle"><a href="{{url('payment?field=clabe&sort='.(request()->session()->get('sort')=='asc'?'desc':'asc'))}}">CLABE</a></th>
{{request()->session()->get('field')=='clabe'?(request()->session()->get('sort')=='asc'?'':''):''}}
<th style="vertical-align: middle"><a href="{{url('payment?field=bank_id&sort='.(request()->session()->get('sort')=='asc'?'desc':'asc'))}}">Banco</a></th>
{{request()->session()->get('field')=='bank_id'?(request()->session()->get('sort')=='asc'?'':''):''}}
<th style="vertical-align: middle"><a href="{{url('payment?field=bank_id&sort='.(request()->session()->get('sort')=='asc'?'desc':'asc'))}}">Código Banco</a></th>
{{request()->session()->get('field')=='bank_id'?(request()->session()->get('sort')=='asc'?'':''):''}}
<th style="vertical-align: middle"><a href="{{url('payment?field=amount&sort='.(request()->session()->get('sort')=='asc'?'desc':'asc'))}}">Monto</a></th>
{{request()->session()->get('field')=='amount'?(request()->session()->get('sort')=='asc'?'':''):''}}
<th style="vertical-align: middle"><a href="{{url('payment?field=revenue&sort='.(request()->session()->get('sort')=='asc'?'desc':'asc'))}}">Utilidad</a></th>
{{request()->session()->get('field')=='revenue'?(request()->session()->get('sort')=='asc'?'':''):''}}
<th style="vertical-align: middle"><a href="{{url('payment?field=IVA&sort='.(request()->session()->get('sort')=='asc'?'desc':'asc'))}}">Retención IVA</a></th>
{{request()->session()->get('field')=='IVA'?(request()->session()->get('sort')=='asc'?'':''):''}}
<th style="vertical-align: middle"><a href="{{url('payment?field=ISR&sort='.(request()->session()->get('sort')=='asc'?'desc':'asc'))}}">Retención ISR</a></th>
{{request()->session()->get('field')=='ISR'?(request()->session()->get('sort')=='asc'?'':''):''}}
<th style="vertical-align: middle"><a href="{{url('payment?field=ichamba_fee&sort='.(request()->session()->get('sort')=='asc'?'desc':'asc'))}}">Retención iChamba</a></th>
{{request()->session()->get('field')=='ichamba_fee'?(request()->session()->get('sort')=='asc'?'':''):''}}
<th style="vertical-align: middle"><a href="{{ $sortUrl('company_name') }}">Proveedor</a></th>
<th style="vertical-align: middle"><a href="{{ $sortUrl('email') }}">Email</a></th>
<th style="vertical-align: middle"><a href="{{ $sortUrl('rfc_curp') }}">RFC / CURP</a></th>
<th style="vertical-align: middle"><a href="{{ $sortUrl('clabe') }}">CLABE</a></th>
<th style="vertical-align: middle"><a href="{{ $sortUrl('bank') }}">Banco</a></th>
<th style="vertical-align: middle"><a href="{{ $sortUrl('contract_count') }}">Contratos</a></th>
<th style="vertical-align: middle"><a href="{{ $sortUrl('total_amount') }}">Monto Total</a></th>
<th style="vertical-align: middle"><a href="{{ $sortUrl('total_revenue') }}">Utilidad</a></th>
<th style="vertical-align: middle"><a href="{{ $sortUrl('total_iva') }}">Ret. IVA</a></th>
<th style="vertical-align: middle"><a href="{{ $sortUrl('total_isr') }}">Ret. ISR</a></th>
<th style="vertical-align: middle"><a href="{{ $sortUrl('total_fee') }}">Ret. JobHero</a></th>
</tr>
</thead>
<tbody>
@php
$i=1;
@endphp
@foreach ($payments as $payment)
<tr>
<th>{{ $payment->id }}</th>
<td>{{ $payment->suppliers->company_name }}</td>
<td >{{ $payment->suppliers->user->email }}</td>
<td >{{ (!$payment->suppliers->RFC) ? $payment->suppliers->CURP : $payment->suppliers->RFC }}</td>
<td >{{ $payment->suppliers->clabe }}</td>
<td >{{ (isset($payment->suppliers->banks->name) ? $payment->suppliers->banks->name : null) }}</td>
<td >{{ (isset($payment->suppliers->banks->code) ? $payment->suppliers->banks->code : null) }}</td>
<td >{{ $payment->amount }}</td>
<td >{{ $payment->revenue }}</td>
<td >{{ $payment->IVA }}</td>
<td >{{ $payment->ISR }}</td>
<td >{{ $payment->ichamba_fee }}</td>
@foreach ($payments as $row)
<tr>
<th>{{ optional($row->suppliers)->company_name ?? '—' }}</th>
<td>{{ optional(optional($row->suppliers)->user)->email ?? '—' }}</td>
<td>{{ optional($row->suppliers)->RFC ?: optional($row->suppliers)->CURP ?? '—' }}</td>
<td>{{ optional($row->suppliers)->clabe ?? '—' }}</td>
<td>{{ optional(optional($row->suppliers)->banks)->name ?? '—' }}</td>
<td>{{ $row->contract_count }}</td>
<td>${{ number_format($row->total_amount, 2) }}</td>
<td>${{ number_format($row->total_revenue, 2) }}</td>
<td>${{ number_format($row->total_iva, 2) }}</td>
<td>${{ number_format($row->total_isr, 2) }}</td>
<td>${{ number_format($row->total_fee, 2) }}</td>
</tr>
@endforeach
</tbody>
</table>
<ul class="pagination">
{{ $payments->links() }}
</ul>
{{ $payments->links() }}
</div>
@endsection