Mejoras en la autorización de reembolsos para Boilerplate Service Layer
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">×</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
- Obtener enlace
- X
- Correo electrónico
- Otras aplicaciones
Comentarios
Publicar un comentario