1686 lines
92 KiB
PHP
Raw Normal View History

2025-03-05 21:11:33 -06:00
<section id="admin-crm-contacts-view">
<div class="row" x-data="{
activeTab: 'general-info',
activeTabPan: localStorage.getItem('activeTabPan') || 'cuenta-usuario',
setActiveTabPan(tab) {
this.activeTabPan = tab;
localStorage.setItem('activeTabPan', tab);
}
}">
<div class="col-md-12">
<div class="nav-align-top">
<ul class="nav nav-pills flex-column flex-md-row mb-6 gap-2 gap-lg-0">
<li class="nav-item">
<a @click="activeTab='general-info'" :class="{ 'active': activeTab === 'general-info' }" class="nav-link">Información general</a>
</li>
<li class="nav-item">
<a @click="activeTab='cotizaciones'" :class="{ 'active': activeTab === 'cotizaciones' }" x-on:click="loadTable('cotizaciones')" class="nav-link">Cotizaciones</a>
</li>
<li class="nav-item">
<a @click="activeTab='pago-pendiente'" :class="{ 'active': activeTab === 'pago-pendiente' }" x-on:click="loadTable('pago-pendiente')" class="nav-link">Pago pendiente</a>
</li>
<li class="nav-item">
<a @click="activeTab='pendientes-entrega'" :class="{ 'active': activeTab === 'pendientes-entrega' }" x-on:click="loadTable('pendientes-entrega')" class="nav-link">Pendientes de entrega</a>
</li>
<li class="nav-item">
<a @click="activeTab='procesados'" :class="{ 'active': activeTab === 'procesados' }" x-on:click="loadTable('procesados')" class="nav-link">Procesados</a>
</li>
<li class="nav-item">
<a @click="activeTab='pagos'" :class="{ 'active': activeTab === 'pagos' }" x-on:click="loadTable('pagos')" class="nav-link">Pagos</a>
</li>
</ul>
</div>
<div>
<div x-show="activeTab === 'general-info'">
<div class="row">
<div class="col-xl-12">
<div class="nav-align-left nav-tabs-shadow mb-6">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button type="button" @click="setActiveTabPan('cuenta-usuario')" :class="{ 'active': activeTabPan === 'cuenta-usuario' }" class="nav-link waves-effect" role="tab" data-bs-toggle="tab" data-bs-target="#navs-left-cuenta-usuario" aria-controls="navs-left-cuenta-usuario" tabindex="-1">
<i class="ti ti-user pr-2"></i> Cuenta de usuario
</button>
</li>
@if (($is_customer || $is_user) && $this->tipo_persona != App\Models\User::TIPO_RFC_PUBLICO)
<li class="nav-item" role="presentation">
<button type="button" @click="setActiveTabPan('accesos')" :class="{ 'active': activeTabPan === 'accesos' }" class="nav-link waves-effect" role="tab" data-bs-toggle="tab" data-bs-target="#navs-left-accesos" aria-controls="navs-left-accesos">
<i class="ti ti-key pr-2"></i> Accesos
</button>
</li>
@endif
@if ($is_prospect || $is_customer || $is_provider)
<li class="nav-item" role="presentation">
<button type="button" @click="setActiveTabPan('facturacion-electronica')" :class="{ 'active': activeTabPan === 'facturacion-electronica' }" class="nav-link waves-effect" role="tab" data-bs-toggle="tab" data-bs-target="#navs-left-facturacion-electronica" aria-controls="navs-left-facturacion-electronica">
<i class="ti ti-rubber-stamp pr-2"></i> Facturación electrónica
</button>
</li>
@endif
@if (($is_prospect || $is_customer || $is_provider || $is_user) && $this->tipo_persona != App\Models\User::TIPO_RFC_PUBLICO)
<li class="nav-item" role="presentation">
<button type="button" @click="setActiveTabPan('direcciones')" :class="{ 'active': activeTabPan === 'direcciones' }" class="nav-link waves-effect" role="tab" data-bs-toggle="tab" data-bs-target="#navs-left-direcciones" aria-controls="navs-left-direcciones">
<i class="ti ti-map-pin pr-2"></i> Direcciones
</button>
</li>
@endif
@if (($is_prospect || $is_customer || $is_provider || $is_user) && $this->tipo_persona != App\Models\User::TIPO_RFC_PUBLICO)
<li class="nav-item" role="presentation">
<button type="button" @click="setActiveTabPan('contacto')" :class="{ 'active': activeTabPan === 'contacto' }" class="nav-link waves-effect" role="tab" data-bs-toggle="tab" data-bs-target="#navs-left-contacto" aria-controls="navs-left-contacto">
<i class="ti ti-address-book pr-2"></i> Contacto
</button>
</li>
@endif
@if (($is_customer || $is_provider) && $this->tipo_persona != App\Models\User::TIPO_RFC_PUBLICO)
<li class="nav-item" role="presentation">
<button type="button" @click="setActiveTabPan('cuentas-bancarias')" :class="{ 'active': activeTabPan === 'cuentas-bancarias' }" class="nav-link waves-effect" role="tab" data-bs-toggle="tab" data-bs-target="#navs-left-cuentas-bancarias" aria-controls="navs-left-cuentas-bancarias">
<i class="ti ti-credit-card pr-2"></i> Cuentas bancarias
</button>
</li>
@endif
</ul>
<div class="tab-content">
<div class="tab-pane fade" :class="{ 'active show': activeTabPan === 'cuenta-usuario' }" id="navs-left-cuenta-usuario" role="tabpanel">
@if($cuentaUsuarioAlert)
<div class="alert alert-{{ $cuentaUsuarioAlert['type'] }} alert-cuenta-usuario alert-dismissible" role="alert">
{{ $cuentaUsuarioAlert['message'] }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif
<form id="cuentaUsuario-form" class="fv-plugins-bootstrap5 fv-plugins-framework" novalidate="novalidate">
<input type="hidden" name="userId" wire:model='userId'>
<div class="row">
<div class="col-lg-6" wire:ignore>
<div class="row custom-options-checkable mb-4">
<div class="col-md-4">
<input class="custom-option-item-check" id="tipo_persona_fisica" name="tipo_persona" type="radio" value="1" wire:model="tipo_persona" >
<label class="custom-option-item p-3" for="tipo_persona_fisica">
<span class="d-flex justify-content-between flex-wrap">
<span class="fw-bolder">Persona física</span>
</span>
</label>
</div>
<div class="col-md-4">
<input class="custom-option-item-check" id="tipo_persona_moral" name="tipo_persona" type="radio" value="2" wire:model="tipo_persona">
<label class="custom-option-item p-3" for="tipo_persona_moral">
<span class="d-flex justify-content-between flex-wrap">
<span class="fw-bolder">Persona moral</span>
</span>
</label>
</div>
<div class="col-md-4">
<input class="custom-option-item-check" id="tipo_publico_en_general" name="tipo_persona" type="radio" value="9" wire:model="tipo_persona">
<label class="custom-option-item p-3" for="tipo_publico_en_general">
<span class="d-flex justify-content-between flex-wrap">
<span class="fw-bolder">Público en general</span>
</span>
</label>
</div>
</div>
<div class="fv-row mb-3">
<label for="name" class="form-label">Nombre</label>
<div class="input-group input-group-merge input-group-name">
<span class="input-group-text">
<i class="ti ti-building-skyscraper"></i>
<i class="ti ti-user"></i>
</span>
<input type="text" id="name" name="name" wire:model='name' class="form-control" placeholder="Nombre completo">
</div>
<div class="error-message"></div>
</div>
<div class="fv-row cargo-div mb-6">
<label for="cargo" class="form-label">Cargo o puesto laboral</label>
<input type="text" id="cargo" name="cargo" wire:model='cargo' class="form-control" placeholder="Cargo o puesto laboral">
<div class="error-message"></div>
</div>
<div class="mb-3">
<x-checkbox-v value="{{ old('is_prospect', $is_prospect) }}"
name='is_prospect'
wire:model='is_prospect'
parent_class='form-switch'>
Es prospecto
</x-checkbox-v>
</div>
<div class="mb-3">
<x-checkbox-v value="{{ old('is_customer', $is_customer) }}"
name='is_customer'
wire:model='is_customer'
parent_class='form-switch'>
Es cliente
</x-checkbox-v>
</div>
<div class="mb-3">
<x-checkbox-v value="{{ old('is_provider', $is_provider) }}"
name='is_provider'
wire:model='is_provider'
parent_class='form-switch'>
Es proveedor
</x-checkbox-v>
</div>
<div class="mb-6">
<x-checkbox-v value="{{ old('is_user', $is_user) }}"
name='is_user'
wire:model='is_user'
parent_class='form-switch'>
Es usuario
</x-checkbox-v>
</div>
<div class="row pricelist-div mb-3">
<div class="col-lg-12">
<label for="pricelist_id" class="form-label">Lista de precios</label>
<x-form.select name="pricelist_id" wire:model='pricelist_id' :options="$pricelists_options" :placeholder="'Selecciona la lista de precios'" />
</div>
</div>
<div class="row credit-div">
<div class="col-md-6 mt-3 mb-3">
<x-checkbox-v value="{{ old('enable_credit', $enable_credit) }}"
name='enable_credit'
wire:model='enable_credit'
parent_class='form-switch'>
Habilitar línea de crédito
</x-checkbox-v>
</div>
</div>
<div class="row credit-div credit-limit-div">
<div class="col-md-6 fv-row ">
<label for="credit_days" class="form-label">Máximo de días de crédito</label>
<div class="input-group input-group-merge">
<span class="input-group-text"><i class="ti ti-calendar-event"></i></span>
<input type="number" id="credit_days" name="credit_days" wire:model='credit_days' class="form-control text-center">
</div>
<div class="error-message"></div>
</div>
<div class="col-md-6 fv-row credit-limit-div">
<label for="credit_limit" class="form-label">Línea de cŕedito</label>
<div class="input-group input-group-merge">
<span class="input-group-text">$</span>
<input type="number" id="credit_limit" name="credit_limit" wire:model='credit_limit' class="form-control text-right">
</div>
<div class="error-message"></div>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="image-wrapper-520x520 mb-3">
<!-- Mostrar una vista previa de la imagen seleccionada -->
<img id="user-image" src="{{ $image? $image->temporaryUrl() : $profile_photo }}">
</div>
<input type="file" name="image" wire:model="image" id="image" class='form-control' accept='image/*' />
@error('image') <span class="error">{{ $message }}</span> @enderror
@if(!$deleteUserImage)
<button type="button" class="btn btn-outline-warning waves-effect btn-delete-image mt-3" onclick="btnDeleteImage()">Eliminar imagen</button>
@endif
</div>
</div>
<div class="row mt-2" wire:ignore>
<div class="col-lg-12">
<button type="submit" id="cuentaUsuario-saveButton" class="btn btn-primary me-3 waves-effect waves-light" disabled>Guardar cambios</button>
<button type="button" id="cuentaUsuario-resetButton" class="btn btn-label-secondary waves-effect" disabled>Cancelar</button>
</div>
</div>
</form>
</div>
<div class="tab-pane fade" :class="{ 'active show': activeTabPan === 'accesos' }" id="navs-left-accesos" role="tabpanel">
@if($accesosAlert)
<div class="alert alert-{{ $accesosAlert['type'] }} alert-accesos alert-dismissible" role="alert">
{{ $accesosAlert['message'] }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif
<form id="accesos-form" class="fv-plugins-bootstrap5 fv-plugins-framework" novalidate="novalidate">
<div class="row">
<div class="col-md-6">
<div class="fv-row mb-3">
<label for="status" class="form-label">Estatus</label>
<div class="input-group input-group-merge">
<span class="input-group-text"><i class="ti ti-shield-exclamation"></i></span>
<x-form.select name="status" :options="$status_options" wire:model='status'/>
</div>
</div>
<div class="fv-row mb-3">
<label for="email" class="form-label">Correo electrónico</label>
<div class="input-group input-group-merge">
<span class="input-group-text"><i class="ti ti-mail"></i></span>
<input type="text" id="email" name="name" wire:model='email' class="form-control" placeholder="Correo electrónico">
</div>
<div class="error-message"></div>
</div>
<div class="fv-row mb-3">
<label for="password" class="form-label">Contraseña</label>
<div class="input-group input-group-merge">
<span class="input-group-text"><i class="ti ti-key"></i></span>
<input type="password" id="password" name="password" wire:model='password' class="form-control" placeholder="Dejar en blanco para no cambiar">
</div>
<div class="error-message"></div>
</div>
<div class="fv-row mb-3">
<label for="password_confirmation" class="form-label">Confirmar contraseña</label>
<div class="input-group input-group-merge">
<span class="input-group-text"><i class="ti ti-key"></i></span>
<input type="password" id="password_confirmation" name="password_confirmation" wire:model='password_confirmation' class="form-control" placeholder="Dejar en blanco para no cambiar">
</div>
<div class="error-message"></div>
</div>
</div>
</div>
<div class="row mt-2" wire:ignore>
<div class="col-lg-12">
<button type="submit" id="accesos-saveButton" class="btn btn-primary me-3 waves-effect waves-light" disabled>Guardar cambios</button>
<button type="button" id="accesos-resetButton" class="btn btn-label-secondary waves-effect" disabled>Cancelar</button>
</div>
</div>
</form>
</div>
<div class="tab-pane fade" :class="{ 'active show': activeTabPan === 'facturacion-electronica' }" id="navs-left-facturacion-electronica" role="tabpanel">
@if($facturacionElectronicaAlert)
<div class="alert alert-{{ $facturacionElectronicaAlert['type'] }} alert-facturacion-electronica alert-dismissible" role="alert">
{{ $facturacionElectronicaAlert['message'] }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif
<form id="facturacion-electronica-form" class="fv-plugins-bootstrap5 fv-plugins-framework" novalidate="novalidate">
<div class="row">
<div class="col-md-6">
<div class="row">
<div class="col-lg-6 fv-row mb-3">
<label for="rfc" class="form-label">RFC</label>
<input type="text" id="rfc" name="name" wire:model='rfc' class="form-control uppercase" placeholder="RFC">
<div class="error-message"></div>
</div>
<div class="col-lg-6 fv-row mb-3">
<label for="domicilio_fiscal" class="form-label">Domicilio fiscal (C.P.)</label>
<div class="input-group input-group-merge">
<span class="input-group-text"><i class="ti ti-mailbox"></i></span>
<input type="number" id="domicilio_fiscal" name="domicilio_fiscal" wire:model='domicilio_fiscal' class="form-control text-center" placeholder="Código postal">
</div>
<div class="error-message"></div>
</div>
</div>
<div class="fv-row mb-3">
<label for="nombre_fiscal" class="form-label">Nombre fiscal</label>
<input type="text" id="nombre_fiscal" name="nombre_fiscal" wire:model='nombre_fiscal' class="form-control uppercase" placeholder="Nombre fiscal">
<div class="error-message"></div>
</div>
<div class="fv-row mb-3">
<label for="c_regimen_fiscal" class="form-label">Regimen fiscal</label>
<x-form.select name="c_regimen_fiscal" :options="$regimen_fiscal_options" wire:model='c_regimen_fiscal' :placeholder="'Selecciona regimen fiscal'" />
<div class="error-message"></div>
</div>
<div class="fv-row mb-3">
<label for="c_uso_cfdi" class="form-label">Uso de CFDI preferido</label>
<x-form.select name="c_uso_cfdi" :options="$uso_cfdi_options" wire:model='c_uso_cfdi' :placeholder="'Selecciona uso de CFDI'" />
<div class="error-message"></div>
</div>
</div>
<div class="col-md-6" wire:ignore>
<div class="pdf-dropzone-div mb-4">
<div class="dropzone mini-dropzone" id="pdf-dropzone">
<div class="dz-message needsclick">
Constancia de situación fiscal
<span class="note needsclick">Arastre aquí el PDF o haga clic para cargarlo.</span>
</div>
</div>
<div class="error-message"></div>
</div>
</div>
</div>
<div class="row mt-2" wire:ignore>
<div class="col-lg-12">
<button type="submit" id="facturacion-electronica-saveButton" class="btn btn-primary me-3 waves-effect waves-light" disabled>Guardar cambios</button>
<button type="button" id="facturacion-electronica-resetButton" class="btn btn-label-secondary waves-effect" disabled>Cancelar</button>
</div>
</div>
</form>
</div>
<div class="tab-pane fade" :class="{ 'active show': activeTabPan === 'direcciones' }" id="navs-left-direcciones" role="tabpanel">
<p>Oat cake chupa chups dragée donut toffee. Sweet cotton candy jelly beans macaroon gummies cupcake gummi</p>
</div>
<div class="tab-pane fade" :class="{ 'active show': activeTabPan === 'contacto' }" id="navs-left-contacto" role="tabpanel">
<p>Oat cake chupa chups dragée donut toffee. Sweet cotton candy jelly beans macaroon gummies cupcake gummi</p>
</div>
<div class="tab-pane fade" :class="{ 'active show': activeTabPan === 'cuentas-bancarias' }" id="navs-left-cuentas-bancarias" role="tabpanel">
<p>Oat cake chupa chups dragée donut toffee. Sweet cotton candy jelly beans macaroon gummies cupcake gummi</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div x-show="activeTab === 'cotizaciones'">
<div class="card">
<div class="card-datatable table-responsive pt-0">
<table class="dt-cotizaciones table">
<thead>
<tr>
<th></th>
<th>id</th>
<th>Name</th>
<th>Email</th>
<th>Date</th>
<th>Salary</th>
<th>Status</th>
<th>Action</th>
</tr>
</thead>
</table>
</div>
</div>
</div>
<div x-show="activeTab === 'pago-pendiente'">
<div class="card">
<div class="card-datatable table-responsive pt-0">
<table class="dt-pago-pendiente table">
<thead>
<tr>
<th></th>
<th>id</th>
<th>Name</th>
<th>Email</th>
<th>Date</th>
<th>Salary</th>
<th>Status</th>
<th>Action</th>
</tr>
</thead>
</table>
</div>
</div>
</div>
<div x-show="activeTab === 'pendientes-entrega'">
<div class="card">
<div class="card-datatable table-responsive pt-0">
<table class="dt-pendientes-entrega table">
<thead>
<tr>
<th></th>
<th>id</th>
<th>Name</th>
<th>Email</th>
<th>Date</th>
<th>Salary</th>
<th>Status</th>
<th>Action</th>
</tr>
</thead>
</table>
</div>
</div>
</div>
<div x-show="activeTab === 'procesados'">
<div class="card">
<div class="card-datatable table-responsive pt-0">
<table class="dt-procesados table">
<thead>
<tr>
<th></th>
<th>id</th>
<th>Name</th>
<th>Email</th>
<th>Date</th>
<th>Salary</th>
<th>Status</th>
<th>Action</th>
</tr>
</thead>
</table>
</div>
</div>
</div>
<div x-show="activeTab === 'pagos'">
<div class="card">
<div class="card-datatable table-responsive pt-0">
<table class="dt-pagos table">
<thead>
<tr>
<th></th>
<th>id</th>
<th>Name</th>
<th>Email</th>
<th>Date</th>
<th>Salary</th>
<th>Status</th>
<th>Action</th>
</tr>
</thead>
</table>
</div>
</div>
</div>
</div>
</div>
</section>
@push('page-script')
<script>
const cuentaUsuarioSaveButton = document.getElementById('cuentaUsuario-saveButton');
const cuentaUsuarioResetButton = document.getElementById('cuentaUsuario-resetButton');
const accesosSaveButton = document.getElementById('accesos-saveButton');
const accesosResetButton = document.getElementById('accesos-resetButton');
const facturacionElectronicaSaveButton = document.getElementById('facturacion-electronica-saveButton');
const facturacionElectronicaResetButton = document.getElementById('facturacion-electronica-resetButton');
const btnDeleteImage = () => {
$("#user-image").prop('src', '');
cuentaUsuarioSaveButton.disabled = false;
cuentaUsuarioResetButton.disabled = false;
@this.set('image', null, false);
@this.set('deleteUserImage', true, false);
$('.btn-delete-image').remove();
}
const initGeneralInfo = () => {
$("input[name=tipo_persona]")
.on("change", function () {
configInputsGeneralInfo();
});
$("#is_prospect")
.on('change', function(){
if($("#is_prospect").is(':checked') && $("#is_customer").is(":checked")){
@this.set('is_customer', false, false).then(() => {
configInputsGeneralInfo();
});
}else{
configInputsGeneralInfo();
}
});
$("#is_customer")
.on('change', function(){
if($("#is_prospect").is(':checked') && $("#is_customer").is(":checked")){
@this.set('is_prospect', false, false).then(() => {
configInputsGeneralInfo();
});
}else{
configInputsGeneralInfo();
}
});
$("#enable_credit")
.on('change', function(){
configInputsGeneralInfo();
});
$("#image")
.on('change', function(){
@this.set('cuentaUsuarioAlert', null, false);
@this.set('deleteUserImage', false, false);
});
$('#cuentaUsuario-form :input')
.on('input', function(){
cuentaUsuarioSaveButton.disabled = false;
cuentaUsuarioResetButton.disabled = false;
@this.set('cuentaUsuarioAlert', null, false).then(() => {
$('.alert-cuenta-usuario').remove();
});
});
$('#cuentaUsuario-resetButton')
.on('click', function () {
@this.reloadUserData();
cuentaUsuarioSaveButton.disabled = true;
cuentaUsuarioResetButton.disabled = true;
});
$("#cuentaUsuario-form")
.validate({
errorClass: 'error',
highlight: function(element, errorClass, validClass) {
// Agrega la clase de error a la fila (contenedor del campo)
$(element).closest('.fv-row').addClass('has-error');
},
unhighlight: function(element, errorClass, validClass) {
// Elimina la clase de error de la fila (contenedor del campo)
$(element).closest('.fv-row').removeClass('has-error');
},
errorPlacement: function(error, element) {
// Controla dónde se colocan los mensajes de error
error.appendTo(element.closest('.fv-row').find('.error-message'));
},
rules: {
name: {
required: true,
minlength: 3,
maxlength: 255,
normalizer: function(value) {
return $.trim(value); // Aplicar trim antes de validar
}
},
cargo: {
minlength: 3,
maxlength: 255,
normalizer: function(value) {
return $.trim(value); // Aplicar trim antes de validar
}
}
},
messages: {
name: {
required: "Por favor ingrese el nombre del contacto",
},
},
submitHandler: function(form, event) {
event.preventDefault();
@this.call('saveCuentaUsuario').then(() => {
initAllForms();
const cuentaUsuarioSaveButton = document.getElementById('cuentaUsuario-saveButton');
const cuentaUsuarioResetButton = document.getElementById('cuentaUsuario-resetButton');
cuentaUsuarioSaveButton.disabled = true;
cuentaUsuarioResetButton.disabled = true;
});
}
});
};
const configInputsGeneralInfo = () => {
let is_prospect = $("#is_prospect").is(":checked"),
is_customer = $("#is_customer").is(":checked"),
enable_credit = $("#enable_credit").is(":checked"),
tipo_persona = Number($("input[name=tipo_persona]:checked").val());
// Persona física
if(tipo_persona == 1){
$(".cargo-div").show();
}else{
$(".cargo-div").hide();
}
// Persona moral
if(tipo_persona == 2){
$(".input-group-name i.ti-building-skyscraper").show();
$(".input-group-name i.ti-user").hide();
}else{
$(".input-group-name i.ti-building-skyscraper").hide();
$(".input-group-name i.ti-user").show();
}
// Publico en general
if(tipo_persona == 9){
@this.set('is_prospect', false, false);
@this.set('is_customer', true, false);
@this.set('is_provider', false, false);
@this.set('is_user', false, false);
@this.set('enable_credit', false, false);
$("#is_prospect").prop("disabled", true);
$("#is_provider").prop("disabled", true);
$("#is_user").prop("disabled", true);
}else{
$("#is_prospect").prop("disabled", false);
$("#is_provider").prop("disabled", false);
$("#is_user").prop("disabled", false);
}
if (is_prospect || is_customer) {
$('.pricelist-div').show();
}else{
$('.pricelist-div').hide();
}
if (is_customer && tipo_persona != 9) {
$('.credit-div').show();
if (enable_credit)
$('.credit-limit-div').show();
else
$('.credit-limit-div').hide();
}else{
$('.credit-div').hide();
$('.credit-limit-div').hide();
}
}
const initAccesses = () => {
$('#accesos-form :input')
.on('input', function(){
accesosSaveButton.disabled = false;
accesosResetButton.disabled = false;
@this.set('accesosAlert', null, false).then(() => {
$('.alert-accesos').remove();
});
});
$('#accesos-resetButton')
.on('click', function () {
@this.reloadUserData();
accesosSaveButton.disabled = true;
accesosResetButton.disabled = true;
});
$("#accesos-form")
.validate({
errorClass: 'error',
highlight: function(element, errorClass, validClass) {
// Agrega la clase de error a la fila (contenedor del campo)
$(element).closest('.fv-row').addClass('has-error');
},
unhighlight: function(element, errorClass, validClass) {
// Elimina la clase de error de la fila (contenedor del campo)
$(element).closest('.fv-row').removeClass('has-error');
},
errorPlacement: function(error, element) {
// Controla dónde se colocan los mensajes de error
error.appendTo(element.closest('.fv-row').find('.error-message'));
},
rules: {
email: {
required: true,
email: true,
},
password: {
minlength: 5,
maxlength: 32,
},
password_confirmation: {
equalTo: "#password" // Valida que coincida con el campo 'password'
}
},
messages: {
email: {
required: "El correo electrónico es obligatorio.",
email: "Debes ingresar un correo electrónico válido.",
},
password: {
minlength: "La contraseña debe tener al menos 5 caracteres.",
maxlength: "La contraseña no puede tener más de 32 caracteres."
},
password_confirmation: {
equalTo: "Las contraseñas no coinciden."
}
},
submitHandler: function(form, event) {
event.preventDefault();
@this.call('saveAccesos').then(() => {
initAllForms();
const accesosSaveButton = document.getElementById('accesos-saveButton');
const accesosResetButton = document.getElementById('accesos-resetButton');
accesosSaveButton.disabled = true;
accesosResetButton.disabled = true;
});
}
});
}
const initFiscalInfo = () => {
$('#facturacion-electronica-form :input')
.on('input', function(){
facturacionElectronicaSaveButton.disabled = false;
facturacionElectronicaResetButton.disabled = false;
@this.set('facturacionElectronicaAlert', null, false).then(() => {
$('.alert-facturacion-electronica').remove();
});
});
$('#facturacion-electronica-resetButton')
.on('click', function () {
@this.reloadUserData();
facturacionElectronicaSaveButton.disabled = true;
facturacionElectronicaResetButton.disabled = true;
});
$("#facturacion-electronica-form")
.validate({
errorClass: 'error',
highlight: function(element, errorClass, validClass) {
// Agrega la clase de error a la fila (contenedor del campo)
$(element).closest('.fv-row').addClass('has-error');
},
unhighlight: function(element, errorClass, validClass) {
// Elimina la clase de error de la fila (contenedor del campo)
$(element).closest('.fv-row').removeClass('has-error');
},
errorPlacement: function(error, element) {
// Controla dónde se colocan los mensajes de error
error.appendTo(element.closest('.fv-row').find('.error-message'));
},
rules: {
rfc: {
maxlength: 13,
pattern: /^[A-Z&Ñ]{3,4}\d{6}[A-Z\d]{3}$/, // Expresión regular para RFC
normalizer: function(value) {
return $.trim(value);
}
},
domicilio_fiscal: {
digits: true, // Solo permite números
minlength: 5,
maxlength: 5, // Debe ser exactamente de 5 dígitos
}
},
messages: {
rfc: {
maxlength: "El RFC no debe exceder los 13 caracteres.",
pattern: "El RFC ingresado no es válido. Verifica el formato.",
},
domicilio_fiscal: {
digits: "El código postal solo debe contener números.",
minlength: "El código postal debe tener 5 dígitos.",
maxlength: "El código postal debe tener 5 dígitos."
}
},
submitHandler: function(form, event) {
event.preventDefault();
@this.call('saveFacturacionElectronica').then(() => {
initAllForms();
const facturacionElectronicaSaveButton = document.getElementById('facturacion-electronica-saveButton');
const facturacionElectronicaResetButton = document.getElementById('facturacion-electronica-resetButton');
facturacionElectronicaSaveButton.disabled = true;
facturacionElectronicaResetButton.disabled = true;
});
}
});
}
const initAllForms = () => {
initGeneralInfo();
initAccesses();
initFiscalInfo();
configInputsGeneralInfo();
}
// Almacena un indicador para saber si las tablas ya han sido inicializadas
let tablesInitialized = {
'cotizaciones': false,
'pago-pendiente': false,
'pendientes-entrega': false,
'procesados': false,
'pagos': false
};
// Función para cargar una tabla específica si aún no ha sido inicializada
function loadTable(tabName) {
if (!tablesInitialized[tabName]) {
switch (tabName) {
case 'cotizaciones':
initializeCotizacionesTable();
break;
case 'pago-pendiente':
initializePagoPendienteTable();
break;
case 'pendientes-entrega':
initializePendientesEntregaTable();
break;
case 'procesados':
initializeProcesadosTable();
break;
case 'pagos':
initializePagosTable();
break;
}
tablesInitialized[tabName] = true;
}
}
function initializeCotizacionesTable() {
var dt_cotizaciones_table = $('.dt-cotizaciones');
if (dt_cotizaciones_table.length) {
dt_cotizaciones = dt_cotizaciones_table.DataTable({
ajax: assetsPath + 'json/table-datatable.json',
columns: [
{ data: '' },
{ data: 'id' },
{ data: 'full_name' },
{ data: 'email' },
{ data: 'start_date' },
{ data: 'salary' },
{ data: 'status' },
{ data: '' }
],
columnDefs: [
{
// For Responsive
className: 'control',
orderable: false,
searchable: false,
responsivePriority: 2,
targets: 0,
render: function (data, type, full, meta) {
return '';
}
},
{
targets: 1,
searchable: false,
visible: false
},
{
// Avatar image/badge, Name and post
targets: 2,
responsivePriority: 4,
render: function (data, type, full, meta) {
var $user_img = full['avatar'],
$name = full['full_name'],
$post = full['post'];
if ($user_img) {
// For Avatar image
var $output =
'<img src="' + assetsPath + 'img/avatars/' + $user_img + '" alt="Avatar" class="rounded-circle">';
} else {
// For Avatar badge
var stateNum = Math.floor(Math.random() * 6);
var states = ['success', 'danger', 'warning', 'info', 'primary', 'secondary'];
var $state = states[stateNum],
$name = full['full_name'],
$initials = $name.match(/\b\w/g) || [];
$initials = (($initials.shift() || '') + ($initials.pop() || '')).toUpperCase();
$output = '<span class="avatar-initial rounded-circle bg-label-' + $state + '">' + $initials + '</span>';
}
// Creates full output for row
var $row_output =
'<div class="d-flex justify-content-start align-items-center user-name">' +
'<div class="avatar-wrapper">' +
'<div class="avatar me-2">' +
$output +
'</div>' +
'</div>' +
'<div class="d-flex flex-column">' +
'<span class="emp_name text-truncate">' +
$name +
'</span>' +
'<small class="emp_post text-truncate text-muted">' +
$post +
'</small>' +
'</div>' +
'</div>';
return $row_output;
}
},
{
responsivePriority: 1,
targets: 3
},
{
// Label
targets: -2,
render: function (data, type, full, meta) {
var $status_number = full['status'];
var $status = {
1: { title: 'Current', class: 'bg-label-primary' },
2: { title: 'Professional', class: ' bg-label-success' },
3: { title: 'Rejected', class: ' bg-label-danger' },
4: { title: 'Resigned', class: ' bg-label-warning' },
5: { title: 'Applied', class: ' bg-label-info' }
};
if (typeof $status[$status_number] === 'undefined') {
return data;
}
return (
'<span class="badge ' + $status[$status_number].class + '">' + $status[$status_number].title + '</span>'
);
}
},
{
// Actions
targets: -1,
title: 'Actions',
orderable: false,
searchable: false,
render: function (data, type, full, meta) {
return (
'<a href="javascript:;" class="btn btn-sm btn-text-secondary rounded-pill btn-icon item-view"><i class="ti ti-eye ti-md"></i></a>' +
'<a href="javascript:;" class="btn btn-sm btn-text-secondary rounded-pill btn-icon item-edit"><i class="ti ti-pencil ti-md"></i></a>'
);
}
}
],
order: [[2, 'desc']],
displayLength: 5,
lengthMenu: [5, 10, 25, 50, 75, 100],
language: $.fn.dataTable.ext.datatable_spanish_default,
responsive: {
details: {
display: $.fn.dataTable.Responsive.display.modal({
header: function (row) {
var data = row.data();
return 'Details of ' + data['full_name'];
}
}),
type: 'column',
renderer: function (api, rowIdx, columns) {
var data = $.map(columns, function (col, i) {
return col.title !== '' // ? Do not show row in modal popup if title is blank (for check box)
? '<tr data-dt-row="' +
col.rowIndex +
'" data-dt-column="' +
col.columnIndex +
'">' +
'<td>' +
col.title +
':' +
'</td> ' +
'<td>' +
col.data +
'</td>' +
'</tr>'
: '';
}).join('');
return data ? $('<table class="table"/><tbody />').append(data) : false;
}
}
},
/*
initComplete: function (settings, json) {
$('.card-header').after('<hr class="my-0">');
}
*/
});
}
}
function initializePagoPendienteTable() {
var dt_pago_pendiente_table = $('.dt-pago-pendiente');
if (dt_pago_pendiente_table.length) {
dt_pago_pendiente = dt_pago_pendiente_table.DataTable({
ajax: assetsPath + 'json/table-datatable.json',
columns: [
{ data: '' },
{ data: 'id' },
{ data: 'full_name' },
{ data: 'email' },
{ data: 'start_date' },
{ data: 'salary' },
{ data: 'status' },
{ data: '' }
],
columnDefs: [
{
// For Responsive
className: 'control',
orderable: false,
searchable: false,
responsivePriority: 2,
targets: 0,
render: function (data, type, full, meta) {
return '';
}
},
{
targets: 1,
searchable: false,
visible: false
},
{
// Avatar image/badge, Name and post
targets: 2,
responsivePriority: 4,
render: function (data, type, full, meta) {
var $user_img = full['avatar'],
$name = full['full_name'],
$post = full['post'];
if ($user_img) {
// For Avatar image
var $output =
'<img src="' + assetsPath + 'img/avatars/' + $user_img + '" alt="Avatar" class="rounded-circle">';
} else {
// For Avatar badge
var stateNum = Math.floor(Math.random() * 6);
var states = ['success', 'danger', 'warning', 'info', 'primary', 'secondary'];
var $state = states[stateNum],
$name = full['full_name'],
$initials = $name.match(/\b\w/g) || [];
$initials = (($initials.shift() || '') + ($initials.pop() || '')).toUpperCase();
$output = '<span class="avatar-initial rounded-circle bg-label-' + $state + '">' + $initials + '</span>';
}
// Creates full output for row
var $row_output =
'<div class="d-flex justify-content-start align-items-center user-name">' +
'<div class="avatar-wrapper">' +
'<div class="avatar me-2">' +
$output +
'</div>' +
'</div>' +
'<div class="d-flex flex-column">' +
'<span class="emp_name text-truncate">' +
$name +
'</span>' +
'<small class="emp_post text-truncate text-muted">' +
$post +
'</small>' +
'</div>' +
'</div>';
return $row_output;
}
},
{
responsivePriority: 1,
targets: 3
},
{
// Label
targets: -2,
render: function (data, type, full, meta) {
var $status_number = full['status'];
var $status = {
1: { title: 'Current', class: 'bg-label-primary' },
2: { title: 'Professional', class: ' bg-label-success' },
3: { title: 'Rejected', class: ' bg-label-danger' },
4: { title: 'Resigned', class: ' bg-label-warning' },
5: { title: 'Applied', class: ' bg-label-info' }
};
if (typeof $status[$status_number] === 'undefined') {
return data;
}
return (
'<span class="badge ' + $status[$status_number].class + '">' + $status[$status_number].title + '</span>'
);
}
},
{
// Actions
targets: -1,
title: 'Actions',
orderable: false,
searchable: false,
render: function (data, type, full, meta) {
return (
'<a href="javascript:;" class="btn btn-sm btn-text-secondary rounded-pill btn-icon item-view"><i class="ti ti-eye ti-md"></i></a>' +
'<a href="javascript:;" class="btn btn-sm btn-text-secondary rounded-pill btn-icon item-edit"><i class="ti ti-pencil ti-md"></i></a>'
);
}
}
],
order: [[2, 'desc']],
displayLength: 5,
lengthMenu: [5, 10, 25, 50, 75, 100],
language: $.fn.dataTable.ext.datatable_spanish_default,
responsive: {
details: {
display: $.fn.dataTable.Responsive.display.modal({
header: function (row) {
var data = row.data();
return 'Details of ' + data['full_name'];
}
}),
type: 'column',
renderer: function (api, rowIdx, columns) {
var data = $.map(columns, function (col, i) {
return col.title !== '' // ? Do not show row in modal popup if title is blank (for check box)
? '<tr data-dt-row="' +
col.rowIndex +
'" data-dt-column="' +
col.columnIndex +
'">' +
'<td>' +
col.title +
':' +
'</td> ' +
'<td>' +
col.data +
'</td>' +
'</tr>'
: '';
}).join('');
return data ? $('<table class="table"/><tbody />').append(data) : false;
}
}
},
/*
initComplete: function (settings, json) {
$('.card-header').after('<hr class="my-0">');
}
*/
});
}
}
function initializePendientesEntregaTable() {
var dt_pendientes_entrega_table = $('.dt-pendientes-entrega');
if (dt_pendientes_entrega_table.length) {
dt_pendientes_entrega = dt_pendientes_entrega_table.DataTable({
ajax: assetsPath + 'json/table-datatable.json',
columns: [
{ data: '' },
{ data: 'id' },
{ data: 'full_name' },
{ data: 'email' },
{ data: 'start_date' },
{ data: 'salary' },
{ data: 'status' },
{ data: '' }
],
columnDefs: [
{
// For Responsive
className: 'control',
orderable: false,
searchable: false,
responsivePriority: 2,
targets: 0,
render: function (data, type, full, meta) {
return '';
}
},
{
targets: 1,
searchable: false,
visible: false
},
{
// Avatar image/badge, Name and post
targets: 2,
responsivePriority: 4,
render: function (data, type, full, meta) {
var $user_img = full['avatar'],
$name = full['full_name'],
$post = full['post'];
if ($user_img) {
// For Avatar image
var $output =
'<img src="' + assetsPath + 'img/avatars/' + $user_img + '" alt="Avatar" class="rounded-circle">';
} else {
// For Avatar badge
var stateNum = Math.floor(Math.random() * 6);
var states = ['success', 'danger', 'warning', 'info', 'primary', 'secondary'];
var $state = states[stateNum],
$name = full['full_name'],
$initials = $name.match(/\b\w/g) || [];
$initials = (($initials.shift() || '') + ($initials.pop() || '')).toUpperCase();
$output = '<span class="avatar-initial rounded-circle bg-label-' + $state + '">' + $initials + '</span>';
}
// Creates full output for row
var $row_output =
'<div class="d-flex justify-content-start align-items-center user-name">' +
'<div class="avatar-wrapper">' +
'<div class="avatar me-2">' +
$output +
'</div>' +
'</div>' +
'<div class="d-flex flex-column">' +
'<span class="emp_name text-truncate">' +
$name +
'</span>' +
'<small class="emp_post text-truncate text-muted">' +
$post +
'</small>' +
'</div>' +
'</div>';
return $row_output;
}
},
{
responsivePriority: 1,
targets: 3
},
{
// Label
targets: -2,
render: function (data, type, full, meta) {
var $status_number = full['status'];
var $status = {
1: { title: 'Current', class: 'bg-label-primary' },
2: { title: 'Professional', class: ' bg-label-success' },
3: { title: 'Rejected', class: ' bg-label-danger' },
4: { title: 'Resigned', class: ' bg-label-warning' },
5: { title: 'Applied', class: ' bg-label-info' }
};
if (typeof $status[$status_number] === 'undefined') {
return data;
}
return (
'<span class="badge ' + $status[$status_number].class + '">' + $status[$status_number].title + '</span>'
);
}
},
{
// Actions
targets: -1,
title: 'Actions',
orderable: false,
searchable: false,
render: function (data, type, full, meta) {
return (
'<a href="javascript:;" class="btn btn-sm btn-text-secondary rounded-pill btn-icon item-view"><i class="ti ti-eye ti-md"></i></a>' +
'<a href="javascript:;" class="btn btn-sm btn-text-secondary rounded-pill btn-icon item-edit"><i class="ti ti-pencil ti-md"></i></a>'
);
}
}
],
order: [[2, 'desc']],
displayLength: 5,
lengthMenu: [5, 10, 25, 50, 75, 100],
language: $.fn.dataTable.ext.datatable_spanish_default,
responsive: {
details: {
display: $.fn.dataTable.Responsive.display.modal({
header: function (row) {
var data = row.data();
return 'Details of ' + data['full_name'];
}
}),
type: 'column',
renderer: function (api, rowIdx, columns) {
var data = $.map(columns, function (col, i) {
return col.title !== '' // ? Do not show row in modal popup if title is blank (for check box)
? '<tr data-dt-row="' +
col.rowIndex +
'" data-dt-column="' +
col.columnIndex +
'">' +
'<td>' +
col.title +
':' +
'</td> ' +
'<td>' +
col.data +
'</td>' +
'</tr>'
: '';
}).join('');
return data ? $('<table class="table"/><tbody />').append(data) : false;
}
}
},
/*
initComplete: function (settings, json) {
$('.card-header').after('<hr class="my-0">');
}
*/
});
}
}
function initializeProcesadosTable() {
var dt_procesados_table = $('.dt-procesados');
if (dt_procesados_table.length) {
dt_procesados = dt_procesados_table.DataTable({
ajax: assetsPath + 'json/table-datatable.json',
columns: [
{ data: '' },
{ data: 'id' },
{ data: 'full_name' },
{ data: 'email' },
{ data: 'start_date' },
{ data: 'salary' },
{ data: 'status' },
{ data: '' }
],
columnDefs: [
{
// For Responsive
className: 'control',
orderable: false,
searchable: false,
responsivePriority: 2,
targets: 0,
render: function (data, type, full, meta) {
return '';
}
},
{
targets: 1,
searchable: false,
visible: false
},
{
// Avatar image/badge, Name and post
targets: 2,
responsivePriority: 4,
render: function (data, type, full, meta) {
var $user_img = full['avatar'],
$name = full['full_name'],
$post = full['post'];
if ($user_img) {
// For Avatar image
var $output =
'<img src="' + assetsPath + 'img/avatars/' + $user_img + '" alt="Avatar" class="rounded-circle">';
} else {
// For Avatar badge
var stateNum = Math.floor(Math.random() * 6);
var states = ['success', 'danger', 'warning', 'info', 'primary', 'secondary'];
var $state = states[stateNum],
$name = full['full_name'],
$initials = $name.match(/\b\w/g) || [];
$initials = (($initials.shift() || '') + ($initials.pop() || '')).toUpperCase();
$output = '<span class="avatar-initial rounded-circle bg-label-' + $state + '">' + $initials + '</span>';
}
// Creates full output for row
var $row_output =
'<div class="d-flex justify-content-start align-items-center user-name">' +
'<div class="avatar-wrapper">' +
'<div class="avatar me-2">' +
$output +
'</div>' +
'</div>' +
'<div class="d-flex flex-column">' +
'<span class="emp_name text-truncate">' +
$name +
'</span>' +
'<small class="emp_post text-truncate text-muted">' +
$post +
'</small>' +
'</div>' +
'</div>';
return $row_output;
}
},
{
responsivePriority: 1,
targets: 3
},
{
// Label
targets: -2,
render: function (data, type, full, meta) {
var $status_number = full['status'];
var $status = {
1: { title: 'Current', class: 'bg-label-primary' },
2: { title: 'Professional', class: ' bg-label-success' },
3: { title: 'Rejected', class: ' bg-label-danger' },
4: { title: 'Resigned', class: ' bg-label-warning' },
5: { title: 'Applied', class: ' bg-label-info' }
};
if (typeof $status[$status_number] === 'undefined') {
return data;
}
return (
'<span class="badge ' + $status[$status_number].class + '">' + $status[$status_number].title + '</span>'
);
}
},
{
// Actions
targets: -1,
title: 'Actions',
orderable: false,
searchable: false,
render: function (data, type, full, meta) {
return (
'<a href="javascript:;" class="btn btn-sm btn-text-secondary rounded-pill btn-icon item-view"><i class="ti ti-eye ti-md"></i></a>' +
'<a href="javascript:;" class="btn btn-sm btn-text-secondary rounded-pill btn-icon item-edit"><i class="ti ti-pencil ti-md"></i></a>'
);
}
}
],
order: [[2, 'desc']],
displayLength: 5,
lengthMenu: [5, 10, 25, 50, 75, 100],
language: $.fn.dataTable.ext.datatable_spanish_default,
responsive: {
details: {
display: $.fn.dataTable.Responsive.display.modal({
header: function (row) {
var data = row.data();
return 'Details of ' + data['full_name'];
}
}),
type: 'column',
renderer: function (api, rowIdx, columns) {
var data = $.map(columns, function (col, i) {
return col.title !== '' // ? Do not show row in modal popup if title is blank (for check box)
? '<tr data-dt-row="' +
col.rowIndex +
'" data-dt-column="' +
col.columnIndex +
'">' +
'<td>' +
col.title +
':' +
'</td> ' +
'<td>' +
col.data +
'</td>' +
'</tr>'
: '';
}).join('');
return data ? $('<table class="table"/><tbody />').append(data) : false;
}
}
},
/*
initComplete: function (settings, json) {
$('.card-header').after('<hr class="my-0">');
}
*/
});
}
}
function initializePagosTable() {
var dt_pagos_table = $('.dt-pagos');
if (dt_pagos_table.length) {
dt_pagos = dt_pagos_table.DataTable({
ajax: assetsPath + 'json/table-datatable.json',
columns: [
{ data: '' },
{ data: 'id' },
{ data: 'full_name' },
{ data: 'email' },
{ data: 'start_date' },
{ data: 'salary' },
{ data: 'status' },
{ data: '' }
],
columnDefs: [
{
// For Responsive
className: 'control',
orderable: false,
searchable: false,
responsivePriority: 2,
targets: 0,
render: function (data, type, full, meta) {
return '';
}
},
{
targets: 1,
searchable: false,
visible: false
},
{
// Avatar image/badge, Name and post
targets: 2,
responsivePriority: 4,
render: function (data, type, full, meta) {
var $user_img = full['avatar'],
$name = full['full_name'],
$post = full['post'];
if ($user_img) {
// For Avatar image
var $output =
'<img src="' + assetsPath + 'img/avatars/' + $user_img + '" alt="Avatar" class="rounded-circle">';
} else {
// For Avatar badge
var stateNum = Math.floor(Math.random() * 6);
var states = ['success', 'danger', 'warning', 'info', 'primary', 'secondary'];
var $state = states[stateNum],
$name = full['full_name'],
$initials = $name.match(/\b\w/g) || [];
$initials = (($initials.shift() || '') + ($initials.pop() || '')).toUpperCase();
$output = '<span class="avatar-initial rounded-circle bg-label-' + $state + '">' + $initials + '</span>';
}
// Creates full output for row
var $row_output =
'<div class="d-flex justify-content-start align-items-center user-name">' +
'<div class="avatar-wrapper">' +
'<div class="avatar me-2">' +
$output +
'</div>' +
'</div>' +
'<div class="d-flex flex-column">' +
'<span class="emp_name text-truncate">' +
$name +
'</span>' +
'<small class="emp_post text-truncate text-muted">' +
$post +
'</small>' +
'</div>' +
'</div>';
return $row_output;
}
},
{
responsivePriority: 1,
targets: 3
},
{
// Label
targets: -2,
render: function (data, type, full, meta) {
var $status_number = full['status'];
var $status = {
1: { title: 'Current', class: 'bg-label-primary' },
2: { title: 'Professional', class: ' bg-label-success' },
3: { title: 'Rejected', class: ' bg-label-danger' },
4: { title: 'Resigned', class: ' bg-label-warning' },
5: { title: 'Applied', class: ' bg-label-info' }
};
if (typeof $status[$status_number] === 'undefined') {
return data;
}
return (
'<span class="badge ' + $status[$status_number].class + '">' + $status[$status_number].title + '</span>'
);
}
},
{
// Actions
targets: -1,
title: 'Actions',
orderable: false,
searchable: false,
render: function (data, type, full, meta) {
return (
'<a href="javascript:;" class="btn btn-sm btn-text-secondary rounded-pill btn-icon item-view"><i class="ti ti-eye ti-md"></i></a>' +
'<a href="javascript:;" class="btn btn-sm btn-text-secondary rounded-pill btn-icon item-edit"><i class="ti ti-pencil ti-md"></i></a>'
);
}
}
],
order: [[2, 'desc']],
displayLength: 5,
lengthMenu: [5, 10, 25, 50, 75, 100],
language: $.fn.dataTable.ext.datatable_spanish_default,
responsive: {
details: {
display: $.fn.dataTable.Responsive.display.modal({
header: function (row) {
var data = row.data();
return 'Details of ' + data['full_name'];
}
}),
type: 'column',
renderer: function (api, rowIdx, columns) {
var data = $.map(columns, function (col, i) {
return col.title !== '' // ? Do not show row in modal popup if title is blank (for check box)
? '<tr data-dt-row="' +
col.rowIndex +
'" data-dt-column="' +
col.columnIndex +
'">' +
'<td>' +
col.title +
':' +
'</td> ' +
'<td>' +
col.data +
'</td>' +
'</tr>'
: '';
}).join('');
return data ? $('<table class="table"/><tbody />').append(data) : false;
}
}
},
/*
initComplete: function (settings, json) {
$('.card-header').after('<hr class="my-0">');
}
*/
});
}
}
document.addEventListener('DOMContentLoaded', function() {
$(document).ready(function() {
$("#pdf-dropzone")
.dropzone({
url: '{{ route('admin.crm.contacts.extraer-datos-pdf-constancia') }}',
paramName: "file",
maxFiles: 1,
acceptedFiles: '.pdf',
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
},
success: function(file, response) {
if($('#name').val().trim() == '')
@this.set('name', response.nombre_fiscal, false);
@this.set('rfc', response.rfc, false);
@this.set('nombre_fiscal', response.nombre_fiscal, false);
if(response.c_regimen_fiscal)
@this.set('c_regimen_fiscal', response.c_regimen_fiscal, false);
@this.set('domicilio_fiscal', response.domicilio_fiscal, false);
facturacionElectronicaSaveButton.disabled = false;
facturacionElectronicaResetButton.disabled = false;
@this.set('facturacionElectronicaAlert', null, false).then(() => {
$('.alert-facturacion-electronica').remove();
});
$('.pdf-dropzone-div').slideUp(200);
},
error: function(file, response) {
$('.pdf-dropzone-div .error-message').html('<label class="error">' + response + '</label>');
this.removeAllFiles(true);
}
});
initAllForms();
});
});
</script>
@endpush