Merge branch 'main' into feat/view-maquinista

This commit is contained in:
amazuecos
2025-04-25 07:41:25 +02:00
52 changed files with 5300 additions and 469 deletions

View File

@ -0,0 +1,146 @@
<!-- File: app/Views/catalogo_configuracion_libro.php -->
<div class="accordion accordion-bordered mt-3" id="accordionConfiguracionLibro">
<div class="card accordion-item active">
<h2 class="accordion-header" id="headingConfiguracionLibro">
<button class="accordion-button" type="button" data-bs-toggle="collapse"
data-bs-target="#collapseConfiguracionLibro" aria-expanded="true"
aria-controls="collapseConfiguracionLibro">
<h5 class="mb-0"><?= lang('Catalogo.configuracionLibro') ?: 'Configuración del libro' ?></h5>
</button>
</h2>
<div id="collapseConfiguracionLibro" class="accordion-collapse collapse show"
data-bs-parent="#accordionConfiguracionLibro">
<div class="accordion-body">
<?php
// 1) TIPO DE IMPRESIÓN + ENCUADERNACIÓN
$tipos = ['negro', 'negrohq', 'color', 'colorhq'];
?>
<div class="divider divider-dark text-start mb-1">
<div class="divider-text">
<h5><?= lang('Presupuestos.tipoImpresion') ?></h5>
</div>
</div>
<div class="row px-4 mt-1">
<div class="col-lg-3 col-md-12">
<select id="tipo_impresion" name="tipo_impresion" class="form-control select2bs2 warning-change"
style="width:100%" data-placeholder="<?= lang('Catalogo.seleccionarTipoImpresion') ?>">
<option></option>
<?php foreach ($tipos as $t): ?>
<option value="<?= $t ?>" <?= $catalogoLibrosEntity->tipo_impresion === $t ? 'selected' : '' ?>>
<?= lang("MaquinasTarifasImpresions.$t") ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="col-lg-3 col-md-12">
<select id="encuadernacion_id" name="encuadernacion_id"
class="form-control select2bs2 warning-change" style="width:100%">
<option value="<?= $catalogoLibrosEntity->encuadernacion_id ?>" selected>
<?= esc($catalogoLibrosEntity->encuadernacionName) ?>
</option>
</select>
</div>
</div>
<?php
// 2) COLUMNAS Y ETIQUETAS COMPARTIDAS
$cols = [2, 2, 2, 2, 2, 2];
$labels = ['', 'numeroPaginas', 'papel', 'gramaje', 'solapas', 'acabados'];
// Función única para renderizar cualquier fila, con clase opcional
$renderRow = function (array $cellsHtml, string $rowClass = '') use ($cols) {
$classAttr = $rowClass ? " {$rowClass}-line" : '';
echo "<div class=\"row{$classAttr} mb-0\">";
foreach ($cellsHtml as $i => $cell) {
$w = $cols[$i] ?? 2;
echo "<div class=\"col-lg-{$w} col-md-12 px-4 mb-0\">{$cell}</div>";
}
echo '<div><hr class="my-1"></div></div>';
};
?>
<div class="divider divider-dark text-start mb-1">
<div class="divider-text">
<h5><?= lang('Presupuestos.papelesComparadorPresupuestoAdmin') ?></h5>
</div>
</div>
<!-- 2a) Encabezado -->
<?php
$hdr = [];
foreach ($labels as $lbl) {
$hdr[] = '<p class="mb-0">' . ($lbl ? lang("Presupuestos.$lbl") : '') . '</p>';
}
echo '<div class="row mb-1">';
foreach ($hdr as $i => $html) {
echo '<div class="col-lg-' . $cols[$i] . ' col-md-12 px-4 mb-0">' . $html . '</div>';
}
echo '<div><hr class="my-1"><hr class="my-1"></div></div>';
?>
<!-- 3) Filas dinámicas: negro y color -->
<?php foreach (['negro', 'negro_pod', 'color', 'color_pod'] as $tipo):
$pag = old("{$tipo}_paginas", $catalogoLibrosEntity->{"{$tipo}_paginas"});
$papId = $catalogoLibrosEntity->{"{$tipo}_papel_id"};
$papNm = $catalogoLibrosEntity->{"{$tipo}PapelName"};
$gram = $catalogoLibrosEntity->{"{$tipo}_gramaje"};
$cells = [
'<p>' . lang("MaquinasTarifasImpresions.$tipo") . '</p>',
"<input type=\"text\" id=\"{$tipo}_paginas\" name=\"{$tipo}_paginas\" placeholder=\"0\" maxlength=\"5\" class=\"form-control {$tipo}_items\" value=\"" . esc($pag) . "\">",
"<select id=\"{$tipo}_papel_id\" name=\"{$tipo}_papel_id\" class=\"form-control select2bs2 {$tipo}_items\" style=\"width:100%\">"
. ($papNm ? "<option value=\"" . esc($papId) . "\" selected>" . esc($papNm) . "</option>" : "")
. "</select>",
"<select id=\"{$tipo}_gramaje\" name=\"{$tipo}_gramaje\" class=\"form-control select2bs2 {$tipo}_items\" style=\"width:100%\">"
. "<option value=\"" . esc($gram) . "\" selected>" . esc($gram) . "</option></select>",
'', // solapas
'' // acabados
];
$renderRow($cells, $tipo);
endforeach; ?>
<!-- 4) Cubierta y Sobrecubierta -->
<?php
$especiales = [
'cubierta' => ['faces' => [2 => 'unaCara', 4 => 'dosCaras'], 'disable' => false],
'cubierta_pod' => ['faces' => [2 => 'unaCara', 4 => 'dosCaras'], 'disable' => false],
'sobrecubierta' => ['faces' => [0 => 'no', 1 => 'si'], 'disable' => in_array($catalogoLibrosEntity->tipo_impresion_id, [5, 6, 7, 8, 21])],
'sobrecubierta_pod' => ['faces' => [0 => 'no', 1 => 'si'], 'disable' => in_array($catalogoLibrosEntity->tipo_impresion_id, [5, 6, 7, 8, 21])]
];
foreach ($especiales as $tipo => $cfg):
$pag = $catalogoLibrosEntity->{"{$tipo}_paginas"};
$papId = $catalogoLibrosEntity->{"{$tipo}_papel_id"};
$papNm = $catalogoLibrosEntity->{"{$tipo}PapelName"};
$gram = $catalogoLibrosEntity->{"{$tipo}_gramaje"};
$sol = old("{$tipo}_solapas_ancho", $catalogoLibrosEntity->{"{$tipo}_ancho_solapas"});
$acId = $catalogoLibrosEntity->{"{$tipo}_acabado_id"};
$acNm = $catalogoLibrosEntity->{"{$tipo}AcabadoName"};
$optPag = '';
foreach ($cfg['faces'] as $v => $lbl) {
$sel = $pag == $v ? ' selected' : '';
$optPag .= "<option value=\"$v\"$sel>" . lang("Presupuestos.$lbl") . "</option>";
}
$cells = [
'<p>' . lang("PapelImpresion.$tipo") . '</p>',
"<select id=\"{$tipo}_paginas\" name=\"{$tipo}_paginas\" class=\"form-control select2bs2\" style=\"width:100%\"" . ($cfg['disable'] ? ' disabled' : '') . ">{$optPag}</select>",
"<select id=\"{$tipo}_papel_id\" name=\"{$tipo}_papel_id\" class=\"form-control select2bs2 {$tipo}_items\" style=\"width:100%\"" . ($cfg['disable'] ? ' disabled' : '') . ">"
. ($papNm ? "<option value=\"" . esc($papId) . "\" selected>" . esc($papNm) . "</option>" : "")
. "</select>",
"<select id=\"{$tipo}_gramaje\" name=\"{$tipo}_gramaje\" class=\"form-control select2bs2 {$tipo}_items\" style=\"width:100%\"" . ($cfg['disable'] ? ' disabled' : '') . ">"
. "<option value=\"" . esc($gram) . "\" selected>" . esc($gram) . "</option></select>",
"<input type=\"text\" id=\"{$tipo}_ancho_solapas\" name=\"{$tipo}_ancho_solapas\" placeholder=\"0\" maxlength=\"5\" class=\"form-control {$tipo}_items\" value=\"" . esc($sol) . "\"" . ($cfg['disable'] ? ' disabled' : '') . ">",
"<select id=\"{$tipo}_acabado_id\" name=\"{$tipo}_acabado_id\" class=\"form-control select2bs2 {$tipo}_items\" style=\"width:100%\"" . ($cfg['disable'] ? ' disabled' : '') . ">"
. "<option value=\"" . esc($acId) . "\" selected>" . esc($acNm) . "</option></select>",
];
$renderRow($cells, $tipo);
endforeach;
?>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,127 @@
<div class="accordion accordion-bordered mt-3" id="accordionLibro">
<div class="card accordion-item active">
<h2 class="accordion-header" id="headingLibroDatos">
<button type="button" class="accordion-button" data-bs-toggle="collapse"
data-bs-target="#collapseLibroDatos" aria-expanded="true" aria-controls="collapseLibroDatos">
<h5 class="mb-0"><?= lang("Catalogo.datosGenerales") ?? 'Datos generales del libro' ?></h5>
</button>
</h2>
<div id="collapseLibroDatos" class="accordion-collapse collapse show" data-bs-parent="#accordionLibro">
<div class="accordion-body">
<div class="row">
<!-- COLUMNA IZQUIERDA: Imagen -->
<div class="col-md-12 col-lg-2 px-4 d-flex flex-column justify-content-center align-items-center"
style="min-height: 100%;">
<div class="mb-3 text-center w-100">
<?php if (!empty($catalogoLibrosEntity->cubierta_url)): ?>
<img src="<?= esc($catalogoLibrosEntity->cubierta_url) ?>" class="img-fluid mb-2"
alt="Portada">
<?php else: ?>
<img src="https://static.cegal.es/imagenes/marcadas/9788415/978841f45711.gif" class="img-fluid mb-2"
alt="Sin portada">
<?php endif; ?>
</div>
</div>
<!-- COLUMNA DERECHA: Datos -->
<div class="col-md-12 col-lg-10 px-4">
<div class="row">
<div class="col-md-4 mb-3">
<label for="cliente_id" class="form-label">Cliente *</label>
<select id="cliente_id" name="cliente_id" class="form-select select2bs5">
<option value="<?= $catalogoLibrosEntity->cliente_id ?>" selected>
<?= $catalogoLibrosEntity->clienteName ?>
</option>
</select>
</div>
<div class="col-md-8 mb-3">
<label for="titulo" class="form-label">Título *</label>
<input type="text" id="titulo" name="titulo" class="form-control"
value="<?= old('titulo', $catalogoLibrosEntity->titulo) ?>" required
maxlength="300">
</div>
<div class="col-md-3 mb-3">
<label for="autor" class="form-label">Autor</label>
<input type="text" id="autor" name="autor" class="form-control"
value="<?= old('autor', $catalogoLibrosEntity->autor) ?>" maxlength="255">
</div>
<div class="col-md-3 mb-3">
<label for="coleccion" class="form-label">Colección</label>
<input type="text" id="coleccion" name="coleccion" class="form-control"
value="<?= old('coleccion', $catalogoLibrosEntity->coleccion) ?>" maxlength="255">
</div>
<div class="col-md-3 mb-3">
<label for="editorial" class="form-label">Editorial</label>
<input type="text" id="editorial" name="editorial" class="form-control"
value="<?= old('editorial', $catalogoLibrosEntity->editorial) ?>" maxlength="255">
</div>
<div class="col-md-3 mb-3">
<label for="sello" class="form-label">Sello</label>
<input type="text" id="sello" name="sello" class="form-control"
value="<?= old('sello', $catalogoLibrosEntity->sello) ?>" maxlength="255">
</div>
<div class="col-md-3 mb-3">
<label for="isk" class="form-label">Identificador ISK</label>
<input type="text" id="isk" name="isk" class="form-control" readonly
value="<?= old('isk', $catalogoLibrosEntity->isk) ?>" maxlength="64"
style="background: #E8E8E8;">
</div>
<div class="col-md-3 mb-3">
<label for="isbn" class="form-label">ISBN *</label>
<input type="text" id="isbn" name="isbn" class="form-control"
value="<?= old('isbn', $catalogoLibrosEntity->isbn) ?>" maxlength="255">
</div>
<div class="col-md-3 mb-3">
<label for="num_edic" class="form-label">Edición</label>
<input type="number" id="num_edic" name="num_edic" class="form-control"
value="<?= old('num_edic', $catalogoLibrosEntity->num_edic ?? 1) ?>">
</div>
<div class="col-md-3 mb-3">
<label for="ean" class="form-label">EAN</label>
<input type="text" id="ean" name="ean" class="form-control" readonly
style="background: #E8E8E8;" value="<?= old('ean', $catalogoLibrosEntity->ean) ?>">
</div>
<div class="col-md-3 mb-3">
<label for="ubicacion" class="form-label">Ubicación</label>
<input type="text" id="ubicacion" name="ubicacion" class="form-control"
value="<?= old('ubicacion', $catalogoLibrosEntity->ubicacion) ?>">
</div>
<div class="col-md-3 mb-3">
<label for="ancho" class="form-label">Ancho *</label>
<input type="number" step="0.01" id="ancho" name="ancho" class="form-control"
value="<?= old('ancho', $catalogoLibrosEntity->ancho) ?>">
</div>
<div class="col-md-3 mb-3">
<label for="alto" class="form-label">Alto *</label>
<input type="number" step="0.01" id="alto" name="alto" class="form-control"
value="<?= old('alto', $catalogoLibrosEntity->alto) ?>">
</div>
<div class="col-md-3 mb-3">
<label for="paginas" class="form-label">Nº Páginas *</label>
<input type="number" id="paginas" name="paginas" class="form-control"
value="<?= old('paginas', $catalogoLibrosEntity->paginas) ?>">
</div>
</div>
</div>
</div> <!-- //.row -->
</div> <!-- //.accordion-body -->
</div> <!-- //.collapse -->
</div> <!-- //.accordion-item -->
</div> <!-- //.accordion -->

