<?php

namespace App\Controladores;

use App\Modelos\Cmpnotas;
use App\Modelos\CmpnotasArticulos;
use App\Modelos\CmpnotasDocumentos;
use App\Modelos\Comprascredito;
use App\Modelos\Comprascreditopagos;
use App\Modelos\MovimientoModel;
use App\Modelos\Productos;
use App\Modelos\Stock;
use Core\Controller;
use Core\Helpers\Moneda;
use Core\Helpers\Notifica;
use Core\Librerias\CarritoComprasEditar;
use Core\Librerias\Http;
use Core\Librerias\Module;
use Core\Vista;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

final class CmpnotaseditarControlador extends Controller
{
    private $array_errors = [];
    private $notas_entrega_model;
    private $divisa_master;
    private $module;
    private $carritoCompras;

    public function __construct()
    {
        parent::__construct();
        $this->module = new Module();
        $this->notas_entrega_model = new Cmpnotas();
        $this->carritoCompras = new CarritoComprasEditar();
        $this->divisa_master  = $this->notas_entrega_model->obtenerDivisaMaster();
    }

    public function verFactura(int $id_factura)
    {
        if ($_SERVER['REQUEST_METHOD'] == 'GET') {

            $id_factura = filter_var($id_factura, FILTER_SANITIZE_NUMBER_INT);
            $factura = $this->notas_entrega_model->obtenerFactura($id_factura);

            $ruta_list=$this->notas_entrega_model->rutaDocumento($factura['cmpn_id']);
            $ruta = [];

            if (is_countable($ruta_list) && count($ruta_list)) {
                foreach ($ruta_list as $row) {
                    if ($row['rd_docid_procedencia'] == 8) {
                        $ruta[] = [
                            'fecha'           => $row['rd_fecha'],
                            'emp_username'    => $row['emp_username'],
                            'rd_observacion'  => $row['rd_observacion'],
                            'doc_prefijo'     => $row['doc_prefijo'],
                            'url'             => ruta_base() . 'cmpfacturaeditar/verFactura/' . $row['rd_facid_procedencia']
                        ];
                    }
                    if ($row['rd_docid_procedencia'] == 10) {
                        $ruta[] = [
                            'fecha'           => $row['rd_fecha'],
                            'emp_username'    => $row['emp_username'],
                            'rd_observacion'  => $row['rd_observacion'],
                            'doc_prefijo'     => $row['doc_prefijo'],
                            'url'             => ruta_base() . 'cmppedidoseditar/verFactura/' . $row['rd_facid_procedencia']
                        ];
                    }
                }
            }

            if ($factura) {
                $data_factura = [
                    'factura'               => $factura,
                    'empleado'              => $this->carritoCompras->obtenerEmpleado($factura['cmpn_empleadoid']),
                    'ruta'                  => $ruta,
                    'anular_doc'            => $this->module->has_module_action_permission('facturacion', 'anular_doc', $_SESSION['user_data']['emp_id']),
                    'eliminar_pago'         => $this->module->has_module_action_permission('facturacion', 'eliminar_pagos', $_SESSION['user_data']['emp_id']),
                    'empresa'               => $this->carritoCompras->obtenerDatosEmpresa(),
                    'proveedor'             => $this->notas_entrega_model->obtenerProveedor($factura['cmpn_cliid']),
                    'tipos_de_documentos'   => $this->carritoCompras->obternerTiposDeDocumentos(),
                    'impuestos'             => $this->carritoCompras->obtenerImpuestos(),
                    'paises'                => $this->carritoCompras->obtenerPaises(),
                    'almacenes'             => $this->carritoCompras->obtenerAlmacenesEmpleado(),
                    'series'                => $this->carritoCompras->obtenerSeriesEmpleado(),
                    'divisas'               => $this->carritoCompras->obtenerDivisasParaFacturar()
                ];

                if ($factura['cmpn_estatus'] < 3) {
                    return Vista::view('cmpnotaseditar/ver', $data_factura);
                } elseif ($factura['cmpn_estatus'] == 3) {
                    return Vista::view('cmpnotaseditar/anulado', $data_factura);
                }
            } else {
                header('Location: ' . ruta_base() . 'compras');
            }
        }
    }

    public function obtenerFactura(int $id_factura)
    {
        if ($_SERVER['REQUEST_METHOD'] == 'GET' && isAjax()) {

            $result = $this->carritoCompras->obtenerFactura('app_compras_notas', 'cmpneditar', $id_factura);

            if (isset($result['errors'])) {
                return Http::json_response(['errors' => $result['errors']]);
            } else {
                return Http::json_response($result);
            }
        }
    }

    public function obtenerArticuloProducto(int $id_factura)
    {
        if ($_SERVER['REQUEST_METHOD'] == 'GET' && isAjax()) {

            $articuls = new CmpnotasArticulos();
            $result = $articuls->articulos($id_factura);

            $inventario = 0;
            $cantidad = 0;

            foreach ($result as $row) {
                $inventario += $row['cmpnart_agregar_inventario'];
                $cantidad += $row['cmpnart_procantidad'];
            }
            return Http::json_response([
                'inventario' => $inventario,
                'cantidad' => $cantidad
            ]);
        }
    }

