Mejoras en la autorización de reembolsos para Boilerplate Service Layer

GitHub commit banner

Mejoras en la autorización de reembolsos para Boilerplate Service Layer

En el mundo del desarrollo, la autorización de reembolsos es un proceso crucial que requiere una atención al detalle y una gestión efectiva. En este sentido, un desarrollador ha aportado cambios significativos en la capa de servicio de boilerplate para mejorar la autorización de reembolsos.

📁 julio101290/boilerplateservicelayer

🔧 Commit  62caea77

Changes for authorize refunds

📁 Repositorio julio101290/boilerplateservicelayer
🔑 SHA 62caea77b9a26da6e52897ff0598d78ca26182df
✍️ Autor Julio Cesar Leyva Rodriguez <juliocesarleyvarodriguez@hotmail.com>
🕐 Fecha 2026-06-05T16:06:43Z
📊 Cambios 5 archivo(s)  ·  +942   -1  ·  943 líneas

📂 Archivos modificados (5)

📄 src/Config/Routes.php ✏️ modificado +25 -0
🖥️ Diff — PHP
@@ -164,4 +164,29 @@
'CFDISAPController::procesarAnalisisCFDI',
['namespace' => 'julio101290\boilerplateservicelayer\Controllers']
);
+
+ $routes->get('refundsauth',
+ 'RefundsAuthController::index',
+ [
+ 'namespace' => 'julio101290\boilerplateservicelayer\Controllers',
+ 'filter' => 'permission:refundsauth-permission',
+ ]
+ );
+
+ $routes->get('servicelayer/refundsauth',
+ 'RefundsAuthController::index',
+ [
+ 'namespace' => 'julio101290\boilerplateservicelayer\Controllers',
+ ]
+ );
+
+ //$routes->get('refundsauth', 'RefundsAuthController::index');
+ $routes->post('refundsauth/authorizeVoucher', 'RefundsAuthController::authorizeVoucher');
+
+ $routes->post('servicelayer/refundsauth/showVoucherDetails'
+ , 'RefundsAuthController::showVoucherDetails'
+ ,[
+ 'namespace' => 'julio101290\boilerplateservicelayer\Controllers',
+ ]
+ );
});
📄 src/Controllers/RefundsAuthController.php ➕ añadido +612 -0
🖥️ Diff — PHP
@@ -0,0 +1,612 @@
+<?php
+
+namespace julio101290\boilerplateservicelayer\Controllers;
+
+use App\Controllers\BaseController;
+use julio101290\boilerplateservicelayer\Models\SapservicelayerModel;
+use julio101290\boilerplateservicelayer\Controllers\SapservicelayerController;
+use julio101290\boilerplateservicelayer\Models\User_sap_linkModel;
+use CodeIgniter\API\ResponseTrait;
+use julio101290\boilerplatelog\Models\LogModel;
+use julio101290\boilerplatecompanies\Models\EmpresasModel;
+use julio101290\boilerplate\Models\UserModel;
+use julio101290\boilerplatecompanies\Models\UsuariosempresaModel;
+
+class RefundsAuthController extends BaseController {
+
+ use ResponseTrait;
+
+ protected $log;
+ protected $user_sap_link;
+ protected $empresa;
+ protected $serviceLayerController;
+ protected $serviceLayerModel;
+ protected $users;
+ protected $usersPerCompanie;
+
+ public function __construct() {
+ $this->user_sap_link = new User_sap_linkModel();
+ $this->log = new LogModel();
+ $this->empresa = new EmpresasModel();
+ $this->serviceLayerController = new SapservicelayerController();
+ $this->serviceLayerModel = new SapservicelayerModel();
+ $this->users = new UserModel();
+ $this->usersPerCompanie = new UsuariosempresaModel();
+
+ helper(['menu', 'utilerias']);
+ }
+
+ // -----------------------------------------------------------------
+ // Vista principal (DataTable)
+ // -----------------------------------------------------------------
+ public function index() {
+ helper('auth');
+
+ $idUser = user()->id;
+ $titulos["empresas"] = $this->empresa->mdlEmpresasPorUsuario($idUser);
+
+ if ($this->request->isAJAX()) {
+ $request = service('request');
+
+ $draw = (int) $request->getGet('draw');
+ $start = (int) $request->getGet('start');
+ $length = (int) $request->getGet('length');
+ $searchValue = trim($request->getGet('search')['value'] ?? '');
+ $orderColumnIndex = (int) ($request->getGet('order')[0]['column'] ?? 0);
+ $orderDir = strtolower($request->getGet('order')[0]['dir'] ?? 'asc');
+
+ // Columnas permitidas para ordenar
+ $columns = [

… diff truncado a 60 líneas

📄 src/Database/Seeds/BoilerplateServiceLayer.php ✏️ modificado +5 -1
🖥️ Diff — PHP
@@ -42,6 +42,9 @@ public function run() {
$this->authorize->createPermission('reqauth-permission', 'Permisos para autorizar requisiciones del SAP');
$this->authorize->createPermission('poauth-permission', 'Permiso Para Autorizar');
$this->authorize->createPermission('analizadorCFDI-permission', 'Permiso Analizar CFDI');
+ $this->authorize->createPermission('refundsauth-permission', 'Permiso para autorizar rembolsos');
+
+
@@ -51,8 +54,9 @@ public function run() {
$this->authorize->addPermissionToUser('reqauth-permission', 1);
$this->authorize->addPermissionToUser('poauth-permission', 1);
$this->authorize->addPermissionToUser('analizadorCFDI-permission', 1);
+ $this->authorize->addPermissionToUser('refundsauth-permission', 1);
+
}
-
public function down() {
//
}
📄 src/Views/modulesAuthRefunds/modalShowVoucherDetails.php ➕ añadido +53 -0
🖥️ Diff — PHP
@@ -0,0 +1,53 @@
+<!-- Modal responsivo para mostrar líneas del comprobante (GLO_VODE) -->
+<div class="modal fade" id="modalShowVoucherDetails" tabindex="-1" role="dialog" aria-labelledby="modalVoucherDetailsLabel" aria-hidden="true">
+ <div class="modal-dialog modal-dialog-scrollable modal-xl" role="document">
+ <div class="modal-content shadow-sm">
+ <div class="modal-header bg-info text-white">
+ <h5 class="modal-title" id="modalVoucherDetailsLabel">Detalle del Comprobante</h5>
+ <button type="button" class="close text-white" data-dismiss="modal" aria-label="Cerrar">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ </div>
+ <div class="modal-body p-0">
+ <div id="modalVoucherDetailsBody" class="p-3">
+ <!-- Aquí se inyectará la tabla o mensaje -->
+ <div class="text-center py-4">
+ <i class="fas fa-spinner fa-pulse fa-2x text-info"></i>
+ <p class="mt-2">Cargando líneas...</p>
+ </div>
+ </div>
+ </div>
+ <div class="modal-footer bg-light">
+ <button type="button" class="btn btn-secondary" data-dismiss="modal">
+ <i class="fas fa-times mr-1"></i>Cerrar
+ </button>
+ </div>
+ </div>
+ </div>
+</div>
+
+<style>
+ /* Ajustes responsivos para la tabla dentro del modal */
+ #modalVoucherDetailsBody .table-responsive {
+ border-radius: 0.5rem;
+ overflow-x: auto;
+ }
+ #modalVoucherDetailsBody table {
+ min-width: 800px; /* Permite scroll horizontal en móviles */
+ font-size: 0.85rem;
+ }
+ #modalVoucherDetailsBody th,
+ #modalVoucherDetailsBody td {
+ vertical-align: middle;
+ white-space: nowrap;
+ }
+ @media (max-width: 576px) {
+ #modalVoucherDetailsBody table {
+ font-size: 0.75rem;
+ }
+ #modalVoucherDetailsBody th,
+ #modalVoucherDetailsBody td {
+ padding: 0.4rem 0.3rem;
+ }
+ }
+</style>
\ No newline at end of file
📄 src/Views/refundsAuth.php ➕ añadido +247 -0
🖥️ Diff — PHP
@@ -0,0 +1,247 @@
+<?php
+/**
+ * Vista: Autorización de Comprobantes (Refunds/Vouchers)
+ * Adaptado de la vista de autorización de pedidos de compra.
+ */
+?>
+<?= $this->include('julio101290\boilerplate\Views\load\select2') ?>
+<?= $this->include('julio101290\boilerplate\Views\load\datatables') ?>
+<?= $this->include('julio101290\boilerplate\Views\load\nestable') ?>
+<?= $this->extend('julio101290\boilerplate\Views\layout\sweetalert') ?>
+<?= $this->extend('julio101290\boilerplate\Views\layout\index') ?>
+<?= $this->section('content') ?>
+<?= $this->include('julio101290\boilerplateservicelayer\Views\modulesAuthRefunds/modalShowVoucherDetails') ?>
+
+<div class="card card-default">
+ <div class="card-header">
+ <h3 class="card-title">Comprobantes pendientes de autorización</h3>
+ </div>
+ <div class="card-body">
+ <div class="row">
+ <div class="col-md-12">
+ <div class="table-responsive">
+ <table id="tableAuthVouchers" class="table table-striped table-hover va-middle">
+ <thead>
+ <tr>
+ <th>Acciones</th>
+ <th>Folio</th>
+ <th>Área</th>
+ <th>Empleado</th>
+ <th>Comentarios</th>
+ <th>Fecha</th>
+ <th>Total</th>
+ <th>Tipo Comprobante</th>
+ <th>Sucursal</th>
+ <th>Usuario Creación</th>
+ </tr>
+ </thead>
+ <tbody></tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+<?= $this->endSection() ?>
+
+<?= $this->section('js') ?>
+<script>
+ // Helper formato moneda
+ function fmtMoney(val) {
+ if (val === null || typeof val === 'undefined' || val === '')
+ return '';
+ var n = parseFloat(val);
+ if (isNaN(n))
+ return '';
+ try {
+ return new Intl.NumberFormat(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}).format(n);
+ } catch (e) {
+ return n.toFixed(2);

… diff truncado a 60 líneas

🔗 Ver commit completo en GitHub →

⚡ César Systems — Blog técnico automatizado

Comentarios

Entradas populares