Merge branch 'main' into fix/permisos-mensajeria-sidebar

This commit is contained in:
amazuecos
2025-04-06 09:40:09 +02:00
27 changed files with 529 additions and 414 deletions

View File

@ -13,8 +13,7 @@ declare(strict_types=1);
namespace Config;
use App\Entities\Usuarios\UsersEntity;
use App\Models\UserModel;
use App\Models\Usuarios\UserModel;
use CodeIgniter\Shield\Authentication\Authenticators\JWT;
use CodeIgniter\Shield\Authentication\Passwords\ValidationRules;
use CodeIgniter\Shield\Config\Auth as ShieldAuth;

View File

@ -384,7 +384,7 @@ class Cliente extends \App\Controllers\BaseResourceController
{
$data = ['' => lang('Basic.global.pleaseSelectA', [mb_strtolower(lang('Users.user'))])];
if (!is_null($selId)) :
$userModel = model('App\Models\UserModel');
$userModel = model('App\Models\Usuarios\UserModel');
$selOption = $userModel->where('id', $selId)->findColumn('first_name');
if (!empty($selOption)) :
@ -414,7 +414,7 @@ class Cliente extends \App\Controllers\BaseResourceController
{
$data = ['' => lang('Basic.global.pleaseSelectA', [mb_strtolower(lang('Users.user'))])];
if (!is_null($selId)) :
$userModel = model('App\Models\UserModel');
$userModel = model('App\Models\Usuarios\UserModel');
$selOption = $userModel->where('id', $selId)->findColumn('last_name');
if (!empty($selOption)) :

View File

@ -5,12 +5,10 @@ use App\Models\Chat\ChatDeparmentModel;
use App\Models\Chat\ChatDeparmentUserModel;
use App\Models\Usuarios\GroupModel;
use App\Models\UserModel;
use App\Models\Usuarios\UserModel;
use App\Models\Usuarios\GroupsUsersModel;
use App\Models\Collection;
use CodeIgniter\Shield\Entities\User;
use function PHPUnit\Framework\isNull;
class Users extends \App\Controllers\GoBaseController
{
@ -89,9 +87,7 @@ class Users extends \App\Controllers\GoBaseController
// Marcar el username como NULL
$sanitizedData = $this->sanitized($postData, true);
$email = $sanitizedData['email'];
unset($sanitizedData['email']);
$noException = true;
// Obtener proveedor de usuarios
@ -102,7 +98,7 @@ class Users extends \App\Controllers\GoBaseController
try {
// The Email is unique
if ($this->user_model->isEmailUnique($email)) {
if ($this->user_model->isEmailUnique($sanitizedData['email'])) {
// Crear el usuario si pasa la validación
$user = new \CodeIgniter\Shield\Entities\User([
@ -111,6 +107,8 @@ class Users extends \App\Controllers\GoBaseController
'last_name' => $sanitizedData['last_name'],
'cliente_id' => $sanitizedData['cliente_id'],
'comments' => $sanitizedData['comments'],
'email' => $sanitizedData['email'],
'password' => $sanitizedData['password'],
'status' => $sanitizedData['status'] ?? 0,
'active' => $sanitizedData['active'] ?? 0,
]);

View File

@ -225,7 +225,7 @@ class Facturas extends \App\Controllers\BaseResourceController
['title' => lang("Facturas.facturaList"), 'route' => route_to('facturasList'), 'active' => true]
];
$userModel = model('App\Models\UserModel');
$userModel = model('App\Models\Usuarios\UserModel');
$factura->created_by = $userModel->getFullName($factura->user_created_id);
$factura->updated_by = $userModel->getFullName($factura->user_updated_id);
$factura->created_at_footer = $factura->created_at ? date(' H:i d/m/Y', strtotime($factura->created_at)) : '';

View File

@ -583,7 +583,7 @@ class Pedido extends \App\Controllers\BaseResourceController
$pedidoEntity->fecha_encuadernado_text = $pedidoEntity->fecha_encuadernado ? date('d/m/Y', strtotime($pedidoEntity->fecha_encuadernado)) : '';
$pedidoEntity->fecha_entrega_externo_text = $pedidoEntity->fecha_entrega_externo ? date('d/m/Y', strtotime($pedidoEntity->fecha_entrega_externo)) : '';
$userModel = model('App\Models\UserModel');
$userModel = model('App\Models\Usuarios\UserModel');
$pedidoEntity->created_by = $userModel->getFullName($pedidoEntity->user_created_id);
$pedidoEntity->updated_by = $userModel->getFullName($pedidoEntity->user_updated_id);
$pedidoEntity->created_at_footer = $pedidoEntity->created_at ? date(' H:i d/m/Y', strtotime($pedidoEntity->created_at)) : '';

View File

@ -232,12 +232,22 @@ class Presupuestoadmin extends \App\Controllers\BaseResourceController
$postData = $this->request->getPost();
$postData['updated_at'] = gmdate('Y-m-d H:m:s', time());
$sanitizedData = $this->sanitized($postData, $nullIfEmpty);
// JJO
$sanitizedData['user_updated_id'] = auth()->user()->id;
if(isset($sanitizedData['total_aceptado_revisado']) && $sanitizedData['total_aceptado_revisado'] != 0
&& $sanitizedData['total_aceptado_revisado'] != null && $sanitizedData['total_aceptado_revisado'] != ""){
$sanitizedData['aprobado_at'] = $sanitizedData['updated_at'];
$sanitizedData['aprobado_user_id'] = $sanitizedData['user_updated_id'];
}
if ($presupuestoEntity->estado_id == 1 && isset($postData['confirmar']) && $postData['confirmar'] == 1) {
$sanitizedData['aprobado_at'] = $sanitizedData['updated_at'];
$sanitizedData['aprobado_user_id'] = $sanitizedData['user_updated_id'];
$sanitizedData['total_aceptado_revisado'] = $sanitizedData['total_presupuesto'];
}
if ($this->request->getPost('is_duplicado') == null) {
$sanitizedData['is_duplicado'] = 0;
}
@ -633,10 +643,16 @@ class Presupuestoadmin extends \App\Controllers\BaseResourceController
$data['resumen']['total_factor'] = is_numeric($presupuesto->total_factor) ? $presupuesto->total_factor : 0;
$data['resumen']['total_factor_ponderado'] = is_numeric($presupuesto->total_factor_ponderado) ? $presupuesto->total_factor_ponderado : 0;
$data['total_aceptado_revisado'] = $presupuesto->total_aceptado_revisado;
$data['aprobado_by_at'] = ($presupuesto->aprobado_user_id != null)?
model('App\Models\Usuarios\UserModel')->getFullName($presupuesto->aprobado_user_id) . ', '
. date('d/m/Y H:i:s', strtotime($presupuesto->aprobado_at)):'';
$data['resumen']['iva_reducido'] = $presupuesto->iva_reducido;
$data['created_by'] = model('App\Models\UserModel')->getFullName($presupuesto->user_created_id);
$data['updated_by'] = model('App\Models\UserModel')->getFullName($presupuesto->user_update_id);
$data['created_by'] = model('App\Models\Usuarios\UserModel')->getFullName($presupuesto->user_created_id);
$data['updated_by'] = model('App\Models\Usuarios\UserModel')->getFullName($presupuesto->user_update_id);
$data['created_at'] = date(' H:i d/m/Y', strtotime($presupuesto->created_at));
$data['updated_at'] = date(' H:i d/m/Y', strtotime($presupuesto->updated_at));

View File

@ -601,7 +601,9 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
];
return $return_data;
} else {
$return_data['eb'][$i] = round($coste_direccion->coste, 2);
$coste = floatval($coste_direccion->coste);
$margen = $coste * (intval($coste_direccion->margen) / 100.0);
$return_data['eb'][$i] = round($coste + $margen, 2);
}
}
@ -657,16 +659,17 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
];
return $return_data;
} else {
// Se añade a los costes de envío
$coste_envio += $coste_direccion->coste;
$coste = floatval($coste_direccion->coste);
$margen = $coste * (intval($coste_direccion->margen) / 100.0);
$coste_envio += $coste + $margen;
}
}
$return_data['coste_envio'][$i] = round($coste_envio, 2);
}
}
}
if ($this->request) {
if ($this->request->isAJAX())
@ -1101,7 +1104,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
}
}
} else if (isset($resultado_presupuesto['exception'])) {
if($this->request) {
if ($this->request) {
return $this->respond([
'error' => $resultado_presupuesto['exception'],
'file' => $resultado_presupuesto['file'],
@ -1111,7 +1114,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
return $resultado_presupuesto['exception'];
}
}
// seleccionamos el peso de la tirada seleccionada
$peso_libro = $resultado_presupuesto['peso'][array_search($selected_tirada, $tirada)];
@ -1225,7 +1228,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
}
$resultado_presupuesto['coste_envio'][$i] = round($coste_envio, 2);
}
}
}
$model_presupuesto = new PresupuestoModel();
$tiradas_alternativas = [];
@ -1242,7 +1245,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$resultado_presupuesto['info']['totales'][$i]['margenPapel'] +
$resultado_presupuesto['info']['totales'][$i]['margen_envio']) / ($coste_total + $coste_envio) * 100.0, 2);
$total_pedido = round(($coste_total + $resultado_presupuesto['info']['totales'][$i]['totalServicios'] + $resultado_presupuesto['info']['totales'][$i]['margenServicios'] + $coste_envio), 2);
$precio_u = round( $resultado_presupuesto['precio_u'][$i], 4);
$precio_u = round($resultado_presupuesto['precio_u'][$i], 4);
array_push($tiradas_alternativas, (object) array(
'tirada' => $tirada[$i],
@ -1255,7 +1258,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
} else {
$resumen_totales = $resultado_presupuesto['info']['totales'][$i];
$resumen_totales['precio_unidad'] = round($resultado_presupuesto['precio_u'][$i], 4);
}
}
@ -1613,8 +1616,10 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if (intval($presupuesto->estado_id) == 2) {
$data['resumen']['base'] = $presupuesto->total_antes_descuento;
$data['resumen']['total_envio'] = round(
floatval($presupuesto->total_coste_envios) +
floatval($presupuesto->total_margen_envios), 2);
floatval($presupuesto->total_coste_envios) +
floatval($presupuesto->total_margen_envios),
2
);
$data['resumen']['precio_unidad'] = $presupuesto->total_precio_unidad;
}
@ -2207,6 +2212,8 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
return $return_data;
}
$cantidad_total = intval($datosPedido->tirada) + intval($datosPedido->merma);
// Acabado Cubierta
if (intval($datos_entrada['cubierta']['acabado']) != 0) {
@ -2215,7 +2222,8 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
foreach ($serviciosAcabado as $servicio) {
$model = model('App\Models\Presupuestos\PresupuestoAcabadosModel');
$acabadoCubierta = $model->getPrecioTarifa(intval($servicio), $datosPedido->tirada, -1, $POD);
$acabadoCubierta = $model->getPrecioTarifa(intval($servicio), $cantidad_total, -1, $POD);
if (count($acabadoCubierta) > 0) {
if ($acabadoCubierta[0]->total <= 0) {
@ -2239,7 +2247,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if ($extra_info) {
$totalServicios += round(floatval($acabadoCubierta[0]->total), 2);
$base = round(floatval($acabadoCubierta[0]->total / (1 + $acabadoCubierta[0]->margen / 100.0)), 2);
$base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada;
$base = round(floatval($base / $cantidad_total), 2) * $cantidad_total;
$margenServicios += round(floatval($acabadoCubierta[0]->total - $base), 2);
}
}
@ -2252,7 +2260,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$tarifa = model('App\Models\Configuracion\ConfigVariableModel')->getVariable('id_servicio_lomo_redondo')->value;
$resultado = PresupuestoCLienteService::getServiciosManipulado([
'tarifa_id' => intval($tarifa),
'tirada' => $datosPedido->tirada,
'tirada' => $cantidad_total,
'POD' => $POD,
]);
@ -2278,7 +2286,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if ($extra_info) {
$totalServicios += round(floatval($resultado[0]->total), 2);
$base = round(floatval($resultado[0]->total / (1 + $resultado[0]->margen / 100.0)), 2);
$base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada;
$base = round(floatval($base / $cantidad_total), 2) * $cantidad_total;
$margenServicios += round(floatval($resultado[0]->total - $base), 2);
}
@ -2348,7 +2356,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
foreach ($serviciosAcabado as $servicio) {
$model = model('App\Models\Presupuestos\PresupuestoAcabadosModel');
$acabadoSobrecubierta = $model->getPrecioTarifa(intval($servicio), $datosPedido->tirada, -1, $POD);
$acabadoSobrecubierta = $model->getPrecioTarifa(intval($servicio), $cantidad_total, -1, $POD);
if (count($acabadoSobrecubierta) > 0) {
@ -2374,7 +2382,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if ($extra_info) {
$totalServicios += round(floatval($acabadoSobrecubierta[0]->total), 2);
$base = round(floatval($acabadoSobrecubierta[0]->total / (1 + $acabadoSobrecubierta[0]->margen / 100.0)), 2);
$base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada;
$base = round(floatval($base / $cantidad_total), 2) * $cantidad_total;
$margenServicios += round(floatval($acabadoSobrecubierta[0]->total - $base), 2);
}
}
@ -2506,7 +2514,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
foreach ($serviciosAcabado as $servicio)
$model = model('App\Models\Presupuestos\PresupuestoAcabadosModel');
$acabadoFaja = $model->getPrecioTarifa(intval($servicio), $datosPedido->tirada, -1, $POD);
$acabadoFaja = $model->getPrecioTarifa(intval($servicio), $cantidad_total, -1, $POD);
if (count($acabadoFaja) > 0) {
@ -2532,7 +2540,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if ($extra_info) {
$totalServicios += round(floatval($acabadoFaja[0]->total), 2);
$base = round(floatval($acabadoFaja[0]->total / (1 + $acabadoFaja[0]->margen / 100.0)), 2);
$base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada;
$base = round(floatval($base / $cantidad_total), 2) * $cantidad_total;
$margenServicios += round(floatval($acabadoFaja[0]->total - $base), 2);
}
}
@ -2552,7 +2560,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
$costeServiciosDefecto = 0.0;
$servDefectoEnc = PresupuestoCLienteService::getServiciosEncuadernacionDefault([
'tipo_impresion_id' => $tipo_impresion_id,
'tirada' => $datosPedido->tirada,
'tirada' => $cantidad_total,
'paginas' => intval($paginas) ?? 0,
'ancho' => $datosPedido->ancho,
'alto' => $datosPedido->alto,
@ -2586,14 +2594,14 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if ($extra_info) {
$totalServicios += round(floatval($servicio->total), 2);
$base = round(floatval($servicio->total / (1 + $servicio->margen / 100.0)), 2);
$base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada;
$base = round(floatval($base / $cantidad_total), 2) * $cantidad_total;
$margenServicios += round(floatval($servicio->total - $base), 2);
}
}
$servDefectoMan = PresupuestoCLienteService::getServiciosManipuladoDefault([
'tipo_impresion_id' => $tipo_impresion_id,
'tirada' => $datosPedido->tirada,
'tirada' => $cantidad_total,
'POD' => $POD,
'solapas' => intval($solapasCubierta) > 0 ? 1 : 0,
]);
@ -2623,7 +2631,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if ($extra_info) {
$totalServicios += round(floatval($servicio->total), 2);
$base = round(floatval($servicio->total / (1 + $servicio->margen / 100.0)), 2);
$base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada;
$base = round(floatval($base / $cantidad_total), 2) * $cantidad_total;
$margenServicios += round(floatval($servicio->total - $base), 2);
}
}
@ -2702,7 +2710,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
// Servicios acabado
$resultado = PresupuestoCLienteService::getServiciosAcabados([
'tarifa_id' => intval($servicio->id),
'tirada' => $datosPedido->tirada,
'tirada' => $cantidad_total,
'POD' => $POD,
]);
array_push($serviciosAutomaticos, $resultado[0]);
@ -2728,7 +2736,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if ($extra_info) {
$totalServicios += round(floatval($resultado[0]->total), 2);
$base = round(floatval($resultado[0]->total / (1 + $resultado[0]->margen / 100.0)), 2);
$base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada;
$base = round(floatval($base / $cantidad_total), 2) * $cantidad_total;
$margenServicios += round(floatval($resultado[0]->total - $base), 2);
}
} else if ($servicio->nombre == "ferro" || $servicio->nombre == "prototipo") {
@ -2760,14 +2768,14 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if ($extra_info) {
$totalServicios += round(floatval($resultado[0]->precio), 2);
$base = round(floatval($resultado[0]->total / (1 + $resultado[0]->margen / 100.0)), 2);
$base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada;
$base = round(floatval($base / $cantidad_total), 2) * $cantidad_total;
$margenServicios += round(floatval($resultado[0]->total - $base), 2);
}
} else if ($servicio->nombre == 'solapas_cubierta' || $servicio->nombre == 'solapas_sobrecubierta' || $servicio->nombre == 'solapas_faja') {
// Servicios manipulado
$resultado = PresupuestoCLienteService::getServiciosManipulado([
'tarifa_id' => intval($servicio->id),
'tirada' => $datosPedido->tirada,
'tirada' => $cantidad_total,
'POD' => $POD,
]);
@ -2794,7 +2802,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if ($extra_info) {
$totalServicios += round(floatval($resultado[0]->total), 2);
$base = round(floatval($resultado[0]->total / (1 + $resultado[0]->margen / 100.0)), 2);
$base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada;
$base = round(floatval($base / $cantidad_total), 2) * $cantidad_total;
$margenServicios += round(floatval($resultado[0]->total - $base), 2);
}
}
@ -2835,7 +2843,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if ($extra_info) {
$totalServicios += round(floatval($resultado[0]->precio), 2);
$base = round(floatval($resultado[0]->precio / (1 + $resultado[0]->margen / 100.0)), 2);
$base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada;
$base = round(floatval($base / $cantidad_total), 2) * $cantidad_total;
$margenServicios += round(floatval($resultado[0]->precio - $base), 2);
}
}
@ -2847,7 +2855,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
// Servicios manipulado
$resultado = PresupuestoCLienteService::getServiciosManipulado([
'tarifa_id' => intval($servicio_solapas_grandes_cubierta->id),
'tirada' => $datosPedido->tirada,
'tirada' => $cantidad_total,
'POD' => $POD,
]);
@ -2874,7 +2882,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if ($extra_info) {
$totalServicios += round(floatval($resultado[0]->total), 2);
$base = round(floatval($resultado[0]->total / (1 + $resultado[0]->margen / 100.0)), 2);
$base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada;
$base = round(floatval($base / $cantidad_total), 2) * $cantidad_total;
$margenServicios += round(floatval($resultado[0]->total - $base), 2);
}
}
@ -2884,7 +2892,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
// Servicios manipulado
$resultado = PresupuestoCLienteService::getServiciosManipulado([
'tarifa_id' => intval($servicio_solapas_grandes_sobrecubierta->id),
'tirada' => $datosPedido->tirada,
'tirada' => $cantidad_total,
'POD' => $POD,
]);
@ -2911,7 +2919,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if ($extra_info) {
$totalServicios += round(floatval($resultado[0]->total), 2);
$base = round(floatval($resultado[0]->total / (1 + $resultado[0]->margen / 100.0)), 2);
$base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada;
$base = round(floatval($base / $cantidad_total), 2) * $cantidad_total;
$margenServicios += round(floatval($resultado[0]->total - $base), 2);
}
}
@ -2921,7 +2929,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
// Servicios manipulado
$resultado = PresupuestoCLienteService::getServiciosManipulado([
'tarifa_id' => intval($servicio_solapas_grandes_faja->id),
'tirada' => $datosPedido->tirada,
'tirada' => $cantidad_total,
'POD' => $POD,
]);
@ -2948,7 +2956,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
if ($extra_info) {
$totalServicios += round(floatval($resultado[0]->total), 2);
$base = round(floatval($resultado[0]->total / (1 + $resultado[0]->margen / 100.0)), 2);
$base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada;
$base = round(floatval($base / $cantidad_total), 2) * $cantidad_total;
$margenServicios += round(floatval($resultado[0]->total - $base), 2);
}
}