    public function predeterminarDivisa()
    {
        if ('GET' == $_SERVER['REQUEST_METHOD'] && isAjax()) {

            if (empty($_GET['id_factura']))
                $this->array_errors[] = 'La Factura es obligatorio';
            if (empty($_GET['id_divisa']))
                $this->array_errors[] = 'La Divisa es obligatorio';

            if (empty($this->array_errors)) {

                $id_divisa          = filter_input(INPUT_GET, 'id_divisa', FILTER_VALIDATE_INT);
                $id_factura         = filter_input(INPUT_GET, 'id_factura', FILTER_VALIDATE_INT);
                $descuento_global   = filter_input(INPUT_GET, 'descuento', FILTER_SANITIZE_STRING) ?? 0;

                if ($id_factura && $id_divisa) {
                    $data_factura = $this->notas_entrega_model->obtenerFactura($id_factura);
                    if ($data_factura) {
                        if ($this->esEditable($id_factura)) {
                            $result = $this->carritoCompras->predeterminarDivisa('cmpneditar', $id_factura, $data_factura['cmpn_cliid'], $id_divisa, $descuento_global);
                            if (isset($result['errors'])) {
                                return Http::json_response(['errors' => $result['errors']]);
                            } else {
                                return Http::json_response($result);
                            }
                        } else {
                            $this->array_errors[] = 'Acción prohibida';
                        }
                    } else {
                        $this->array_errors[] = 'Acción prohibida';
                    }
                } else {
                    $this->array_errors[] = 'Acción prohibida';
                }
            }

            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    public function agregarProducto()
    {
        if ('POST' == $_SERVER['REQUEST_METHOD'] && isAjax()) {

            if (empty($_POST['id_factura']))
                $this->array_errors[] = 'La Factura es obligatorio';
            if (empty($_POST['id_producto']))
                $this->array_errors[] = 'El Producto es obligatorio';
            if (empty($_POST['id_almacen']))
                $this->array_errors[] = 'El Almacen es obligatorio';
            if (empty($_POST['id_divisa']))
                $this->array_errors[] = 'La Divisa es obligatorio';

            if (empty($this->array_errors)) {

                $id_factura         = filter_input(INPUT_POST, 'id_factura', FILTER_VALIDATE_INT);
                $id_producto        = filter_input(INPUT_POST, 'id_producto', FILTER_VALIDATE_INT);
                $id_almacen         = filter_input(INPUT_POST, 'id_almacen', FILTER_VALIDATE_INT);
                $id_divisa          = filter_input(INPUT_POST, 'id_divisa', FILTER_VALIDATE_INT);
                $descuento_global   = filter_input(INPUT_POST, 'descuento_global', FILTER_SANITIZE_STRING) ?? 0;

                if ($id_factura && $id_producto && $id_almacen && $id_divisa) {
                    $data_factura = $this->notas_entrega_model->obtenerFactura($id_factura);
                    if ($data_factura) {
                        if ($this->esEditable($id_factura)) {
                            $result = $this->carritoCompras->agregarProducto('cmpneditar', $id_factura, $data_factura['cmpn_cliid'], $id_producto, $id_almacen, $id_divisa, $descuento_global);
                            if (isset($result['errors'])) {
                                return Http::json_response(['errors' => $result['errors']]);
                            } else {
                                return Http::json_response($result);
                            }
                        } else {
                            $this->array_errors[] = 'Acción prohibida';
                        }
                    } else {
                        $this->array_errors[] = 'Acción prohibida';
                    }
                } else {
                    $this->array_errors[] = 'Acción prohibida';
                }
            }

            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    public function actualizarPrecio()
    {
        if ('POST' == $_SERVER['REQUEST_METHOD'] && isAjax()) {

            if (empty($_POST['id_factura']))
                $this->array_errors[] = 'El Factura es obligatorio';
            if (empty($_POST['unique']))
                $this->array_errors[] = 'El Producto es obligatorio';

            if (empty($this->array_errors)) {

                $id_factura         = filter_input(INPUT_POST, 'id_factura', FILTER_VALIDATE_INT);
                $unique             = filter_input(INPUT_POST, 'unique', FILTER_SANITIZE_STRIPPED);
                $precio             = filter_input(INPUT_POST, 'precio', FILTER_SANITIZE_STRING) ?? 0;
                $descuento_global   = filter_input(INPUT_POST, 'descuento_global', FILTER_SANITIZE_STRING) ?? 0;

                if ($id_factura) {
                    $data_factura = $this->notas_entrega_model->obtenerFactura($id_factura);
                    if ($data_factura) {
                        if ($this->esEditable($id_factura)) {
                            $result = $this->carritoCompras->actualizarPrecio('cmpneditar', $id_factura, $data_factura['cmpn_cliid'], $unique, $precio, $descuento_global);
                            if (isset($result['errors'])) {
                                return Http::json_response(['errors' => $result['errors']]);
                            } else {
                                return Http::json_response($result);
                            }
                        } else {
                            $this->array_errors[] = 'Acción prohibida';
                        }
                    } else {
                        $this->array_errors[] = 'Acción prohibida';
                    }
                } else {
                    $this->array_errors[] = 'Acción prohibida';
                }
            }

            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    public function actualizarCantidad()
    {
        if ('POST' == $_SERVER['REQUEST_METHOD'] && isAjax()) {

            if (empty($_POST['id_factura']))
                $this->array_errors[] = 'El Factura es obligatorio';
            if (empty($_POST['id_producto']))
                $this->array_errors[] = 'El Producto es obligatorio';
            if (empty($_POST['cantidad']))
                $this->array_errors[] = 'El Cantidad es obligatorio';

            if (empty($this->array_errors)) {

                $id_factura         = filter_input(INPUT_POST, 'id_factura', FILTER_VALIDATE_INT);
                $id_producto        = filter_input(INPUT_POST, 'id_producto', FILTER_VALIDATE_INT);
                $cantidad           = filter_input(INPUT_POST, 'cantidad', FILTER_VALIDATE_FLOAT);
                $descuento_global   = filter_input(INPUT_POST, 'descuento_global', FILTER_SANITIZE_STRING) ?? 0;

                if ($id_factura && $id_producto && $cantidad) {
                    $data_factura = $this->notas_entrega_model->obtenerFactura($id_factura);
                    if ($data_factura) {
                        if ($this->esEditable($id_factura)) {
                            $result = $this->carritoCompras->actualizarCantidad('cmpneditar', 'app_compras_notas', $id_factura, $data_factura['cmpn_cliid'], $id_producto, $cantidad, $descuento_global);
                            if (isset($result['errors'])) {
                                return Http::json_response(['errors' => $result['errors']]);
                            } else {
                                return Http::json_response($result);
                            }
                        } else {
                            $this->array_errors[] = 'Acción prohibida';
                        }
                    } else {
                        $this->array_errors[] = 'Acción prohibida';
                    }
                } else {
                    $this->array_errors[] = 'Acción prohibida';
                }
            }

            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    public function actualizarDescripcion()
    {
        if ('POST' == $_SERVER['REQUEST_METHOD'] && isAjax()) {

            if (empty($_POST['id_factura']))
                $this->array_errors[] = 'Accion prohibida';
            if (empty($_POST['unique']))
                $this->array_errors[] = 'El Producto es obligatorio';
            if (empty($_POST['descripcion']))
                $this->array_errors[] = 'La Descripción es obligatorio';

            if (empty($this->array_errors)) {

                $id_factura         = filter_input(INPUT_POST, 'id_factura', FILTER_VALIDATE_INT);
                $unique             = filter_input(INPUT_POST, 'unique', FILTER_SANITIZE_STRING);
                $descripcion        = $this->solicitud->sanitize($_POST['descripcion'], FILTER_SANITIZE_STRING);

                if ($id_factura) {
                    $data_factura = $this->notas_entrega_model->obtenerFactura($id_factura);
                    if ($data_factura) {
                        if ($this->esEditable($id_factura)) {
                            $result = $this->carritoCompras->actualizarDescripcion('cmpneditar', $id_factura, $unique, $descripcion);
                            if (isset($result['errors'])) {
                                return Http::json_response(['errors' => $result['errors']]);
                            } else {
                                return Http::json_response($result);
                            }
                        } else {
                            $this->array_errors[] = 'Acción prohibida';
                        }
                    } else {
                        $this->array_errors[] = 'Acción prohibida';
                    }
                } else {
                    $this->array_errors[] = 'Acción prohibida';
                }
            }

            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    public function aplicarNuevoIva()
    {
        if ('POST' == $_SERVER['REQUEST_METHOD'] && isAjax()) {

            if (empty($_POST['id_factura']))
                $this->array_errors[] = 'El Factura es obligatorio';
            if (empty($_POST['unique']))
                $this->array_errors[] = 'El Producto es obligatorio';
            if (empty($_POST['id_iva']))
                $this->array_errors[] = 'El IVA es obligatorio';

            if (empty($this->array_errors)) {

                $id_factura         = filter_input(INPUT_POST, 'id_factura', FILTER_VALIDATE_INT);
                $unique             = filter_input(INPUT_POST, 'unique', FILTER_SANITIZE_STRIPPED);
                $id_iva             = filter_input(INPUT_POST, 'id_iva', FILTER_VALIDATE_INT);
                $descuento_global   = filter_input(INPUT_POST, 'descuento_global', FILTER_SANITIZE_STRING) ?? 0;

                if ($id_factura && $id_iva) {
                    $data_factura = $this->notas_entrega_model->obtenerFactura($id_factura);
                    if ($data_factura) {
                        if ($this->esEditable($id_factura)) {
                            $result = $this->carritoCompras->aplicarNuevoIva('cmpneditar', $id_factura, $data_factura['cmpn_cliid'], $unique, $id_iva, $descuento_global);
                            if (isset($result['errors'])) {
                                return Http::json_response(['errors' => $result['errors']]);
                            } else {
                                return Http::json_response($result);
                            }
                        } else {
                            $this->array_errors[] = 'Acción prohibida';
                        }
                    } else {
                        $this->array_errors[] = 'Acción prohibida';
                    }
                } else {
                    $this->array_errors[] = 'Acción prohibida';
                }
            }

            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    public function aplicarDescuentoProducto()
    {
        if ('POST' == $_SERVER['REQUEST_METHOD'] && isAjax()) {

            if (empty($_POST['id_factura']))
                $this->array_errors[] = 'La Factura es obligatorio';
            if (empty($_POST['unique']))
                $this->array_errors[] = 'El Producto es obligatorio';

            if (empty($this->array_errors)) {

                $id_factura         = filter_input(INPUT_POST, 'id_factura', FILTER_VALIDATE_INT);
                $unique             = filter_input(INPUT_POST, 'unique', FILTER_SANITIZE_STRIPPED);
                $descuento          = filter_input(INPUT_POST, 'descuento', FILTER_SANITIZE_STRING) ?? 0;
                $descuento_global   = filter_input(INPUT_POST, 'descuento_global', FILTER_SANITIZE_STRING) ?? 0;

                if ($id_factura) {
                    $data_factura = $this->notas_entrega_model->obtenerFactura($id_factura);
                    if ($data_factura) {
                        if ($this->esEditable($id_factura)) {
                            $result = $this->carritoCompras->aplicarDescuentoProducto('cmpneditar', $id_factura, $data_factura['cmpn_cliid'], $unique, $descuento, $descuento_global);
                            if (isset($result['errors'])) {
                                return Http::json_response(['errors' => $result['errors']]);
                            } else {
                                return Http::json_response($result);
                            }
                        } else {
                            $this->array_errors[] = 'Acción prohibida';
                        }
                    } else {
                        $this->array_errors[] = 'Acción prohibida';
                    }
                } else {
                    $this->array_errors[] = 'Acción prohibida';
                }
            }

            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    public function aplicarDescuentoAdicional()
    {
        if ('POST' == $_SERVER['REQUEST_METHOD'] && isAjax()) {

            if (empty($_POST['id_factura'])) {
                $this->array_errors[] = 'La Factura es obligatorio';
            } else {

                $id_factura = filter_input(INPUT_POST, 'id_factura', FILTER_VALIDATE_INT);
                $descuento_global = filter_input(INPUT_POST, 'descuento', FILTER_SANITIZE_STRING) ?? 0;

                if ($id_factura) {
                    $data_factura = $this->notas_entrega_model->obtenerFactura($id_factura);
                    if ($data_factura) {
                        if ($this->esEditable($id_factura)) {
                            $result = $this->carritoCompras->aplicarDescuentoAdicional('cmpneditar', $id_factura, $data_factura['cmpn_cliid'], $descuento_global);
                            if (isset($result['errors'])) {
                                return Http::json_response(['errors' => $result['errors']]);
                            } else {
                                return Http::json_response($result);
                            }
                        } else {
                            $this->array_errors[] = 'Acción prohibida';
                        }
                    } else {
                        $this->array_errors[] = 'Acción prohibida';
                    }
                } else {
                    $this->array_errors[] = 'Acción prohibida';
                }
            }

            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    public function eliminarProducto()
    {
        if ('POST' == $_SERVER['REQUEST_METHOD'] && isAjax()) {

            if (empty($_POST['id_factura']))
                $this->array_errors[] = 'El Cliente es obligatorio';
            if (empty($_POST['id_producto']))
                $this->array_errors[] = 'El Producto es obligatorio';

            if (empty($this->array_errors)) {

                $id_factura         = filter_input(INPUT_POST, 'id_factura', FILTER_VALIDATE_INT);
                $unique             = filter_input(INPUT_POST, 'id_producto', FILTER_SANITIZE_STRING);
                $descuento_global   = filter_input(INPUT_POST, 'descuento_global', FILTER_SANITIZE_STRING) ?? 0;

                if ($id_factura) {
                    $data_factura = $this->notas_entrega_model->obtenerFactura($id_factura);
                    if ($data_factura) {
                        if ($this->esEditable($id_factura)) {
                            $result = $this->carritoCompras->eliminarProducto('cmpneditar', 'app_compras_notas', $id_factura, $data_factura['cmpn_cliid'], $unique, $descuento_global);
                            if (isset($result['errors'])) {
                                return Http::json_response(['errors' => $result['errors']]);
                            } else {
                                return Http::json_response($result);
                            }
                        } else {
                            $this->array_errors[] = 'Acción prohibida';
                        }
                    } else {
                        $this->array_errors[] = 'Acción prohibida';
                    }
                } else {
                    $this->array_errors[] = 'Acción prohibida';
                }
            }

            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    public function guardarDetallesCliente()
    {
        if ('POST' === $_SERVER['REQUEST_METHOD'] && isAjax()) {

            if (empty($_POST['prov_cifnif']))
                $this->array_errors[] = 'El campo Cedula de identidad es obligatorio';
            if (empty($_POST['prov_tipoidfiscal']))
                $this->array_errors[] = 'El campo Tipo de documento es obligatorio';
            if (empty($_POST['prov_razonsocial']))
                $this->array_errors[] = 'El campo Razón social es obligatorio';
            if (empty($_POST['prov_direccion']))
                $this->array_errors[] = 'El campo Dirección es obligatorio';

            if (empty($this->array_errors)) {

                $prov_id                = filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT);
                $prov_tipoidfiscal      = filter_input(INPUT_POST, 'prov_tipoidfiscal', FILTER_SANITIZE_NUMBER_INT);
                $prov_cifnif            = $this->solicitud->sanitize($_POST['prov_cifnif'], FILTER_SANITIZE_STRING);
                $prov_razonsocial       = $this->solicitud->sanitize($_POST['prov_razonsocial'], FILTER_SANITIZE_STRING);
                $prov_direccion         = $this->solicitud->sanitize($_POST['prov_direccion'], FILTER_SANITIZE_STRING);
                $prov_paisid            = filter_input(INPUT_POST, 'prov_paisid', FILTER_SANITIZE_NUMBER_INT);
                $prov_estado            = $this->solicitud->sanitize($_POST['prov_estado'], FILTER_SANITIZE_STRING);
                $prov_ciudad            = $this->solicitud->sanitize($_POST['prov_ciudad'], FILTER_SANITIZE_STRING);
                $prov_codigo_postal     = $this->solicitud->sanitize($_POST['prov_codigo_postal'], FILTER_SANITIZE_STRING);

                $result = $this->carritoCompras->editarDetallesCliente($prov_id, [
                    'prov_tipoidfiscal'     => $prov_tipoidfiscal,
                    'prov_cifnif'           => $prov_cifnif,
                    'prov_razonsocial'      => $prov_razonsocial,
                    'prov_direccion'        => $prov_direccion,
                    'prov_paisid'           => $prov_paisid,
                    'prov_estado'           => $prov_estado,
                    'prov_ciudad'           => $prov_ciudad,
                    'prov_codigo_postal'    => $prov_codigo_postal
                ]);

                if (isset($result['errors'])) {
                    return Http::json_response(['errors' => $result['errors']]);
                } else {
                    return Http::json_response($result);
                }
            }

            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    public function guardarEnvioCliente()
    {
        if ('POST' === $_SERVER['REQUEST_METHOD'] && isAjax()) {

            $id_factura             = filter_input(INPUT_POST, 'id_factura', FILTER_SANITIZE_NUMBER_INT);
            $env_nombre_opcional    = filter_input(INPUT_POST, 'env_nombre_opcional', FILTER_SANITIZE_STRING);
            $env_agencia_transporte = filter_input(INPUT_POST, 'env_agencia_transporte', FILTER_SANITIZE_STRING);
            $env_codigo_seguimiento = filter_input(INPUT_POST, 'env_codigo_seguimiento', FILTER_SANITIZE_STRING);
            $env_direccion          = filter_input(INPUT_POST, 'env_direccion', FILTER_SANITIZE_STRING);
            $env_pais               = filter_input(INPUT_POST, 'env_pais', FILTER_SANITIZE_NUMBER_INT);
            $env_estado             = filter_input(INPUT_POST, 'env_estado', FILTER_SANITIZE_STRING);
            $env_ciudad             = filter_input(INPUT_POST, 'env_ciudad', FILTER_SANITIZE_STRING);
            $env_codigopostal       = filter_input(INPUT_POST, 'env_codigopostal', FILTER_SANITIZE_STRING);
            $env_asegurado          = ('true' == filter_input(INPUT_POST, 'env_asegurado')) ? 1 : 0;

            if (!empty($id_factura)) {

                if (empty($env_agencia_transporte))
                    $this->array_errors[] = "El campo Agencia de tranporte es obligatorio.";
                if (empty($env_codigo_seguimiento))
                    $this->array_errors[] = "El campo Codigo de seguimiento es obligatorio.";
                if (empty($env_direccion))
                    $this->array_errors[] = "El campo Dirección obligatorio.";
                if (empty($env_pais))
                    $this->array_errors[] = "El campo País es obligatorio.";
                if (empty($env_estado))
                    $this->array_errors[] = "El campo Estado es obligatorio.";
                if (empty($env_ciudad))
                    $this->array_errors[] = "El campo Ciudad es obligatorio.";
                if (empty($env_codigopostal))
                    $this->array_errors[] = "El campo Codigo postal es obligatorio.";

                if (empty($this->array_errors)) {

                    $data_factura = $this->notas_entrega_model->obtenerFactura($id_factura);

                    if ($data_factura['cmpn_estatus'] != 1) {
                        Http::json_response($this->notas_entrega_model->editar($id_factura, [
                            'cmpn_env_nombres'            => $env_nombre_opcional ?? $data_factura['cmpn_env_nombres'],
                            'cmpn_env_direccion'          => $env_direccion,
                            'cmpn_env_pais'               => $env_pais,
                            'cmpn_env_estado'             => $env_estado,
                            'cmpn_env_ciudad'             => $env_ciudad,
                            'cmpn_env_codigo_postal'      => $env_codigopostal,
                            'cmpn_env_agencia_transporte' => $env_agencia_transporte,
                            'cmpn_env_codigo_seguimiento' => $env_codigo_seguimiento,
                            'cmpn_env_asegurado'          => $env_asegurado,
                        ]));
                    } else {
                        $this->array_errors[] = "La factura no se puede editar ya que ha sigo pagada en su totalidad.";
                    }
                }
            }

            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    public function comprobarFactura($id_factura)
    {
        if ('GET' === $_SERVER['REQUEST_METHOD'] && isAjax()) {
            $id_factura = filter_var($id_factura, FILTER_SANITIZE_NUMBER_INT);
            $factura = $this->notas_entrega_model->obtenerFactura($id_factura);
            if ($factura['cmpn_estatus'] == 1) {
                $this->array_errors[] = 'Ya la factura a sido pagada en su totalidad';
            } else {
                Http::json_response(true);
            }
            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    private function esEditable($id_factura)
    {
        $factura = $this->notas_entrega_model->obtenerFactura($id_factura);
        return ($factura['cmpn_estatus'] == 1) ? false : true;
    }

    private function facturaFinalizada($id_factura)
    {
        $movimiento_model = new MovimientoModel();
        $factura = $this->notas_entrega_model->obtenerFactura($id_factura);
        $total_pagos = $movimiento_model->totalPagos($id_factura, 9, 2);
        return ((round($total_pagos['total'], 2) * -1) >= round($factura['cmpn_total'], 2)) ? true : false;
    }

    public function ventaEnEsperaEditar()
    {
        if ($_SERVER['REQUEST_METHOD'] == 'POST' && isAjax()) {

            $id_serie       = filter_input(INPUT_POST, 'id_serie', FILTER_SANITIZE_NUMBER_INT);
            $id_factura     = filter_input(INPUT_POST, 'id_factura', FILTER_SANITIZE_NUMBER_INT);
            $fecha          = filter_input(INPUT_POST, 'fecha', FILTER_SANITIZE_STRING);
            $observaciones  = filter_input(INPUT_POST, 'observaciones', FILTER_SANITIZE_STRING) ?? '';
            $afectar_stock  = ('true' == filter_input(INPUT_POST, 'afectar_stock')) ? true : false;
            $afectar_precio = ('true' == filter_input(INPUT_POST, 'afectar_precio')) ? true : false;
            $cantidad_agregada = 0;

            if (!empty($id_factura)) {

                if (empty($id_serie))
                    $this->array_errors[] = 'El campo Serie es obligatorio.';
                if (empty($fecha))
                    $this->array_errors[] = 'El campo fecha es obligatorio.';

                if (empty($this->array_errors)) {

                    $serie      = $this->notas_entrega_model->obtenerSerie($id_serie);
                    $factura    = $this->notas_entrega_model->obtenerFactura($id_factura);
                    $proveedor    = $this->notas_entrega_model->obtenerProveedor($factura['cmpn_cliid']);

                    if ($proveedor && $serie && $factura && $this->esEditable($id_factura)) {
                        $divisa_master = Moneda::Predeterminada();
                        $new_stock = new Stock();
                        $new_productos = new Productos();
                        $notas_entrega_articulos_model = new CmpnotasArticulos();
                        $contenido_carrito = $this->carritoCompras->contenidoCarrito('cmpneditar', $id_factura);
                        $fecha = date('Y-m-d', strtotime($fecha)) . ' ' . date('H:i:s');
                        if ($afectar_precio == true && $factura['cmpn_precio'] == 0) {
                            $cmp_precio = 1;
                        } else {
                            $cmp_precio = $factura['cmpn_precio'];
                        }
                        if ($afectar_stock == true && $factura['cmpn_agregado'] == 0) {
                            $cmp_agregado = 1;
                        } else {
                            $cmp_agregado = $factura['cmpn_agregado'];
                        }
                        if (empty($this->array_errors)) {

                            if ($this->notas_entrega_model->editar($id_factura, [
                                'cmpn_subtotal'          => $_SESSION["cmpneditar$id_factura"]['subtotal'],
                                'cmpn_descuento'         => $_SESSION["cmpneditar$id_factura"]['descuento'],
                                'cmpn_neto'              => $_SESSION["cmpneditar$id_factura"]['neto'],
                                'cmpn_iva'               => $_SESSION["cmpneditar$id_factura"]['iva'],
                                'cmpn_total'             => $_SESSION["cmpneditar$id_factura"]['total'],
                                'cmpn_articulos_total'   => $_SESSION["cmpneditar$id_factura"]['articulos_cantidad'],
                                'cmpn_divid'             => $_SESSION["cmpneditar$id_factura"]['divisa'],
                                'cmpn_serid'             => $serie['ser_id'],
                                'cmpn_serie'             => $serie['ser_descripcion'],
                                'cmpn_empresaid'         => 1,
                                'cmpn_empleadoid'        => $_SESSION['user_data']['einfo_id'],
                                'cmpn_fecha'             => $fecha,
                                'cmpn_cliid'             => $proveedor['prov_id'],
                                'cmpn_env_nombres'       => $proveedor['prov_razonsocial'],
                                'cmpn_env_direccion'     => $proveedor['prov_direccion'],
                                'cmpn_env_pais'          => $proveedor['prov_paisid'],
                                'cmpn_env_estado'        => $proveedor['prov_estado'],
                                'cmpn_env_ciudad'        => $proveedor['prov_ciudad'],
                                'cmpn_env_codigo_postal' => $proveedor['prov_codigo_postal'],
                                'cmpn_estatus'           => 2,
                                'cmpn_observaciones'     => $observaciones,
                                'cmpn_agregado'          => $cmp_agregado,
                                'cmpn_precio'            => $cmp_precio
                            ])) {

                                foreach ($contenido_carrito as $row) {

                                    $detalles_producto = $notas_entrega_articulos_model->obtenerDetalleProductoFacturado($id_factura, $row['id'], $row['id_almacen']);
                                    $almacen  = $this->notas_entrega_model->obtenerAlmacen($row['id_almacen']);
                                    $cantidad_stock = $this->notas_entrega_model->chuequearStock($row['id'], $row['id_almacen']);

                                    if ($detalles_producto) {

                                        $cantidad_agregada = $detalles_producto['cmpnart_agregar_inventario'];

                                        if ($detalles_producto['cmpnart_procantidad'] > $row['cantidad'] && $cmp_agregado == 1) {
                                            $cantidad = $detalles_producto['cmpnart_procantidad'] - $row['cantidad'];
                                            if ($this->notas_entrega_model->desontardeStock($row['id'], $row['id_almacen'], $cantidad)) {
                                                $cantidad_agregada = $detalles_producto['cmpnart_agregar_inventario'] - $cantidad;
                                                Notifica::stock($row['id'], "{$almacen['alm_nombre']}", 'compras', $cantidad_stock['ps_cantidad'], 0, $cantidad, $cantidad_stock['ps_cantidad'] - $cantidad, $id_factura, 9);
                                            }
                                        } else {
                                            if ($afectar_stock == true || $cmp_agregado == 1) {
                                                if ($this->notas_entrega_model->chuequearStock($row['id'], $row['id_almacen'])) {
                                                    if ($detalles_producto['cmpnart_agregar_inventario'] < $row['cantidad']) {
                                                        $cantidad_a_agregar = $row['cantidad'] - $detalles_producto['cmpnart_agregar_inventario'];
                                                        if ($cantidad_a_agregar > 0 && $this->notas_entrega_model->restablecerStock($row['id'], $row['id_almacen'], $cantidad_a_agregar)) {
                                                            $cantidad_agregada = $detalles_producto['cmpnart_agregar_inventario'] + $cantidad_a_agregar;
                                                            Notifica::stock($row['id'], "{$almacen['alm_nombre']}", 'compras', $cantidad_stock['ps_cantidad'], $cantidad_a_agregar, 0, $cantidad_stock['ps_cantidad'] + $cantidad_a_agregar, $id_factura, 9);
                                                        }
                                                    }
                                                } else {
                                                    if ($new_stock->guardar([
                                                        'ps_cantidad'   => $row['cantidad'],
                                                        'ps_almid'      => $row['id_almacen'],
                                                        'ps_disponible' => $row['cantidad'],
                                                        'ps_proid'      => $row['id'],
                                                        'ps_stockmax'   => $row['cantidad'],
                                                        'ps_stockmin'   => $row['cantidad']
                                                    ], true)) {
                                                        $cantidad_agregada = $row['cantidad'];
                                                        Notifica::stock($row['id'], "{$almacen['alm_nombre']}", 'compras', 0, $row['cantidad'], 0, $row['cantidad'], $id_factura, 9);
                                                    }
                                                }
                                            }
                                        }

                                        if ($notas_entrega_articulos_model->editar($detalles_producto['cmpnart_id'], [
                                            'cmpnart_procodigo'              => $row['codigo'],
                                            'cmpnart_propnombre'             => $row['nombre'],
                                            'cmpnart_proprecio'              => $row['costo'],
                                            'cmpnart_procantidad'            => $row['cantidad'],
                                            'cmpnart_prodescuento'           => $row['descuento'],
                                            'cmpnart_proneto'                => $row['neto'],
                                            'cmpnart_idiva'                  => $row['id_iva'],
                                            'cmpnart_almid'                  => $row['id_almacen'],
                                            'cmpnart_proiva'                 => $row['iva'],
                                            'cmpnart_ivatotal'               => $row['iva_total'],
                                            'cmpnart_prototal'               => $row['total'],
                                            'cmpnart_agregar_inventario'     => $cantidad_agregada,
                                        ]) && ($afectar_precio == true || $cmp_precio == 1)) {
                                            $precio = TarifasControlador::aplicar(null, $row['costo'], "pvp", $row['descuento'], 0,0);
                                            //DESCUENTO PRODUCTO
                                            $new_productos->editar($row['id'], [
                                                'pro_costo' => $precio,
                                                //'pro_impid' => $row['id_iva']
                                            ]);
                                        }
                                    } else {

                                        if ($this->notas_entrega_model->chuequearStock($row['id'], $row['id_almacen'])) {
                                            if (($afectar_stock == true || $cmp_agregado == 1) && $this->notas_entrega_model->restablecerStock($row['id'], $row['id_almacen'], $row['cantidad'])) {
                                                $cantidad_agregada = $row['cantidad'];
                                                Notifica::stock($row['id'], "{$almacen['alm_nombre']}", 'compras', $cantidad_stock['ps_cantidad'], $row['cantidad'], 0, $cantidad_stock['ps_cantidad'] + $row['cantidad'], $id_factura, 9);
                                            }
                                        } else {
                                            if ($afectar_stock == true || $cmp_agregado == 1) {
                                                if ($new_stock->guardar([
                                                    'ps_cantidad'   => $row['cantidad'],
                                                    'ps_almid'      => $row['id_almacen'],
                                                    'ps_disponible' => $row['cantidad'],
                                                    'ps_proid'      => $row['id'],
                                                    'ps_stockmax'   => $row['cantidad'],
                                                    'ps_stockmin'   => $row['cantidad']
                                                ], true)) {
                                                    $cantidad_agregada = $row['cantidad'];
                                                    Notifica::stock($row['id'], "{$almacen['alm_nombre']}", 'compras', 0, $row['cantidad'], 0, $row['cantidad'], $id_factura, 9);
                                                }
                                            }
                                        }

                                        if ($notas_entrega_articulos_model->guardar([
                                            'cmpnart_cmpnid'                  => $id_factura,
                                            'cmpnart_proid'                  => $row['id'],
                                            'cmpnart_procodigo'              => $row['codigo'],
                                            'cmpnart_propnombre'             => $row['nombre'],
                                            'cmpnart_proprecio'              => $row['costo'],
                                            'cmpnart_procantidad'            => $row['cantidad'],
                                            'cmpnart_prodescuento'           => $row['descuento'],
                                            'cmpnart_proneto'                => $row['neto'],
                                            'cmpnart_idiva'                  => $row['id_iva'],
                                            'cmpnart_almid'                  => $row['id_almacen'],
                                            'cmpnart_proiva'                 => $row['iva'],
                                            'cmpnart_ivatotal'               => $row['iva_total'],
                                            'cmpnart_prototal'               => $row['total'],
                                            'cmpnart_agregar_inventario'     => $cantidad_agregada,
                                        ], true) && ($afectar_precio == true || $cmp_precio == 1)) {
                                            $precio = TarifasControlador::aplicar(null, $row['costo'], "pvp", $row['descuento'], 0,0);
                                            //DESCUENTO PRODUCTO
                                            if ($_SESSION["cmpneditar$id_factura"]['divisa'] != $divisa_master['id']) {
                                                $factor =  $this->carritoCompras->obtenerPrecioSegunDivisa($precio, $_SESSION["cmpneditar$id_factura"]['divisa'], $divisa_master['id']);
                                                $new_productos->editar($row['id'], [
                                                    'pro_costo' => $factor['precio'],
                                                   // 'pro_impid' => $row['id_iva']
                                                ]);
                                            } else {
                                                $new_productos->editar($row['id'], [
                                                    'pro_costo' => $precio,
                                                    //'pro_impid' => $row['id_iva']
                                                ]);
                                            }
                                        }
                                    }
                                }

                                Http::json_response(ruta_base() . 'cmpnotaseditar/verFactura/' . $id_factura);
                            } else {
                                $this->array_errors[] = "Los siento ocurrio un error al guardar la venta";
                            }
                        }
                    }
                }

                Http::json_response(['errors' => $this->array_errors]);
            }
        }
    }

    public function obtenerMetodosSegunDivisa()
    {
        if ('POST' == $_SERVER['REQUEST_METHOD'] && isAjax()) {

            $id_divisa  = filter_input(INPUT_POST, 'id_divisa', FILTER_SANITIZE_NUMBER_INT);
            $id_factura = filter_input(INPUT_POST, 'id_factura', FILTER_SANITIZE_NUMBER_INT);
            $factor = 1;

            if (empty($id_divisa))
                $this->array_errors[] = 'Debe seleccionar una divisa';

            if (!empty($id_factura) && empty($this->array_errors)) {

                $factura        = $this->notas_entrega_model->obtenerFactura($id_factura);
                $divisa         = Moneda::obtenerDivisa($id_divisa);

                if ($divisa && $factura) {

                    $data_metodos   = $this->notas_entrega_model->obtenerMetodosSegunDivisa($id_divisa);

                    if ($data_metodos) {

                        if ($factura['cmpn_divid'] != $divisa['id']) {
                            $divisa_factor = $this->notas_entrega_model->obtenerDivisaAlCambio($factura['cmpn_divid'], $divisa['id']);
                            if ($divisa_factor) {
                                $factor = $divisa_factor['df_factor'];
                            } else {
                                $this->array_errors[] = 'Lo siento no se encuentra ningun valor de conversión para la moneda que intenta escoger y la moneda en que se realizo la factura';
                            }
                        }

                        if (empty($this->array_errors)) {

                            $movimiento_model = new MovimientoModel();
                            $total_pagos = $movimiento_model->totalPagos($factura['cmpn_id'], 9, 2);
                            $total = round(($factura['cmpn_total'] + ($total_pagos['total'] ?? 0)), 2);

                            Http::json_response([
                                'factor'            => $factor,
                                'divisa'            => $divisa,
                                'data_metodos'      => $data_metodos,
                                'restante'          => $total
                            ]);
                        }
                    }
                }
            }

            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    public function obtenerCuentasSegunMetodo($id_metodo_divisa)
    {
        if ('GET' == $_SERVER['REQUEST_METHOD'] && isAjax()) {

            $id_metodo_divisa = filter_var($id_metodo_divisa, FILTER_SANITIZE_NUMBER_INT);

            if (empty($id_metodo_divisa))
                $this->array_errors[] = 'Debe seleccionar un metodo';

            if (empty($this->array_errors)) {
                $data = $this->notas_entrega_model->obtenerCuentasSegunMetodo($id_metodo_divisa);
                if ($data) {
                    Http::json_response($data);
                } else {
                    $this->array_errors[] = 'Lo siento no hay cuentas registradas para este metoto de pago';
                }
            }

            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    public function obtenerSaldoSegunCuenta()
    {
        if ('GET' === $_SERVER['REQUEST_METHOD'] && isAjax()) {
            $id = filter_input(INPUT_GET, 'id_cuenta', FILTER_SANITIZE_NUMBER_INT);
            $divisa_cuenta = $this->notas_entrega_model->obtenerDivisaSegunCuenta($id);
            $cuenta = $this->notas_entrega_model->consultar("SELECT cmp_cueid FROM app_cuentas_metodopago WHERE cmp_id = $id")->row();
            $saldo = $this->notas_entrega_model->consultar("SELECT bc_saldo FROM app_bancos_cuentas WHERE bc_id = {$cuenta['cmp_cueid']}")->row();
            $saldo = $saldo['bc_saldo'] ?? 0;
            Http::json_response([
                'div_locale'    => $divisa_cuenta['div_locale'],
                'div_simbolo'   => $divisa_cuenta['div_simbolo'],
                'saldo'         => $saldo
            ]);
        }
    }

    public function pagar()
    {
        if ($_SERVER['REQUEST_METHOD'] == 'POST' && isAjax()) {

            $id_factura         = filter_input(INPUT_POST, 'id_factura', FILTER_SANITIZE_NUMBER_INT);
            $id_divisa          = filter_input(INPUT_POST, 'id_divisa', FILTER_SANITIZE_NUMBER_INT);
            $id_metodo_divisa   = filter_input(INPUT_POST, 'id_metodo_divisa', FILTER_SANITIZE_NUMBER_INT);
            $id_cuenta_metodo   = filter_input(INPUT_POST, 'id_cuenta_metodo', FILTER_SANITIZE_NUMBER_INT);
            $monto              = filter_input(INPUT_POST, 'monto', FILTER_SANITIZE_STRING);
            $referencia              = filter_input(INPUT_POST, 'referencia', FILTER_SANITIZE_STRING);

            if (empty($id_divisa))
                $this->array_errors[] = 'El campo Divisa es obligatorio.';
            if (empty($id_metodo_divisa))
                $this->array_errors[] = 'El campo Metodo es obligatorio.';
            if (empty($id_cuenta_metodo))
                $this->array_errors[] = 'El campo Cuenta es obligatorio.';
            if (empty($monto))
                $this->array_errors[] = 'El campo Monto es obligatorio.';

            if (!empty($id_factura) && empty($this->array_errors)) {

                $factura    = $this->notas_entrega_model->obtenerFactura($id_factura);

                if ($factura) {
                    if (!$this->facturaFinalizada($factura['cmpn_id'])) {
                        $result = $this->carritoCompras->pagar('app_compras_notas', $monto, $id_divisa, $id_factura, false, $id_cuenta_metodo, $id_metodo_divisa,$referencia);
                        if (isset($result['errors'])) {
                            return Http::json_response(['errors' => $result['errors']]);
                        } else {
                            return Http::json_response($result);
                        }
                    } else {
                        $this->array_errors[] = 'Acción prohibida';
                    }
                }
            }

            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    public function eliminarPago()
    {
        if ($_SERVER['REQUEST_METHOD'] == 'POST' && isAjax()) {

            if ($this->module->has_module_action_permission('facturacion', 'eliminar_pagos', $_SESSION['user_data']['emp_id'])) {

                $id         = filter_input(INPUT_POST, 'id', FILTER_SANITIZE_NUMBER_INT);
                $id_factura = filter_input(INPUT_POST, 'id_factura', FILTER_SANITIZE_NUMBER_INT);

                if (!empty($id) && !empty($id_factura)) {
                    $factura    = $this->notas_entrega_model->obtenerFactura($id_factura);
                    if ($factura) {
                        if (!$this->facturaFinalizada($factura['cmpn_id'])) {
                            $result = $this->carritoCompras->eliminarPago('app_compras_notas', $id_factura, $id);
                            if (isset($result['errors'])) {
                                return Http::json_response(['errors' => $result['errors']]);
                            } else {
                                return Http::json_response($result);
                            }
                        } else {
                            $this->array_errors[] = 'Acción prohibida';
                        }
                    }
                }
            } else {
                $this->array_errors[] = 'Acción prohibida';
            }

            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    public function eniviarFactura()
    {
        if ('POST' === $_SERVER['REQUEST_METHOD'] && isAjax()) {

            $id     = filter_input(INPUT_POST, 'id_factura', FILTER_SANITIZE_NUMBER_INT);
            $de     = filter_input(INPUT_POST, 'de', FILTER_SANITIZE_EMAIL);
            $para   = filter_input(INPUT_POST, 'para', FILTER_SANITIZE_EMAIL);
            $copia  = filter_input(INPUT_POST, 'copia', FILTER_SANITIZE_EMAIL);
            $firma  = filter_input(INPUT_POST, 'firma', FILTER_SANITIZE_EMAIL);
            $tipo   = filter_input(INPUT_POST, 'tipo', FILTER_SANITIZE_NUMBER_INT) ?? 1;

            if (empty($de))
                $this->array_errors[] = "El campo De es obligatorio.";
            if (empty($para))
                $this->array_errors[] = "El campo Para es obligatorio.";

            if (empty($this->array_errors) && !empty($id)) {
                switch ($tipo) {
                    case 1:
                        $mpdf = $this->pdfCompleto($id);
                        break;
                    case 2:
                        $mpdf = $this->pdfMediaPagina($id);
                        break;
                    case 3:
                        $mpdf = $this->pdfPagos($id);
                        break;
                }
                $content = $mpdf['mpdf']->Output('', 'S');
                $mail = new PHPMailer(true);
                try {

                    $mail->isSMTP();
                    $mail->Host       = "{$mpdf['empresa']['emp_host_correo']}";
                    $mail->SMTPAuth   = true;
                    $mail->Username   = "{$mpdf['empresa']['emp_email']}";
                    $mail->Password   = "{$mpdf['empresa']['emp_email_password']}";
                    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
                    $mail->Port       = $mpdf['empresa']['emp_port_correo'];

                    $mail->setFrom($de);
                    $mail->addAddress($para);
                    $mail->addReplyTo($de, 'Empresa');

                    if (!empty($copia)) {
                        $mail->addAddress($copia);
                    }

                    $mail->addStringAttachment($content, "{$mpdf['mascara']}");

                    $mail->isHTML(true);
                    $mail->Subject = 'NOTA DE ENTREGA';
                    $mail->Body    = "{$mpdf['mascara']}";

                    $mail->send();

                    Http::json_response("Envio de factura exitosa");
                } catch (Exception $e) {
                    $this->array_errors[] = "Message could not be sent. Mailer Error: {$mail->ErrorInfo}.";
                }
            }

            Http::json_response([
                'errors' => $this->array_errors
            ]);
        }
    }

    private function pdfCompleto($id_factura)
    {
        $factura_data       = $this->notas_entrega_model->obtenerFacturaCompleta($id_factura);

        $articulos_model    = new CmpnotasArticulos();
        $articulos_data     = $articulos_model->articulos($factura_data['cmpn_id']);
        $proveedor_data       = $this->notas_entrega_model->obtenerProveedor($factura_data['cmpn_cliid']);
        $empresa_data       = $this->notas_entrega_model->obtenerDatosEmpresa();
        $documento_data     = $this->notas_entrega_model->obtenerDocumento(9);

        $mascara = mascara_correlativo($documento_data['doc_prefijo'], $factura_data['ser_impuesto'], $factura_data['cmpn_correlativo']);

        $mpdf = new \Mpdf\Mpdf([
            'mode'              => 'utf-8',
            'margin_left'       => 15,
            'margin_right'      => 15,
            'margin_top'        => 35,
            'margin_bottom'     => 30,
            'margin_header'     => 15,
            'margin_footer'     => 30,
            'format'            => 'A4',
            'orientation'       => 'P',
            'default_font_size' => 8,
            'default_font'      => 'helvetica'
        ]);

        $mpdf->SetTitle($mascara);
        $mpdf->SetAuthor($empresa_data['emp_nombre']);
        $mpdf->SetCreator($empresa_data['emp_nombre']);
        $mpdf->SetSubject($mascara);

        $html_header = Vista::viewPDF('pdfcompras/notas/header.php', [
            'emp_nombre'    => $empresa_data['emp_nombre'] ?? '',
            'emp_rif'       => $empresa_data['emp_rif'] ?? '',
            'emp_direccion' => $empresa_data['emp_direccion'] ?? '',
            'emp_direccion' => $empresa_data['emp_direccion'] ?? '',
            'emp_codpostal' => $empresa_data['emp_codpostal'] ?? '',
            'emp_estado'    => $empresa_data['emp_estado'] ?? '',
            'emp_ciudad'    => $empresa_data['emp_ciudad'] ?? '',
        ]);

        $mpdf->SetHTMLHeader($html_header);

        $html_body = Vista::viewPDF('pdfcompras/notas/body_completo', [
            'factura'       => $mascara,
            'cliente'       => $proveedor_data['prov_razonsocial'],
            'direccion'     => $proveedor_data['prov_direccion'],
            'fecha'         => date('Y-m-d', strtotime($factura_data['cmpn_fecha'])),
            'cedularif'     => $proveedor_data['prov_cifnif'],
            'telefono'      => $proveedor_data['prov_telefono1'],
            'div_locale'    => $factura_data['div_locale'],
            'div_simbolo'  => $factura_data['div_simbolo'],
            'articulos'     => $articulos_data,
            'observaciones' => $factura_data['cmpn_observaciones']
        ]);

        $mpdf->WriteHTML($html_body);

        $html_footer = Vista::viewPDF('pdfcompras/notas/footer', [
            'div_locale'    => $factura_data['div_locale'],
            'div_simbolo'  => $factura_data['div_simbolo'],
            'total'         => $factura_data['cmpn_total'],
            'iva'           => $factura_data['cmpn_iva'],
            'neto'          => $factura_data['cmpn_neto'],
            'descuento'     => $factura_data['cmpn_descuento']
        ]);

        $mpdf->SetHTMLFooter($html_footer);

        return [
            'mpdf'      => $mpdf,
            'mascara'   => $mascara . '.pdf',
            'empresa'   => $empresa_data,
        ];
    }

    private function pdfMediaPagina($id_factura)
    {
        $factura_data = $this->notas_entrega_model->obtenerFacturaCompleta($id_factura);

        $articulos_model    = new CmpnotasArticulos();
        $articulos_data     = $articulos_model->articulos($factura_data['cmpn_id']);
        $proveedor_data       = $this->notas_entrega_model->obtenerProveedor($factura_data['cmpn_cliid']);
        $empresa_data       = $this->notas_entrega_model->obtenerDatosEmpresa();
        $documento_data     = $this->notas_entrega_model->obtenerDocumento(9);

        $mascara = mascara_correlativo($documento_data['doc_prefijo'], $factura_data['ser_impuesto'], $factura_data['cmpn_correlativo']);

        $mpdf = new \Mpdf\Mpdf([
            'mode'              => 'utf-8',
            'margin_left'       => 15,
            'margin_right'      => 15,
            'margin_top'        => 35,
            'margin_bottom'     => 30,
            'margin_header'     => 15,
            'margin_footer'     => 30,
            'format'            => [210, 148.5],
            'orientation'       => 'P',
            'default_font_size' => 8,
            'default_font'      => 'helvetica'
        ]);

        $mpdf->SetTitle($mascara);
        $mpdf->SetAuthor($empresa_data['emp_nombre']);
        $mpdf->SetCreator($empresa_data['emp_nombre']);
        $mpdf->SetSubject($mascara);

        $html_header = Vista::viewPDF('pdfcompras/notas/header', [
            'emp_nombre'    => $empresa_data['emp_nombre'] ?? '',
            'emp_rif'       => $empresa_data['emp_rif'] ?? '',
            'emp_direccion' => $empresa_data['emp_direccion'] ?? '',
            'emp_direccion' => $empresa_data['emp_direccion'] ?? '',
            'emp_codpostal' => $empresa_data['emp_codpostal'] ?? '',
            'emp_estado'    => $empresa_data['emp_estado'] ?? '',
            'emp_ciudad'    => $empresa_data['emp_ciudad'] ?? '',
        ]);

        $mpdf->SetHTMLHeader($html_header);

        $html_body = Vista::viewPDF('pdfcompras/notas/body_completo', [
            'factura'       => $mascara,
            'cliente'       => $proveedor_data['prov_razonsocial'],
            'direccion'     => $proveedor_data['prov_direccion'],
            'fecha'         => date('Y-m-d', strtotime($factura_data['cmpn_fecha'])),
            'cedularif'     => $proveedor_data['prov_cifnif'],
            'telefono'      => $proveedor_data['prov_telefono1'],
            'div_locale'    => $factura_data['div_locale'],
            'div_simbolo'  => $factura_data['div_simbolo'],
            'articulos'     => $articulos_data,
            'observaciones' => $factura_data['cmpn_observaciones']
        ]);

        $mpdf->WriteHTML($html_body);

        $html_footer = Vista::viewPDF('pdfcompras/notas/footer', [
            'div_locale'    => $factura_data['div_locale'],
            'div_simbolo'  => $factura_data['div_simbolo'],
            'total'         => $factura_data['cmpn_total'],
            'iva'           => $factura_data['cmpn_iva'],
            'neto'          => $factura_data['cmpn_neto'],
            'descuento'     => $factura_data['cmpn_descuento']
        ]);

        $mpdf->SetHTMLFooter($html_footer);

        return [
            'mpdf'      => $mpdf,
            'mascara'   => $mascara . '.pdf',
            'empresa'   => $empresa_data,
        ];
    }

    public function pdfPagos($id_factura)
    {
        $factura_data = $this->notas_entrega_model->obtenerFacturaCompleta($id_factura);

        $articulos_model    = new CmpnotasArticulos();
        $articulos_data     = $articulos_model->articulos($factura_data['cmpn_id']);
        $proveedor_data     = $this->notas_entrega_model->obtenerProveedor($factura_data['cmpn_cliid']);
        $empresa_data       = $this->notas_entrega_model->obtenerDatosEmpresa();
        $documento_data     = $this->notas_entrega_model->obtenerDocumento(9);

        $mascara = mascara_correlativo($documento_data['doc_prefijo'], $factura_data['ser_impuesto'], $factura_data['cmpn_correlativo']);

        $mpdf = new \Mpdf\Mpdf([
            'mode'              => 'utf-8',
            'margin_left'       => 15,
            'margin_right'      => 15,
            'margin_top'        => 35,
            'margin_bottom'     => 30,
            'margin_header'     => 15,
            'margin_footer'     => 20,
            'format'            => [210, 148.5],
            'orientation'       => 'P',
            'default_font_size' => 8,
            'default_font'      => 'helvetica'
        ]);

        $mpdf->SetTitle($mascara);
        $mpdf->SetAuthor($empresa_data['emp_nombre']);
        $mpdf->SetCreator($empresa_data['emp_nombre']);
        $mpdf->SetSubject($mascara);

        $html_header = Vista::viewPDF('pdfcompras/notas/header', [
            'emp_nombre'    => $empresa_data['emp_nombre'] ?? '',
            'emp_rif'       => $empresa_data['emp_rif'] ?? '',
            'emp_direccion' => $empresa_data['emp_direccion'] ?? '',
            'emp_direccion' => $empresa_data['emp_direccion'] ?? '',
            'emp_codpostal' => $empresa_data['emp_codpostal'] ?? '',
            'emp_estado'    => $empresa_data['emp_estado'] ?? '',
            'emp_ciudad'    => $empresa_data['emp_ciudad'] ?? '',
        ]);

        $mpdf->SetHTMLHeader($html_header);

        $html_body = Vista::viewPDF('pdfcompras/notas/body_completo', [
            'factura'       => $mascara,
            'cliente'       => $proveedor_data['prov_razonsocial'],
            'direccion'     => $proveedor_data['prov_direccion'],
            'fecha'         => date('Y-m-d', strtotime($factura_data['cmpn_fecha'])),
            'cedularif'     => $proveedor_data['prov_cifnif'],
            'telefono'      => $proveedor_data['prov_telefono1'],
            'div_locale'    => $factura_data['div_locale'],
            'div_simbolo'  => $factura_data['div_simbolo'],
            'articulos'     => $articulos_data,
            'observaciones' => $factura_data['cmpn_observaciones']
        ]);

        $mpdf->WriteHTML($html_body);

        $html_footer = Vista::viewPDF('pdfcompras/notas/footer', [
            'div_locale'    => $factura_data['div_locale'],
            'div_simbolo'  => $factura_data['div_simbolo'],
            'total'         => $factura_data['cmpn_total'],
            'iva'           => $factura_data['cmpn_iva'],
            'neto'          => $factura_data['cmpn_neto'],
            'descuento'     => $factura_data['cmpn_descuento']
        ]);

        $mpdf->SetHTMLFooter($html_footer);

        $mpdf->AddPage();

        $array_abonos = [];
        $total_abonos = 0;
        $abonos = $this->notas_entrega_model->abonos($id_factura);

        if (is_countable($abonos) && count($abonos)) {
            foreach ($abonos as $row) {
                $divisa_mov = $this->notas_entrega_model->obtenerDivisa($row['fab_divisa']);
                $divisa_conv_mov = $this->notas_entrega_model->obtenerDivisa($row['fab_divid_conversion']);
                $array_abonos[] = [
                    'fab_id'            => $row['fab_id'],
                    'fab_fecha'         => $row['fecha'],
                    'bc_alias'          => $row['bc_alias'],
                    'bc_tipo'           => $row['bc_tipo'],
                    'fab_retiro'        => $row['fab_retiro'],
                    'mp_nombre'         => $row['mp_nombre'],
                    'fab_monto'         => Moneda::moneda($row['fab_monto'] * -1, $divisa_mov['div_locale'], $divisa_mov['div_simbolo']),
                    'fab_factor'        => Moneda::decimal($row['fab_factor'], $this->divisa_master['div_locale']),
                    'fab_conversion'    => Moneda::moneda($row['fab_conversion'] * -1, $divisa_conv_mov['div_locale'], $divisa_conv_mov['div_simbolo'])
                ];

                $total_abonos += ($row['fab_conversion'] * -1);
            }
        }

        $pendiente = $factura_data['cmpn_total'] - $total_abonos;

        if (is_countable($abonos) && count($abonos)) {
            $html_abonos = Vista::viewPDF('pdfcompras/notas/abonos', [
                'total' => Moneda::moneda($factura_data['cmpn_total'], $divisa_conv_mov['div_locale'], $divisa_conv_mov['div_simbolo']),
                'pendiente' => Moneda::moneda($pendiente, $divisa_conv_mov['div_locale'], $divisa_conv_mov['div_simbolo']),
                'abonos' => $array_abonos,
                'abonado' => Moneda::moneda($total_abonos, $divisa_conv_mov['div_locale'], $divisa_conv_mov['div_simbolo'])
            ]);
        } else {
            $html_abonos = Vista::viewPDF('pdfcompras/notas/abonos', [
                'total' => Moneda::moneda($factura_data['cmpn_total'], $factura_data['div_locale'], $factura_data['div_simbolo']),
                'pendiente' => Moneda::moneda($factura_data['cmpn_total'], $factura_data['div_locale'], $factura_data['div_simbolo']),
                'abonos' => $array_abonos,
                'abonado' => 0
            ]);
        }

        $mpdf->WriteHTML($html_abonos);

        $footer = Vista::viewPDF('pdfcompras/notas/footerFMP');

        $mpdf->SetHTMLFooter($footer);

        return [
            'mpdf'      => $mpdf,
            'mascara'   => $mascara . '.pdf',
            'empresa'   => $empresa_data,
        ];
    }


//gisbel


private function pdfCompletoSM($id_factura)
    {
        $factura_data       = $this->notas_entrega_model->obtenerFacturaCompleta($id_factura);

        $articulos_model    = new CmpnotasArticulos();
        $articulos_data     = $articulos_model->articulos($factura_data['cmpn_id']);
        $proveedor_data       = $this->notas_entrega_model->obtenerProveedor($factura_data['cmpn_cliid']);
        $empresa_data       = $this->notas_entrega_model->obtenerDatosEmpresa();
        $documento_data     = $this->notas_entrega_model->obtenerDocumento(9);

        $mascara = mascara_correlativo($documento_data['doc_prefijo'], $factura_data['ser_impuesto'], $factura_data['cmpn_correlativo']);

        $mpdf = new \Mpdf\Mpdf([
            'mode'              => 'utf-8',
            'margin_left'       => 15,
            'margin_right'      => 15,
            'margin_top'        => 35,
            'margin_bottom'     => 30,
            'margin_header'     => 15,
            'margin_footer'     => 30,
            'format'            => 'A4',
            'orientation'       => 'P',
            'default_font_size' => 8,
            'default_font'      => 'helvetica'
        ]);

        $mpdf->SetTitle($mascara);
        $mpdf->SetAuthor($empresa_data['emp_nombre']);
        $mpdf->SetCreator($empresa_data['emp_nombre']);
        $mpdf->SetSubject($mascara);

        $html_header = Vista::viewPDF('pdfcompras/notas/header.php', [
            'emp_nombre'    => $empresa_data['emp_nombre'] ?? '',
            'emp_rif'       => $empresa_data['emp_rif'] ?? '',
            'emp_direccion' => $empresa_data['emp_direccion'] ?? '',
            'emp_direccion' => $empresa_data['emp_direccion'] ?? '',
            'emp_codpostal' => $empresa_data['emp_codpostal'] ?? '',
            'emp_estado'    => $empresa_data['emp_estado'] ?? '',
            'emp_ciudad'    => $empresa_data['emp_ciudad'] ?? '',
        ]);

        $mpdf->SetHTMLHeader($html_header);

        $html_body = Vista::viewPDF('pdfcompras/notas/body_completo_sm', [
            'factura'       => $mascara,
            'cliente'       => $proveedor_data['prov_razonsocial'],
            'direccion'     => $proveedor_data['prov_direccion'],
            'fecha'         => date('Y-m-d', strtotime($factura_data['cmpn_fecha'])),
            'cedularif'     => $proveedor_data['prov_cifnif'],
            'telefono'      => $proveedor_data['prov_telefono1'],
            'div_locale'    => $factura_data['div_locale'],
            'div_simbolo'  => $factura_data['div_simbolo'],
            'articulos'     => $articulos_data,
            'observaciones' => $factura_data['cmpn_observaciones']
        ]);

        $mpdf->WriteHTML($html_body);

     
        return [
            'mpdf'      => $mpdf,
            'mascara'   => $mascara . '.pdf',
            'empresa'   => $empresa_data,
        ];
    }

   public function pdfFMPSM($id)
    {
        if ('GET' === $_SERVER['REQUEST_METHOD']) {

            $id = filter_var($id, FILTER_SANITIZE_NUMBER_INT);

            $factura_data = $this->notas_entrega_model->obtenerFacturaCompleta($id);

            if (!$factura_data) {
                Http::notFound();
            }

            $mpdf = $this->pdfCompletoSM($id);

            $mpdf['mpdf']->Output("{$mpdf['mascara']}", \Mpdf\Output\Destination::INLINE);
            exit;
        }
    }
//gisbel


    public function pdf($id)
    {
        if ('GET' === $_SERVER['REQUEST_METHOD']) {

            $id = filter_var($id, FILTER_SANITIZE_NUMBER_INT);

            $factura_data = $this->notas_entrega_model->obtenerFacturaCompleta($id);

            if (!$factura_data) {
                Http::notFound();
            }

            $mpdf = $this->pdfCompleto($id);

            $mpdf['mpdf']->Output("{$mpdf['mascara']}", \Mpdf\Output\Destination::INLINE);
            exit;
        }
    }

    public function pdfMP($id)
    {
        if ('GET' === $_SERVER['REQUEST_METHOD']) {

            $id = filter_var($id, FILTER_SANITIZE_NUMBER_INT);

            $factura_data = $this->notas_entrega_model->obtenerFacturaCompleta($id);

            if (!$factura_data) {
                Http::notFound();
            }

            $mpdf = $this->pdfMediaPagina($id);

            $mpdf['mpdf']->Output("{$mpdf['mascara']}", \Mpdf\Output\Destination::INLINE);
            exit;
        }
    }

    public function pdfFMP($id)
    {
        if ('GET' === $_SERVER['REQUEST_METHOD']) {

            $id = filter_var($id, FILTER_SANITIZE_NUMBER_INT);

            $factura_data = $this->notas_entrega_model->obtenerFacturaCompleta($id);

            if (!$factura_data) {
                Http::notFound();
            }

            $mpdf = $this->pdfPagos($id);

            $mpdf['mpdf']->Output("{$mpdf['mascara']}", \Mpdf\Output\Destination::INLINE);
            exit;
        }
    }

    public function enviarDocumento()
    {
        if ('POST' === $_SERVER['REQUEST_METHOD'] && isAjax()) {

            $new_cmpfacdoc = new CmpnotasDocumentos();

            $id_factura     = filter_input(INPUT_POST, 'id_factura', FILTER_SANITIZE_NUMBER_INT);
            $descripcion    = filter_input(INPUT_POST, 'descripcion', FILTER_SANITIZE_STRING);

            if (!empty($id_factura)) {

                if (empty($descripcion))
                    $this->array_errors[] = "El campo Descripcion es obligatorio.";
                if (empty($_FILES['documento']))
                    $this->array_errors[] = "El documento es obligatorio.";

                if (empty($this->array_errors)) {

                    $fileTmpPath    = $_FILES['documento']['tmp_name'];
                    $fileName       = $_FILES['documento']['name'];
                    $fileSize       = $_FILES['documento']['size'];
                    $extenciones    = array('jpg','jpeg', 'png', 'pdf');

                    if ($_FILES['documento']['error'] === UPLOAD_ERR_OK) {

                        $fileNameCmps = explode(".", basename($_FILES['documento']['name']));
                        $fileExtension = strtolower(end($fileNameCmps));
                        $newFileName = md5(time() . $fileName) . '.' . $fileExtension;
                        $dest_path = 'upload/comprasnotas/' . $newFileName;

                        if ($fileSize < 1000000) {
                            if (in_array($fileExtension, $extenciones)) {
                                if (move_uploaded_file($fileTmpPath, $dest_path)) {
                                    if ($new_cmpfacdoc->guardar([
                                        'cmpndoc_cmpnid'          => $id_factura,
                                        'cmpndoc_descripcion'    => $descripcion,
                                        'cmpndoc_documento'      => $newFileName
                                    ])) {
                                        Http::json_response('Archivo subido satisfactoriamente');
                                    } else {
                                        unlink($dest_path);
                                        $this->array_errors[] = "Se produjo un error al cargar el archivo";
                                    }
                                } else {
                                    $this->array_errors[] = "Se produjo un error al cargar el archivo";
                                }
                            } else {
                                $this->array_errors[] = "Solo archivos con formato PDF, PNG o JPG";
                            }
                        } else {
                            $this->array_errors[] = "EL archivo supera el limite de 1MB";
                        }
                    } else {
                        $this->array_errors[] = "Se produjo un error al cargar el archivo";
                    }
                }
            }

            Http::json_response([
                'errors' => $this->array_errors
            ]);
        }
    }

    public function obtnerDocumentos($id_factura)
    {
        if ('GET' === $_SERVER['REQUEST_METHOD'] && isAjax()) {

            $new_cmpfacdoc = new CmpnotasDocumentos();

            $id_factura = filter_var($id_factura, FILTER_SANITIZE_NUMBER_INT);

            if (!empty($id_factura)) {
                Http::json_response($new_cmpfacdoc->obtenerDocumentos($id_factura));
            }
        }
    }

    public function cambiarProveedor()
    {
        if ($_SERVER['REQUEST_METHOD'] == 'GET' && isAjax()) {

            $id_proveedor   = filter_input(INPUT_GET, 'id_proveedor', FILTER_SANITIZE_NUMBER_INT);
            $id_factura     = filter_input(INPUT_GET, 'id_factura', FILTER_SANITIZE_NUMBER_INT);

            if (!empty($id_proveedor) && !empty($id_factura)) {

                $proveedor = $this->notas_entrega_model->obtenerProveedor($id_proveedor);
                $factura = $this->notas_entrega_model->obtenerFactura($id_factura);

                if ($proveedor && $factura) {
                    if ($this->esEditable($id_factura)) {
                        if ($this->notas_entrega_model->editar($id_factura, [
                            'cmpn_cliid'             => $proveedor['prov_id'],
                            'cmpn_env_nombres'       => $proveedor['prov_razonsocial'],
                            'cmpn_env_direccion'     => $proveedor['prov_direccion'],
                            'cmpn_env_pais'          => $proveedor['prov_paisid'],
                            'cmpn_env_estado'        => $proveedor['prov_estado'],
                            'cmpn_env_ciudad'        => $proveedor['prov_ciudad'],
                            'cmpn_env_codigo_postal' => $proveedor['prov_codigo_postal'],
                        ])) {
                            Http::json_response(ruta_base() . 'cmpnotaseditar/verFactura/' . $id_factura);
                        } else {
                            $this->array_errors[] = "Los siento ocurrio un error al editar el proveedor de la nota de entrega";
                        }
                    } else {
                        $this->array_errors[] = "Nota de entrega no editable";
                    }
                }

                Http::json_response(['errors' => $this->array_errors]);
            }
        }
    }

    public function anularFactura()
    {
        if ($_SERVER['REQUEST_METHOD'] == 'GET' && isAjax()) {

            if ($this->module->has_module_action_permission('facturacion', 'anular_doc', $_SESSION['user_data']['emp_id'])) {

                $id_factura     = filter_input(INPUT_GET, 'id_factura', FILTER_SANITIZE_NUMBER_INT);
                $descripcion    = filter_input(INPUT_GET, 'descripcion', FILTER_SANITIZE_STRING);

                $factura = $this->notas_entrega_model->obtenerFactura($id_factura);

                if (!$factura) {
                    $this->array_errors[] = 'ACCESO DENEGADO';
                    return Http::json_response(['errors' => $this->array_errors]);
                }

                if ($factura['cmpn_estatus'] == 3) {
                    $this->array_errors[] = 'La nota de entrega ya se encuentra anulada.';
                }

                if (empty($this->array_errors)) {

                    $correlativo = $this->notas_entrega_model->chuequearCorrelativo($factura['cmpn_serid'], 11);
                    $serie = $this->notas_entrega_model->obtenerSerie($factura['cmpn_serid']);

                    if ($correlativo == false) {
                        $this->array_errors[] = "No existe correlativo entre la se serie $serie[ser_descripcion] y el documento Notas de credito COMPRAS por favor dirijase a Modulo Configuración -> correlativos";
                    }

                    if (empty($this->array_errors)) {

                        $new_articulos = new CmpnotasArticulos();
                        $new_movimiento = new MovimientoModel();
                        $new_credito = new Comprascredito();
                        $new_crepagos = new Comprascreditopagos();
                        $articulos = $new_articulos->articulos($factura['cmpn_id']);
                        $movimientos = $new_movimiento->obtenerMovimientosDocumento($factura['cmpn_id'], 9, true);
                        $empresa = $this->notas_entrega_model->obtenerDatosEmpresa();

                        foreach ($articulos as $row) {
                            $almacen  = $this->notas_entrega_model->obtenerAlmacen($row['cmpnart_almid']);
                            $cantidad_stock = $this->notas_entrega_model->chuequearStock($row['cmpnart_proid'], $row['cmpnart_almid']);
                            if ($cantidad_stock['ps_cantidad'] < $row['cmpnart_agregar_inventario']) {
                                $this->array_errors = [];
                                $this->array_errors[] = "Existe productos que no poseen suficiente stock para ser descontado";
                            }
                        }

                        if (empty($this->array_errors)) {

                            if ($this->notas_entrega_model->editar($factura['cmpn_id'], [
                                'cmpn_estatus' => 3,
                                'cmpn_observaciones' => $factura['cmpn_observaciones'] . ' (ANULADO ' . $descripcion . ')'
                            ])) {

                                foreach ($articulos as $row) {
                                    $almacen  = $this->notas_entrega_model->obtenerAlmacen($row['cmpnart_almid']);
                                    $cantidad_stock = $this->notas_entrega_model->chuequearStock($row['cmpnart_proid'], $row['cmpnart_almid']);
                                    if ($row['cmpnart_agregar_inventario'] > 0 && $this->notas_entrega_model->desontardeStock($row['cmpnart_proid'], $row['cmpnart_almid'], $row['cmpnart_agregar_inventario'])) {
                                        $new_articulos->editar($row['cmpnart_id'], ['cmpnart_agregar_inventario' => 0]);
                                        Notifica::stock($row['cmpnart_proid'], "{$almacen['alm_nombre']}", 'compras', $cantidad_stock['ps_cantidad'], 0, $row['cmpnart_agregar_inventario'], $cantidad_stock['ps_cantidad'] - $row['cmpnart_agregar_inventario'], $factura['cmpn_id'], 9);
                                    }
                                }

                                if (is_countable($movimientos) && count($movimientos)) {

                                    $id_credito = $new_credito->guardar([
                                        'crecmp_provid'        => $factura['cmpn_cliid'],
                                        'crecmp_facid'         => $factura['cmpn_id'],
                                        'crecmp_docid'         => 9,
                                        'crecmp_empleado'      => $_SESSION['user_data']['emp_id'],
                                        'crecmp_empresa'       => $empresa['emp_id'],
                                        'crecmp_modulo'        => 'NEC',
                                        'crecmp_descripcion'   => $descripcion,
                                        'crecmp_correlativo'   => $correlativo['cor_correlativo'] + 1,
                                    ]);

                                    if ($id_credito) {

                                        $this->notas_entrega_model->actualizarCorrelativo($serie['ser_id'], 11, ($correlativo['cor_correlativo'] + 1));

                                        foreach ($movimientos as $row) {
                                            $new_crepagos->guardar([
                                                'crecmpart_crecmpid'           => $id_credito,
                                                'crecmpart_divid'              => $row['fab_divisa'],
                                                'crecmpart_meid'               => $row['fab_metodo'],
                                                'crecmpart_cmpid'              => $row['fab_cmpid'],
                                                'crecmpart_factor_master'      => $row['fab_factor_master'],
                                                'crecmpart_monto'              => $row['fab_monto'] * -1,
                                                'crecmpart_factor'             => $row['fab_factor'],
                                                'crecmpart_conversion'         => $row['fab_conversion'] * -1,
                                                'crecmpart_divid_conversion'   => $row['fab_divid_conversion'],
                                                'crecmpart_fecha'              => $row['fab_fecha']
                                            ]);
                                        }
                                    }
                                }

                                return Http::json_response(ruta_base() . 'cmpnotaseditar/verFactura/' . $id_factura);
                            } else {
                                Http::json_response(false);
                            }
                        }
                    }
                }
            } else {
                $this->array_errors[] = 'Acceso prohibido no posee permisos para anular el documento.';
            }

            Http::json_response(['errors' => $this->array_errors]);
        }
    }

    public function actualizarFactura()
    {
        if ('POST' == $_SERVER['REQUEST_METHOD'] && isAjax()) {

            if (empty($_POST['factura']))
                $this->array_errors[] = 'El numero de la factura es obligatorio';

            if (empty($this->array_errors)) {

                $factura       = filter_input(INPUT_POST, 'factura', FILTER_SANITIZE_STRING);
                $id       = filter_input(INPUT_POST, 'id', FILTER_VALIDATE_INT);

                Http::json_response($this->notas_entrega_model->editar($id, [
                    'cmpn_numfactura' => $factura,
                ]));
            } else {
                $this->array_errors[] = 'Acción prohibida';
            }
        }

        Http::json_response(['errors' => $this->array_errors]);
    }
}
