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

@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Pagination\LengthAwarePaginator;
use Carbon\Carbon;
use App\Models\User;
use App\Models\Suppliers;
@@ -25,32 +26,71 @@ class PaymentController extends Controller
public function index(Request $request)
{
//
$request->session()->put('search', $request
->has('search') ? strip_tags($request->get('search')) : ($request->session()
->has('search') ? strip_tags($request->session()->get('search')) : ''));
$dateFrom = $request->has('date_from') ? strip_tags($request->get('date_from')) : $request->session()->get('pay_date_from', '');
$dateTo = $request->has('date_to') ? strip_tags($request->get('date_to')) : $request->session()->get('pay_date_to', '');
$request->session()->put('field', $request
->has('field') ? strip_tags($request->get('field')) : ($request->session()
->has('field') ? strip_tags($request->session()->get('field')) : 'id'));
if ($request->has('date_from')) $request->session()->put('pay_date_from', $dateFrom);
if ($request->has('date_to')) $request->session()->put('pay_date_to', $dateTo);
$request->session()->put('sort', $request
->has('sort') ? strip_tags($request->get('sort')) : ($request->session()
->has('sort') ? strip_tags($request->session()->get('sort')) : 'asc'));
$contracts = FinishedContracts::with(['suppliers.user', 'suppliers.banks'])
->where('status_id', 3)
->where('paid', false)
->where('transaction_id', '!=', 'NO APPLY')
->when($dateFrom, fn($q) => $q->whereDate('appointment', '>=', $dateFrom))
->when($dateTo, fn($q) => $q->whereDate('appointment', '<=', $dateTo))
->get();
//$headers = $request->get('header') != '' ? $request->get('header') : -1;
$field = in_array($request->input('field'), ['company_name', 'email', 'rfc_curp', 'clabe', 'bank', 'contract_count', 'total_amount', 'total_revenue', 'total_iva', 'total_isr', 'total_fee'])
? $request->input('field')
: 'total_amount';
$sort = $request->input('sort', 'desc') === 'asc' ? 'asc' : 'desc';
$payments = new FinishedContracts();
$payments = $payments->where('status_id', 3)->where('paid', false)->where('transaction_id', '!=', 'NO APPLY')
->orderBy(strip_tags($request->session()->get('field')), strip_tags($request->session()->get('sort')))
->paginate(10);
$grouped = $contracts->groupBy('supplier_id')->map(function ($group) {
$first = $group->first();
return (object) [
'suppliers' => $first->suppliers,
'contract_count' => $group->count(),
'total_amount' => $group->sum('amount'),
'total_revenue' => $group->sum('revenue'),
'total_iva' => $group->sum('IVA'),
'total_isr' => $group->sum('ISR'),
'total_fee' => $group->sum('ichamba_fee'),
];
})->values();
$sortCallbacks = [
'company_name' => fn($r) => optional($r->suppliers)->company_name,
'email' => fn($r) => optional(optional($r->suppliers)->user)->email,
'rfc_curp' => fn($r) => optional($r->suppliers)->RFC ?: optional($r->suppliers)->CURP,
'clabe' => fn($r) => optional($r->suppliers)->clabe,
'bank' => fn($r) => optional(optional($r->suppliers)->banks)->name,
'contract_count' => fn($r) => $r->contract_count,
'total_amount' => fn($r) => $r->total_amount,
'total_revenue' => fn($r) => $r->total_revenue,
'total_iva' => fn($r) => $r->total_iva,
'total_isr' => fn($r) => $r->total_isr,
'total_fee' => fn($r) => $r->total_fee,
];
$grouped = $sort === 'asc'
? $grouped->sortBy($sortCallbacks[$field])->values()
: $grouped->sortByDesc($sortCallbacks[$field])->values();
$perPage = 15;
$page = $request->input('page', 1);
$payments = new LengthAwarePaginator(
$grouped->slice(($page - 1) * $perPage, $perPage)->values(),
$grouped->count(),
$perPage,
$page,
['path' => $request->url(), 'query' => $request->query()]
);
if ($request->ajax()) {
return view('payments.index', compact('payments'));
} else {
return view('payments.ajax', compact('payments'));
}
return view('payments.index', compact('payments', 'dateFrom', 'dateTo'));
} else {
return view('payments.ajax', compact('payments', 'dateFrom', 'dateTo'));
}
}
public function cardsindex(Request $request)