View File

@ -3,7 +3,7 @@
namespace App\Controllers;
use App\Models\UserModel;
use App\Models\Usuarios\UserModel;
class Profile extends BaseController
{

View File

@ -109,7 +109,7 @@ class Ticketcontroller extends \App\Controllers\BaseResourceController
$message = lang('Basic.global.saveSuccess', [lang('Basic.global.record')]) . '.';
$userModel = new \App\Models\UserModel();
$userModel = new \App\Models\Usuarios\UserModel();
$this->sendMail(lang('Tickets.newTicket'), lang('Tickets.newTicketBody') . base_url(route_to('editTicket', $id)), $userModel->find($sanitizedData['user_soporte_id'])->email);
@ -198,7 +198,7 @@ class Ticketcontroller extends \App\Controllers\BaseResourceController
}
// envio de correos
$userModel = new \App\Models\UserModel();
$userModel = new \App\Models\Usuarios\UserModel();
if ($oldUserSupport != $sanitizedData['user_soporte_id']) {
$this->sendMail(lang('Tickets.asgignToChanged'), lang('Tickets.asgignToChangedBody') . base_url(route_to('editTicket', $id)), $userModel->find($sanitizedData['user_soporte_id'])->email);
}
@ -382,15 +382,15 @@ class Ticketcontroller extends \App\Controllers\BaseResourceController
$supportUsers = array(
array(
'id' => $defatulSoporteUserId,
'name' => model('App\Models\UserModel')->getFullName($defatulSoporteUserId)
'name' => model('App\Models\Usuarios\UserModel')->getFullName($defatulSoporteUserId)
),
array(
'id' => 2,
'name' => model('App\Models\UserModel')->getFullName(2)
'name' => model('App\Models\Usuarios\UserModel')->getFullName(2)
),
array(
'id' => 1,
'name' => model('App\Models\UserModel')->getFullName(1)
'name' => model('App\Models\Usuarios\UserModel')->getFullName(1)
),
);

