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

- Empresa
- Sucursal
- Tipo Serie (venta,pago,devolucion,bonificacion)
- Serie
- Desde Fecha
- Hasta Fecha
- Desde Folio
- Hasta Folio
- Ambiente Timbrado
- Token pruebas
- Token producción
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

1 pingback