Ahora le toca al catalogo de choferes y debe contener los siguientes datos

- Empresa
- Nombre
- Apellido
Desarrollador web apasionado y gusto por la buena musica
Ya esta creado el catalogo de tipos de vehículos ahora crearemos el catalogo de vehículos que va a tener los siguientes datos
Creamos el archivo de migración en App/Database/Migrations/2023-09-02171027_Vehiculos.php con el siguiente codigo
Posteriormente vamos a necesitar el catalogo de tipo de vehículos y vehículos en esta publicación dejaremos la forma para crear el CRUD de tipos de vehículos con los siguientes datos.
Un módulo de ventas con facturación electrónica es un software que permite a las empresas realizar ventas y emitir facturas electrónicas de manera automatizada. Este tipo de módulos suele incluir las siguientes funcionalidades:
Los módulos de ventas con facturación electrónica ofrecen a las empresas una serie de ventajas, entre las que se incluyen:
En México, la facturación electrónica es obligatoria para todas las empresas que realicen ventas a clientes ubicados en el país. Por lo tanto, los módulos de ventas con facturación electrónica son una herramienta indispensable para las empresas mexicanas.
A continuación, se detallan algunas de las funcionalidades específicas que puede incluir un módulo de ventas con facturación electrónica:
Elegir un módulo de ventas con facturación electrónica adecuado para su empresa dependerá de una serie de factores, como el tamaño de su empresa, su volumen de ventas, sus necesidades específicas, etc. Es importante comparar diferentes módulos antes de tomar una decisión.
A continuación, se ofrecen algunos consejos para elegir un módulo de ventas con facturación electrónica:
El kardex de inventario es un documento o sistema de registro que permite llevar un control de las entradas y salidas de mercancías o productos en un almacén. En él se registran los datos básicos de cada producto, como el código, la descripción, la unidad de medida, el precio unitario y el stock.
El kardex de inventario es una herramienta fundamental para la gestión del inventario. Permite conocer la cantidad de cada producto en existencia, así como su valor total. También ayuda a identificar las tendencias de consumo y a detectar posibles problemas de desabastecimiento.
El kardex de inventario se puede llevar de forma manual o automatizada. En el caso de la gestión manual, el registro se realiza en una hoja de cálculo o en un libro. En el caso de la gestión automatizada, el registro se realiza en un sistema informático.
Los datos que se registran en el kardex de inventario son los siguientes:
El kardex de inventario se actualiza con cada movimiento de inventario. Cuando se recibe un producto, se registra la entrada con la cantidad recibida y el precio unitario. Cuando se vende un producto, se registra la salida con la cantidad vendida y el precio unitario.
El kardex de inventario es una herramienta esencial para la gestión del inventario. Permite conocer la cantidad de cada producto en existencia, así como su valor total. También ayuda a identificar las tendencias de consumo y a detectar posibles problemas de desabastecimiento.
En términos generales, los trabajadores rinden mejor con una jornada laboral de 40 horas que con una de 48 horas. Esto se debe a que la productividad humana disminuye a medida que aumenta la duración de la jornada laboral.
Ilustración de la productividad humana
Una investigación realizada por la Universidad de Warwick en el Reino Unido encontró que los trabajadores que trabajaban 35 horas a la semana eran un 13% más productivos que los que trabajaban 55 horas a la semana. La investigación también encontró que los trabajadores que trabajaban 35 horas a la semana tenían menos probabilidades de sufrir estrés, agotamiento y depresión.
Otro estudio, realizado por la Universidad de Stanford en los Estados Unidos, encontró que los trabajadores que trabajaban 60 horas a la semana eran menos productivos que los que trabajaban 40 horas a la semana. El estudio también encontró que los trabajadores que trabajaban 60 horas a la semana tenían más probabilidades de cometer errores.
Por supuesto, hay excepciones a esta regla. En algunos casos, los trabajadores pueden ser más productivos con una jornada laboral más larga. Por ejemplo, los trabajadores que realizan tareas creativas o que necesitan estar disponibles para emergencias pueden necesitar trabajar más horas.
Sin embargo, en general, la evidencia sugiere que los trabajadores rinden mejor con una jornada laboral de 40 horas.
Para registrar los movimientos requerimos especificar que tipo de movimiento es como puede ser entradas por compra, salidas por venta, entrada por devolución de cliente, saluda por devolución a proveedor
Para ello crearemos el siguiente catalogo de Tipos de movimiento con los siguientes campos
Primero creamos el archivo de migración App/Database/2023-08-17222335_Tipos_movimientos_inventario.php con el siguiente código
Es necesario para llevar el control correcto del inventario tener almacenes,
A continuación mostramos como crear el CRUD de almacenes
El CRUD tendrá los siguientes datos
Antes de empezar con el inventario necesitaremos los catálogos principales, uno de ellos es el catalogo de proveedores.
El catalogo es similar al de clientes
Para ello necesitamos en los siguientes campos:
Datos Generales
Datos Extra Facturación
Creamos el archivo de migración App/Database/Migrations/2023-04-21063336_Proveedores con el siguiente codigo
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class Proveedores extends Migration {
public function up() {
// Custumers
$this->forge->addField([
'id' => ['type' => 'int', 'constraint' => 11, 'unsigned' => true, 'auto_increment' => true],
'idEmpresa' => ['type' => 'varchar', 'constraint' => 128, 'null' => true],
'firstname' => ['type' => 'varchar', 'constraint' => 128, 'null' => true],
'lastname' => ['type' => 'varchar', 'constraint' => 128, 'null' => true],
'razonSocial' => ['type' => 'varchar', 'constraint' => 512, 'null' => true],
'taxID' => ['type' => 'varchar', 'constraint' => 64, 'null' => true],
'email' => ['type' => 'varchar', 'constraint' => 128, 'null' => true],
'direction' => ['type' => 'varchar', 'constraint' => 1024, 'null' => true],
'birthdate' => ['type' => 'datetime', 'null' => true],
'formaPago' => ['type' => 'varchar', 'constraint' => 16, 'null' => true],
'metodoPago' => ['type' => 'varchar', 'constraint' => 16, 'null' => true],
'usoCFDI' => ['type' => 'varchar', 'constraint' => 16, 'null' => true],
'codigoPostal' => ['type' => 'int', 'constraint' => 11, 'unsigned' => true],
'regimenFiscal' => ['type' => 'varchar', 'constraint' => 128, 'null' => true],
'created_at' => ['type' => 'datetime', 'null' => true],
'updated_at' => ['type' => 'datetime', 'null' => true],
'deleted_at' => ['type' => 'datetime', 'null' => true],
]);
$this->forge->addKey('id', true);
$this->forge->createTable('proveedores', true);
}
public function down() {
$this->forge->dropTable('proveedores', true);
}
}
Creamos el archivo modelo en App/Models/ProveedoresModel.php con el siguiente código
<?php
namespace App\Models;
use CodeIgniter\Model;
class ProveedoresModel extends Model {
protected $table = 'proveedores';
protected $primaryKey = 'id';
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $useSoftDeletes = true;
protected $allowedFields = ['id'
, 'idEmpresa'
, 'firstname'
, 'lastname'
, 'taxID'
, 'email'
, 'direction'
, 'birthdate'
, 'created_at'
, 'updated_at'
, 'deleted_at'
, 'metodoPago'
, 'formaPago'
, 'codigoPostal'
, 'regimenFiscal'
, 'razonSocial'
, 'usoCFDI'];
protected $useTimestamps = true;
protected $createdField = 'created_at';
protected $deletedField = 'deleted_at';
protected $validationRules = [
];
protected $validationMessages = [];
protected $skipValidation = false;
/**
* Obtener Clientes
*/
public function mdlGetProveedores($empresas) {
$resultado = $this->db->table('proveedores a, empresas b')
->select('a.id
,a.idEmpresa
,b.nombre as nombreEmpresa
,a.firstname
,a.lastname
,a.taxID
,a.email
,a.direction
,a.birthdate
,a.metodoPago
,a.formaPago
,a.usoCFDI
,a.created_at
,a.updated_at
,a.codigoPostal
,a.regimenFiscal
,a.razonSocial
,a.deleted_at')
->where('a.idEmpresa', 'b.id', FALSE)
->whereIn('a.idEmpresa', $empresas);
return $resultado;
}
}
Creamos el archivo controlador en App/Controllers/ProveedoresController.php con el siguiente código.
<?php
namespace App\Controllers;
use App\Controllers\BaseController;
use \App\Models\{
ProveedoresModel
};
use App\Models\LogModel;
use CodeIgniter\API\ResponseTrait;
use App\Models\EmpresasModel;
class ProveedoresController extends BaseController {
use ResponseTrait;
protected $log;
protected $proveedores;
protected $empresa;
public function __construct() {
$this->proveedores = new ProveedoresModel();
$this->log = new LogModel();
$this->empresa = new EmpresasModel();
helper('menu');
helper('utilerias');
}
public function index() {
helper('auth');
$idUser = user()->id;
$titulos["empresas"] = $this->empresa->mdlEmpresasPorUsuario($idUser);
if (count($titulos["empresas"]) == "0") {
$empresasID[0] = "0";
} else {
$empresasID = array_column($titulos["empresas"], "id");
}
if ($this->request->isAJAX()) {
$datos = $this->proveedores->mdlGetProveedores($empresasID);
return \Hermawan\DataTables\DataTable::of($datos)->toJson(true);
}
$fechaActual = fechaMySQLADateTimeHTML5(fechaHoraActual());
$titulos["title"] = lang('proveedores.title');
$titulos["subtitle"] = lang('proveedores.subtitle');
$titulos["fecha"] = $fechaActual;
$titulos["formaPago"] = $this->catalogosSAT->formasDePago40()->searchByField("texto", "%%", 99999);
$titulos["usoCFDI"] = $this->catalogosSAT->usosCfdi40()->searchByField("texto", "%%", 99999);
$titulos["metodoPago"] = $this->catalogosSAT->metodosDePago40()->searchByField("texto", "%%", 99999);
$titulos["regimenFiscal"] = $this->catalogosSAT->regimenesFiscales40()->searchByField("texto", "%%", 99999);
return view('proveedores', $titulos);
}
/**
* Read Custumers
*/
public function getProveedores() {
$idProveedor = $this->request->getPost("idProveedor");
$datosProveedor = $this->proveedores->find($idProveedor);
echo json_encode($datosProveedor);
}
/**
* Get Custumers via AJax
*/
public function getProveedoresAjax() {
$request = service('request');
$postData = $request->getPost();
$response = array();
// Read new token and assign in $response['token']
$response['token'] = csrf_hash();
$proveedores = new ProveedoresModel();
$idEmpresa = $postData['idEmpresa'];
if (!isset($postData['searchTerm'])) {
// Fetch record
$listProveedores = $proveedores->select('id,firstname,lastname')->where("deleted_at", null)
->where('idEmpresa', $idEmpresa)
->orderBy('id')
->orderBy('firstname')
->orderBy('lastname')
->findAll(10);
} else {
$searchTerm = $postData['searchTerm'];
// Fetch record
$listProveedores = $proveedores->select('id,firstname,lastname')->where("deleted_at", null)
->where('idEmpresa', $idEmpresa)
->groupStart()
->like('firstname', $searchTerm)
->orLike('id', $searchTerm)
->orLike('lastname', $searchTerm)
->groupEnd()
->findAll(10);
}
$data = array();
foreach ($listProveedores as $proveedores) {
$data[] = array(
"id" => $proveedores['id'],
"text" => $proveedores['id'] . ' ' . $proveedores['firstname'] . ' ' . $proveedores['lastname'],
);
}
$response['data'] = $data;
return $this->response->setJSON($response);
}
/**
* Save or update Custumers
*/
public function save() {
helper('auth');
$userName = user()->username;
$idUser = user()->id;
$datos = $this->request->getPost();
if ($datos["idProveedor"] == 0) {
try {
if ($this->proveedores->save($datos) === false) {
$errores = $this->proveedores->errors();
foreach ($errores as $field => $error) {
echo $error . " ";
}
return;
}
$dateLog["description"] = lang("vehicles.logDescription") . json_encode($datos);
$dateLog["user"] = $userName;
$this->log->save($dateLog);
echo "Guardado Correctamente";
} catch (\PHPUnit\Framework\Exception $ex) {
echo "Error al guardar " . $ex->getMessage();
}
} else {
if ($this->proveedores->update($datos["idProveedor"], $datos) == false) {
$errores = $this->proveedores->errors();
foreach ($errores as $field => $error) {
echo $error . " ";
}
return;
} else {
$dateLog["description"] = lang("proveedores.logUpdated") . json_encode($datos);
$dateLog["user"] = $userName;
$this->log->save($dateLog);
echo "Actualizado Correctamente";
return;
}
}
return;
}
/**
* Delete Custumers
* @param type $id
* @return type
*/
public function delete($id) {
$infoCustumers = $this->proveedores->find($id);
helper('auth');
$userName = user()->username;
if (!$found = $this->proveedores->delete($id)) {
return $this->failNotFound(lang('custumers.msg.msg_get_fail'));
}
$this->proveedores->purgeDeleted();
$logData["description"] = lang("proveedores.logDeleted") . json_encode($infoCustumers);
$logData["user"] = $userName;
$this->log->save($logData);
return $this->respondDeleted($found, lang('custumers.msg_delete'));
}
}
Creamos el archivo principal de la vista en App/Views/proveedores.php con el siguiente código.
<?= $this->include('julio101290\boilerplate\Views\load\select2') ?>
<?= $this->include('julio101290\boilerplate\Views\load\datatables') ?>
<?= $this->include('julio101290\boilerplate\Views\load\nestable') ?>
<!-- Extend from layout index -->
<?= $this->extend('julio101290\boilerplate\Views\layout\index') ?>
<!-- Section content -->
<?= $this->section('content') ?>
<?= $this->include('modulesProveedores/modalCaptureProveedores') ?>
<!-- SELECT2 EXAMPLE -->
<div class="card card-default">
<div class="card-header">
<div class="float-right">
<div class="btn-group">
<button class="btn btn-primary btnAddProveedores" data-toggle="modal" data-target="#modalAddProveedores"><i
class="fa fa-plus"></i>
<?= lang('proveedores.add') ?>
</button>
</div>
</div>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-12">
<div class="table-responsive">
<table id="tableProveedores" class="table table-striped table-hover va-middle tableProveedores">
<thead>
<tr>
<th>#</th>
<th>Empresa</th>
<th>
<?= lang('proveedores.fields.firstname') ?>
</th>
<th>
<?= lang('proveedores.fields.lastname') ?>
</th>
<th>
<?= lang('proveedores.fields.taxID') ?>
</th>
<th>
<?= lang('proveedores.fields.email') ?>
</th>
<th>
<?= lang('proveedores.fields.direction') ?>
</th>
<th>
<?= lang('proveedores.fields.birthdate') ?>
</th>
<th>
<?= lang('proveedores.fields.created_at') ?>
</th>
<th>
<?= lang('proveedores.fields.updated_at') ?>
</th>
<th>
<?= lang('proveedores.fields.deleted_at') ?>
</th>
<th>
<?= lang('proveedores.fields.actions') ?>
</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- /.card -->
<?= $this->endSection() ?>
<?= $this->section('js') ?>
<script>
/**
* Cargamos la tabla
*/
var tableProveedores = $('#tableProveedores').DataTable({
processing: true,
serverSide: true,
responsive: true,
autoWidth: false,
order: [[1, 'asc']],
ajax: {
url: '<?= base_url('admin/proveedores') ?>',
method: 'GET',
dataType: "json"
},
columnDefs: [{
orderable: false,
targets: [11],
searchable: false,
targets: [11]
}],
columns: [{
'data': 'id'
},
{
'data': 'nombreEmpresa'
},
{
'data': 'firstname'
},
{
'data': 'lastname'
},
{
'data': 'taxID'
},
{
'data': 'email'
},
{
'data': 'direction'
},
{
'data': 'birthdate'
},
{
'data': 'created_at'
},
{
'data': 'updated_at'
},
{
'data': 'deleted_at'
},
{
"data": function (data) {
return `<td class="text-right py-0 align-middle">
<div class="btn-group btn-group-sm">
<button class="btn btn-warning btnEditProveedores" data-toggle="modal" idProveedor="${data.id}" data-target="#modalAddProveedores"> <i class=" fa fa-edit"></i></button>
<button class="btn btn-danger btn-delete" data-id="${data.id}"><i class="fas fa-trash"></i></button>
</div>
</td>`
}
}
]
});
/**
* Carga datos actualizar
*/
/*=============================================
EDITAR Proveedores
=============================================*/
$(".tableProveedores").on("click", ".btnEditProveedores", function () {
var idProveedor = $(this).attr("idProveedor");
var datos = new FormData();
datos.append("idProveedor", idProveedor);
$.ajax({
url: "<?= base_url('admin/proveedores/getProveedores') ?>",
method: "POST",
data: datos,
cache: false,
contentType: false,
processData: false,
dataType: "json",
success: function (respuesta) {
$("#idProveedor").val(respuesta["id"]);
$("#idEmpresaProveedor").val(respuesta["idEmpresa"]);
$("#idEmpresaProveedor").trigger("change");
$("#firstname").val(respuesta["firstname"]);
$("#razonSocial").val(respuesta["razonSocial"]);
$("#lastname").val(respuesta["lastname"]);
$("#taxID").val(respuesta["taxID"]);
$("#email").val(respuesta["email"]);
$("#direction").val(respuesta["direction"]);
$("#birthdate").val(respuesta["birthdate"]);
$("#formaPago").val(respuesta["formaPago"]);
$("#formaPago").trigger("change");
$("#metodoPago").val(respuesta["metodoPago"]);
$("#metodoPago").trigger("change");
$("#usoCFDI").val(respuesta["usoCFDI"]);
$("#usoCFDI").trigger("change");
$("#codigoPostal").val(respuesta["codigoPostal"]);
$("#regimenFiscal").val(respuesta["regimenFiscal"]);
$("#regimenFiscal").trigger("change");
}
})
})
$("#idEmpresaProveedor ").select2();
/*=============================================
ELIMINAR proveedores
=============================================*/
$(".tableProveedores").on("click", ".btn-delete", function () {
var idProveedores = $(this).attr("data-id");
Swal.fire({
title: '<?= lang('boilerplate.global.sweet.title') ?>',
text: "<?= lang('boilerplate.global.sweet.text') ?>",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: '<?= lang('boilerplate.global.sweet.confirm_delete') ?>'
})
.then((result) => {
if (result.value) {
$.ajax({
url: `<?= base_url('admin/proveedores') ?>/` + idProveedores,
method: 'DELETE',
}).done((data, textStatus, jqXHR) => {
Toast.fire({
icon: 'success',
title: jqXHR.statusText,
});
tableProveedores.ajax.reload();
}).fail((error) => {
Toast.fire({
icon: 'error',
title: error.responseJSON.messages.error,
});
})
}
})
})
$(function () {
$("#modalAddProveedores").draggable();
});
</script>
<?= $this->endSection() ?>
Creamos el archivo secundario que contiene el modal en App/Views/modulesProveedores/modalCaptureProveedores.php con el siguiente codigo.
<?= $this->include('julio101290\boilerplate\Views\load\select2') ?>
<?= $this->include('julio101290\boilerplate\Views\load\datatables') ?>
<?= $this->include('julio101290\boilerplate\Views\load\nestable') ?>
<!-- Extend from layout index -->
<?= $this->extend('julio101290\boilerplate\Views\layout\index') ?>
<!-- Section content -->
<?= $this->section('content') ?>
<?= $this->include('modulesProveedores/modalCaptureProveedores') ?>
<!-- SELECT2 EXAMPLE -->
<div class="card card-default">
<div class="card-header">
<div class="float-right">
<div class="btn-group">
<button class="btn btn-primary btnAddProveedores" data-toggle="modal" data-target="#modalAddProveedores"><i
class="fa fa-plus"></i>
<?= lang('proveedores.add') ?>
</button>
</div>
</div>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-12">
<div class="table-responsive">
<table id="tableProveedores" class="table table-striped table-hover va-middle tableProveedores">
<thead>
<tr>
<th>#</th>
<th>Empresa</th>
<th>
<?= lang('proveedores.fields.firstname') ?>
</th>
<th>
<?= lang('proveedores.fields.lastname') ?>
</th>
<th>
<?= lang('proveedores.fields.taxID') ?>
</th>
<th>
<?= lang('proveedores.fields.email') ?>
</th>
<th>
<?= lang('proveedores.fields.direction') ?>
</th>
<th>
<?= lang('proveedores.fields.birthdate') ?>
</th>
<th>
<?= lang('proveedores.fields.created_at') ?>
</th>
<th>
<?= lang('proveedores.fields.updated_at') ?>
</th>
<th>
<?= lang('proveedores.fields.deleted_at') ?>
</th>
<th>
<?= lang('proveedores.fields.actions') ?>
</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- /.card -->
<?= $this->endSection() ?>
<?= $this->section('js') ?>
<script>
/**
* Cargamos la tabla
*/
var tableProveedores = $('#tableProveedores').DataTable({
processing: true,
serverSide: true,
responsive: true,
autoWidth: false,
order: [[1, 'asc']],
ajax: {
url: '<?= base_url('admin/proveedores') ?>',
method: 'GET',
dataType: "json"
},
columnDefs: [{
orderable: false,
targets: [11],
searchable: false,
targets: [11]
}],
columns: [{
'data': 'id'
},
{
'data': 'nombreEmpresa'
},
{
'data': 'firstname'
},
{
'data': 'lastname'
},
{
'data': 'taxID'
},
{
'data': 'email'
},
{
'data': 'direction'
},
{
'data': 'birthdate'
},
{
'data': 'created_at'
},
{
'data': 'updated_at'
},
{
'data': 'deleted_at'
},
{
"data": function (data) {
return `<td class="text-right py-0 align-middle">
<div class="btn-group btn-group-sm">
<button class="btn btn-warning btnEditProveedores" data-toggle="modal" idProveedor="${data.id}" data-target="#modalAddProveedores"> <i class=" fa fa-edit"></i></button>
<button class="btn btn-danger btn-delete" data-id="${data.id}"><i class="fas fa-trash"></i></button>
</div>
</td>`
}
}
]
});
/**
* Carga datos actualizar
*/
/*=============================================
EDITAR Proveedores
=============================================*/
$(".tableProveedores").on("click", ".btnEditProveedores", function () {
var idProveedor = $(this).attr("idProveedor");
var datos = new FormData();
datos.append("idProveedor", idProveedor);
$.ajax({
url: "<?= base_url('admin/proveedores/getProveedores') ?>",
method: "POST",
data: datos,
cache: false,
contentType: false,
processData: false,
dataType: "json",
success: function (respuesta) {
$("#idProveedor").val(respuesta["id"]);
$("#idEmpresaProveedor").val(respuesta["idEmpresa"]);
$("#idEmpresaProveedor").trigger("change");
$("#firstname").val(respuesta["firstname"]);
$("#razonSocial").val(respuesta["razonSocial"]);
$("#lastname").val(respuesta["lastname"]);
$("#taxID").val(respuesta["taxID"]);
$("#email").val(respuesta["email"]);
$("#direction").val(respuesta["direction"]);
$("#birthdate").val(respuesta["birthdate"]);
$("#formaPago").val(respuesta["formaPago"]);
$("#formaPago").trigger("change");
$("#metodoPago").val(respuesta["metodoPago"]);
$("#metodoPago").trigger("change");
$("#usoCFDI").val(respuesta["usoCFDI"]);
$("#usoCFDI").trigger("change");
$("#codigoPostal").val(respuesta["codigoPostal"]);
$("#regimenFiscal").val(respuesta["regimenFiscal"]);
$("#regimenFiscal").trigger("change");
}
})
})
$("#idEmpresaProveedor ").select2();
/*=============================================
ELIMINAR proveedores
=============================================*/
$(".tableProveedores").on("click", ".btn-delete", function () {
var idProveedores = $(this).attr("data-id");
Swal.fire({
title: '<?= lang('boilerplate.global.sweet.title') ?>',
text: "<?= lang('boilerplate.global.sweet.text') ?>",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: '<?= lang('boilerplate.global.sweet.confirm_delete') ?>'
})
.then((result) => {
if (result.value) {
$.ajax({
url: `<?= base_url('admin/proveedores') ?>/` + idProveedores,
method: 'DELETE',
}).done((data, textStatus, jqXHR) => {
Toast.fire({
icon: 'success',
title: jqXHR.statusText,
});
tableProveedores.ajax.reload();
}).fail((error) => {
Toast.fire({
icon: 'error',
title: error.responseJSON.messages.error,
});
})
}
})
})
$(function () {
$("#modalAddProveedores").draggable();
});
</script>
<?= $this->endSection() ?>
Creamos el archivo de lenguaje en español en App/Languaje/es/proveedores.php con el siguiente código.
<?php
$proveedores["logDescription"] = "El registro en proveedores fue guardado con los siguientes datos:";
$proveedores["logUpdate"] = "El registro en proveedores fue actualizado con los siguientes datos:";
$proveedores["logDeleted"] = "El registro en proveedores fue eliminado con los siguientes datos:";
$proveedores["msg_delete"] = "El Registro en clieproveedoresntes fue eliminado correctamente:";
$proveedores["add"] = "Agregar Proveedor";
$proveedores["edit"] = "Editar Proveedor";
$proveedores["createEdit"] = "Crear / Editar";
$proveedores["title"] = "Admon. Proveedores";
$proveedores["subtitle"] = "Lista de Proveedores";
$proveedores["fields"]["firstname"] = "Nombre";
$proveedores["fields"]["lastname"] = "Apellido";
$proveedores["fields"]["taxID"] = "RFC";
$proveedores["fields"]["email"] = "Correo Electronico";
$proveedores["fields"]["direction"] = "Direccion";
$proveedores["fields"]["birthdate"] = "Fecha de nacimiento";
$cusproveedorestumers["fields"]["created_at"] = "Fecha de creacion";
$proveedores["fields"]["updated_at"] = "Ultima modificacion";
$proveedores["fields"]["deleted_at"] = "Fecha de eliminacion";
$proveedores["fields"]["actions"] = "Acciones";
$proveedores["msg"]["msg_insert"] = "Registro agregado correctamente.";
$proveedores["msg"]["msg_update"] = "Registro modificado correctamente.";
$proveedores["msg"]["msg_delete"] = "Registro eliminado correctamente.";
$proveedores["msg"]["msg_get"] = "Registro obtenido correctamente.";
$proveedores["msg"]["msg_get_fail"] = "Registro no encontrado o eliminado.";
return $proveedores;
Creamos el archivo de lenguaje en ingles en App/Languaje/en/proveedores.php con el siguiente código.
<?php
$proveedores["logDescription"] = "The custumers was saved with the following data:";
$proveedores["logUpdate"] = "The custumers was updated with the following data:";
$proveedores["logDeleted"] = "The custumers was deleted with the following data:";
$proveedores["msg_delete"] = "The custumers was deleted correctly:";
$proveedores["add"] = "Add Vendor";
$proveedores["edit"] = "Edit Vendor";
$proveedores["createEdit"] = "Create / Edit";
$proveedores["title"] = "Vendors management";
$proveedores["subtitle"] = "Vendors list";
$proveedores["fields"]["firstname"] = "Firstname";
$proveedores["fields"]["lastname"] = "Lastname";
$proveedores["fields"]["taxID"] = "TaxID";
$proveedores["fields"]["email"] = "Email";
$proveedores["fields"]["direction"] = "Direction";
$proveedores["fields"]["birthdate"] = "Birthdate";
$proveedores["fields"]["created_at"] = "Created_at";
$proveedores["fields"]["updated_at"] = "Updated_at";
$proveedores["fields"]["deleted_at"] = "Deleted_at";
$proveedores["fields"]["actions"] = "Actions";
$proveedores["msg"]["msg_insert"] = "The Vendor has been correctly added.";
$proveedores["msg"]["msg_update"] = "The Vendor has been correctly modified.";
$proveedores["msg"]["msg_delete"] = "The Vendor has been correctly deleted.";
$proveedores["msg"]["msg_get"] = "The Vendor has been successfully get.";
$proveedores["msg"]["msg_get_fail"] = "The Vendor not found or already deleted.";
return $proveedores;
En App/Config/Routes.php en el grupo admin agregamos las siguientes rutas
$routes->resource('proveedores', [
'filter' => 'permission:proveedores-permission',
'controller' => 'ProveedoresController',
'except' => 'show'
]);
$routes->post('proveedores/save', 'ProveedoresController::save');
$routes->post('proveedores/getProveedores', 'ProveedoresController::getProveedores');
$routes->post('proveedores/getProveedoresAjax', 'ProveedoresController::getProveedoresAjax');
Creamos el menú de proveedores tal cual se ve en la imagen
Creamos el permiso y lo asignamos al rol correspondiente
Y listo ya tenemos nuestro catalogo de proveedores
Ahora para poder timbrar facturas CFDI necesitamos tener un catalogo de series electrónicas.
En el catalogo de series electrónicas vamos a necesitar los siguientes datos
Primero creamos el archivo de migración App/Database/migrations/2023-10-17120916_Seriesfacturaelectronica.php para la creación de la tabla en la base de datos
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class Seriesfacturaelectronica extends Migration {
public function up() {
// Seriesfacturaelectronica
$this->forge->addField([
'id' => ['type' => 'int', 'constraint' => 11, 'unsigned' => true, 'auto_increment' => true],
'idEmpresa' => ['type' => 'bigint', 'constraint' => 20, 'null' => false],
'sucursal' => ['type' => 'bigint', 'constraint' => 20, 'null' => false],
'tipoSerie' => ['type' => 'varchar', 'constraint' => 16, 'null' => false],
'serie' => ['type' => 'varchar', 'constraint' => 16, 'null' => false],
'desdeFecha' => ['type' => 'date', 'null' => false],
'hastaFecha' => ['type' => 'date', 'null' => false],
'desdeFolio' => ['type' => 'bigint', 'constraint' => 20, 'null' => false],
'hastaFolio' => ['type' => 'bigint', 'constraint' => 20, 'null' => false],
'ambienteTimbrado' => ['type' => 'varchar', 'constraint' => 32, 'null' => false],
'tokenPruebas' => ['type' => 'text', 'null' => false],
'tokenProduccion' => ['type' => 'text', 'null' => false],
'created_at' => ['type' => 'datetime', 'null' => true],
'updated_at' => ['type' => 'datetime', 'null' => true],
'deleted_at' => ['type' => 'datetime', 'null' => true],
]);
$this->forge->addKey('id', true);
$this->forge->createTable('seriesfacturaelectronica', true);
}
public function down() {
$this->forge->dropTable('seriesfacturaelectronica', true);
}
}
Creamos el archivo modelo App/Models/SeriesfacturaelectronicaModel.php para el acceso a la tabla
<?php
namespace App\Models;
use CodeIgniter\Model;
class SeriesfacturaelectronicaModel extends Model {
protected $table = 'seriesfacturaelectronica';
protected $primaryKey = 'id';
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $useSoftDeletes = true;
protected $allowedFields = ['id'
, 'idEmpresa'
, 'sucursal'
, 'tipoSerie'
, 'serie'
, 'desdeFecha'
, 'hastaFecha'
, 'desdeFolio'
, 'hastaFolio'
, 'ambienteTimbrado'
, 'tokenPruebas'
, 'tokenProduccion'
, 'created_at'
, 'updated_at'
, 'deleted_at'];
protected $useTimestamps = true;
protected $createdField = 'created_at';
protected $deletedField = 'deleted_at';
protected $validationRules = [
];
protected $validationMessages = [];
protected $skipValidation = false;
public function mdlGetSeriesfacturaelectronica($idEmpresas) {
$result = $this->db->table('seriesfacturaelectronica a, empresas b, branchoffices c')
->select('a.id
,a.idEmpresa
,a.sucursal
,a.tipoSerie
,a.serie
,a.desdeFecha
,a.hastaFecha
,a.desdeFolio
,a.hastaFolio
,a.ambienteTimbrado
,a.tokenPruebas
,a.tokenProduccion
,a.created_at
,a.updated_at
,a.deleted_at
,b.nombre as nombreEmpresa
,c.name as nombreSucursal
')
->where('a.idEmpresa', 'b.id', FALSE)
->where('a.sucursal', 'c.id', FALSE)
->whereIn('a.idEmpresa', $idEmpresas);
return $result;
}
}
Creamos el archivo controlador App/Controllers/SeriesfacturaelectronicaController.php
<?php
namespace App\Controllers;
use App\Controllers\BaseController;
use \App\Models\{
SeriesfacturaelectronicaModel
};
use App\Models\LogModel;
use CodeIgniter\API\ResponseTrait;
use App\Models\EmpresasModel;
use App\Models\BranchofficesModel;
class SeriesfacturaelectronicaController extends BaseController {
use ResponseTrait;
protected $log;
protected $seriesfacturaelectronica;
protected $sucursales;
public function __construct() {
$this->seriesfacturaelectronica = new SeriesfacturaelectronicaModel();
$this->log = new LogModel();
$this->empresa = new EmpresasModel();
$this->sucursales = new BranchofficesModel();
helper('menu');
helper('utilerias');
}
public function index() {
helper('auth');
$idUser = user()->id;
$titulos["empresas"] = $this->empresa->mdlEmpresasPorUsuario($idUser);
if (count($titulos["empresas"]) == "0") {
$empresasID[0] = "0";
} else {
$empresasID = array_column($titulos["empresas"], "id");
}
if ($this->request->isAJAX()) {
$datos = $this->seriesfacturaelectronica->mdlGetSeriesfacturaelectronica($empresasID);
return \Hermawan\DataTables\DataTable::of($datos)->toJson(true);
}
$titulos["title"] = lang('seriesfacturaelectronica.title');
$titulos["subtitle"] = lang('seriesfacturaelectronica.subtitle');
return view('seriesfacturaelectronica', $titulos);
}
/**
* Read Seriesfacturaelectronica
*/
public function getSeriesfacturaelectronica() {
helper('auth');
$idUser = user()->id;
$titulos["empresas"] = $this->empresa->mdlEmpresasPorUsuario($idUser);
if (count($titulos["empresas"]) == "0") {
$empresasID[0] = "0";
} else {
$empresasID = array_column($titulos["empresas"], "id");
}
$idSeriesfacturaelectronica = $this->request->getPost("idSeriesfacturaelectronica");
$datosSeriesfacturaelectronica = $this->seriesfacturaelectronica->whereIn('idEmpresa', $empresasID)
->where("id", $idSeriesfacturaelectronica)->first();
$datosSucursal = $this->sucursales->select("*")->where("id",$datosSeriesfacturaelectronica["sucursal"])->first();
if($datosSucursal["name"]!=null){
$datosSeriesfacturaelectronica["nombreSucursal"] = $datosSucursal["name"];
}else{
$datosSucursal["name"] ="";
}
echo json_encode($datosSeriesfacturaelectronica);
}
/**
* Save or update Seriesfacturaelectronica
*/
public function save() {
helper('auth');
$userName = user()->username;
$idUser = user()->id;
$datos = $this->request->getPost();
if ($datos["idSeriesfacturaelectronica"] == 0) {
try {
if ($this->seriesfacturaelectronica->save($datos) === false) {
$errores = $this->seriesfacturaelectronica->errors();
foreach ($errores as $field => $error) {
echo $error . " ";
}
return;
}
$dateLog["description"] = lang("vehicles.logDescription") . json_encode($datos);
$dateLog["user"] = $userName;
$this->log->save($dateLog);
echo "Guardado Correctamente";
} catch (\PHPUnit\Framework\Exception $ex) {
echo "Error al guardar " . $ex->getMessage();
}
} else {
if ($this->seriesfacturaelectronica->update($datos["idSeriesfacturaelectronica"], $datos) == false) {
$errores = $this->seriesfacturaelectronica->errors();
foreach ($errores as $field => $error) {
echo $error . " ";
}
return;
} else {
$dateLog["description"] = lang("seriesfacturaelectronica.logUpdated") . json_encode($datos);
$dateLog["user"] = $userName;
$this->log->save($dateLog);
echo "Actualizado Correctamente";
return;
}
}
return;
}
/**
* Delete Seriesfacturaelectronica
* @param type $id
* @return type
*/
public function delete($id) {
$infoSeriesfacturaelectronica = $this->seriesfacturaelectronica->find($id);
helper('auth');
$userName = user()->username;
if (!$found = $this->seriesfacturaelectronica->delete($id)) {
return $this->failNotFound(lang('seriesfacturaelectronica.msg.msg_get_fail'));
}
$this->seriesfacturaelectronica->purgeDeleted();
$logData["description"] = lang("seriesfacturaelectronica.logDeleted") . json_encode($infoSeriesfacturaelectronica);
$logData["user"] = $userName;
$this->log->save($logData);
return $this->respondDeleted($found, lang('seriesfacturaelectronica.msg_delete'));
}
}
Para los archivos de la vista ya se la saben, es un archivo principal en el que incluimos los archivos secundarios
Creamos el archivo principal App/Views/seriesfacturaelectronica.php con el siguiente código
<?= $this->include('load/toggle') ?>
<?= $this->include('julio101290\boilerplate\Views\load\select2') ?>
<?= $this->include('julio101290\boilerplate\Views\load\datatables') ?>
<?= $this->include('julio101290\boilerplate\Views\load\nestable') ?>
<!-- Extend from layout index -->
<?= $this->extend('julio101290\boilerplate\Views\layout\index') ?>
<!-- Section content -->
<?= $this->section('content') ?>
<?= $this->include('modulesSeriesfacturaelectronica/modalCaptureSeriesfacturaelectronica') ?>
<!-- SELECT2 EXAMPLE -->
<div class="card card-default">
<div class="card-header">
<div class="float-right">
<div class="btn-group">
<button class="btn btn-primary btnAddSeriesfacturaelectronica" data-toggle="modal" data-target="#modalAddSeriesfacturaelectronica"><i class="fa fa-plus"></i>
<?= lang('seriesfacturaelectronica.add') ?>
</button>
</div>
</div>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-12">
<div class="table-responsive">
<table id="tableSeriesfacturaelectronica" class="table table-striped table-hover va-middle tableSeriesfacturaelectronica">
<thead>
<tr>
<th>#</th>
<th><?= lang('seriesfacturaelectronica.fields.empresa') ?></th>
<th><?= lang('seriesfacturaelectronica.fields.sucursal') ?></th>
<th>Tipo Serie</th>
<th><?= lang('seriesfacturaelectronica.fields.desdeFecha') ?></th>
<th><?= lang('seriesfacturaelectronica.fields.hastaFecha') ?></th>
<th><?= lang('seriesfacturaelectronica.fields.desdeFolio') ?></th>
<th><?= lang('seriesfacturaelectronica.fields.ambienteTimbrado') ?></th>
<th><?= lang('seriesfacturaelectronica.fields.tokenPruebas') ?></th>
<th><?= lang('seriesfacturaelectronica.fields.tokenProduccion') ?></th>
<th><?= lang('seriesfacturaelectronica.fields.created_at') ?></th>
<th><?= lang('seriesfacturaelectronica.fields.updated_at') ?></th>
<th><?= lang('seriesfacturaelectronica.fields.deleted_at') ?></th>
<th><?= lang('seriesfacturaelectronica.fields.actions') ?> </th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- /.card -->
<?= $this->endSection() ?>
<?= $this->section('js') ?>
<script>
/**
* Cargamos la tabla
*/
var tableSeriesfacturaelectronica = $('#tableSeriesfacturaelectronica').DataTable({
processing: true,
serverSide: true,
responsive: true,
autoWidth: false,
order: [[1, 'asc']],
ajax: {
url: '<?= base_url('admin/seriesfacturaelectronica') ?>',
method: 'GET',
dataType: "json"
},
columnDefs: [{
orderable: false,
targets: [12],
searchable: false,
targets: [12]
}],
columns: [{
'data': 'id'
},
{
'data': 'nombreEmpresa'
},
{
'data': 'nombreSucursal'
},
{
'data': 'tipoSerie'
},
{
'data': 'desdeFecha'
},
{
'data': 'hastaFecha'
},
{
'data': 'desdeFolio'
},
{
'data': 'ambienteTimbrado'
},
{
'data': 'tokenPruebas'
},
{
'data': 'tokenProduccion'
},
{
'data': 'created_at'
},
{
'data': 'updated_at'
},
{
'data': 'deleted_at'
},
{
"data": function (data) {
return `<td class="text-right py-0 align-middle">
<div class="btn-group btn-group-sm">
<button class="btn btn-warning btnEditSeriesfacturaelectronica" data-toggle="modal" idSeriesfacturaelectronica="${data.id}" data-target="#modalAddSeriesfacturaelectronica"> <i class=" fa fa-edit"></i></button>
<button class="btn btn-danger btn-delete" data-id="${data.id}"><i class="fas fa-trash"></i></button>
</div>
</td>`
}
}
]
});
$(document).on('click', '#btnSaveSeriesfacturaelectronica', function (e) {
var idSeriesfacturaelectronica = $("#idSeriesfacturaelectronica").val();
var empresa = $("#empresa").val();
var sucursal = $("#sucursal").val();
var tipoSerie = $("#tipoSerie").val();
var serie = $("#serie").val();
var desdeFecha = $("#desdeFecha").val();
var hastaFecha = $("#hastaFecha").val();
var desdeFolio = $("#desdeFolio").val();
var hastaFolio = $("#hastaFolio").val();
if ($("#ambienteTimbrado").is(':checked')) {
var ambienteTimbrado = "on";
} else {
var ambienteTimbrado = "off";
}
var tokenPruebas = $("#tokenPruebas").val();
var tokenProduccion = $("#tokenProduccion").val();
$("#btnSaveSeriesfacturaelectronica").attr("disabled", true);
var datos = new FormData();
datos.append("idSeriesfacturaelectronica", idSeriesfacturaelectronica);
datos.append("idEmpresa", empresa);
datos.append("sucursal", sucursal);
datos.append("tipoSerie", tipoSerie);
datos.append("serie", serie);
datos.append("desdeFecha", desdeFecha);
datos.append("hastaFecha", hastaFecha);
datos.append("desdeFolio", desdeFolio);
datos.append("hastaFolio", hastaFolio);
datos.append("ambienteTimbrado", ambienteTimbrado);
datos.append("tokenPruebas", tokenPruebas);
datos.append("tokenProduccion", tokenProduccion);
$.ajax({
url: "<?= base_url('admin/seriesfacturaelectronica/save') ?>",
method: "POST",
data: datos,
cache: false,
contentType: false,
processData: false,
success: function (respuesta) {
if (respuesta.match(/Correctamente.*/)) {
Toast.fire({
icon: 'success',
title: "Guardado Correctamente"
});
tableSeriesfacturaelectronica.ajax.reload();
$("#btnSaveSeriesfacturaelectronica").removeAttr("disabled");
$('#modalAddSeriesfacturaelectronica').modal('hide');
} else {
Toast.fire({
icon: 'error',
title: respuesta
});
$("#btnSaveSeriesfacturaelectronica").removeAttr("disabled");
}
}
}
)
});
/**
* Carga datos actualizar
*/
/*=============================================
EDITAR Seriesfacturaelectronica
=============================================*/
$(".tableSeriesfacturaelectronica").on("click", ".btnEditSeriesfacturaelectronica", function () {
var idSeriesfacturaelectronica = $(this).attr("idSeriesfacturaelectronica");
var datos = new FormData();
datos.append("idSeriesfacturaelectronica", idSeriesfacturaelectronica);
$.ajax({
url: "<?= base_url('admin/seriesfacturaelectronica/getSeriesfacturaelectronica') ?>",
method: "POST",
data: datos,
cache: false,
contentType: false,
processData: false,
dataType: "json",
success: function (respuesta) {
$("#idSeriesfacturaelectronica").val(respuesta["id"]);
$("#empresa").val(respuesta["idEmpresa"]);
var newOptionSucursal = new Option(respuesta["nombreSucursal"], respuesta["sucursal"], true, true);
$('#sucursal').append(newOptionSucursal).trigger('change');
$("#sucursal").val(respuesta["sucursal"]);
$("#sucursal").val(respuesta["sucursal"]);
$("#tipoSerie").val(respuesta["tipoSerie"]);
$("#tipoSerie").trigger("change");
$("#serie").val(respuesta["serie"]);
$("#desdeFecha").val(respuesta["desdeFecha"]);
$("#hastaFecha").val(respuesta["hastaFecha"]);
$("#desdeFolio").val(respuesta["desdeFolio"]);
$("#hastaFolio").val(respuesta["hastaFolio"]);
$("#ambienteTimbrado").bootstrapToggle(respuesta["ambienteTimbrado"]);
$("#tokenPruebas").val(respuesta["tokenPruebas"]);
$("#tokenProduccion").val(respuesta["tokenProduccion"]);
}
})
})
/*=============================================
ELIMINAR seriesfacturaelectronica
=============================================*/
$(".tableSeriesfacturaelectronica").on("click", ".btn-delete", function () {
var idSeriesfacturaelectronica = $(this).attr("data-id");
Swal.fire({
title: '<?= lang('boilerplate.global.sweet.title') ?>',
text: "<?= lang('boilerplate.global.sweet.text') ?>",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: '<?= lang('boilerplate.global.sweet.confirm_delete') ?>'
})
.then((result) => {
if (result.value) {
$.ajax({
url: `<?= base_url('admin/seriesfacturaelectronica') ?>/` + idSeriesfacturaelectronica,
method: 'DELETE',
}).done((data, textStatus, jqXHR) => {
Toast.fire({
icon: 'success',
title: jqXHR.statusText,
});
tableSeriesfacturaelectronica.ajax.reload();
}).fail((error) => {
Toast.fire({
icon: 'error',
title: error.responseJSON.messages.error,
});
})
}
})
})
$(function () {
$("#modalAddSeriesfacturaelectronica").draggable();
});
$("#tipoSerie").select2();
</script>
<?= $this->endSection() ?>
En el archivo secundario App/Views/modulesSeriesfacturaelectronica/modalCaptureSeriesfacturaelectronica.php
<!-- Modal Seriesfacturaelectronica -->
<div class="modal fade" id="modalAddSeriesfacturaelectronica" tabindex="-1" role="dialog" aria-labelledby="modalAddSeriesfacturaelectronica" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><?= lang('seriesfacturaelectronica.createEdit') ?></h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<form id="form-seriesfacturaelectronica" class="form-horizontal">
<input type="hidden" id="idSeriesfacturaelectronica" name="idSeriesfacturaelectronica" value="0">
<div class="form-group row">
<label for="emitidoRecibido" class="col-sm-2 col-form-label">Empresa</label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-pencil-alt"></i></span>
</div>
<select class="form-control empresa" name="empresa" id="empresa" style = "width:80%;">
<option value="0">Seleccione empresa</option>
<?php
foreach ($empresas as $key => $value) {
echo "<option value='$value[id]' selected>$value[id] - $value[nombre] </option> ";
}
?>
</select>
</div>
</div>
</div>
<div class="form-group row">
<label for="sucursal" class="col-sm-2 col-form-label">Sucursal</label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-pencil-alt"></i></span>
</div>
<select class="form-control sucursal" name="sucursal" id="sucursal" style = "width:80%;">
<option value="0">Seleccione sucursal</option>
</select>
</div>
</div>
</div>
<div class="form-group row">
<label for="sucursal" class="col-sm-2 col-form-label">Tipo Serie</label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-pencil-alt"></i></span>
</div>
<select class="form-control tipoSerie" name="tipoSerie" id="tipoSerie" style = "width:80%;">
<option value="ven">Venta</option>
<option value="pag">Pago</option>
<option value="dev">Devolución</option>
<option value="bon">Bonificaciónn</option>
</select>
</div>
</div>
</div>
<div class="form-group row">
<label for="desdeFecha" class="col-sm-2 col-form-label"><?= lang('seriesfacturaelectronica.fields.desdeFecha') ?></label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-pencil-alt"></i></span>
</div>
<input type="date" name="desdeFecha" id="desdeFecha" class="form-control <?= session('error.desdeFecha') ? 'is-invalid' : '' ?>" value="<?= old('desdeFecha') ?>" placeholder="<?= lang('seriesfacturaelectronica.fields.desdeFecha') ?>" autocomplete="off">
</div>
</div>
</div>
<div class="form-group row">
<label for="hastaFecha" class="col-sm-2 col-form-label"><?= lang('seriesfacturaelectronica.fields.hastaFecha') ?></label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-pencil-alt"></i></span>
</div>
<input type="date" name="hastaFecha" id="hastaFecha" class="form-control <?= session('error.hastaFecha') ? 'is-invalid' : '' ?>" value="<?= old('hastaFecha') ?>" placeholder="<?= lang('seriesfacturaelectronica.fields.hastaFecha') ?>" autocomplete="off">
</div>
</div>
</div>
<div class="form-group row">
<label for="serie" class="col-sm-2 col-form-label">Serie</label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-pencil-alt"></i></span>
</div>
<input type="text" name="serie" id="serie" class="form-control <?= session('error.serie') ? 'is-invalid' : '' ?>" value="<?= old('desdeFolio') ?>" placeholder="Inserte serie" autocomplete="off">
</div>
</div>
</div>
<div class="form-group row">
<label for="desdeFolio" class="col-sm-2 col-form-label"><?= lang('seriesfacturaelectronica.fields.desdeFolio') ?></label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-pencil-alt"></i></span>
</div>
<input type="number" name="desdeFolio" id="desdeFolio" class="form-control <?= session('error.desdeFolio') ? 'is-invalid' : '' ?>" value="<?= old('desdeFolio') ?>" placeholder="<?= lang('seriesfacturaelectronica.fields.desdeFolio') ?>" autocomplete="off">
</div>
</div>
</div>
<div class="form-group row">
<label for="hastaFolio" class="col-sm-2 col-form-label">Hasta Folio</label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-pencil-alt"></i></span>
</div>
<input type="number" name="hastaFolio" id="hastaFolio" class="form-control <?= session('error.desdeFolio') ? 'is-invalid' : '' ?>" value="<?= old('hastaFolio') ?>" placeholder="Hasta Folio" autocomplete="off">
</div>
</div>
</div>
<div class="form-group row">
<label for="ambienteTimbrado" class="col-sm-2 col-form-label"><?= lang('seriesfacturaelectronica.fields.ambienteTimbrado') ?></label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-pencil-alt"></i></span>
</div>
<input type="checkbox" name="ambienteTimbrado" id="ambienteTimbrado" class="form-control " autocomplete="off" data-width="250" data-height="40" checked data-toggle="toggle" data-on="produccion" data-off="pruebas" data-onstyle="success" data-offstyle="danger">
</div>
</div>
</div>
<div class="form-group row">
<label for="tokenPruebas" class="col-sm-2 col-form-label"><?= lang('seriesfacturaelectronica.fields.tokenPruebas') ?></label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-pencil-alt"></i></span>
</div>
<input type="text" name="tokenPruebas" id="tokenPruebas" class="form-control <?= session('error.tokenPruebas') ? 'is-invalid' : '' ?>" value="<?= old('tokenPruebas') ?>" placeholder="<?= lang('seriesfacturaelectronica.fields.tokenPruebas') ?>" autocomplete="off">
</div>
</div>
</div>
<div class="form-group row">
<label for="tokenProduccion" class="col-sm-2 col-form-label"><?= lang('seriesfacturaelectronica.fields.tokenProduccion') ?></label>
<div class="col-sm-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fas fa-pencil-alt"></i></span>
</div>
<input type="text" name="tokenProduccion" id="tokenProduccion" class="form-control <?= session('error.tokenProduccion') ? 'is-invalid' : '' ?>" value="<?= old('tokenProduccion') ?>" placeholder="<?= lang('seriesfacturaelectronica.fields.tokenProduccion') ?>" autocomplete="off">
</div>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal"><?= lang('boilerplate.global.close') ?></button>
<button type="button" class="btn btn-primary btn-sm" id="btnSaveSeriesfacturaelectronica"><?= lang('boilerplate.global.save') ?></button>
</div>
</div>
</div>
</div>
<?= $this->section('js') ?>
<script>
$(document).on('click', '.btnAddSeriesfacturaelectronica', function (e) {
$(".form-control").val("");
$("#idSeriesfacturaelectronica").val("0");
$("#empresa").val("0");
$("#empresa").trigger("change");
$("#ambienteTimbrado").bootstrapToggle("off");
$("#btnSaveSeriesfacturaelectronica").removeAttr("disabled");
});
/*
* AL hacer click al editar
*/
$(document).on('click', '.btnEditSeriesfacturaelectronica', function (e) {
var idSeriesfacturaelectronica = $(this).attr("idSeriesfacturaelectronica");
//LIMPIAMOS CONTROLES
$(".form-control").val("");
$("#idSeriesfacturaelectronica").val(idSeriesfacturaelectronica);
$("#btnGuardarSeriesfacturaelectronica").removeAttr("disabled");
});
$("#empresa").select2();
$("#empresa").trigger("change");
$("#sucursal").select2({
ajax: {
url: "<?= site_url('admin/sucursales/getSucursalesAjax') ?>",
type: "post",
dataType: 'json',
delay: 250,
data: function (params) {
// CSRF Hash
var csrfName = $('.txt_csrfname').attr('name'); // CSRF Token name
var csrfHash = $('.txt_csrfname').val(); // CSRF hash
var idEmpresa = $('.empresa').val(); // CSRF hash
return {
searchTerm: params.term, // search term
[csrfName]: csrfHash, // CSRF Token
idEmpresa: idEmpresa // search term
};
},
processResults: function (response) {
// Update CSRF Token
$('.txt_csrfname').val(response.token);
return {
results: response.data
};
},
cache: true
}
});
</script>
<?= $this->endSection() ?>
En las rutas App/config/Routes.php dentro del grupo admin agregamos el siguiente código
$routes->resource('seriesfacturaelectronica', [
'filter' => 'permission:seriesfacturaelectronica-permission',
'controller' => 'seriesfacturaelectronicaController',
'except' => 'show'
]);
$routes->post('seriesfacturaelectronica/save', 'SeriesfacturaelectronicaController::save');
$routes->post('seriesfacturaelectronica/getSeriesfacturaelectronica', 'SeriesfacturaelectronicaController::getSeriesfacturaelectronica');
Creamos el menú para las series electrónicas con los siguientes datos
Y listo ya tenemos nuestro CRUD de Series Electronicas
Creado con WordPress & Tema de Anders Norén