mirror of
https://git.imnavajas.es/jjimenez/safekat.git
synced 2025-07-25 22:52:08 +00:00
Merge branch 'mod/listado_facturas' into 'main'
Mod/listado facturas See merge request jjimenez/safekat!601
This commit is contained in:
@ -769,7 +769,7 @@ $routes->resource('albaranes', ['namespace' => 'App\Controllers\Pedidos', 'contr
|
||||
$routes->group('facturas', ['namespace' => 'App\Controllers\Facturacion'], function ($routes) {
|
||||
|
||||
$routes->get('list', 'Facturas::list', ['as' => 'facturasList']);
|
||||
$routes->post('datatable', 'Facturas::datatable', ['as' => 'dataTableOfFacturas']);
|
||||
$routes->get('datatable', 'Facturas::datatable', ['as' => 'dataTableOfFacturas']);
|
||||
$routes->get('add', 'Facturas::add', ['as' => 'newFactura']);
|
||||
$routes->post('add', 'Facturas::add', ['as' => 'createFactura']);
|
||||
$routes->get('edit/(:any)', 'Facturas::edit/$1', ['as' => 'editarFactura']);
|
||||
|
||||
@ -6,7 +6,7 @@ use App\Models\Facturas\FacturaModel;
|
||||
use App\Entities\Facturas\FacturaEntity;
|
||||
use App\Models\Clientes\ClienteModel;
|
||||
use App\Models\Collection;
|
||||
|
||||
use Hermawan\DataTables\DataTable;
|
||||
|
||||
class Facturas extends \App\Controllers\BaseResourceController
|
||||
{
|
||||
@ -47,7 +47,7 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
$user = $model_user->find(auth()->user()->id);
|
||||
$clienteId = $user->cliente_id;
|
||||
} else {
|
||||
$clienteId = 0;
|
||||
$clienteId = -1;
|
||||
}
|
||||
|
||||
$this->viewData['cliente_id'] = $clienteId;
|
||||
@ -81,7 +81,7 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
$user = $model_user->find(auth()->user()->id);
|
||||
$clienteId = $user->cliente_id;
|
||||
} else {
|
||||
$clienteId = 0;
|
||||
$clienteId = -1;
|
||||
}
|
||||
|
||||
$viewData['cliente_id'] = $clienteId;
|
||||
@ -187,7 +187,8 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
} // end function add()
|
||||
|
||||
|
||||
public function edit($id=null){
|
||||
public function edit($id = null)
|
||||
{
|
||||
|
||||
if ($id == null):
|
||||
return $this->redirect2listView();
|
||||
@ -219,8 +220,9 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
|
||||
return $this->displayForm(__METHOD__, $id);
|
||||
}
|
||||
|
||||
public function datatable(){
|
||||
/*
|
||||
public function datatable()
|
||||
{
|
||||
|
||||
if ($this->request->isAJAX()) {
|
||||
|
||||
@ -249,9 +251,137 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
return $this->failUnauthorized('Invalid request', 403);
|
||||
}
|
||||
}
|
||||
*/
|
||||
public function datatable()
|
||||
{
|
||||
|
||||
if (auth()->user()->inGroup('cliente-admin') || auth()->user()->inGroup('cliente-editor')) {
|
||||
// Se obtiene el cliente ID a partir del usuario de la sesion
|
||||
$model_user = model('App\Models\Usuarios\UserModel');
|
||||
$user = $model_user->find(auth()->user()->id);
|
||||
$clienteId = $user->cliente_id;
|
||||
} else {
|
||||
$clienteId = -1;
|
||||
}
|
||||
|
||||
$model = model(FacturaModel::class);
|
||||
$q = $model->getDatatableQuery($clienteId);
|
||||
|
||||
$result = DataTable::of($q)
|
||||
->edit(
|
||||
"creditoAsegurado",
|
||||
function ($row, $meta) {
|
||||
switch ($row->creditoAsegurado) {
|
||||
case "0":
|
||||
return lang('Basic.global.no');
|
||||
case "1":
|
||||
return lang('Basic.global.yes');
|
||||
default:
|
||||
return '--'; // Debug
|
||||
}
|
||||
}
|
||||
)
|
||||
->edit(
|
||||
"estado",
|
||||
function ($row, $meta) {
|
||||
switch ($row->estado) {
|
||||
case "borrador":
|
||||
return lang('Facturas.borrador');
|
||||
case "validada":
|
||||
return lang('Facturas.validada');
|
||||
default:
|
||||
return '--'; // Debug
|
||||
}
|
||||
}
|
||||
)
|
||||
->edit(
|
||||
"estado_pago",
|
||||
function ($row, $meta) {
|
||||
switch ($row->estado_pago) {
|
||||
case "pendiente":
|
||||
return lang('Facturas.pendiente');
|
||||
case "pagada":
|
||||
return lang('Facturas.pagada');
|
||||
case "insolvente":
|
||||
return lang('Facturas.insolvente');
|
||||
default:
|
||||
return '--'; // Debug
|
||||
}
|
||||
}
|
||||
)
|
||||
->edit(
|
||||
"forma_pago",
|
||||
function ($row, $meta) {
|
||||
switch ($row->forma_pago) {
|
||||
case "cheque":
|
||||
return lang('Facturas.cheque');
|
||||
case "compensada":
|
||||
return lang('Facturas.compensada');
|
||||
case "confirming":
|
||||
return lang('Facturas.confirming');
|
||||
case "giroDomiciliado":
|
||||
return lang('Facturas.giroDomiciliado');
|
||||
case "pagare":
|
||||
return lang('Facturas.pagare');
|
||||
case "transferencia":
|
||||
return lang('Facturas.transferencia');
|
||||
default:
|
||||
return $row->forma_pago; // Debug
|
||||
|
||||
}
|
||||
}
|
||||
)
|
||||
->add("action", callback: function ($q) {
|
||||
if ($q->estado == 'borrador') {
|
||||
return '
|
||||
<td class="text-right py-0 align-middle">
|
||||
<div class="btn-group btn-group-sm">
|
||||
<a href="javascript:void(0);"><i class="ti ti-pencil ti-sm btn-edit mx-2" data-id="' . $q->id . '"></i></a>
|
||||
</div>
|
||||
</td>';
|
||||
} else {
|
||||
return '
|
||||
<td class="text-right py-0 align-middle">
|
||||
<div class="btn-group btn-group-sm">
|
||||
<a href="javascript:void(0);"><i class="ti ti-eye ti-sm btn-edit mx-2" data-id="' . $q->id . '"></i></a>
|
||||
</div>
|
||||
</td>';
|
||||
}
|
||||
});
|
||||
if ($clienteId != -1) {
|
||||
$result->hide('cliente');
|
||||
$result->hide('creditoAsegurado');
|
||||
$result->hide('estado');
|
||||
$result->hide('estado_pago');
|
||||
$result->hide('forma_pago');
|
||||
$result->hide('vencimiento');
|
||||
$result->hide('dias_vencimiento');
|
||||
}
|
||||
|
||||
//return $result->toJson(returnAsObject: true);
|
||||
|
||||
// Obtener el resultado como array para inspeccionarlo
|
||||
$jsonResult = $result->toJson(returnAsObject: true);
|
||||
$data = json_decode($jsonResult->getBody(), true);
|
||||
|
||||
// Verificar si "data" contiene solo una fila vacía
|
||||
if (empty($data['data']) || (count($data['data']) === 1 && $data['data'][0]['id'] === null)) {
|
||||
return $this->response->setJSON([
|
||||
'draw' => $data['draw'] ?? $this->request->getVar('draw') ?? 0,
|
||||
'recordsTotal' => $data['recordsTotal'] ?? 0,
|
||||
'recordsFiltered' => 0,
|
||||
'data' => []
|
||||
]);
|
||||
}
|
||||
|
||||
// Si hay datos válidos, devolver el resultado original
|
||||
return $jsonResult;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function datatablePedidos(){
|
||||
public function datatablePedidos()
|
||||
{
|
||||
|
||||
if ($this->request->isAJAX()) {
|
||||
|
||||
@ -282,7 +412,8 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
}
|
||||
}
|
||||
|
||||
public function update($id = null){
|
||||
public function update($id = null)
|
||||
{
|
||||
|
||||
if ($this->request->isAJAX()) {
|
||||
$newTokenHash = csrf_hash();
|
||||
@ -355,14 +486,14 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
$csrfTokenName => $newTokenHash
|
||||
];
|
||||
return $this->respond($data);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return $this->failUnauthorized('Invalid request', 403);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public function menuPedidosPendientes($cliente_id){
|
||||
public function menuPedidosPendientes($cliente_id)
|
||||
{
|
||||
|
||||
if ($this->request->isAJAX()) {
|
||||
$model = model('\App\Models\Pedidos\PedidoLineaModel');
|
||||
@ -370,8 +501,7 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
$pedidos = [];
|
||||
try {
|
||||
$pedidos = $model->obtenerLineasPedidoSinFacturar($cliente_id);
|
||||
}
|
||||
catch(Exception $e){
|
||||
} catch (Exception $e) {
|
||||
|
||||
}
|
||||
|
||||
@ -382,13 +512,13 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
$csrfTokenName => $newTokenHash
|
||||
];
|
||||
return $this->respond($data);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return $this->failUnauthorized('Invalid request', 403);
|
||||
}
|
||||
}
|
||||
|
||||
public function duplicate($factura_id = 0){
|
||||
public function duplicate($factura_id = 0)
|
||||
{
|
||||
if ($this->request->isAJAX()) {
|
||||
|
||||
$factura_origen = $this->model->find($factura_id);
|
||||
@ -419,7 +549,8 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
}
|
||||
}
|
||||
|
||||
public function updateTotales($factura_id = 0){
|
||||
public function updateTotales($factura_id = 0)
|
||||
{
|
||||
if ($this->request->isAJAX()) {
|
||||
|
||||
$postData = $this->request->getPost();
|
||||
@ -451,13 +582,13 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
$model->update($factura_id, $data);
|
||||
|
||||
return $this->respond($data_ret);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return $this->failUnauthorized('Invalid request', 403);
|
||||
}
|
||||
}
|
||||
|
||||
public function addExcedentes($factura_id){
|
||||
public function addExcedentes($factura_id)
|
||||
{
|
||||
|
||||
if ($this->request->isAJAX()) {
|
||||
$model_factura_linea = model('\App\Models\Facturas\FacturaLineaModel');
|
||||
@ -500,13 +631,13 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
$csrfTokenName => $newTokenHash
|
||||
];
|
||||
return $this->respond($data_ret);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return $this->failUnauthorized('Invalid request', 403);
|
||||
}
|
||||
}
|
||||
|
||||
public function addLineaPedidoImpresion($factura_id){
|
||||
public function addLineaPedidoImpresion($factura_id)
|
||||
{
|
||||
|
||||
if ($this->request->isAJAX()) {
|
||||
$model_pedido_linea = model('\App\Models\Pedidos\PedidoLineaModel');
|
||||
@ -568,8 +699,7 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception $e){
|
||||
} catch (Exception $e) {
|
||||
|
||||
}
|
||||
|
||||
@ -579,13 +709,13 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
$csrfTokenName => $newTokenHash
|
||||
];
|
||||
return $this->respond($data);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return $this->failUnauthorized('Invalid request', 403);
|
||||
}
|
||||
}
|
||||
|
||||
public function deleteLineaPedidoImpresion(){
|
||||
public function deleteLineaPedidoImpresion()
|
||||
{
|
||||
|
||||
if ($this->request->isAJAX()) {
|
||||
|
||||
@ -603,14 +733,14 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
$csrfTokenName => $newTokenHash
|
||||
];
|
||||
return $this->respond($data);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return $this->failUnauthorized('Invalid request', 403);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public function validar($factura_id){
|
||||
public function validar($factura_id)
|
||||
{
|
||||
|
||||
if ($this->request->isAJAX()) {
|
||||
|
||||
@ -640,14 +770,14 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
$csrfTokenName => $newTokenHash
|
||||
];
|
||||
return $this->respond($data);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return $this->failUnauthorized('Invalid request', 403);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public function updateCabecera($factura_id){
|
||||
public function updateCabecera($factura_id)
|
||||
{
|
||||
|
||||
if ($this->request->isAJAX()) {
|
||||
if ($factura_id == 0) {
|
||||
@ -686,8 +816,7 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
];
|
||||
return $this->respond($data);
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return $this->failUnauthorized('Invalid request', 403);
|
||||
}
|
||||
}
|
||||
@ -696,7 +825,8 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
* FUNCIONES AUXILIARES
|
||||
************************************/
|
||||
|
||||
private function obtenerDatosFormulario(&$factura){
|
||||
private function obtenerDatosFormulario(&$factura)
|
||||
{
|
||||
|
||||
if ($factura->estado == 'borrador') {
|
||||
$serieModel = model('App\Models\Configuracion\SeriesFacturasModel');
|
||||
@ -721,4 +851,3 @@ class Facturas extends \App\Controllers\BaseResourceController
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -605,8 +605,16 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
|
||||
}
|
||||
}
|
||||
|
||||
// para el calculo del precio unidad, sólo se tiene en cuenta el envío base
|
||||
for ($i = 0; $i < count($tirada); $i++) {
|
||||
$coste_envio = 0.0;
|
||||
$coste_envio += ($return_data['eb'][$i] / $tirada[$i]);
|
||||
$return_data['precio_u'][$i] = round(floatval($return_data['precio_u'][$i]) + $coste_envio, 4);
|
||||
}
|
||||
|
||||
$envio_base = true;
|
||||
$coste_envio = 0.0; // se inicializa para calcular los costes de envíos restantes si es que hay
|
||||
$return_data['coste_envio'] = [];
|
||||
if (count($direcciones) > 0) {
|
||||
|
||||
for ($i = 0; $i < count($tirada); $i++) {
|
||||
@ -614,8 +622,6 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
|
||||
foreach ($direcciones as $direccion) {
|
||||
// El primer envio no se calcula ya que se añade el base
|
||||
if ($envio_base) {
|
||||
//aporte del envio al precio unidad
|
||||
$coste_envio += ($return_data['eb'][$i] / $tirada[$i]);
|
||||
$envio_base = false;
|
||||
continue;
|
||||
}
|
||||
@ -651,19 +657,17 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
|
||||
];
|
||||
return $return_data;
|
||||
} else {
|
||||
//aporte del envio al precio unidad
|
||||
$coste_envio += ($coste_direccion->coste / $tirada[$i]);
|
||||
// Se añade a los costes de envío
|
||||
$coste_envio += $coste_direccion->coste;
|
||||
}
|
||||
}
|
||||
$return_data['precio_u'][$i] = round(floatval($return_data['precio_u'][$i]) + $coste_envio, 4);
|
||||
}
|
||||
} else {
|
||||
for ($i = 0; $i < count($tirada); $i++) {
|
||||
$coste_envio = 0.0;
|
||||
$coste_envio += ($return_data['eb'][$i] / $tirada[$i]);
|
||||
$return_data['precio_u'][$i] = round(floatval($return_data['precio_u'][$i]) + $coste_envio, 4);
|
||||
|
||||
$return_data['coste_envio'][$i] = round($coste_envio, 2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
if ($this->request) {
|
||||
if ($this->request->isAJAX())
|
||||
return $this->respond($return_data);
|
||||
@ -1158,6 +1162,18 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
|
||||
$resultado_presupuesto['info']['totales'][$i]['coste_envio'] = 0.0;
|
||||
$resultado_presupuesto['info']['totales'][$i]['margen_envio'] = 0.0;
|
||||
}
|
||||
|
||||
// para el calculo del precio unidad, sólo se tiene en cuenta el envío base
|
||||
for ($i = 0; $i < count($tirada); $i++) {
|
||||
$coste_envio = 0.0;
|
||||
$coste_envio += ($resultado_presupuesto['eb'][$i] / $tirada[$i]);
|
||||
$resultado_presupuesto['info']['totales'][$i]['envio_base_coste'] = $resultado_presupuesto['eb'][$i] - $resultado_presupuesto['eb_margen'][$i];
|
||||
$resultado_presupuesto['info']['totales'][$i]['envio_base_margen'] = $resultado_presupuesto['eb_margen'][$i];
|
||||
$resultado_presupuesto['precio_u'][$i] = round(floatval($resultado_presupuesto['precio_u'][$i]) + $coste_envio, 4);
|
||||
}
|
||||
|
||||
$coste_envio = 0.0; // se inicializa para calcular los costes de envíos restantes si es que hay
|
||||
$resultado_presupuesto['coste_envio'] = [];
|
||||
if (count($direcciones) > 0) {
|
||||
|
||||
for ($i = 0; $i < count($tirada); $i++) {
|
||||
@ -1168,11 +1184,6 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
|
||||
foreach ($direcciones as $direccion) {
|
||||
// El primer envio no se calcula ya que se añade el base
|
||||
if ($envio_base) {
|
||||
//aporte del envio al precio unidad
|
||||
$coste_envio += ($resultado_presupuesto['eb'][$i] / $tirada[$i]);
|
||||
$margen_envio += ($resultado_presupuesto['eb_margen'][$i] / $tirada[$i]);
|
||||
$resultado_presupuesto['info']['totales'][$i]['coste_envio'] += $resultado_presupuesto['eb'][$i] - $resultado_presupuesto['eb_margen'][$i];
|
||||
$resultado_presupuesto['info']['totales'][$i]['margen_envio'] += $resultado_presupuesto['eb_margen'][$i];
|
||||
$envio_base = false;
|
||||
continue;
|
||||
}
|
||||
@ -1212,19 +1223,10 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
|
||||
|
||||
}
|
||||
}
|
||||
$resultado_presupuesto['precio_u'][$i] = round(floatval($resultado_presupuesto['precio_u'][$i]) + $coste_envio, 4);
|
||||
}
|
||||
} else {
|
||||
for ($i = 0; $i < count($tirada); $i++) {
|
||||
$coste_envio = 0.0;
|
||||
$coste_envio += ($resultado_presupuesto['eb'][$i] / $tirada[$i]);
|
||||
$resultado_presupuesto['info']['totales'][$i]['coste_envio'] = $resultado_presupuesto['eb'][$i] - $resultado_presupuesto['eb_margen'][$i];
|
||||
$resultado_presupuesto['info']['totales'][$i]['margen_envio'] = $resultado_presupuesto['eb_margen'][$i];
|
||||
$resultado_presupuesto['precio_u'][$i] = round(floatval($resultado_presupuesto['precio_u'][$i]) + $coste_envio, 4);
|
||||
$resultado_presupuesto['coste_envio'][$i] = round($coste_envio, 2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$model_presupuesto = new PresupuestoModel();
|
||||
$tiradas_alternativas = [];
|
||||
$resumen_totales = [];
|
||||
@ -1240,7 +1242,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
|
||||
$resultado_presupuesto['info']['totales'][$i]['margenPapel'] +
|
||||
$resultado_presupuesto['info']['totales'][$i]['margen_envio']) / ($coste_total + $coste_envio) * 100.0, 2);
|
||||
$total_pedido = round(($coste_total + $resultado_presupuesto['info']['totales'][$i]['totalServicios'] + $resultado_presupuesto['info']['totales'][$i]['margenServicios'] + $coste_envio), 2);
|
||||
$precio_u = round(($coste_total + $resultado_presupuesto['info']['totales'][$i]['totalServicios'] + $resultado_presupuesto['info']['totales'][$i]['margenServicios'] + $coste_envio) / $tirada[$i], 4);
|
||||
$precio_u = round( $resultado_presupuesto['precio_u'][$i], 4);
|
||||
|
||||
array_push($tiradas_alternativas, (object) array(
|
||||
'tirada' => $tirada[$i],
|
||||
@ -1252,6 +1254,8 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
|
||||
));
|
||||
} else {
|
||||
$resumen_totales = $resultado_presupuesto['info']['totales'][$i];
|
||||
$resumen_totales['precio_unidad'] = round($resultado_presupuesto['precio_u'][$i], 4);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -1607,7 +1611,10 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController
|
||||
}
|
||||
|
||||
if (intval($presupuesto->estado_id) == 2) {
|
||||
$data['resumen']['base'] = $presupuesto->total_aceptado;
|
||||
$data['resumen']['base'] = $presupuesto->total_antes_descuento;
|
||||
$data['resumen']['total_envio'] = round(
|
||||
floatval($presupuesto->total_coste_envios) +
|
||||
floatval($presupuesto->total_margen_envios), 2);
|
||||
$data['resumen']['precio_unidad'] = $presupuesto->total_precio_unidad;
|
||||
}
|
||||
|
||||
|
||||
@ -754,6 +754,7 @@ return [
|
||||
"menu_presupuestos_clientes" => "Presupuestos (Clientes)",
|
||||
"menu_presupuesto" => "Libros",
|
||||
"menu_presupuesto_buscador" => "Buscador",
|
||||
"menu_presupuesto_importador" => "Importador ERP antiguo",
|
||||
"menu_libros" => "Libros",
|
||||
"menu_libros_fresasdo_tapa_dura" => "Fresado tapa dura",
|
||||
"menu_libros_fresasdo_tapa_blanda" => "Fresado tapa blanda",
|
||||
|
||||
@ -2,7 +2,10 @@
|
||||
|
||||
namespace App\Models\Facturas;
|
||||
|
||||
class FacturaModel extends \App\Models\BaseModel {
|
||||
use CodeIgniter\Database\BaseBuilder;
|
||||
|
||||
class FacturaModel extends \App\Models\BaseModel
|
||||
{
|
||||
|
||||
protected $table = 'facturas';
|
||||
|
||||
@ -109,6 +112,35 @@ class FacturaModel extends \App\Models\BaseModel {
|
||||
->groupEnd();
|
||||
}
|
||||
|
||||
public function getDatatableQuery($cliente_id): BaseBuilder
|
||||
{
|
||||
$builder = $this->db
|
||||
->table($this->table . " t1")
|
||||
->select(
|
||||
"t1.id AS id, t1.numero AS numero, DATE_FORMAT(t1.fecha_factura_at, '%d/%m/%Y') AS fecha_factura_at,
|
||||
t2.nombre AS cliente, t1.base AS base, t1.total AS total, t1.pendiente AS pendiente,
|
||||
t1.creditoAsegurado AS creditoAsegurado, t1.estado AS estado, t1.estado_pago AS estado_pago,
|
||||
GROUP_CONCAT(DISTINCT t4.nombre ORDER BY t4.nombre ASC SEPARATOR ', ') AS forma_pago,
|
||||
DATE_FORMAT(MIN(CASE WHEN t3.fecha_vencimiento_at != '0000-00-00 00:00:00' THEN t3.fecha_vencimiento_at ELSE NULL END), '%d/%m/%Y') AS vencimiento,
|
||||
t2.vencimiento AS dias_vencimiento"
|
||||
);
|
||||
$builder->join("clientes t2", "t2.id = t1.cliente_id", "left");
|
||||
$builder->join("facturas_pagos t3", "t3.factura_id = t1.id", "left");
|
||||
$builder->join("formas_pago t4", "t3.forma_pago_id = t4.id", "left");
|
||||
$builder->where("t1.deleted_at", null);
|
||||
|
||||
$builder->where("t1.deleted_at IS NULL");
|
||||
if (auth()->user()->inGroup("cliente-admin") || auth()->user()->inGroup("cliente-editor")) {
|
||||
$builder->where("t1.estado", "validada");
|
||||
}
|
||||
|
||||
if ($cliente_id != -1) {
|
||||
$builder->where("t1.cliente_id", $cliente_id);
|
||||
}
|
||||
|
||||
return $builder;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get resource data for creating PDFs.
|
||||
|
||||
@ -404,9 +404,9 @@ class PresupuestoModel extends \App\Models\BaseModel
|
||||
$is_cosido = (new TipoPresupuestoModel())->get_isCosido($data['tipo_impresion_id']);
|
||||
|
||||
$totalCostes = $resumen_totales['totalPapel'] + $resumen_totales['totalImpresion'] +
|
||||
$resumen_totales['totalServicios'] + $resumen_totales['coste_envio'];
|
||||
$resumen_totales['totalServicios'] + $resumen_totales['envio_base_coste'];
|
||||
$totalMargenes = $resumen_totales['margenPapel'] + $resumen_totales['margenImpresion'] +
|
||||
$resumen_totales['margenServicios'] + $resumen_totales['margen_envio'];
|
||||
$resumen_totales['margenServicios'] + $resumen_totales['envio_base_margen'];
|
||||
|
||||
$fields = [
|
||||
'cliente_id' => $data['clienteId'],
|
||||
@ -486,9 +486,9 @@ class PresupuestoModel extends \App\Models\BaseModel
|
||||
'total_descuento' => 0,
|
||||
'total_descuentoPercent' => 0,
|
||||
|
||||
'total_precio_unidad' => round(($totalCostes + $totalMargenes) / $tirada, 4),
|
||||
'total_presupuesto' => round($totalCostes + $totalMargenes, 2),
|
||||
'total_aceptado' => round($totalCostes + $totalMargenes, 2),
|
||||
'total_precio_unidad' => $resumen_totales['precio_unidad'],
|
||||
'total_presupuesto' => round($totalCostes + $totalMargenes + $resumen_totales['coste_envio']+$resumen_totales['margen_envio'], 2),
|
||||
'total_aceptado' => round($totalCostes + $totalMargenes + $resumen_totales['coste_envio']+$resumen_totales['margen_envio'], 2),
|
||||
|
||||
'total_factor' => round(($totalCostes + $totalMargenes - $resumen_totales['coste_envio'] - $resumen_totales['margen_envio']) / $resumen_totales['sumForFactor'], 2),
|
||||
'total_factor_ponderado' => round(($totalCostes + $totalMargenes - $resumen_totales['coste_envio'] - $resumen_totales['margen_envio']) / $resumen_totales['sumForFactorPonderado'], 2),
|
||||
|
||||
@ -12,24 +12,49 @@
|
||||
<div class="card-body">
|
||||
<?= view('themes/_commonPartialsBs/_alertBoxes'); ?>
|
||||
|
||||
<input type="hidden" id="cliente_id" value="<?= $cliente_id ?>">
|
||||
|
||||
<table id="tableOfFacturas" class="table table-striped table-hover" style="width: 100%;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><?= lang('Facturas.idFactura') ?></th>
|
||||
<th><?= lang('Facturas.numeroFactura') ?></th>
|
||||
<th><?= lang('Facturas.fechaFactura') ?></th>
|
||||
<?php if ($cliente_id == -1): ?>
|
||||
<th><?= lang('Facturas.cliente') ?></th>
|
||||
<?php endif; ?>
|
||||
<th><?= lang('Facturas.base') ?></th>
|
||||
<th><?= lang('Facturas.total') ?></th>
|
||||
<th><?= lang('Facturas.pendiente') ?></th>
|
||||
<?php if ($cliente_id == -1): ?>
|
||||
<th><?= lang('Facturas.credito') ?></th>
|
||||
<th><?= lang('Facturas.estado') ?></th>
|
||||
<th><?= lang('Facturas.estadoPago') ?></th>
|
||||
<th><?= lang('Facturas.formaPago') ?></th>
|
||||
<th><?= lang('Facturas.vencimiento') ?></th>
|
||||
<th><?= lang('Facturas.dias') ?></th>
|
||||
<?php endif; ?>
|
||||
<th class="text-nowrap"><?= lang('Basic.global.Action') ?></th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><input type="text" class="form-control factura-filter" name="id"></th>
|
||||
<th><input type="text" class="form-control factura-filter" name="numero"></th>
|
||||
<th></th>
|
||||
<?php if ($cliente_id == -1): ?>
|
||||
<th><input type="text" class="form-control factura-filter" name="cliente"></th>
|
||||
<?php endif; ?>
|
||||
<th></th>
|
||||
<th></th>
|
||||
<th></th>
|
||||
<?php if ($cliente_id == -1): ?>
|
||||
<th><select class="select2 form-select select-credito" id="credito-filter" name="creditoAsegurado"></select></th>
|
||||
<th><select class="select2 form-select select-estado" id="estado-filter" name="estado"></select></th>
|
||||
<th><select class="select2 form-select select-estadoPago" id="estadoPago-filter" name="estado_pago"></select></th>
|
||||
<th><select class="select2 form-select select-formaPago" id="formaPago-filter" name="forma_pago"></select></th>
|
||||
<th></th>
|
||||
<th><input type="text" class="form-control factura-filter" name="dias_vencimiento"></th>
|
||||
<?php endif; ?>
|
||||
<th></th>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
@ -46,256 +71,23 @@
|
||||
<?= $this->endSection() ?>
|
||||
|
||||
|
||||
<?=$this->section('additionalInlineJs') ?>
|
||||
|
||||
const lastColNr = $('#tableOfFacturas').find("tr:first th").length - 1;
|
||||
const actionBtns = function(data) {
|
||||
if(data.estado == 'borrador'){
|
||||
return `
|
||||
<td class="text-right py-0 align-middle">
|
||||
<div class="btn-group btn-group-sm">
|
||||
<a href="javascript:void(0);"><i class="ti ti-pencil ti-sm btn-edit mx-2" data-id="${data.id}"></i></a>
|
||||
</div>
|
||||
</td>`;
|
||||
}
|
||||
else{
|
||||
return `
|
||||
<td class="text-right py-0 align-middle">
|
||||
<div class="btn-group btn-group-sm">
|
||||
<a href="javascript:void(0);"><i class="ti ti-eye ti-sm btn-edit mx-2" data-id="${data.id}"></i></a>
|
||||
</div>
|
||||
</td>`;
|
||||
}
|
||||
};
|
||||
|
||||
theTable = $('#tableOfFacturas').DataTable({
|
||||
processing: true,
|
||||
serverSide: true,
|
||||
autoWidth: true,
|
||||
responsive: true,
|
||||
scrollX: true,
|
||||
lengthMenu: [ 5, 10, 25, 50, 75, 100, 250, 500, 1000, 2500 ],
|
||||
pageLength: 250,
|
||||
lengthChange: true,
|
||||
"dom": 'lfBrtip',
|
||||
buttons: [
|
||||
{
|
||||
text: 'Exportar Excel Contaplus',
|
||||
action: function (e, dt, button, config) {
|
||||
var searchValue = theTable.search(); // Captura el valor del campo de búsqueda
|
||||
var ajaxParams = theTable.ajax.params(); // Captura otros parámetros de la tabla
|
||||
|
||||
console.log(searchValue);
|
||||
|
||||
/*
|
||||
$.ajax({
|
||||
url: '/ruta/exportarExcel', // URL del servidor para manejar la exportación
|
||||
type: 'POST',
|
||||
data: {
|
||||
search: searchValue,
|
||||
extraParams: ajaxParams
|
||||
},
|
||||
xhrFields: {
|
||||
responseType: 'blob' // Para manejar la descarga del archivo
|
||||
},
|
||||
success: function(blob, status, xhr) {
|
||||
// Crear un enlace temporal para descargar el archivo
|
||||
var link = document.createElement('a');
|
||||
var url = window.URL.createObjectURL(blob);
|
||||
link.href = url;
|
||||
link.download = 'datos_personalizados.xlsx';
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
document.body.removeChild(link);
|
||||
window.URL.revokeObjectURL(url);
|
||||
}
|
||||
});
|
||||
*/
|
||||
}
|
||||
},
|
||||
{
|
||||
text: 'Exportar Lineas a Excel',
|
||||
action: function (e, dt, button, config) {
|
||||
var searchValue = theTable.search(); // Captura el valor del campo de búsqueda
|
||||
var ajaxParams = theTable.ajax.params(); // Captura otros parámetros de la tabla
|
||||
|
||||
console.log(searchValue);
|
||||
|
||||
}
|
||||
},
|
||||
{
|
||||
text: 'Exportar Girosgit ',
|
||||
action: function (e, dt, button, config) {
|
||||
var searchValue = theTable.search(); // Captura el valor del campo de búsqueda
|
||||
var ajaxParams = theTable.ajax.params(); // Captura otros parámetros de la tabla
|
||||
|
||||
console.log(searchValue);
|
||||
|
||||
}
|
||||
}
|
||||
],
|
||||
stateSave: true,
|
||||
order: [[0, 'asc']],
|
||||
language: {
|
||||
url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json"
|
||||
},
|
||||
ajax : $.fn.dataTable.pipeline( {
|
||||
url: '<?= route_to('dataTableOfFacturas') ?>',
|
||||
method: 'POST',
|
||||
data: function(d, settings){
|
||||
d.cliente_id = "<?= $cliente_id ?>";
|
||||
},
|
||||
headers: {'X-Requested-With': 'XMLHttpRequest'},
|
||||
async: true,
|
||||
}),
|
||||
columnDefs: [
|
||||
{
|
||||
orderable: false,
|
||||
searchable: false,
|
||||
targets: [lastColNr]
|
||||
}
|
||||
],
|
||||
columns : [
|
||||
{ 'data': 'id' },
|
||||
{ 'data': 'numero' },
|
||||
{ 'data': 'fecha_factura_at' },
|
||||
{ 'data': 'cliente' },
|
||||
{ 'data': 'base' ,render : (d) => `<span class="autonumeric">${d}</span>`},
|
||||
{ 'data': 'total',render : (d) => `<span class="autonumeric">${d}</span>`},
|
||||
{ 'data': 'pendiente',render : (d) => `<span class="autonumeric">${d}</span>` },
|
||||
{ 'data': 'creditoAsegurado' ,
|
||||
render: function(data, type, row, meta) {
|
||||
switch(data){
|
||||
case "0":
|
||||
return '<?= lang('Basic.global.no') ?>';
|
||||
break;
|
||||
|
||||
case "1":
|
||||
return '<?= lang('Basic.global.yes') ?>';
|
||||
break;
|
||||
|
||||
default:
|
||||
return '--'; // Debug
|
||||
break;
|
||||
|
||||
}
|
||||
},
|
||||
},
|
||||
{ 'data': 'estado',
|
||||
render: function(data, type, row, meta) {
|
||||
switch(data){
|
||||
case "borrador":
|
||||
return '<?= lang('Facturas.borrador') ?>';
|
||||
break;
|
||||
|
||||
case "validada":
|
||||
return '<?= lang('Facturas.validada') ?>';
|
||||
break;
|
||||
|
||||
default:
|
||||
return '--'; // Debug
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
},
|
||||
{ 'data': 'estado_pago',
|
||||
render: function(data, type, row, meta) {
|
||||
switch(data){
|
||||
case "pendiente":
|
||||
return '<?= lang('Facturas.pendiente') ?>';
|
||||
break;
|
||||
|
||||
case "pagada":
|
||||
return '<?= lang('Facturas.pagada') ?>';
|
||||
break;
|
||||
|
||||
case "insolvente":
|
||||
return '<?= lang('Facturas.insolvente') ?>';
|
||||
break;
|
||||
|
||||
default:
|
||||
return '--'; // Debug
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
},
|
||||
{ 'data': 'forma_pago',
|
||||
render: function(data, type, row, meta) {
|
||||
switch(data){
|
||||
case "cheque":
|
||||
return '<?= lang('Facturas.cheque') ?>';
|
||||
break;
|
||||
|
||||
case "compensada":
|
||||
return '<?= lang('Facturas.compensada') ?>';
|
||||
break;
|
||||
|
||||
case "confirming":
|
||||
return '<?= lang('Facturas.confirming') ?>';
|
||||
break;
|
||||
|
||||
case "giroDomiciliado":
|
||||
return '<?= lang('Facturas.giroDomiciliado') ?>';
|
||||
break;
|
||||
|
||||
case "pagare":
|
||||
return '<?= lang('Facturas.pagare') ?>';
|
||||
break;
|
||||
|
||||
case "transferencia":
|
||||
return '<?= lang('Facturas.transferencia') ?>';
|
||||
break;
|
||||
|
||||
default:
|
||||
return data; // Debug
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
},
|
||||
{ 'data': 'vencimiento' },
|
||||
{ 'data': 'dias_vencimiento' },
|
||||
{ 'data': actionBtns }
|
||||
]
|
||||
});
|
||||
|
||||
theTable.on( 'draw.dt', function () {
|
||||
if(<?= $cliente_id ?> != -1){
|
||||
theTable.column(3).visible(false);
|
||||
theTable.column(7).visible(false);
|
||||
theTable.column(8).visible(false);
|
||||
theTable.column(9).visible(false);
|
||||
theTable.column(10).visible(false);
|
||||
theTable.column(11).visible(false);
|
||||
theTable.column(12).visible(false);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
$(document).on('click', '.btn-edit', function(e) {
|
||||
var url = '<?= route_to('editarFactura', ':id') ?>';
|
||||
url = url.replace(':id', `${$(this).attr('data-id')}` );
|
||||
window.location.href = url;
|
||||
});
|
||||
|
||||
|
||||
<?=$this->endSection() ?>
|
||||
|
||||
|
||||
<?= $this->section('css') ?>
|
||||
<link rel="stylesheet" href="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.bootstrap5.min.css") ?>">
|
||||
<link rel="stylesheet"
|
||||
href="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.bootstrap5.min.css") ?>">
|
||||
<?= $this->endSection() ?>
|
||||
|
||||
|
||||
<?= $this->section('additionalExternalJs') ?>
|
||||
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/dataTables.buttons.min.js") ?>"></script>
|
||||
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.bootstrap5.min.js") ?>"></script>
|
||||
<script
|
||||
src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/dataTables.buttons.min.js") ?>"></script>
|
||||
<script
|
||||
src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.bootstrap5.min.js") ?>"></script>
|
||||
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.html5.min.js") ?>"></script>
|
||||
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/buttons/buttons.print.min.js") ?>"></script>
|
||||
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/jszip/jszip.min.js") ?>"></script>
|
||||
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/pdfmake/pdfmake.min.js") ?>" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/pdfmake/pdfmake.min.js") ?>"
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
<script src="<?= site_url("/themes/vuexy/vendor/libs/datatables-sk/plugins/pdfmake/vfs_fonts.js") ?>"></script>
|
||||
<?=$this->endSection() ?>
|
||||
|
||||
<script type="module" src="<?= site_url("assets/js/safekat/pages/facturas/facturasList.js") ?>"></script>
|
||||
<?= $this->endSection() ?>
|
||||
@ -5,9 +5,11 @@
|
||||
|
||||
<div class="col-sm-8 mb-3 d-flex flex-column align-items-center">
|
||||
<h5 class="mb-1 "> Precio unidad: <span id="resumenPrecioU"></span> €</h5>
|
||||
<h4 class="mb-1 "> Total base: <span id="resumenTotalBase"></span> €</h>
|
||||
<h4 class="mb-1 "> Iva (<span id="resumenIvaPorcentaje"></span>%): <span id="resumenIva"></span> €</h>
|
||||
<h3 class="mt-3 mb-1 fw-bold"> Total: <span id="resumenTotal"></span> €</h>
|
||||
<h4 class="mb-1 "> Total base: <span id="resumenTotalBase"></span> €</h4>
|
||||
<h4 class="mb-1 "> Envío: <span id="resumenTotalEnvio"></span> €</h4>
|
||||
<h4 class="mb-1 "> Total antes de I.V.A: <span id="resumenTotalAntesIVA"></span> €</h4>
|
||||
<h4 class="mb-1 "> Iva (<span id="resumenIvaPorcentaje"></span>%): <span id="resumenIva"></span> €</h4>
|
||||
<h3 class="mt-3 mb-1 fw-bold"> Total: <span id="resumenTotal"></span> €</h3>
|
||||
</div><!--//.mb-3 -->
|
||||
|
||||
<div id="divFormaCubierta" class="col-sm-12 mb-3 d-flex flex-column align-items-center">
|
||||
|
||||
@ -23,27 +23,23 @@ if (auth()->user()->can('presupuesto.menu')) {
|
||||
</a>
|
||||
<ul class="menu-sub">
|
||||
<li class="menu-item">
|
||||
<a href="<?= site_url("presupuestoadmin/list/1") ?>"
|
||||
class="menu-link">
|
||||
<a href="<?= site_url("presupuestoadmin/list/1") ?>" class="menu-link">
|
||||
<?= lang("App.menu_libros_fresasdo_tapa_dura") ?>
|
||||
</a>
|
||||
</li>
|
||||
<li class="menu-item">
|
||||
<a href="<?= site_url("presupuestoadmin/list/2") ?>"
|
||||
class="menu-link">
|
||||
<a href="<?= site_url("presupuestoadmin/list/2") ?>" class="menu-link">
|
||||
<?= lang("App.menu_libros_fresasdo_tapa_blanda") ?>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="menu-item">
|
||||
<a href="<?= site_url("presupuestoadmin/list/3") ?>"
|
||||
class="menu-link">
|
||||
<a href="<?= site_url("presupuestoadmin/list/3") ?>" class="menu-link">
|
||||
<?= lang("App.menu_libros_cosido_tapa_dura") ?>
|
||||
</a>
|
||||
</li>
|
||||
<li class="menu-item">
|
||||
<a href="<?= site_url("presupuestoadmin/list/4") ?>"
|
||||
class="menu-link">
|
||||
<a href="<?= site_url("presupuestoadmin/list/4") ?>" class="menu-link">
|
||||
<?= lang("App.menu_libros_cosido_tapa_blanda") ?>
|
||||
</a>
|
||||
</li>
|
||||
@ -59,8 +55,7 @@ if (auth()->user()->can('presupuesto.menu')) {
|
||||
</li>
|
||||
|
||||
<li class="menu-item">
|
||||
<a href="<?= site_url("presupuestoadmin/list/6") ?>"
|
||||
class="menu-link">
|
||||
<a href="<?= site_url("presupuestoadmin/list/6") ?>" class="menu-link">
|
||||
<?= lang("App.menu_libros_espiral_tapa_blanda") ?>
|
||||
</a>
|
||||
</li>
|
||||
@ -96,7 +91,8 @@ if (auth()->user()->can('presupuesto.menu')) {
|
||||
|
||||
<li class="menu-item">
|
||||
<a href="<?= site_url("presupuestos/tarjetascomerciales") ?>" class="menu-link">
|
||||
<div data-i18n="<?= lang("App.menu_tarjetas_comerciales") ?>"><?= lang("App.menu_tarjetas_comerciales") ?></div>
|
||||
<div data-i18n="<?= lang("App.menu_tarjetas_comerciales") ?>">
|
||||
<?= lang("App.menu_tarjetas_comerciales") ?></div>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
@ -119,18 +115,21 @@ if (auth()->user()->can('presupuesto.menu')) {
|
||||
<ul class="menu-sub">
|
||||
<li class="menu-item">
|
||||
<a href="<?= site_url("presupuestos/dipticos") ?>" class="menu-link">
|
||||
<div data-i18n="<?= lang("App.menu_folleto_diptico") ?>"><?= lang("App.menu_folleto_diptico") ?></div>
|
||||
<div data-i18n="<?= lang("App.menu_folleto_diptico") ?>"><?= lang("App.menu_folleto_diptico") ?>
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="menu-item">
|
||||
<a href="<?= site_url("presupuestos/tripticos") ?>" class="menu-link">
|
||||
<div data-i18n="<?= lang("App.menu_folleto_triptico") ?>"><?= lang("App.menu_folleto_triptico") ?></div>
|
||||
<div data-i18n="<?= lang("App.menu_folleto_triptico") ?>">
|
||||
<?= lang("App.menu_folleto_triptico") ?></div>
|
||||
</a>
|
||||
</li>
|
||||
<li class="menu-item">
|
||||
<a href="<?= site_url("presupuestos/cuadripticos") ?>" class="menu-link">
|
||||
<div data-i18n="<?= lang("App.menu_folleto_cuadriptico") ?>"><?= lang("App.menu_folleto_cuadriptico") ?></div>
|
||||
<div data-i18n="<?= lang("App.menu_folleto_cuadriptico") ?>">
|
||||
<?= lang("App.menu_folleto_cuadriptico") ?></div>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
@ -140,8 +139,13 @@ if (auth()->user()->can('presupuesto.menu')) {
|
||||
<div data-i18n="<?= lang("App.menu_calendarios") ?>"><?= lang("App.menu_calendarios") ?></div>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="menu-item">
|
||||
<a href="<?= site_url("/importador") ?>" class="menu-link">
|
||||
<?= lang("App.menu_presupuesto_importador") ?>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</li>
|
||||
<?php } ?>
|
||||
|
||||
|
||||
|
||||
@ -100,6 +100,7 @@ class Resumen {
|
||||
let margenServicios = parseFloat(0);
|
||||
|
||||
let totalEnvios = 0;
|
||||
let totalEnvios_base = 0;
|
||||
let margenEnvios = 0;
|
||||
|
||||
let sumForFactor = 0.0;
|
||||
@ -262,15 +263,16 @@ class Resumen {
|
||||
|
||||
if (updateEnvio) {
|
||||
|
||||
totalEnvios = parseFloat($('#envio_base').val());
|
||||
totalEnvios_base = parseFloat($('#envio_base').val());
|
||||
if (typeof $('#tableOfDireccionesEnvio').DataTable() !== 'undefined' && $('#tableOfDireccionesEnvio').DataTable().rows().count() > 0) {
|
||||
$('#tableOfDireccionesEnvio').DataTable().rows().every(function (rowIdx, tableLoop, rowLoop) {
|
||||
if (rowIdx == 0) {
|
||||
return;
|
||||
}
|
||||
// el primer envio es el base, y no se debe de cobrar
|
||||
if (rowIdx != 0) {
|
||||
|
||||
let data = this.data()
|
||||
totalEnvios += parseFloat(data.precio)
|
||||
margenEnvios += parseFloat((data.precio) * data.margen / 100)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -298,10 +300,11 @@ class Resumen {
|
||||
if ($('#total_descuentoPercent').val() < 0) {
|
||||
$('#total_descuentoPercent').val(0)
|
||||
}
|
||||
let totalAntesDescuento = totalCostes + totalMargenes
|
||||
let totalAntesDescuento = totalCostes + totalMargenes - parseFloat(totalEnvios.toFixed(2)) + totalEnvios_base;
|
||||
let totalDescuento = totalAntesDescuento * parseInt($('#total_descuentoPercent').val() || 0) / 100
|
||||
let totalPresupuesto = totalAntesDescuento - totalDescuento
|
||||
let totalPresupuesto = totalAntesDescuento - totalDescuento; // para el calculo del precio_u solo se tiene en cuenta el base
|
||||
let precioUnidad = totalPresupuesto / parseInt($('#tirada').val())
|
||||
totalPresupuesto += totalEnvios;
|
||||
|
||||
$('#totalAntesDescuento').text((this.addSeparatorsNF(totalAntesDescuento.toFixed(2), ".", ",", ".")) + "€")
|
||||
$('#descuentoTotal').text((this.addSeparatorsNF(totalDescuento.toFixed(2), ".", ",", ".")) + "€")
|
||||
@ -313,10 +316,10 @@ class Resumen {
|
||||
$('#precioUnidadPresupuesto').attr('val', (precioUnidad).toFixed(4))
|
||||
$('#totalDespuesDecuento').trigger("change")
|
||||
|
||||
$('#factor').text(this.addSeparatorsNF(((totalPresupuesto - totalEnvios - margenEnvios) / sumForFactor).toFixed(2), ".", ",", "."))
|
||||
$('#factor').attr('val', ((totalPresupuesto - totalEnvios - margenEnvios) / sumForFactor).toFixed(2))
|
||||
$('#factor_ponderado').text(this.addSeparatorsNF(((totalPresupuesto - totalEnvios - margenEnvios) / sumForFactorPonderado).toFixed(2), ".", ",", "."))
|
||||
$('#factor_ponderado').attr('val', ((totalPresupuesto - totalEnvios - margenEnvios) / sumForFactorPonderado).toFixed(2))
|
||||
$('#factor').text(this.addSeparatorsNF(((totalPresupuesto - totalEnvios - totalEnvios_base - margenEnvios) / sumForFactor).toFixed(2), ".", ",", "."))
|
||||
$('#factor').attr('val', ((totalPresupuesto - totalEnvios - totalEnvios_base - margenEnvios) / sumForFactor).toFixed(2))
|
||||
$('#factor_ponderado').text(this.addSeparatorsNF(((totalPresupuesto - totalEnvios - totalEnvios_base - margenEnvios) / sumForFactorPonderado).toFixed(2), ".", ",", "."))
|
||||
$('#factor_ponderado').attr('val', ((totalPresupuesto - totalEnvios - totalEnvios_base - margenEnvios) / sumForFactorPonderado).toFixed(2))
|
||||
|
||||
}
|
||||
|
||||
@ -365,8 +368,7 @@ class Resumen {
|
||||
roundToTwoDecimals(num) {
|
||||
return parseFloat(num.toFixed(2));
|
||||
}
|
||||
updateToastSummary()
|
||||
{
|
||||
updateToastSummary() {
|
||||
if (this.toastPresupuestoTotal) {
|
||||
this.toastPresupuestoTotal.close()
|
||||
}
|
||||
|
||||
@ -622,7 +622,8 @@ class PresupuestoCliente {
|
||||
('precio-tiradas-' + response.tiradas[i]),
|
||||
response.tiradas[i],
|
||||
precio,
|
||||
response.precio_u[i]
|
||||
response.precio_u[i],
|
||||
response.coste_envio[i]
|
||||
);
|
||||
|
||||
if (this.actualizarTiradasEnvio) {
|
||||
@ -895,7 +896,10 @@ class PresupuestoCliente {
|
||||
$('#menu_resumen_button').trigger('click');
|
||||
setTimeout(() => {
|
||||
self.resumen.init_dropzone();
|
||||
self.resumen.generate_total(response.data.resumen.base, response.data.resumen.precio_unidad, response.data.datosGenerales.ivaReducido);
|
||||
self.resumen.generate_total(response.data.resumen.base,
|
||||
response.data.resumen.precio_unidad,
|
||||
response.data.resumen.total_envio,
|
||||
response.data.datosGenerales.ivaReducido);
|
||||
}, 0);
|
||||
}
|
||||
}, 0);
|
||||
|
||||
@ -48,6 +48,8 @@ class Resumen {
|
||||
|
||||
this.precio_unidad = $(this.domItem.find("#resumenPrecioU"));
|
||||
this.total_base = $(this.domItem.find("#resumenTotalBase"));
|
||||
this.total_envios = $(this.domItem.find("#resumenTotalEnvio"));
|
||||
this.total_antes_iva = $(this.domItem.find("#resumenTotalAntesIVA"));
|
||||
this.iva_porcentaje = $(this.domItem.find("#resumenIvaPorcentaje"));
|
||||
this.iva = $(this.domItem.find("#resumenIva"));
|
||||
this.total = $(this.domItem.find("#resumenTotal"));
|
||||
@ -308,19 +310,26 @@ class Resumen {
|
||||
return parseInt($(this).find('.tarjeta-tiradas-precios-tirada').attr('data')) == unidades;
|
||||
});
|
||||
|
||||
|
||||
let envios = tarjetaPrecio.find('.tarjeta-tiradas-precios-envio').val();
|
||||
this.total_envios.text(this.#changeDecimalFormat(parseFloat(envios).toFixed(2)));
|
||||
|
||||
let precio_u_text = tarjetaPrecio.find('.tarjeta-tiradas-precios-precio-unidad').text();
|
||||
precio_u_text = precio_u_text.replace('€/ud', '');
|
||||
|
||||
const base = tarjetaPrecio.find('.tarjeta-tiradas-precios-precio').attr('data');
|
||||
let base_text = this.#changeDecimalFormat(parseFloat(base).toFixed(2));
|
||||
|
||||
const total_antes_iva_text = this.#changeDecimalFormat((parseFloat(base) + parseFloat(envios)).toFixed(2));
|
||||
|
||||
const iva_porcentaje = parseInt(this.datosGenerales.ivaReducido.find('option:selected').val()) == 1 ? 0.04 : 0.21;
|
||||
const iva = (parseFloat(base) * iva_porcentaje).toFixed(2);
|
||||
const iva = ((parseFloat(base) + parseFloat(envios))* iva_porcentaje).toFixed(2);
|
||||
let iva_text = this.#changeDecimalFormat(iva);
|
||||
|
||||
const total = (parseFloat(base) + parseFloat(iva)).toFixed(2);
|
||||
const total = (parseFloat(base) + parseFloat(envios) +parseFloat(iva)).toFixed(2);
|
||||
let total_text = this.#changeDecimalFormat(total);
|
||||
|
||||
|
||||
this.precio_unidad.text(precio_u_text);
|
||||
this.total_base.text(base_text);
|
||||
this.iva_porcentaje.text(this.datosGenerales.ivaReducido.find('option:selected').val() == 1 ? '4' : '21');
|
||||
@ -329,23 +338,28 @@ class Resumen {
|
||||
|
||||
}
|
||||
|
||||
generate_total(base, precio_u, iva_reducido) {
|
||||
generate_total(base, precio_u, total_envio, iva_reducido) {
|
||||
|
||||
let precio_u_text = String(precio_u);
|
||||
precio_u_text = precio_u_text.replace('€/u', '');
|
||||
precio_u_text = this.#changeDecimalFormat(precio_u_text);
|
||||
|
||||
let base_text = this.#changeDecimalFormat(String(base));
|
||||
let envios_text = this.#changeDecimalFormat(total_envio.toFixed(2));
|
||||
let total_antes_iva = parseFloat(base) + parseFloat(total_envio);
|
||||
let total_antes_iva_text = this.#changeDecimalFormat(total_antes_iva.toFixed(2));
|
||||
|
||||
const iva_porcentaje = !iva_reducido? 0.21 : 0.04;
|
||||
const iva = (parseFloat(base) * iva_porcentaje).toFixed(2);
|
||||
const iva = ((parseFloat(base) + parseFloat(total_envio)) * iva_porcentaje).toFixed(2);
|
||||
let iva_text = this.#changeDecimalFormat(iva);
|
||||
|
||||
const total = (parseFloat(base) + parseFloat(iva)).toFixed(2);
|
||||
const total = (parseFloat(base) + parseFloat(total_envio) + parseFloat(iva)).toFixed(2);
|
||||
let total_text = this.#changeDecimalFormat(total);
|
||||
|
||||
this.precio_unidad.text(precio_u_text);
|
||||
this.total_base.text(base_text);
|
||||
this.total_envios.text(envios_text);
|
||||
this.total_antes_iva.text(total_antes_iva_text);
|
||||
this.iva_porcentaje.text(!iva_reducido? '21' : '4');
|
||||
this.iva.text(iva_text);
|
||||
this.total.text(total_text);
|
||||
|
||||
@ -1,13 +1,14 @@
|
||||
class tarjetaTiradasPrecio {
|
||||
|
||||
constructor(domItem, id, tirada, precio, precio_unidad) {
|
||||
constructor(domItem, id, tirada, precio, precio_unidad, envio) {
|
||||
this.domItem = domItem;
|
||||
this.id = id;
|
||||
this.tirada = tirada;
|
||||
this.precio = precio;
|
||||
this.precio_unidad = precio_unidad;
|
||||
this.envio = envio;
|
||||
|
||||
this.card = this.#generateHTML(id, tirada, precio, precio_unidad);
|
||||
this.card = this.#generateHTML(id, tirada, precio, precio_unidad, envio);
|
||||
this.domItem.append(this.card);
|
||||
}
|
||||
|
||||
@ -15,7 +16,7 @@ class tarjetaTiradasPrecio {
|
||||
return value.toLocaleString("de-DE", { minimumFractionDigits: digits, maximumFractionDigits: digits });
|
||||
}
|
||||
|
||||
#generateHTML(id, tirada, precio, precio_unidad) {
|
||||
#generateHTML(id, tirada, precio, precio_unidad, envio) {
|
||||
|
||||
let $html = $('<div>', {
|
||||
id: id,
|
||||
@ -38,6 +39,7 @@ class tarjetaTiradasPrecio {
|
||||
const formattedPrecio = this.formatNumber(precio, 2);
|
||||
const formattedPrecioUnidad = this.formatNumber(precio_unidad, 4);
|
||||
|
||||
|
||||
$listContent.append($('<h7>', {
|
||||
id: 'ud_' + id,
|
||||
class: 'mb-1 tarjeta-tiradas-precios-tirada',
|
||||
@ -56,6 +58,12 @@ class tarjetaTiradasPrecio {
|
||||
text: formattedPrecioUnidad + '€/ud'
|
||||
}).attr('data', precio_unidad));
|
||||
|
||||
$listContent.append($('<input>', {
|
||||
id: 'envio_' + id,
|
||||
type: 'hidden',
|
||||
class: 'mb-1 tarjeta-tiradas-precios-envio',
|
||||
}).val(envio));
|
||||
|
||||
$liWrapper.append($listContent);
|
||||
$link.append($liWrapper);
|
||||
$html.append($link);
|
||||
|
||||
Reference in New Issue
Block a user