View File

@ -0,0 +1,25 @@
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class AddTotalAceptadoRevisadoToPresupuestos extends Migration
{
public function up()
{
$this->forge->addColumn('presupuestos', [
'total_aceptado_revisado' => [
'type' => 'FLOAT',
'null' => true,
'default' => null,
'after' => 'total_aceptado' // Opcional: reemplazar con la última columna actual
],
]);
}
public function down()
{
$this->forge->dropColumn('presupuestos', 'total_aceptado_revisado');
}
}

View File

@ -100,6 +100,7 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity
"total_factor" => null,
"total_factor_ponderado" => null,
'total_aceptado' => null,
'total_aceptado_revisado' => null,
'iva_reducido' => null,
'excluir_rotativa' => null,
"acabado_cubierta_id" => null,
@ -173,6 +174,7 @@ class PresupuestoEntity extends \CodeIgniter\Entity\Entity
"total_factor" => "?float",
"total_factor_ponderado" => "?float",
'total_aceptado' => "?float",
'total_aceptado_revisado' => "?float",
'iva_reducido' => "?boolean",
'excluir_rotativa' => "?boolean",
"acabado_cubierta_id" => "int",

View File

@ -1,11 +1,10 @@
<?php
namespace App\Entities\Usuarios;
use App\Entities\Chat\ChatNotificationEntity;
use App\Models\ChatNotification;
use CodeIgniter\Entity;
use CodeIgniter\Shield\Entities\User;
class UserEntity extends \CodeIgniter\Entity\Entity
class UserEntity extends User
{
protected $attributes = [
"id" => null,
@ -20,7 +19,6 @@ class UserEntity extends \CodeIgniter\Entity\Entity
"created_at" => null,
"updated_at" => null,
"deleted_at" => null,
];
protected $casts = [
"id" => "int",
@ -73,4 +71,6 @@ class UserEntity extends \CodeIgniter\Entity\Entity
$m = model(ChatNotification::class);
return $m->where('user_id',$this->attributes['id'])->findAll() ?? [];
}
}