View File

@ -0,0 +1,99 @@
<div class="accordion accordion-bordered mt-3" id="accordionLibroOtros">
<div class="card accordion-item">
<h2 class="accordion-header" id="headingOtrosDatos">
<button type="button" class="accordion-button collapsed" data-bs-toggle="collapse"
data-bs-target="#collapseOtrosDatos" aria-expanded="false" aria-controls="collapseOtrosDatos">
<h5 class="mb-0"><?= lang("Catalogo.otrosDatosLibro") ?? 'Otros datos del libro' ?></h5>
</button>
</h2>
<div id="collapseOtrosDatos" class="accordion-collapse collapse" data-bs-parent="#accordionLibroOtros">
<div class="accordion-body">
<div class="row">
<div class="col-md-2 mb-3">
<label for="peso" class="form-label">Peso</label>
<input type="number" step="0.01" id="peso" name="peso" class="form-control"
value="<?= old('peso', $catalogoLibrosEntity->peso) ?>">
</div>
<div class="col-md-2 mb-3">
<label for="autor_entidad" class="form-label">Autor entidad</label>
<input type="text" id="autor_entidad" name="autor_entidad" class="form-control"
value="<?= old('autor_entidad', $catalogoLibrosEntity->autor_entidad) ?>">
</div>
<div class="col-md-2 mb-3">
<label for="traductor" class="form-label">Traductor</label>
<input type="text" id="traductor" name="traductor" class="form-control"
value="<?= old('traductor', $catalogoLibrosEntity->traductor) ?>">
</div>
<div class="col-md-2 mb-3">
<label for="ilustrador" class="form-label">Ilustrador</label>
<input type="text" id="ilustrador" name="ilustrador" class="form-control"
value="<?= old('ilustrador', $catalogoLibrosEntity->ilustrador) ?>">
</div>
<div class="col-md-2 mb-3">
<label for="idioma" class="form-label">Idioma</label>
<input type="text" id="idioma" name="idioma" class="form-control"
value="<?= old('idioma', $catalogoLibrosEntity->idioma ?? 'spa') ?>">
</div>
<div class="col-md-2 mb-3">
<label for="num_edic" class="form-label">Nº Edición</label>
<input type="number" id="num_edic" name="num_edic" class="form-control"
value="<?= old('num_edic', $catalogoLibrosEntity->num_edic ?? 1) ?>">
</div>
<div class="col-md-2 mb-3">
<label for="fecha_disponibilidad" class="form-label">Fecha Disponibilidad</label>
<input type="date" id="fecha_disponibilidad" name="fecha_disponibilidad" class="form-control"
value="<?= old('fecha_disponibilidad', $catalogoLibrosEntity->fecha_disponibilidad?->format('Y-m-d')) ?>">
</div>
<div class="col-md-2 mb-3">
<label for="fecha_public" class="form-label">Fecha Publicación</label>
<input type="date" id="fecha_public" name="fecha_public" class="form-control"
value="<?= old('fecha_public', $catalogoLibrosEntity->fecha_public?->format('Y-m-d')) ?>">
</div>
<div class="col-md-2 mb-3">
<label for="num_fotos" class="form-label">Nº Fotos</label>
<input type="number" id="num_fotos" name="num_fotos" class="form-control"
value="<?= old('num_fotos', $catalogoLibrosEntity->num_fotos ?? 0) ?>">
</div>
<div class="col-md-2 mb-3">
<label for="num_ilustr" class="form-label">Nº Ilustraciones</label>
<input type="number" id="num_ilustr" name="num_ilustr" class="form-control"
value="<?= old('num_ilustr', $catalogoLibrosEntity->num_ilustr ?? 0) ?>">
</div>
<div class="col-md-2 mb-3">
<label for="num_ilustr_color" class="form-label">Nº Ilustraciones Color</label>
<input type="number" id="num_ilustr_color" name="num_ilustr_color" class="form-control"
value="<?= old('num_ilustr_color', $catalogoLibrosEntity->num_ilustr_color ?? 0) ?>">
</div>
<div class="col-md-2 mb-3">
<label for="num_ilustr_bn" class="form-label">Nº Ilustraciones B/N</label>
<input type="number" id="num_ilustr_bn" name="num_ilustr_bn" class="form-control"
value="<?= old('num_ilustr_bn', $catalogoLibrosEntity->num_ilustr_bn ?? 0) ?>">
</div>
<div class="col-md-6 mb-3">
<label for="resumen" class="form-label">Resumen</label>
<textarea id="resumen" name="resumen" rows="4" class="form-control"><?= old('resumen', $catalogoLibrosEntity->resumen) ?></textarea>
</div>
<div class="col-md-6 mb-3">
<label for="resumen_breve" class="form-label">Resumen breve</label>
<textarea id="resumen_breve" name="resumen_breve" rows="4" class="form-control"><?= old('resumen_breve', $catalogoLibrosEntity->resumen_breve) ?></textarea>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,20 @@
<?php if (!empty($catalogoLibrosEntity->user_created_id)): ?>
<div
class="container-fluid d-flex flex-md-row flex-column justify-content-between align-items-md-center gap-1 container-p-x py-3">
<div class="col-md-6">
<p>
<strong><?= lang("Catalogo.created_by_at") ?></strong>
<span id="created_by"><?= $catalogoLibrosEntity->createdUser ?></span>,
<span id="created_at"><?= $catalogoLibrosEntity->created_at ?></span>
</p>
</div>
<div class="col-md-6">
<p>
<strong><?= lang("Catalogo.updated_by_at") ?></strong>
<span id="updated_by"><?= $catalogoLibrosEntity->updatedUser ?></span>,
<span id="updated_at_footer"><?= $catalogoLibrosEntity->updated_at ?></span>
</p>
</div>
</div>
<?php endif; ?>