View File

@ -1,30 +0,0 @@
<?php
namespace App\Entities\Usuarios;
use CodeIgniter\Shield\Entities\User;
class UsersEntity extends User
{
protected $attributes = [
'first_name' => null,
'last_name'=> null,
'cliente_id' => null,
'comments' => null,
];
protected $casts = [
"cliente_id" => "int",
];
public function getFullName()
{
$firstName = trim($this->attributes["first_name"] ?? "");
$lastName = trim($this->attributes["last_name"] ?? "");
$fullName = $firstName . ' ' . $lastName;
$fullName = trim($fullName); // In case first name is empty, this will remove the leading space
// Use the username attribute if the full name is still empty after trimming
return $fullName ?: $this->attributes["username"];
}
}

View File

@ -23,7 +23,7 @@ class ClienteUsuariosModel extends ShieldUserModel
];
protected $allowedFields = ["id", "first_name", "last_name", "email"];
protected $returnType = "App\Entities\Usuarios\UsersEntity";
protected $returnType = "App\Entities\Usuarios\UserEntity";
protected $useTimestamps = true;
protected $useSoftDeletes = false;

View File

@ -74,6 +74,7 @@ class PresupuestoDireccionesModel extends \App\Models\BaseModel
$builder->where('t1.presupuesto_id', $presupuesto_id);
$builder->join("lg_paises t2", "t1.pais_id = t2.id", "left");
$builder->orderBy('t1.id', 'DESC');
return empty($search)
? $builder

View File

@ -119,6 +119,7 @@ class PresupuestoModel extends \App\Models\BaseModel
"total_descuento",
"total_descuentoPercent",
"total_presupuesto",
"total_aceptado_revisado",
"total_precio_unidad",
"total_factor",
"total_factor_ponderado",

View File

@ -1,153 +0,0 @@
<?php
declare(strict_types=1);
namespace App\Models;
use App\Entities\Usuarios\UsersEntity;
use CodeIgniter\Shield\Authentication\Traits\HasAccessTokens;
use CodeIgniter\Shield\Models\UserModel as ShieldUserModel;
class UserModel extends ShieldUserModel
{
use HasAccessTokens;
protected function initialize(): void
{
parent::initialize();
$this->allowedFields = [
...$this->allowedFields,
'first_name', // Añadido
'last_name', // Añadido
'cliente_id', // Añadido
'comments', // Añadido
];
}
const SORTABLE = [
0 => "t1.id",
1 => "t1.first_name",
2 => "t1.last_name",
3 => "t2.secret",
4 => "t3.nombre",
5 => "t1.last_active",
];
protected $returnType = UsersEntity::class;
protected $useSoftDeletes = true;
protected $useTimestamps = true;
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
protected $deletedField = 'deleted_at';
protected $validationRules = [
"first_name" => "required|trim|max_length[150]",
"last_name" => "required|trim|max_length[150]",
"email" => "required|valid_email|max_length[150]",
'new_pwd' => 'permit_empty|min_length[8]',
'new_pwd_confirm' => 'permit_empty|required_with[new_pwd]|matches[new_pwd]',
"comments" => "permit_empty|trim|max_length[512]"
];
protected $validationMessages = [
'first_name' => [
"max_length" => "Users.validation.first_name.max_length",
"required" => "Users.validation.first_name.required"
],
'last_name' => [
"max_length" => "Users.validation.last_name.max_length",
"required" => "Users.validation.last_name.required"
],
'new_pwd' => [
'min_length' => "App.profile_rules_password_m"
],
'new_pwd_confirm' => [
'matches' => "App.profile_rules_password_confirm_m"
],
'comments' => [
"max_length" => "Users.validation.last_name.max_length",
],
'email' => [
"required" => "Users.validation.email.required",
"valid_email" => "Users.validation.email.valid_email",
"max_length" => "Users.validation.email.max_length"
]
];
public function getResource($search = [])
{
$builder = $this->db
->table($this->table . " t1")
->select(
"t1.id as id, t1.first_name AS first_name, t1.last_name AS last_name,
t2.secret AS email, t1.last_active AS last_active, t3.nombre AS cliente"
);
$builder->join("auth_identities t2", "t1.id = t2.user_id", "left");
$builder->join("clientes t3", "t1.cliente_id = t3.id", "left");
$builder->where('t1.deleted_at', null)->groupBy("t1.id");
if (empty($search))
return $builder;
else {
$builder->groupStart();
foreach ($search as $col_search) {
$column = self::SORTABLE[$col_search[0]];
$value = $col_search[2];
$builder->where("LOWER(CONVERT($column USING utf8)) COLLATE utf8_general_ci LIKE", "%" . strtolower($value) . "%");
}
$builder->groupEnd();
return $builder;
}
}
public function getComerciales()
{
$builder = $this->db
->table("users" . " t1")
->select(
"t1.id AS id, CONCAT(t1.first_name, ' ', t1.last_name) AS name"
);
$builder->where('t1.deleted_at', null);
$builder->where("t2.group", "comercial");
$builder->join("auth_groups_users t2", "t1.id = t2.user_id", "left");
return $builder->get()->getResult();
}
public function getFullName($id=0){
$builder = $this->db
->table("users" . " t1")
->select(
"CONCAT(t1.first_name, ' ', t1.last_name) AS name"
);
$builder->where('t1.deleted_at', null);
$builder->where('t1.id', $id);
return $builder->get()->getRow()->name;
}
// Método para comprobar si el email ya está registrado
public function isEmailUnique($email)
{
$builder = $this->db
->table("auth_identities t1") // La tabla correcta
->select("t1.secret AS email")
->where('secret', $email);
// Obtener resultados
$result = $builder->get()->getRow();
// Devuelve true si no se encuentra el correo (es único), false en caso contrario
return $result === null;
}
}