View File

@ -0,0 +1,48 @@
<?= $this->include("themes/_commonPartialsBs/select2bs5") ?>
<?= $this->include("themes/_commonPartialsBs/sweetalert") ?>
<?= $this->extend('themes/vuexy/main/defaultlayout') ?>
<?= $this->section("content") ?>
<div class="row">
<div class="col-12">
<div class="card card-info">
<div class="card-header">
<h3 class="card-title"><?= $boxTitle ?? $pageTitle ?></h3>
</div><!--//.card-header -->
<form id="catalogoLibroForm" class="card-body" method="post" action="<?= $formAction ?>">
<?= csrf_field() ?>
<!-- card-body -->
<div class="card-body">
<?= view("themes/_commonPartialsBs/_alertBoxes") ?>
<?= !empty($validation->getErrors()) ? $validation->listErrors("bootstrap_style") : "" ?>
<?= view("themes/vuexy/form/catalogo/_datosGeneralesFormItems") ?>
<?= view("themes/vuexy/form/catalogo/_otrosDatosFormItems") ?>
<?= view("themes/vuexy/form/catalogo/_configuracionLibroFormItems") ?>
<?= view("themes/vuexy/form/catalogo/_trackingFormItems") ?>
</div>
<!-- /.card-body -->
<!-- card-footer -->
<div class="pt-4">
<?php if (auth()->user()->can('catalogo.edit')): ?>
<input type="submit" class="btn btn-primary float-start me-sm-3 me-1" name="save"
value="<?= lang("Basic.global.Save") ?>" />
<?php endif; ?>
<?= anchor(route_to("catalogoLibrosList"), lang("Basic.global.Cancel"), ["class" => "btn btn-secondary float-start"]) ?>
</div>
<!-- /.card-footer -->
</form>
</div><!-- //.card -->
</div><!--//.col -->
</div><!--//.row -->
<?= $this->endSection() ?>
<?= $this->section('css') ?>
<link rel="stylesheet" href="<?= site_url('themes/vuexy/css/safekat.css') ?>">
<?= $this->endSection() ?>
<?= $this->section("additionalExternalJs") ?>
<script type="module" src="<?= site_url('assets/js/safekat/pages/catalogo/catalogo.js?' . 'token' . '=' . (csrf_token() ?? "token")) ?>"></script>
<?= $this->endSection() ?>

View File

@ -0,0 +1,80 @@
<?= $this->include('themes/_commonPartialsBs/datatables') ?>
<?= $this->include('themes/_commonPartialsBs/sweetalert') ?>
<?= $this->extend('themes/vuexy/main/defaultlayout') ?>
<?= $this->section('content'); ?>
<div class="row">
<div class="col-md-12">
<div class="card card-info">
<div class="card-header">
<h3 class="card-title"><?= lang('Catalogo.listingPage') ?></h3>
<?= anchor(route_to('catalogoLibrosAdd'), lang('Basic.global.addNew') . ' ' . lang('Catalogo.libro'), ['class' => 'btn btn-primary float-end']); ?>
</div><!--//.card-header -->
<div class="card-body">
<?= view('themes/_commonPartialsBs/_alertBoxes'); ?>
<table id="tableOfCatalogoLibros" class="table table-striped table-hover" style="width: 100%;">
<thead>
<tr>
<th><?= lang('Catalogo.portada') ?></th>
<th><?= lang('Catalogo.id') ?></th>
<th><?= lang('Catalogo.titulo') ?></th>
<th><?= lang('Catalogo.cliente') ?></th>
<th><?= lang('Catalogo.edicion') ?></th>
<th><?= lang('Catalogo.autor') ?></th>
<th><?= lang('Catalogo.isbn') ?></th>
<th><?= lang('Catalogo.ean') ?></th>
<th><?= lang('Catalogo.paginas') ?></th>
<th class="text-nowrap" style="min-width: 85px;"><?= lang('Basic.global.Action') ?></th>
</tr>
<tr>
<th></th>
<th></th>
<th><input type="text" class="form-control filtro_catalogo" name="titulo"></th>
<th><input type="text" class="form-control filtro_catalogo" name="cliente"></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div><!--//.card-body -->
<div class="card-footer">
</div><!--//.card-footer -->
</div><!--//.card -->
</div><!--//.col -->
</div><!--//.row -->
<?= $this->endSection() ?>
<?= $this->section('css') ?>
<link rel="stylesheet"
href="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.bootstrap5.min.css") ?>">
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/sweetalert2/sweetalert2.css') ?>" />
<?= $this->endSection() ?>
<?= $this->section('additionalExternalJs') ?>
<script
src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/dataTables.buttons.min.js") ?>"></script>
<script
src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.bootstrap5.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.html5.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.print.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/jszip/jszip.min.js") ?>"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/pdfmake/pdfmake.min.js") ?>"
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/pdfmake/vfs_fonts.js") ?>"></script>
<script src="<?= site_url('themes/vuexy/vendor/libs/sweetalert2/sweetalert2.js') ?>"></script>
<script type="module" src="<?= site_url("assets/js/safekat/pages/catalogo/list.js") ?>"></script>
<?= $this->endSection() ?>