View File

@ -1,81 +1,154 @@
<?php
declare(strict_types=1);
namespace App\Models\Usuarios;
class UserModel extends \App\Models\BaseModel
use CodeIgniter\Shield\Authentication\Traits\HasAccessTokens;
use CodeIgniter\Shield\Models\UserModel as ShieldUserModel;
use App\Entities\Usuarios\UserEntity;
class UserModel extends ShieldUserModel
{
protected $table = "users";
/**
* Whether primary key uses auto increment.
*
* @var bool
*/
protected $useAutoIncrement = true;
protected $useTimestamps = true;
protected $dateFormat = 'datetime';
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
protected $primaryKey = "id";
protected $allowedFields = [
"username",
"first_name",
"last_name",
"client_id",
"status",
"status_message",
"active",
"comments",
"last_active",
"created_at",
"updated_at",
"deleted_at",
];
protected $returnType = "App\Entities\Usuarios\UserEntity";
public static $labelField = "first_name";
use HasAccessTokens;
protected function initialize(): void
{
parent::initialize();
$this->allowedFields = [
...$this->allowedFields,
'first_name', // Añadido
'last_name', // Añadido
'cliente_id', // Añadido
'comments', // Añadido
];
}
const SORTABLE = [
0 => "t1.id",
1 => "t1.first_name",
2 => "t1.last_name",
3 => "t2.secret",
4 => "t3.nombre",
5 => "t1.last_active",
];
protected $returnType = UserEntity::class;
protected $useSoftDeletes = true;
protected $useTimestamps = true;
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
protected $deletedField = 'deleted_at';
protected $validationRules = [
"first_name" => [
"label" => "Users.firstName",
"rules" => "trim|max_length[150]",
],
"rules" => "required|trim|max_length[150]",
],
"last_name" => [
"label" => "Users.lastName",
"rules" => "trim|max_length[150]",
],
"rules" => "required|trim|max_length[150]",
],
'new_pwd' => 'permit_empty|min_length[8]',
'new_pwd_confirm' => 'permit_empty|required_with[new_pwd]|matches[new_pwd]',
"comments" => "permit_empty|trim|max_length[512]"
];
protected $validationMessages = [
"first_name" => [
'first_name' => [
"max_length" => "Users.validation.first_name.max_length",
"required" => "Users.validation.first_name.required",
"required" => "Users.validation.first_name.required"
],
"last_name" => [
'last_name' => [
"max_length" => "Users.validation.last_name.max_length",
"required" => "Users.validation.last_name.required",
],
"required" => "Users.validation.last_name.required"
],
'new_pwd' => [
'min_length' => "App.profile_rules_password_m"
],
'new_pwd_confirm' => [
'matches' => "App.profile_rules_password_confirm_m"
],
'comments' => [
"max_length" => "Users.validation.last_name.max_length",
]
];
public function getGroupsTitles($user_token){
$sql = 'SELECT `auth_groups`.`title` FROM `auth_groups`
JOIN `group_user` ON `auth_groups`.`token` = `group_user`.`token_group`
JOIN `auth_user` ON `auth_user`.`token` = `group_user`.`token_user`
WHERE `auth_user`.`token` = \''. $user_token . '\'';
public function getResource($search = [])
{
$builder = $this->db
->table($this->table . " t1")
->select(
"t1.id as id, t1.first_name AS first_name, t1.last_name AS last_name,
t2.secret AS email, t1.last_active AS last_active, t3.nombre AS cliente"
);
$query = $this->db->query($sql);
$result = $query->getResultObject();
$data = [];
foreach($result as $r){
array_push($data, $r->title);
$builder->join("auth_identities t2", "t1.id = t2.user_id", "left");
$builder->join("clientes t3", "t1.cliente_id = t3.id", "left");
$builder->where('t1.deleted_at', null)->groupBy("t1.id");
if (empty($search))
return $builder;
else {
$builder->groupStart();
foreach ($search as $col_search) {
$column = self::SORTABLE[$col_search[0]];
$value = $col_search[2];
$builder->where("LOWER(CONVERT($column USING utf8)) COLLATE utf8_general_ci LIKE", "%" . strtolower($value) . "%");
}
$builder->groupEnd();
return $builder;
}
return implode(',', $data);
}
public function getComerciales()
{
$builder = $this->db
->table("users" . " t1")
->select(
"t1.id AS id, CONCAT(t1.first_name, ' ', t1.last_name) AS name"
);
$builder->where('t1.deleted_at', null);
$builder->where("t2.group", "comercial");
$builder->join("auth_groups_users t2", "t1.id = t2.user_id", "left");
return $builder->get()->getResult();
}
public function getFullName($id=0){
$builder = $this->db
->table("users" . " t1")
->select(
"CONCAT(t1.first_name, ' ', t1.last_name) AS name"
);
$builder->where('t1.deleted_at', null);
$builder->where('t1.id', $id);
return $builder->get()->getRow()->name;
}
// Método para comprobar si el email ya está registrado
public function isEmailUnique($email)
{
$builder = $this->db
->table("auth_identities t1") // La tabla correcta
->select("t1.secret AS email")
->where('secret', $email);
// Obtener resultados
$result = $builder->get()->getRow();
// Devuelve true si no se encuentra el correo (es único), false en caso contrario
return $result === null;
}
}

View File

@ -2,14 +2,12 @@
<div class="card accordion-item active">
<h2 class="accordion-header" id="headingOne">
<button type="button" class="accordion-button" data-bs-toggle="collapse"
data-bs-target="#accordionResumenTip" aria-expanded="false"
aria-controls="accordionResumenTip">
data-bs-target="#accordionResumenTip" aria-expanded="false" aria-controls="accordionResumenTip">
<h4><?= lang("Presupuestos.resumen") ?></h4>
</button>
</h2>
<div id="accordionResumenTip" class="accordion-collapse collapse show"
data-bs-parent="#accordionResumen">
<div id="accordionResumenTip" class="accordion-collapse collapse show" data-bs-parent="#accordionResumen">
<div class="accordion-body">
<div class="col-xl-12">
@ -18,63 +16,88 @@
<!-- Price Details -->
<dl class="row mb-0">
<dt class="col-5 py-1 fw-normal text-end">Coste papel</dt>
<dd class="py-1 col-6 text-end"><span id="totalCostePapel" class="autonumeric-resumen-currency"></span></dd>
<dd class="py-1 col-6 text-end"><span id="totalCostePapel"
class="autonumeric-resumen-currency"></span></dd>
<dt class="col-5 py-1 fw-normal text-end">Margen papel</dt>
<dd class="col-3 text-end py-1"><span id="porcentajeMargenPapel" class="autonumeric-resumen-percent"></span></dd>
<dd class="col-3 text-end py-1"><span id="margenPapel" class="autonumeric-resumen-currency"></span></dd>
<dd class="col-3 text-end py-1"><span id="porcentajeMargenPapel"
class="autonumeric-resumen-percent"></span></dd>
<dd class="col-3 text-end py-1"><span id="margenPapel"
class="autonumeric-resumen-currency"></span></dd>
<dt class="col-5 fw-normal text-end">Coste impresión</dt>
<dd class="col-6 text-end py-1"><span id="totalCosteImpresion" class="autonumeric-resumen-currency"></span></dd>
<dd class="col-6 text-end py-1"><span id="totalCosteImpresion"
class="autonumeric-resumen-currency"></span></dd>
<dt class="col-5 py-1 fw-normal text-end">Margen impresión</dt>
<dd class="col-3 text-end py-1"><span id="porcentajeMargenImpresion" class="autonumeric-resumen-percent"></span></dd>
<dd class="col-3 text-end py-1"><span id="margenImpresion" class="autonumeric-resumen-currency"></span></d>
<dd class="col-3 text-end py-1"><span id="porcentajeMargenImpresion"
class="autonumeric-resumen-percent"></span></dd>
<dd class="col-3 text-end py-1"><span id="margenImpresion"
class="autonumeric-resumen-currency"></span></d>
<dt class="col-5 fw-normal text-end">Coste servicios</dt>
<dd class="col-6 text-end py-1 "><span id="totalServicios" class="autonumeric-resumen-currency"></span></dd>
<dd class="col-6 text-end py-1 "><span id="totalServicios"
class="autonumeric-resumen-currency"></span></dd>
<dt class="col-5 fw-normal text-end">Margen servicios</dt>
<dd class="col-3 text-end py-1 "><span id="porcentajeMargenServicios" class="autonumeric-resumen-percent"></span></dd>
<dd class="col-3 text-end py-1 "><span id="margenServicios" class="autonumeric-resumen-currency"></span></dd>
<dd class="col-3 text-end py-1 "><span id="porcentajeMargenServicios"
class="autonumeric-resumen-percent"></span></dd>
<dd class="col-3 text-end py-1 "><span id="margenServicios"
class="autonumeric-resumen-currency"></span></dd>
<dt class="col-5 fw-normal text-end">Coste de envío</dt>
<dd class="col-6 text-end py-1 "><span id="costeEnvios" class="autonumeric-resumen-currency"></span></sp>
<dt class="col-5 fw-normal text-end">Precio de envío</dt>
<dd class="col-6 text-end py-1 "><span id="precioEnvios" class="autonumeric-resumen-currency"></span></sp>
<dd class="col-6 text-end py-1 "><span id="costeEnvios"
class="autonumeric-resumen-currency"></span></dd>
<dt class="col-5 fw-normal text-end">Margen envío</dt>
<dd class="col-6 text-end py-1 "><span id="margenEnvios" class="autonumeric-resumen-currency"></span></sp>
<dd class="col-6 text-end py-1 "><span id="margenEnvios"
class="autonumeric-resumen-currency"></span></dd>
<dt class="col-5 fw-normal text-end">Total envío base</dt>
<dd class="col-6 text-end py-1 "><span id="precioEnvios"
class="autonumeric-resumen-currency"></span></dd>
</dl>
<hr class="mx-n4">
<dl class="row mb-0">
<dt class="col-5 fw-normal text-end">Total Costes</dt>
<dd class="col-6 text-end "><span id="totalCostes" class="autonumeric-resumen-currency"></span></span>
<dd class="col-6 text-end "><span id="totalCostes"
class="autonumeric-resumen-currency"></span></span>
<dt class="col-5 fw-normal text-end">Total Margen</dt>
<dd class="col-3 text-end py-1"><span id="porcentajeMargen" class="autonumeric-resumen-percent"></span></dd>
<dd class="col-3 text-end py-1"><span id="totalMargenes" class="autonumeric-resumen-currency"></span></dd>
<dd class="col-3 text-end py-1"><span id="porcentajeMargen"
class="autonumeric-resumen-percent"></span></dd>
<dd class="col-3 text-end py-1"><span id="totalMargenes"
class="autonumeric-resumen-currency"></span></dd>
</dl>
<hr class="mx-n4">
<dl class="row mb-0">
<dt class="col-5 fw-normal text-end">Total</dt>
<dd class="col-6 text-end"><span id="totalAntesDescuento" class="autonumeric-resumen-currency"></span></span>
<dt class="col-5 fw-normal text-end">Total antes de descuento</dt>
<dd class="col-6 text-end"><span id="totalAntesDescuento"
class="autonumeric-resumen-currency"></span></span>
<dt class="col-5 py-1 fw-normal text-end">Descuento (%)</dt>
<dd id="dd" class="col-3 text-end py-1"><input id="total_descuentoPercent" type="number" value="" class="update-totales form-control" style="width:100% !important;"></dd>
<dd class="col-3 py-1 text-end "><span id="descuentoTotal" class="autonumeric-resumen-currency"></span></dd>
<dd id="dd" class="col-3 text-end py-1"><input id="total_descuentoPercent" type="number"
value="" class="update-totales form-control" style="width:100% !important;"></dd>
<dd class="col-3 py-1 text-end "><span id="descuentoTotal"
class="autonumeric-resumen-currency"></span></dd>
<dt class="col-5 text-end">Total presupuesto</dt>
<dd class="col-6 text-end"><span id="totalDespuesDecuento" class="fw-semibold autonumeric-resumen-currency"></span></dd>
<dd class="col-6 text-end"><span id="totalDespuesDecuento"
class="fw-semibold autonumeric-resumen-currency"></span></dd>
<dt class="col-5 fw-normal text-end">Precio unidad</dt>
<dd class="col-6 text-end mb-2"><span id="precioUnidadPresupuesto" class="autonumeric-resumen-currency-4"></span></dd>
<dd class="col-6 text-end mb-2"><span id="precioUnidadPresupuesto"
class="autonumeric-resumen-currency-4"></span></dd>
<dt class="col-5 fw-normal text-end" style="font-size: smaller !important;">Factor</dt>
<dd class="col-6 text-end mb-2 "><span id="factor" class="autonumeric-resumen-2" style="font-size: smaller !important;"></span></dd>
<dt class="col-5 fw-normal text-end" style="font-size: smaller !important;">Factor Ponderado</dt>
<dd class="col-6 text-end mb-0"><span id="factor_ponderado" class="autonumeric-resumen-2" style="font-size: smaller !important;"></span></dd>
<dd class="col-6 text-end mb-2 "><span id="factor" class="autonumeric-resumen-2"
style="font-size: smaller !important;"></span></dd>
<dt class="col-5 fw-normal text-end" style="font-size: smaller !important;">Factor Ponderado
</dt>
<dd class="col-6 text-end mb-0"><span id="factor_ponderado" class="autonumeric-resumen-2"
style="font-size: smaller !important;"></span></dd>
</dl>
</div>
<div class="d-grid float-end mb-4">
<div class="form-check form-switch mb-2">
<input class="form-check-input" <?= $presupuestoEntity->estado_id == 2 ? 'onclick="return false;"' : ''; ?> type="checkbox" id="confirmar_presupuesto" name="confirmar_presupuesto" value="1" <?= $presupuestoEntity->estado_id == 2 ? 'checked' : ''; ?>>
<label class="form-check-label" for="confirmar_presupuesto"><?= $presupuestoEntity->estado_id == 2 ? lang('Presupuestos.confirmado') : lang('Presupuestos.confirmar'); ?></label>
<input class="form-check-input" <?= $presupuestoEntity->estado_id == 2 ? 'onclick="return false;"' : ''; ?> type="checkbox" id="confirmar_presupuesto"
name="confirmar_presupuesto" value="1" <?= $presupuestoEntity->estado_id == 2 ? 'checked' : ''; ?>>
<label class="form-check-label"
for="confirmar_presupuesto"><?= $presupuestoEntity->estado_id == 2 ? lang('Presupuestos.confirmado') : lang('Presupuestos.confirmar'); ?></label>
</div>
</div>
</div>
@ -92,18 +115,53 @@
</select>
</div>
<?php if ($presupuestoEntity->estado_id == 2): ?>
<div class="row mt-5">
<div class="mb-1">
<label for="totalAceptado" class="form-label">
<?= lang('Presupuestos.totalAceptado') ?>
</label>
<input disabled type="text" id="totalAceptado" name="totalAceptado" class="form-control autonumeric-resumen-currency" value="" <?php echo ($tipo_impresion_id == 21) ? ' max=80' : '' ?>>
</div><!--//.mb-3 -->
</div>
<?php endif; ?>
</div> <!-- //.accordion-body -->
</div> <!-- //.accordion-collapse -->
</div> <!-- //.accordion-item -->
</div> <!-- //.accordion -->
<div class="col-xl-12 mt-3">
<div class="card border border-secondary-subtle rounded-3">
<div class="card-body">
<div id="div_ajustar_error" class="alert alert-danger d-flex align-items-baseline d-none" role="alert">
<span class="alert-icon alert-icon-lg text-primary me-2">
<i class="ti ti-ban ti-sm"></i>
</span>
<div class="d-flex flex-column ps-1">
<h5 id="error_recalcular_margen" class="alert-heading mb-2"></h5>
</div>
</div>
<div class="row">
<p>El total aceptado y revisado tiene que ser mayor que total costes + precio de envío
</p>
</div>
<div class="row">
<div class="col-sm-6 mb-md-0 mb-2">
<label for="total_aceptado_revisado" class="form-label">Total aceptado y
revisado</label>
<input <?= ($presupuestoEntity->estado_id == 2) ? "disabled" : "" ?> type="text"
class="autonumeric-currency form-control text-center fs-5"
id="total_aceptado_revisado"></input>
</div>
<div class="col-sm-6 d-flex align-items-end mb-md-0 mb-2">
<button type="button" id="btn_ajustar_revisado"
class="btn btn-primary w-100">Ajustar</button>
</div>
</div>
<?php /*if ($presupuestoEntity->estado_id == 2): ?>
<div class="row">
<div class="col-sm-6 mb-1">
<label for="totalAceptado"
class="form-label"><?= lang('Presupuestos.totalAceptado') ?></label>
<input disabled type="text" id="totalAceptado" name="totalAceptado"
class="form-control text-center fs-5 autonumeric-resumen-currency" value="" <?php echo ($tipo_impresion_id == 21) ? ' max=80' : '' ?>>
</div>
</div>
<?php endif; */?>
<div class="row">
<p>
<span id="aprobado_by_at"></span>
</p>
</div>
</div>
</div> <!-- //.card-body -->
</div> <!-- //.card -->
</div> <!-- //.col-xl-12 -->
</div> <!-- //.accordion-body -->
</div> <!-- //.accordion-collapse -->
</div> <!-- //.accordion-item -->