View File

@ -186,10 +186,10 @@ var editor_lineas = new $.fn.dataTable.Editor( {
{
name: "cantidad",
attr: {
type: "text",
name : "cantidad",
class :"autonumeric"
}
type: "text",
name : "cantidad",
class :"autonumeric"
}
}, {
name: "descripcion",
type: "textarea",
@ -199,11 +199,21 @@ var editor_lineas = new $.fn.dataTable.Editor( {
}
}, {
name: "iva",
type: "select",
options: [
{ label: "4%", value: 4 },
{ label: "21%", value: 21 }
],
attr: {
type: "text",
name : "iva",
class :"autonumeric"
}
class: "autonumeric"
}
}, {
name: "base",
attr: {
type: "text",
name : "total",
class :"autonumeric"
}
}, {
name: "pedido_linea_impresion_id",
type: "hidden"
@ -213,9 +223,6 @@ var editor_lineas = new $.fn.dataTable.Editor( {
}, {
name: "id",
type: "hidden"
}, {
name: "base",
type: "hidden"
},
]
} );
@ -321,7 +328,9 @@ var tableLineas = $('#tableOfLineasFactura').DataTable({
if(row.pedido_linea_impresion_id != null && <?= (auth()->user()->inGroup('cliente-admin') || auth()->user()->inGroup('cliente-editor')) ? 0 : 1 ?>){
// se convierten a float data.total_aceptado y subtotal
var total_aceptado = parseFloat(row.total_aceptado);
var total_aceptado_revisado = parseFloat(row.total_aceptado_revisado);
var total_aceptado = total_aceptado_revisado?total_aceptado_revisado: parseFloat(row.total_aceptado);
var subtotal = parseFloat(row.base);
var error_text = '';
@ -478,7 +487,7 @@ var tableLineas = $('#tableOfLineasFactura').DataTable({
return sum;
}, 0);
const totalTotal = table.column(10).data().reduce((a, b) => parseFloat(a) + parseFloat(b), 0);
let totalTotal = table.column(10).data().reduce((a, b) => parseFloat(a) + parseFloat(b), 0);
autoNumericSubtotal.set(totalSubtotal);
autoNumericIVA_4.set(totalIVA_4);
@ -486,6 +495,7 @@ var tableLineas = $('#tableOfLineasFactura').DataTable({
$('#total-iva-sum-4').closest('tr').addClass('d-none');
}
else{
totalTotal += totalIVA_4;
$('#total-iva-sum-4').closest('tr').removeClass('d-none');
}
autoNumericIVA_21.set(totalIVA_21);
@ -493,6 +503,7 @@ var tableLineas = $('#tableOfLineasFactura').DataTable({
$('#total-iva-sum-21').closest('tr').addClass('d-none');
}
else{
totalTotal += totalIVA_21;
$('#total-iva-sum-21').closest('tr').removeClass('d-none');
}
autoNumericTotal.set(totalTotal);

View File

@ -73,6 +73,45 @@ const actionBtns_pagos = function(data) {
<?php endif; ?>
}
$(document).on('click', '.btn-delete-pago', function(e) {
const dataId = $(this).attr('data-id');
const row = $(this).closest('tr');
if ($.isNumeric(dataId)) {
asyncConfirmDialogWithParams(
"Borrar Linea de pagos",
"¿Está seguro de borrar la línea? Esta acción no se puede deshacer.",
deleteConfirmedLineaPago, function(){}, [dataId, row])
}
});
function deleteConfirmedLineaPago(params){
var factura_linea_id = params[0];
var row = params[1];
const row_data = tablePagos.row($(row)).data();
const tabla = tablePagos;
if(row_data.id != null){
var url = '<?= route_to('deleteLineaPago') ?>';
$.ajax({
url: url,
method: 'POST',
data: {
factura_id: <?= $facturaEntity->id ?>,
pago_id: row_data.id,
<?= csrf_token() ?? "token" ?> : <?= csrf_token() ?>v
}
}).done((data, textStatus, jqXHR) => {
tabla.clearPipeline().draw();
$('#tableOfLineasFactura').DataTable().clearPipeline().draw();
}).fail((jqXHR, textStatus, errorThrown) => {
popErrorAlert(jqXHR.responseJSON.messages.error)
})
}
}
const editor_pagos = new $.fn.dataTable.Editor( {
ajax: {
url: "<?= route_to('editorOfPagosFacturas') ?>",

View File

@ -9,7 +9,7 @@
<div class="col-12">
<div class="card">
<div class="card-header">
<h4><?= $boxTitle ?></h4>
<h4><?= $boxTitle ?> <?= ($envioEntity->finalizado == 0)?'':'<span class="badge text-bg-success fw-lg">FINALIZADO</span>' ?></h4>
</div>
<div class="card-body">
@ -112,41 +112,43 @@
</div>
</div>
<div class="accordion accordion-bordered">
<div class="card accordion-item active mb-5">
<h4 class="accordion-header px-4 py-3">
<?= lang("Logistica.addLineasEnvio") ?>
</h4>
<?php if ($envioEntity->finalizado == 0): ?>
<div class="accordion accordion-bordered">
<div class="card accordion-item active mb-5">
<h4 class="accordion-header px-4 py-3">
<?= lang("Logistica.addLineasEnvio") ?>
</h4>
<div id="accordionaddLineasEnvioTip" class="accordion-collapse collapse show">
<div id="accordionaddLineasEnvioTip" class="accordion-collapse collapse show">
<div class="d-flex flex-row mb-3">
<div class="col-sm-12 px-3">
<p><?= lang('Logistica.addLineasText') ?></p>
<div class="d-flex flex-row mb-3">
<div class="col-sm-12 px-3">
<p><?= lang('Logistica.addLineasText') ?></p>
</div>
</div>
<div class="d-flex flex-row mb-3">
<div class="col-sm-6 px-3">
<label for="buscadorPedidos" class="form-label">
<?= lang("Logistica.buscadorPedidosTitle2") ?>
</label>
<select id="buscadorPedidos" name="buscador_pedidos" tabindex="1" maxlength="50"
class="form-control select2bs2" style="width: 100%;">
</select>
</div>
<div class="col-sm-2 px-3">
<button id="btnAddLinea" name="btnBuscar" tabindex="1"
class="btn btn-primary mt-4 w-100">
<?= lang("Logistica.add") ?>
<ti class="ti ti-circle-plus"></ti>
</button>
</div>
</div>
</div>
<div class="d-flex flex-row mb-3">
<div class="col-sm-6 px-3">
<label for="buscadorPedidos" class="form-label">
<?= lang("Logistica.buscadorPedidosTitle2") ?>
</label>
<select id="buscadorPedidos" name="buscador_pedidos" tabindex="1" maxlength="50"
class="form-control select2bs2" style="width: 100%;">
</select>
</div>
<div class="col-sm-2 px-3">
<button id="btnAddLinea" name="btnBuscar" tabindex="1"
class="btn btn-primary mt-4 w-100">
<?= lang("Logistica.add") ?>
<ti class="ti ti-circle-plus"></ti>
</button>
</div>
</div>
</div>
</div>
</div>
<?php endif; ?>
<div class="accordion accordion-bordered">
@ -168,13 +170,15 @@
<i class="ti ti-select"></i>
</button>
</div>
<div class="col-sm-2 px-3">
<button id="btnEliminarLineas" name="btnEliminarLineas" tabindex="1"
class="btn btn-danger w-100">
<?= lang("Logistica.eliminar") ?>
<i class="ti ti-trash"></i>
</button>
</div>
<?php if ($envioEntity->finalizado == 0): ?>
<div class="col-sm-2 px-3">
<button id="btnEliminarLineas" name="btnEliminarLineas" tabindex="1"
class="btn btn-danger w-100">
<?= lang("Logistica.eliminar") ?>
<i class="ti ti-trash"></i>
</button>
</div>
<?php endif; ?>
<div class="col-sm-2 px-3">
<button id="btnGenerarAlbaran" name="btnGenerarAlbaran" tabindex="1"
class="btn btn-success w-100">
@ -244,35 +248,90 @@
<input type="number" id="cajas" name="cajas" tabindex="1" maxlength="50"
class="form-control" value="<?= old('cajas', $envioEntity->cajas) ?>">
</div>
</div>
</div>
</div>
</div>
</div>
<div class="accordion accordion-bordered mt-3" id="accordioAlbaranes">
<div class="accordion accordion-bordered mt-3 mb-5" id="accordioAlbaranes">
<div class="card accordion-item active">
<h2 class="accordion-header" id="headingAlbaranes">
<button type="button" class="accordion-button" data-bs-toggle="collapse"
data-bs-target="#accordionAlbaranesTip" aria-expanded="false"
aria-controls="accordionAlbaranesTip">
<h3><?= lang("Pedidos.albaranes") ?></h3>
</button>
</h2>
<div class="card accordion-item active">
<h2 class="accordion-header" id="headingAlbaranes">
<button type="button" class="accordion-button" data-bs-toggle="collapse"
data-bs-target="#accordionAlbaranesTip" aria-expanded="false"
aria-controls="accordionAlbaranesTip">
<h3><?= lang("Pedidos.albaranes") ?></h3>
</button>
</h2>
<div id="accordionAlbaranesTip" class="accordion-collapse collapse show"
data-bs-parent="#accordioAlbaranes">
<div id="contenedorAlbaranes" class="accordion-body">
<div id="accordionAlbaranesTip" class="accordion-collapse collapse show"
data-bs-parent="#accordioAlbaranes">
<div id="contenedorAlbaranes" class="accordion-body">
</div>
</div>
</div>
</div>
<div class="accordion accordion-bordered">
<div class="card accordion-item active mb-5">
<h4 class="accordion-header px-4 py-3">
<?= lang("Logistica.acciones") ?>
</h4>
<div class="d-flex flex-row mb-3">
<div class="col-sm-3 px-3">
<label for="codigoSeguimiento" class="form-label">
<?= lang("Logistica.codigoSeguimiento") ?>
</label>
<input type="text" id="codigoSeguimiento" name="codigo_seguimiento" tabindex="1"
maxlength="100" class="form-control"
<?= ($envioEntity->finalizado == 0) ? "" : "readonly" ?>
value="<?= old('codigo_seguimiento', $envioEntity->codigo_seguimiento) ?>">
</div>
<div class="col-sm-3 px-3">
<label for="empresaMensajeria" class="form-label">
<?= lang("Logistica.empresaMensajería") ?>
</label>
<?php if ($envioEntity->finalizado == 0): ?>
<select id="empresaMensajeria" name="empresa_mensajeria" tabindex="1" maxlength="50"
class="form-control select2bs2" style="width: 100%;">
<?php if ($envioEntity->proveedor_id): ?>
<option value="<?= $envioEntity->proveedor_id ?>" "selected">
<?= $envioEntity->proveedor_nombre ?>
</option>
<?php endif; ?>
</select>
<?php else: ?>
<input type="text" id="empresaMensajeriaInput" name="empresa_mensajeria_input"
tabindex="1" maxlength="100" class="form-control" readonly
value="<?= old('empresa_mensajeria', $envioEntity->proveedor_nombre) ?>">
<?php endif; ?>
</div>
<?php if ($envioEntity->finalizado == 0): ?>
<div class="col-sm-3 px-3">
<button id="finalizarEnvio" name="finalizar_envio" tabindex="1"
class="btn btn-primary mt-4 w-100 btn-finalizar">
<?= lang("Logistica.finalizarEnvio") ?>
<ti class="ti ti-check"></ti>
</button>
</div>
<div class="col-sm-3 px-3">
<button id="finalizarEnvioYOTs" name="finalizar_envio_ots" tabindex="1"
class="btn btn-primary mt-4 w-100 btn-finalizar">
<?= lang("Logistica.finalizarEnvioYOTs") ?>
<ti class="ti ti-checks"></ti>
</button>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -1,5 +1,6 @@
<?= $this->include("themes/_commonPartialsBs/sweetalert") ?>
<?= $this->include('themes/_commonPartialsBs/datatables') ?>
<?= $this->include("themes/_commonPartialsBs/select2bs5") ?>
<?= $this->extend('themes/vuexy/main/defaultlayout') ?>
<?= $this->section('content'); ?>
@ -22,15 +23,35 @@
<div class="accordion-body px-4 py-3">
<div class="row">
<div class="mb-1 col-sm-4">
<div class="mb-1 col-sm-6">
<label for="buscadorPedidos" class="form-label">
<?= lang("Logistica.buscadorPedidosTitle") ?>
<?= lang("Logistica.buscadorPedidosTitle2") ?>
</label>
<input id="buscadorPedidos" name="buscador_pedidos" tabindex="1" maxlength="50"
class="form-control" value="">
<select id="buscadorPedidos" name="buscador_pedidos" tabindex="1" maxlength="50"
class="form-control select2bs2">
</select>
</div>
</div>
<div class="row select-direcciones d-none">
<div class="col-sm-6 px-3">
<label for="selectDirecciones" class="form-label">
<?= lang("Logistica.selectDirecciones") ?>
</label>
<select id="selectDirecciones" name="select_direcciones" tabindex="1" maxlength="50"
class="form-control select2bs2" style="width: 100%;">
</select>
</div>
</div>
<div class="row add-envio d-none">
<div class="col-sm-2 px-3">
<button id="btnAddEnvio" name="btn_add_envio" tabindex="1"
class="btn btn-primary mt-4 w-100">
<?= lang("Logistica.add") ?>
<ti class="ti ti-circle-plus"></ti>
</button>
</div>
</div>
</div>
</div>
@ -87,10 +108,10 @@
<?= $this->section('css') ?>
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/sweetalert2/sweetalert2.css') ?>" />
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/sweetalert2/sweetalert2.css') ?>" />
<?= $this->endSection() ?>
<?= $this->section('additionalExternalJs') ?>
<script src="<?= site_url('themes/vuexy/vendor/libs/sweetalert2/sweetalert2.js') ?>"></script>
<script type="module" src="<?= site_url("assets/js/safekat/pages/logistica/envio.js") ?>"></script>
<script src="<?= site_url('themes/vuexy/vendor/libs/sweetalert2/sweetalert2.js') ?>"></script>
<script type="module" src="<?= site_url("assets/js/safekat/pages/logistica/envio.js") ?>"></script>
<?= $this->endSection() ?>

View File

@ -12,48 +12,24 @@
</div>
<div class="card-body">
<div class="row mb-3">
<div class="col-4">
<button type="button" style="height: 80px;" class="btn btn-primary w-100 "
onclick="window.location.href='<?= route_to('selectEnvios', 'simple') ?>'"
>
<?= lang('Logistica.envioSimple') ?>
</button>
<div class="grid">
<div class="item" onclick="location.href='<?= route_to('gestionEnvios') ?>'">
<img src="<?= site_url("assets/img/logistica/envios.jpg") ?>" alt="Envíos">
<div><span><?= lang("Logistica.gestionEnvios"); ?></span></div>
</div>
<div class="col-4">
<button type="button" style="height: 80px;" class="btn btn-primary w-100 " >
<?= lang('Logistica.envioMultiple') ?>
</button>
<div class="item">
<img src="<?= site_url("assets/img/logistica/envios_ferros.png") ?>" alt="Envío de Ferros/Prototipos">
<div><span><?= lang("Logistica.envioFerros"); ?></span></div>
</div>
<div class="col-4">
<button type="button" style="height: 80px;" class="btn btn-primary w-100 " >
<?= lang('Logistica.envioConjunto') ?>
</button>
<div class="item">
<img src="<?= site_url("assets/img/logistica/impresionEtiquetas.jpg") ?>" alt="Etiquetas de títulos">
<div><span><?= lang("Logistica.etiquetasTitulos"); ?></span></div>
</div>
</div>
<div class="row mb-3">
<div class="col-4">
<button type="button" style="height: 80px;" class="btn btn-primary w-100 " >
<?= lang('Logistica.etiquetasTitulos') ?>
</button>
</div>
<div class="col-4">
<button type="button" style="height: 80px;" class="btn btn-primary w-100 " >
<?= lang('Logistica.etiquetasEnvio') ?>
</button>
</div>
<div class="col-4">
<button type="button" style="height: 80px;" class="btn btn-primary w-100 " >
<?= lang('Logistica.envioFerros') ?>
</button>
</div>
</div>
<div class="row">
<div class="col-4">
<button type="button" style="height: 80px;" class="btn btn-primary w-100 " >
<?= lang('Logistica.cerrarOTauto') ?>
</button>
<div class="item">
<img src="<?= site_url("assets/img/logistica/albaranes.png") ?>" alt="Albaranes">
<div><span><?= lang("Logistica.albaranes"); ?></span></div>
</div>
</div>
</div>
</div>
@ -63,6 +39,7 @@
<?= $this->endSection(); ?>
<?= $this->section('css') ?>
<link rel="stylesheet" href="<?= site_url('themes/vuexy/css/logisticaPanel.css') ?>">
<?= $this->endSection() ?>

View File

@ -1,35 +1,33 @@
<?php
/**
* MENU CATALOGO
*/
if (auth()->user()->inGroup('beta')) {
?>
if (auth()->user()->can('catalogo.menu')) {
?>
<!-- Catalogue -->
<li class="menu-item">
<a href="javascript:void(0);" class="menu-link menu-toggle beta">
<a href="javascript:void(0);" class="menu-link menu-toggle">
<i class="menu-icon tf-icons ti ti-book"></i>
<div><?= lang("App.menu_catalogo") ?></div>
<?= lang("App.menu_catalogo") ?>
</a>
<ul class="menu-sub">
<li class="menu-item">
<a href="<?= site_url("catalogo/catalogo") ?>" class="menu-link beta">
<div><?= lang("App.menu_catalogo_libros") ?></div>
</a>
</li>
<li class="menu-item">
<a href="<?= site_url("catalogo/catalogo/nuevo") ?>" class="menu-link beta">
<div><?= lang("App.menu_catalogo_nuevo") ?></div>
</a>
</li>
<li class="menu-item">
<a href="<?= site_url("catalogo/catalogo/categorias") ?>" class="menu-link beta">
<div><?= lang("App.menu_catalogo_categorias") ?></div>
</a>
</li>
<?php if (auth()->user()->can('catalogo.menu')) { ?>
<li class="menu-item">
<a href="<?= route_to("catalogoLibrosList") ?>" class="menu-link">
<?= lang("App.menu_catalogo_libros") ?>
</a>
</li>
<?php } ?>
<?php if (auth()->user()->can('catalogo.create')) { ?>
<li class="menu-item">
<a href="<?= route_to("catalogoLibrosAdd") ?>" class="menu-link">
<?= lang("App.menu_catalogo_nuevo") ?>
</a>
</li>
<?php } ?>
<li class="menu-item">
<a href="<?= site_url("catalogo/catalogo/importar") ?>" class="menu-link beta">
<div> <?= lang("App.menu_catalogo_importar") ?></div>
<?= lang("App.menu_catalogo_importar") ?>
</a>
</li>
</ul>

View File

@ -7,29 +7,10 @@ if (auth()->user()->inGroup('beta')) {
?>
<!-- Logistic -->
<li class="menu-item">
<a href="javascript:void(0);" class="menu-link menu-toggle">
<a href="<?= route_to("LogisticaPanel") ?>" class="menu-link">
<i class="menu-icon tf-icons ti ti-truck"></i>
<div> <?= lang("App.menu_logistica") ?></div>
</a>
<ul class="menu-sub">
<li class="menu-item">
<a href="<?= route_to("LogisticaPanel") ?>" class="menu-link">
<div> <?= lang("App.menu_logistica_panel") ?></div>
</a>
<a href="<?= site_url("envioslogistica/logistica") ?>" class="menu-link">
<div> <?= lang("App.menu_logistica_envios") ?></div>
</a>
</li>
<li class="menu-item">
<a href="<?= site_url("envioslogistica/logistica/etiquetas") ?>" class="menu-link">
<div> <?= lang("App.menu_logistica_etiquetas") ?></div>
</a>
</li>
<li class="menu-item">
<a href="<?= site_url("envioslogistica/logistica/tracking") ?>" class="menu-link">
<div> <?= lang("App.menu_logistica_tracking") ?></div>
</a>
</li>
</ul>
</li>
<?php } ?>