El complemento de pago es un archivo electrónico que se agrega a una factura electrónica para proporcionar información adicional sobre los pagos recibidos. Este complemento es obligatorio en México para todas las facturas que se emiten con un método de pago distinto al de contado.

El complemento de pago incluye los siguientes datos:

  • Forma de pago: La forma en que se recibió el pago, por ejemplo, efectivo, cheque, transferencia bancaria, etc.
  • Monto del pago: El monto del pago recibido.
  • Fecha del pago: La fecha en que se recibió el pago.
  • Documento origen: El número de la factura o documento que se pagó.
  • Método de pago: El método que se utilizó para realizar el pago, por ejemplo, banca electrónica, banca móvil, etc.

El complemento de pago se debe emitir a más tardar al décimo día natural del mes siguiente al que se recibió el pago. Se puede emitir a través de un software de facturación electrónica o de manera manual.

Bien para programar el modulo de complemento de pago primero vamos a crear el archivo de migración para la tabla pagos en App/Database/Migrations/2023-10-18120916_pagos.php con el siguiente codigo

<?php

namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class Pagos extends Migration {

    public function up() {
        // Quotes  
        $this->forge->addField([
            'id' => ['type' => 'bigint', 'constraint' => 20, 'unsigned' => true, 'auto_increment' => true],
            'idEmpresa' => ['type' => 'bigint', 'constraint' => 20, 'unsigned' => true, 'null' => true],
            'idSucursal' => ['type' => 'bigint', 'constraint' => 20, 'unsigned' => true, 'null' => true],
            'idCustumer' => ['type' => 'bigint', 'constraint' => 20, 'unsigned' => true, 'null' => true],
            'folio' => ['type' => 'bigint', 'constraint' => 20, 'unsigned' => true, 'null' => true],
            'idUser' => ['type' => 'bigint', 'constraint' => 20, 'null' => true],
            'listPagos' => ['type' => 'text', 'null' => true],
            'taxes' => ['type' => 'decimal', 'constraint' => '18,2', 'null' => true],
            'IVARetenido' => ['type' => 'decimal', 'constraint' => '18,4', 'null' => true],
            'ISRRetenido' => ['type' => 'decimal', 'constraint' => '18,4', 'null' => true],
            'subTotal' => ['type' => 'decimal', 'constraint' => '18,2', 'null' => true],
            'total' => ['type' => 'decimal', 'constraint' => '18,2', 'null' => true],
            'balance' => ['type' => 'decimal', 'constraint' => '18,2', 'null' => true],
            'date' => ['type' => 'date', 'null' => true],
            'dateVen' => ['type' => 'date', 'null' => true],
            'quoteTo' => ['type' => 'varchar', 'constraint' => 512, 'null' => true],
            'delivaryTime' => ['type' => 'varchar', 'constraint' => 512, 'null' => true],
            'generalObservations' => ['type' => 'varchar', 'constraint' => 512, 'null' => true],
            'UUID' => ['type' => 'varchar', 'constraint' => 36, 'null' => true],
            'idQuote' => ['type' => 'int', 'constraint' => 11, 'unsigned' => true, 'null' => true],
            'tipoComprobanteRD' => ['type' => 'int', 'constraint' => 11, 'unsigned' => true, 'null' => true],
            'folioCombrobanteRD' => ['type' => 'bigint', 'constraint' => 11, 'unsigned' => true, 'null' => true],
            'RFCReceptor' => ['type' => 'varchar', 'constraint' => 15, 'null' => true],
            'usoCFDI' => ['type' => 'varchar', 'constraint' => 32, 'null' => true],
            'metodoPago' => ['type' => 'varchar', 'constraint' => 32, 'null' => true],
            'formaPago' => ['type' => 'varchar', 'constraint' => 32, 'null' => true],
            'regimenFiscalReceptor' => ['type' => 'varchar', 'constraint' => 1024, 'null' => true],
            'razonSocialReceptor' => ['type' => 'varchar', 'constraint' => 1024, 'null' => true],
            'codigoPostalReceptor' => ['type' => 'varchar', 'constraint' => 5, 'null' => true],
            'idVehiculo' => ['type' => 'bigint', 'constraint' => 20, 'unsigned' => true, 'null' => true],
            'idChofer' => ['type' => 'bigint', 'constraint' => 20, 'unsigned' => true, 'null' => true],
            'tipoVehiculo' => ['type' => 'bigint', 'constraint' => 20, 'unsigned' => true, 'null' => true],
            'idArqueoCaja' => ['type' => 'bigint', 'constraint' => 20, 'unsigned' => true, 'null' => true],
            'noCTAOrdenante' => ['type' => 'varchar', 'constraint' => 64, 'null' => true],
            'noCTABeneficiario' => ['type' => 'varchar', 'constraint' => 64, 'null' => true],
            'RFCCTAOrdenante' => ['type' => 'varchar', 'constraint' => 64, 'null' => true],
            'RFCCTABeneficiario' => ['type' => 'varchar', 'constraint' => 64, 'null' => true],
            'created_at' => ['type' => 'datetime', 'null' => true],
            'updated_at' => ['type' => 'datetime', 'null' => true],
            'deleted_at' => ['type' => 'datetime', 'null' => true],
        ]);

        $this->forge->addKey('id', true);
        $this->forge->addUniqueKey('UUID', 'UQ_UUID');
        $this->forge->createTable('pagos', true);
    }

    public function down() {
        $this->forge->dropTable('pagos', true);
    }

}

Creamos el archivo modelo para los complementos de pago en App/Models/PagosModel.php con el siguiente código

<?php

namespace App\Models;

use CodeIgniter\Model;

class PagosModel extends Model {

    protected $table = 'pagos';
    protected $primaryKey = 'id';
    protected $useAutoIncrement = true;
    protected $returnType = 'array';
    protected $useSoftDeletes = true;
    protected $allowedFields = [
        'id',
        'idEmpresa',
        'folio',
        'idUser',
        'idCustumer',
        'listPagos',
        'taxes',
        'IVARetenido',
        'ISRRetenido',
        'subTotal',
        'total',
        'balance',
        'date',
        'dateVen',
        'generalObservations',
        'quoteTo',
        'delivaryTime',
        'created_at',
        'updated_at',
        'idQuote',
        'RFCReceptor',
        'usoCFDI',
        'metodoPago',
        'formaPago',
        'razonSocialReceptor',
        'codigoPostalReceptor',
        'regimenFiscalReceptor',
        'idVehiculo',
        'idChofer',
        'idSucursal',
        'idArqueoCaja',
        'tipoVehiculo',
        'noCTAOrdenante',
        'noCTABeneficiario',
        'RFCCTAOrdenante',
        'RFCCTABeneficiario',
        'UUID'
    ];
    protected $useTimestamps = true;
    protected $createdField = 'created_at';
    protected $deletedField = 'deleted_at';
    protected $validationRules = [
        'idCustumer' => 'required|',
    ];
    protected $validationMessages = [];
    protected $skipValidation = false;

    public function mdlGetPagos($empresas) {

        $result = $this->db->table('pagos a, custumers b, empresas c')
                ->select('a.UUID,a.id,concat(b.firstname,\' \',b.lastname) as nameCustumer
                    ,a.idCustumer
                    ,a.folio
                    ,a.date
                    ,b.email as correoCliente
                    ,a.dateVen
                    ,a.total
                    ,a.taxes
                    ,a.subTotal
                    ,a.balance
                    ,a.delivaryTime
                    ,a.generalObservations
                    ,a.idQuote
                    ,a.IVARetenido
                    ,a.ISRRetenido
                    ,a.idSucursal


                    ,a.RFCReceptor
                    ,a.usoCFDI
                    ,a.metodoPago
                    ,a.formaPago
                    ,a.razonSocialReceptor
                    ,a.codigoPostalReceptor
                    ,a.regimenFiscalReceptor
                    
                    ,a.idVehiculo
                    ,a.idChofer
                    ,a.tipoVehiculo
                    ,a.idArqueoCaja

                    ,a.created_at
                    ,a.updated_at
                    ,a.deleted_at')
                ->where('a.idCustumer', 'b.id', FALSE)
                ->where('a.idEmpresa', 'c.id', FALSE)
                ->whereIn('a.idEmpresa', $empresas);

        return $result;
    }

    /**
     * Search by filters
     */
    public function mdlGetPagosFilters($empresas
            , $from
            , $to
            , $allSells
            , $empresa = 0
            , $sucursal = 0
            , $cliente = 0
    ) {

        $result = $this->db->table('pagos a, custumers b, empresas c')
                ->select('a.UUID,a.id,concat(b.firstname,\' \',b.lastname) as nameCustumer
                    ,a.idCustumer
                    ,a.folio
                    ,a.date
                    ,b.email as correoCliente
                    ,a.dateVen
                    ,a.total
                    ,a.taxes
                    ,a.subTotal
                    ,a.balance
                    ,a.delivaryTime
                    ,a.generalObservations
                    ,a.idQuote
                    ,a.IVARetenido
                    ,a.ISRRetenido
                    ,a.idSucursal


                    ,a.RFCReceptor
                    ,a.usoCFDI
                    ,a.metodoPago
                    ,a.formaPago
                    ,a.razonSocialReceptor
                    ,a.codigoPostalReceptor
                    ,a.regimenFiscalReceptor
                    
                    ,a.idVehiculo
                    ,a.idChofer
                    ,a.tipoVehiculo
                    ,a.idArqueoCaja

                    ,a.created_at
                    ,a.updated_at
                    ,a.deleted_at')
                ->where('a.idCustumer', 'b.id', FALSE)
                ->where('a.idEmpresa', 'c.id', FALSE)
                ->where('a.date >=', $from . ' 00:00:00')
                ->where('a.date <=', $to . ' 23:59:59')
                ->groupStart()
                ->where('\'true\'', $allSells, true)
                ->orWhere('a.balance>', '0')
                ->groupEnd()
                ->groupStart()
                ->where('0', $empresa)
                ->orWhere('a.idEmpresa', $empresa)
                ->groupEnd()
                ->groupStart()
                ->where('0', $sucursal)
                ->orWhere('a.idSucursal', $sucursal)
                ->groupEnd()
                ->groupStart()
                ->where('0', $cliente)
                ->orWhere('a.idCustumer', $cliente)
                ->groupEnd()
                ->whereIn('a.idEmpresa', $empresas);

        return $result;
    }

    /**
     * Obtener Cotización por UUID
     */
    public function mdlGetPagoUUID($uuid, $empresas) {

        $result = $this->db->table('pagos a, custumers b, empresas c')
                        ->select('a.idCustumer
            ,a.folio
            ,a.quoteTo
            ,a.UUID
            ,a.idUser
            ,a.id
            ,concat(b.firstname,\' \',b.lastname) as nameCustumer
            ,a.idEmpresa
            ,c.nombre as nombreEmpresa
            ,a.listPagos
            ,a.date
            ,a.dateVen
            ,a.total
            ,a.taxes
            ,a.IVARetenido
            ,a.ISRRetenido
            ,a.idQuote
            ,a.delivaryTime
            ,a.generalObservations

            ,a.RFCReceptor
            ,a.usoCFDI
            ,a.metodoPago
            ,a.formaPago
            ,a.razonSocialReceptor
            ,a.codigoPostalReceptor
            ,a.regimenFiscalReceptor
            ,a.idSucursal
            
            ,a.idVehiculo
            ,a.idChofer
            ,a.tipoVehiculo
            ,a.idArqueoCaja

            ,a.created_at
            ,a.updated_at,
            a.deleted_at')
                        ->where('a.idCustumer', 'b.id', FALSE)
                        ->where('a.idEmpresa', 'c.id', FALSE)
                        ->where('UUID', $uuid)
                        ->whereIn('a.idEmpresa', $empresas)
                        ->get()->getRowArray();

        return $result;
    }

    public function mdlObtenerVentasFacturadasPendientesDePago(
            $idEmpresa
            , $idSucursal
            , $idCustumer
    ) {


        $resultado = $this->db->table('sells a, xml c, enlacexml b, custumers e')
                        ->select('
                                a.id
                                ,a.folio
                                ,a.idCustumer
                                ,a.total
                                ,a.balance
                                ,c.serie
                                ,a.date
                                ,a.dateVen
                                ,a.taxes
                                ')
                        ->where('a.id', 'b.idDocumento', FALSE)
                        ->where('c.uuidTimbre', 'b.uuidXML', FALSE)
                        ->where('a.balance >', 0)
                        ->where('a.idEmpresa', $idEmpresa)
                        ->where('a.idSucursal', $idSucursal)
                        ->where('a.idCustumer', $idCustumer)
                        ->where('a.idCustumer', 'e.id', FALSE)
                        ->get()->getResultArray();

        return $resultado;
    }

}

Creamos el archivo controlador para el complemento de pago en App/Controllers/PagosController.php con el siguiente código

<?php

namespace App\Controllers;

use App\Controllers\BaseController;
use App\Database\Migrations\Storages;
use App\Models\ProductsModel;
use \App\Models\UserModel;
use App\Models\LogModel;
use App\Models\QuotesModel;
use App\Models\SellsModel;
use App\Models\CompaniesModel;
use App\Models\StoragesModel;
use App\Models\SellsDetailsModel;
use CodeIgniter\API\ResponseTrait;
use App\Models\EmpresasModel;
use App\Models\CustumersModel;
use App\Models\PaymentsModel;
use App\Models\Comprobantes_rdModel;
use App\Models\VehiculosModel;
use App\Models\ChoferesModel;
use App\Models\TipovehiculoModel;
use App\Models\BranchofficesModel;
use App\Models\ArqueoCajaModel;
use App\Models\SaldosModel;
use App\Models\PagosModel;

class PagosController extends BaseController {

    use ResponseTrait;

    protected $log;
    protected $sells;
    protected $storages;
    protected $sellsDetail;
    protected $sucursales;
    protected $empresa;
    protected $user;
    protected $custumer;
    protected $payments;
    protected $products;
    protected $quotes;
    protected $comprobantesRD;
    protected $vehiculos;
    protected $choferes;
    protected $tiposVehiculo;
    protected $arqueoCaja;
    protected $saldos;
    protected $pagos;

    public function __construct() {
        $this->log = new LogModel();

        $this->sells = new SellsModel();
        $this->sellsDetail = new SellsDetailsModel();
        $this->empresa = new EmpresasModel();
        $this->user = new UserModel();
        $this->custumer = new CustumersModel();
        $this->payments = new PaymentsModel();
        $this->products = new ProductsModel();
        $this->quotes = new QuotesModel();
        $this->comprobantesRD = new Comprobantes_rdModel();
        $this->vehiculos = new VehiculosModel();
        $this->choferes = new ChoferesModel();
        $this->tiposVehiculo = new TipovehiculoModel();
        $this->sucursales = new BranchofficesModel();
        $this->arqueoCaja = new ArqueoCajaModel();
        $this->saldos = new SaldosModel();
        $this->pagos = new PagosModel();

        helper('menu');
        helper('utilerias');
    }

    public function index() {

        $auth = service('authentication');
        if (!$auth->check()) {

            return redirect()->route('admin');
        }


        helper('auth');

        $idUser = user()->id;
        $titulos["empresas"] = $this->empresa->mdlEmpresasPorUsuario($idUser);

        if (count($titulos["empresas"]) == "0") {

            $empresasID[0] = "0";
        } else {

            $empresasID = array_column($titulos["empresas"], "id");
        }


        if ($this->request->isAJAX()) {


            $datos = $this->pagos->mdlGetPagos($empresasID);

            return \Hermawan\DataTables\DataTable::of($datos)->toJson(true);
        }


        $tiposVehiculo = $this->tiposVehiculo->mdlGetTipovehiculoArray($empresasID);

        $titulos["tiposVehiculo"] = $tiposVehiculo;
        $titulos["listaTitle"] = "Administracion de ventas";
        $titulos["listaSubtitle"] = "Muestra la lista de ventas";

        //$data["data"] = $datos;
        return view('pagos', $titulos);
    }

    public function pagosFilters($desdeFecha, $hastaFecha, $todas, $empresa, $sucursal, $cliente) {


        $auth = service('authentication');
        if (!$auth->check()) {

            return redirect()->route('admin');
        }


        helper('auth');

        $idUser = user()->id;
        $titulos["empresas"] = $this->empresa->mdlEmpresasPorUsuario($idUser);

        if (count($titulos["empresas"]) == "0") {

            $empresasID[0] = "0";
        } else {

            $empresasID = array_column($titulos["empresas"], "id");
        }


        if ($this->request->isAJAX()) {


            $datos = $this->pagos->mdlGetPagosFilters($empresasID, $desdeFecha, $hastaFecha, $todas, $empresa, $sucursal, $cliente);

            return \Hermawan\DataTables\DataTable::of($datos)->toJson(true);
        }
    }

    /**
     * 
     * @param type $desdeFecha
     * @param type $hastaFecha
     * @param type $todas
     * @return type
     * 
     * Get Report Sells per products
     */
    public function sellsReport($idEmpresa = 0
            , $idSucursal = 0
            , $idProducto = 0
            , $from
            , $to
            , $cliente) {


        $auth = service('authentication');
        if (!$auth->check()) {

            return redirect()->route('admin');
        }


        helper('auth');

        $idUser = user()->id;

        /**
         * Vemos las Empresa a la que tiene acceso
         */
        $titulos["empresas"] = $this->empresa->mdlEmpresasPorUsuario($idUser);

        if (count($titulos["empresas"]) == "0") {

            $empresasID[0] = "0";
        } else {

            $empresasID = array_column($titulos["empresas"], "id");
        }


        /**
         * Vemos a las sucursales a las que tiene accesio
         */
        $sucursales = $this->sucursales->mdlSucursalesPorUsuario($idUser);

        if (count($sucursales) == "0") {

            $sucursalesID[0] = "0";
        } else {

            $sucursalesID = array_column($sucursales, "id");
        }


        if ($this->request->isAJAX()) {


            $datos = $this->sells->mdlVentasPorProductos($idEmpresa
                    , $idSucursal
                    , $idProducto
                    , $from
                    , $to
                    , $empresasID
                    , $sucursalesID
                    , $cliente);

            return \Hermawan\DataTables\DataTable::of($datos)->toJson(true);
        }
    }

    public function newPago() {
        $auth = service('authentication');
        if (!$auth->check()) {

            return redirect()->route('admin');
        }

        helper('auth');
        $userName = user()->username;
        $idUser = user()->id;

        $titulos["empresas"] = $this->empresa->mdlEmpresasPorUsuario($idUser);

        if (count($titulos["empresas"]) == "0") {

            $empresasID[0] = "0";
        } else {

            $empresasID = array_column($titulos["empresas"], "id");
        }


        $fechaActual = fechaMySQLADateHTML5(fechaHoraActual());

        $idMax = "0";

        $titulos["idMax"] = $idMax;
        $titulos["idSell"] = $idMax;
        $titulos["folio"] = "0";
        $titulos["fecha"] = $fechaActual;
        $titulos["userName"] = $userName;
        $titulos["idUser"] = $idUser;
        $titulos["contact"] = "";
        $titulos["idQuote"] = "0";
        $titulos["codeCustumer"] = "";
        $titulos["observations"] = "";
        $titulos["taxes"] = "0.00";
        $titulos["IVARetenido"] = "0.00";
        $titulos["ISRRetenido"] = "0.00";
        $titulos["subTotal"] = "0.00";
        $titulos["total"] = "0.00";
        $titulos["formaPago"] = $this->catalogosSAT->formasDePago40()->searchByField("texto", "%%", 99999);
        $titulos["usoCFDI"] = $this->catalogosSAT->usosCfdi40()->searchByField("texto", "%%", 99999);
        $titulos["metodoPago"] = $this->catalogosSAT->metodosDePago40()->searchByField("texto", "%%", 99999);
        $titulos["regimenFiscal"] = $this->catalogosSAT->regimenesFiscales40()->searchByField("texto", "%%", 99999);

        $titulos["RFCReceptor"] = "";
        $titulos["regimenFiscalReceptor"] = "";
        $titulos["usoCFDIReceptor"] = "";
        $titulos["metodoPagoReceptor"] = "";
        $titulos["formaPagoReceptor"] = "";
        $titulos["razonSocialReceptor"] = "";
        $titulos["codigoPostalReceptor"] = "";

        $titulos["folioComprobanteRD"] = "0";

        $titulos["uuid"] = generaUUID();

        $tiposVehiculo = $this->tiposVehiculo->mdlGetTipovehiculoArray($empresasID);

        $titulos["title"] = "Complemento de Pago"; //lang('registerNew.title');
        $titulos["subtitle"] = "Captura de Complementos de pago"; // lang('registerNew.subtitle');
        $titulos["tiposVehiculo"] = $tiposVehiculo;

        return view('newPayment', $titulos);
    }

    public function reportSellsProducts() {
        $auth = service('authentication');
        if (!$auth->check()) {

            return redirect()->route('admin');
        }

        helper('auth');
        $userName = user()->username;
        $idUser = user()->id;

        $titulos["empresas"] = $this->empresa->mdlEmpresasPorUsuario($idUser);

        if (count($titulos["empresas"]) == "0") {

            $empresasID[0] = "0";
        } else {

            $empresasID = array_column($titulos["empresas"], "id");
        }




        $titulos["title"] = "Reporte de Ventas"; //lang('registerNew.title');
        $titulos["subtitle"] = "Ventas por Empresa, Sucursal, Producto";

        return view('reportSellsProducts', $titulos);
    }

    /**
     * Get Last Code
     */
    public function getLastCode() {

        $idEmpresa = $this->request->getPost("idEmpresa");
        $idSucursal = $this->request->getPost("idSucursal");
        $result = $this->pagos->selectMax("folio")
                ->where("idEmpresa", $idEmpresa)
                ->where("idSucursal", $idSucursal)
                ->first();

        if ($result["folio"] == null) {

            $result["folio"] = 1;
        } else {

            $result["folio"] = $result["folio"] + 1;
        }

        echo json_encode($result);
    }

    /**
     * Get Last Code
     */
    public function getLastCodeInterno($idEmpresa, $idSucursal) {


        $result = $this->pagos->selectMax("folio")
                ->where("idEmpresa", $idEmpresa)
                ->where("idSucursal", $idSucursal)
                ->first();

        if ($result["folio"] == null) {

            $result["folio"] = 1;
        } else {

            $result["folio"] = $result["folio"] + 1;
        }

        return $result["folio"];
    }

    /*
     * Editar Cotizacion
     */

    public function editPago($uuid) {

        helper('auth');
        $userName = user()->username;
        $idUser = user()->id;

        $auth = service('authentication');
        if (!$auth->check()) {

            return redirect()->route('admin');
        }


        $auth = service('authentication');
        if (!$auth->check()) {

            return redirect()->route('admin');
        }

        helper('auth');
        $userName = user()->username;
        $idUser = user()->id;

        $titulos["empresas"] = $this->empresa->mdlEmpresasPorUsuario($idUser);

        if (count($titulos["empresas"]) == "0") {

            $empresasID[0] = "0";
        } else {

            $empresasID = array_column($titulos["empresas"], "id");
        }


        $pago = $this->pagos->mdlGetPagoUUID($uuid, $empresasID);

        $listPagos = json_decode($pago["listPagos"], true);

        $titulos["idPago"] = $pago["id"];
        $titulos["folio"] = $pago["folio"];
        $titulos["idCustumer"] = $pago["idCustumer"];
        $titulos["nameCustumer"] = $pago["nameCustumer"];
        $titulos["idEmpresa"] = $pago["idEmpresa"];
        $titulos["nombreEmpresa"] = $pago["nombreEmpresa"];

        $titulos["idUser"] = $idUser;
        $titulos["userName"] = $userName;
        $titulos["listPagos"] = $listPagos;

        $titulos["total"] = number_format($pago["total"], 2, ".");
        $titulos["fecha"] = $pago["date"];
        $titulos["dateVen"] = $pago["dateVen"];
        $titulos["quoteTo"] = $pago["quoteTo"];
        $titulos["observations"] = $pago["generalObservations"];
        $titulos["uuid"] = $pago["UUID"];
        $titulos["formaPago"] = $this->catalogosSAT->formasDePago40()->searchByField("texto", "%%", 99999);
        $titulos["usoCFDI"] = $this->catalogosSAT->usosCfdi40()->searchByField("texto", "%%", 99999);
        $titulos["metodoPago"] = $this->catalogosSAT->metodosDePago40()->searchByField("texto", "%%", 99999);
        $titulos["regimenFiscal"] = $this->catalogosSAT->regimenesFiscales40()->searchByField("texto", "%%", 99999);

        $titulos["RFCReceptor"] = $pago["RFCReceptor"];
        $titulos["regimenFiscalReceptor"] = $pago["regimenFiscalReceptor"];
        $titulos["usoCFDIReceptor"] = $pago["usoCFDI"];
        $titulos["metodoPagoReceptor"] = $pago["metodoPago"];
        $titulos["formaPagoReceptor"] = $pago["formaPago"];
        $titulos["razonSocialReceptor"] = $pago["razonSocialReceptor"];
        $titulos["codigoPostalReceptor"] = $pago["codigoPostalReceptor"];

        $titulos["idSucursal"] = $pago["idSucursal"];
        $sucursal = $this->sucursales->select("*")->where("id", $titulos["idSucursal"])->first();
        $titulos["nombreSucursal"] = $sucursal["key"] . " " . $sucursal["name"];

        $titulos["title"] = "Editar Complemento de Pago";
        $titulos["subtitle"] = "Edición de complemento de pago";

        return view('newPayment', $titulos);
    }

    /*
     * Save or Update
     */

    public function save() {

        $auth = service('authentication');

        if (!$auth->check()) {
            $this->session->set('redirect_url', current_url());
            return redirect()->route('admin');
        }

        helper('auth');
        $userName = user()->username;
        $idUser = user()->id;

        $datos = $this->request->getPost();

        $this->pagos->db->transBegin();

        $existsPago = $this->pagos->where("UUID", $datos["UUID"])->countAllResults();

        $listPagos = json_decode($datos["listPagos"], true);

        $datosSucursal = $this->sucursales->find($datos["idSucursal"]);

        //$datos["idArqueoCaja"] = 0;
        /*
          if ($datosSucursal["arqueoCaja"] == "on") {


          $datosArqueoCaja = $this->arqueoCaja->mdlObtenerIdArqueo($datos["idEmpresa"], $datos["idSucursal"], $datos["date"]);

          if (!isset($datosArqueoCaja["id"])) {


          $this->sells->db->transRollback();

          echo "No hay habilitado arqueo de caja";

          return;
          } else {


          $datos["idArqueoCaja"] = $datosArqueoCaja["id"];
          }
          }
         */
        /**
         * if is new sell
         */
        if ($existsPago == 0) {


            $ultimoFolio = $this->getLastCodeInterno($datos["idEmpresa"], $datos["idSucursal"]);

            $empresa = $this->empresa->find($datos["idEmpresa"]);

            $datos["folio"] = $ultimoFolio;

            try {


                if ($this->pagos->save($datos) === false) {

                    $errores = $this->pagos->errors();

                    $listErrors = "";

                    foreach ($errores as $field => $error) {

                        $listErrors .= $error . " ";
                    }

                    echo $listErrors;

                    return;
                }

                $idPaymentInserted = $this->pagos->getInsertID();

                // save datail

                foreach ($listPagos as $key => $value) {

                    if ($value["importeAPagar"] == 0) {

                        continue;
                    }

                    $pagosDetalle["idComplemento"] = $idPaymentInserted;
                    $pagosDetalle["idSell"] = $value["idSell"];
                    $pagosDetalle["importPayment"] = $value["importeAPagar"];
                    $pagosDetalle["importBack"] = "0.00";
                    $pagosDetalle["datePayment"] = $datos["date"];

                    if ($this->payments->save($pagosDetalle) === false) {

                        echo "error al insertar el pago $pagosDetalle[importPayment]";

                        $this->pagos->db->transRollback();
                        return;
                    }

                    $obtenerVenta = $this->sells->where("id", $value["idSell"])->first();

                    $datosVenta["balance"] = $obtenerVenta["balance"];

                    $datosVenta["balance"] = $datosVenta["balance"] - ($pagosDetalle["importPayment"] - $pagosDetalle["importBack"]);

                    if ($this->sells->update($value["idSell"], $datosVenta) === false) {

                        echo "error al insertar el saldo de la venta $value[idSell]";

                        $this->pagos->db->transRollback();
                        return;
                    }
                }

                $datosBitacora["description"] = "Se guardo el pago con los siguientes datos" . json_encode($pagosDetalle);
                $datosBitacora["user"] = $userName;

                $this->log->save($datosBitacora);

                $this->sellsDetail->db->transCommit();
                echo "Guardado Correctamente";
            } catch (\PHPUnit\Framework\Exception $ex) {


                echo "Error al guardar " . $ex->getMessage();
            }
        } else {




            $backPago = $this->pagos->where("UUID", $datos["UUID"])->first();
            $listPagosBack = json_decode($backPago["listPagos"], true);

            $datos["folio"] = $backPago["folio"];

            if ($this->pagos->update($backPago["id"], $datos) == false) {

                $errores = $this->pago->errors();
                $listError = "";
                foreach ($errores as $field => $error) {

                    $listError .= $error . " ";
                }

                echo $listError;

                return;
            } else {



                //DEJAMOS EL STOCK COMO ESTABA ANTES

                foreach ($listPagosBack as $key => $value) {

                    //BUSCAMOS STOCK DEL PRODUCTO
                    $sell = $this->sells->find($value["idSell"]);

                    if ($value["importeAPagar"] == 0) {

                        continue;
                    }

                    $balanceBack["balance"] = $sell["balance"] + $value["importeAPagar"];

                    if ($this->sells->update($sell["id"], $balanceBack) == false) {

                        $errores = $this->sells->errors();
                        $listError = "";
                        foreach ($errores as $field => $error) {

                            $listError .= $error . " ";
                        }

                        echo $listError;

                        return;
                    }
                }

                $this->payments->select("*")->where("idComplemento", $backPago["id"])->delete();
                $this->payments->purgeDeleted();

                foreach ($listPagos as $key => $value) {

                    $pagosDetalle["idComplemento"] = $backPago["id"];
                    $pagosDetalle["idSell"] = $value["idSell"];
                    $pagosDetalle["importPayment"] = $value["importeAPagar"];
                    $pagosDetalle["importBack"] = "0.00";
                    $pagosDetalle["datePayment"] = $datos["date"];

                    if ($this->payments->save($pagosDetalle) === false) {

                        echo "error al insertar el pago $pagosDetalle[idSell]";

                        $this->pagos->db->transRollback();
                        return;
                    }

                    $datosVenta = $this->sells->select("*")->where("id", $value["idSell"])->first();

                    $nuevoBalance["balance"] = $datosVenta["balance"] - ($value["importeAPagar"]);

                    if ($this->sells->update($value["idSell"], $nuevoBalance) === false) {

                        echo "error al actualizar el saldo de la venta $datos[idSell]";

                        $this->pagos->db->transRollback();
                        return;
                    }
                }


                $datosBitacora["description"] = "Se hizo el pago" . json_encode($datos) .
                        " Los datos anteriores son" . json_encode($backPago);
                $datosBitacora["user"] = $userName;
                $this->log->save($datosBitacora);

                echo "Actualizado Correctamente";
                $this->sells->db->transCommit();
                return;
            }
        }

        return;
    }

    public function delete($id) {
        helper('auth');
        $userName = user()->username;
        $idUser = user()->id;

        $auth = service('authentication');
        if (!$auth->check()) {

            return redirect()->route('admin');
        }


        $auth = service('authentication');
        if (!$auth->check()) {

            return redirect()->route('admin');
        }

        helper('auth');
        $userName = user()->username;
        $idUser = user()->id;

        $titulos["empresas"] = $this->empresa->mdlEmpresasPorUsuario($idUser);

        if (count($titulos["empresas"]) == "0") {

            $empresasID[0] = "0";
        } else {

            $empresasID = array_column($titulos["empresas"], "id");
        }



        /**
         * 
         */
        if ($this->pagos->select("*")->whereIn("idEmpresa", $empresasID)->where("id", $id)->countAllResults() == 0) {

            return $this->failNotFound('Acceso Prohibido');
        }

        $this->pagos->db->transBegin();

        $infoPago = $this->pagos->find($id);

        if (!$found = $this->pagos->delete($id)) {
            $this->pagos->db->transRollback();
            return $this->failNotFound('Error al eliminar');
        }

        //Borramos quotesdetails

        if ($this->payments->select("*")->where("idComplemento", $id)->delete() === false) {

            $this->pagos->db->transRollback();
            return $this->failNotFound('Error al eliminar el detalle');
        }

        $this->pagos->purgeDeleted();

        $listPagos = json_decode($infoPago["listPagos"], true);
        $this->sells->purgeDeleted();

        //Devolvemos el Stock

        foreach ($listPagos as $key => $value) {

            $sell = $this->sells->select("*")->where("id", $value["idSell"])->first();

            $nuevoSaldo["balance"] = $sell["balance"] + $value["importeAPagar"];

            if ($this->sells->update($sell["id"], $nuevoSaldo) === false) {

                $this->pagos->db->transRollback();
                return $this->failNotFound('Error al corregir saldo');
            }
        }


        $datosBitacora["description"] = 'Se elimino el pago' . json_encode($listPagos);

        $this->log->save($datosBitacora);

        $this->sells->db->transCommit();
        return $this->respondDeleted($found, 'Eliminado Correctamente');
    }

    /**
     * Reporte Consulta
     */
    public function report($uuid, $isMail = 0) {

        $pdf = new PDFLayout(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

        $dataSells = $this->sells->where("uuid", $uuid)->first();

        $listProducts = json_decode($dataSells["listProducts"], true);

        $user = $this->user->where("id", $dataSells["idUser"])->first()->toArray();

        $custumer = $this->custumer->where("id", $dataSells["idCustumer"])->where("deleted_at", null)->first();

        $datosEmpresa = $this->empresa->select("*")->where("id", $dataSells["idEmpresa"])->first();
        $datosEmpresaObj = $this->empresa->select("*")->where("id", $dataSells["idEmpresa"])->asObject()->first();

        $pdf->nombreDocumento = "Nota De Venta";
        $pdf->direccion = $datosEmpresaObj->direccion;

        if ($datosEmpresaObj->logo == NULL || $datosEmpresaObj->logo == "") {

            $pdf->logo = ROOTPATH . "public/images/logo/default.png";
        } else {

            $pdf->logo = ROOTPATH . "public/images/logo/" . $datosEmpresaObj->logo;
        }
        $pdf->folio = str_pad($dataSells["folio"], 5, "0", STR_PAD_LEFT);

        $folioConsulta = "Folio Consulta";
        $fecha = " Fecha: ";

        // set document information
        $pdf->nombreEmpresa = $datosEmpresa["nombre"];
        $pdf->direccion = $datosEmpresa["direccion"];
        $pdf->usuario = $user["firstname"] . " " . $user["lastname"];
        $pdf->SetCreator(PDF_CREATOR);
        $pdf->SetAuthor($user["username"]);
        $pdf->SetTitle('CI4JCPOS');
        $pdf->SetSubject('CI4JCPOS');
        $pdf->SetKeywords('CI4JCPOS, PDF, PHP, CodeIgniter, CESARSYSTEMS.COM.MX');

        // set default header data
        $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE, PDF_HEADER_STRING);

        // set header and footer fonts
        $pdf->setHeaderFont(array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
        $pdf->setFooterFont(array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));

        // set default monospaced font
        $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

        // set margins
        $pdf->SetMargins(PDF_MARGIN_LEFT, 35, PDF_MARGIN_RIGHT);
        $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
        $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

        // set auto page breaks
        $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

        // set image scale factor
        $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

        // ---------------------------------------------------------
        // add a page
        $pdf->AddPage();

        $pdf->SetY(45);
        //ETIQUETAS
        $cliente = "Cliente: ";
        $folioRegistro = " Folio: ";
        $fecha = " Fecha:";

        $pdf->SetY(45);
        //ETIQUETAS
        $cliente = "Cliente: ";
        $folioRegistro = " Folio: ";
        $fecha = " Fecha:";

        // set font
        //$pdf->SetFont('times', '', 12);

        if ($datosEmpresa["facturacionRD"] == "on" && $dataSells["folioComprobanteRD"] > 0) {


            $comprobante = $this->comprobantesRD->find($dataSells["tipoComprobanteRD"]);
            if ($comprobante["tipoDocumento"] == "COF") {
                $tipoDocumento = "FACTURA PARA CONSUMIDOR FINAL";
            }

            if ($comprobante["tipoDocumento"] == "CF") {
                $tipoDocumento = "FACTURA PARA CREDITO FISCAL";
            }

            $comprobanteFactura = $comprobante["prefijo"] . str_pad($dataSells["folioComprobanteRD"], 10, "0", STR_PAD_LEFT);
            $fechaVencimiento = "AUTORIZADO POR DGII :" . $comprobante["hastaFecha"];
        } else {

            $tipoDocumento = "";
            $comprobanteFactura = "";
            $fechaVencimiento = "";
        }

        $bloque2 = <<<EOF

    
        <table style="font-size:10px; padding:0px 10px;">
    
             <tr>
               <td style="width: 50%; background-color:#2c3e50; padding: 4px 4px 4px; font-weight:bold;  color:white;">ATENCION A
               </td>
               <td style="width: 50%; background-color:#2c3e50; padding: 4px 4px 4px; font-weight:bold;  color:white;">OBSERVACIONES
               </td>
            </tr>
            <tr>
    
                <td >
    
    
                Cliente: $custumer[firstname] $custumer[lastname] 
    
                    <br>
                    Telefono: 000
                    <br>
                    E-Mail: $custumer[email]
                    <br>
                </td>
                <td >
                    $dataSells[generalObservations]
                    $tipoDocumento  <br>
                    $comprobanteFactura  <br>
                    $fechaVencimiento <br>
                </td>
    
    
            </tr>
    
            <tr>
    
                <td style="width: 25%; background-color:#2c3e50; padding: 4px 4px 4px; font-weight:bold;  color:white;">VENDEDOR
                </td>
    
                <td style="width: 24%; background-color:#2c3e50; padding: 4px 4px 4px; font-weight:bold;  color:white;">FECHA
                </td>
                <td style="width: 30%; background-color:#2c3e50; padding: 4px 4px 4px; font-weight:bold;  color:white;">FECHA DE VENCIMIENTO
                </td>
    
    
                <td style="width: 21%; background-color:#2c3e50; padding: 4px 4px 4px; font-weight:bold;  color:white;">VIGENCIA
                </td>
    
            </tr>
            <tr>
                    <td>
                        $user[firstname] $user[lastname]
                    </td>
                    <td>
                    $dataSells[date]
                    </td>
                    <td>
                    $dataSells[dateVen]
                    </td>
                    <td>
                    $dataSells[delivaryTime]
                    </td>
            </tr>
            <tr>
                <td style="border-bottom: 1px solid #666; background-color:white; width:640px"></td>
            </tr>
        </table>
    EOF;

        $pdf->writeHTML($bloque2, false, false, false, false, '');

        $bloque3 = <<<EOF

        <table style="font-size:10px; padding:5px 10px;">
    
            <tr>
    
            <td style="width: 100px; background-color:#2c3e50; padding: 4px 4px 4px; font-weight:bold;  color:white; text-align:center">Código</td>
            <td style="width: 200px; background-color:#2c3e50; padding: 4px 4px 4px; font-weight:bold;  color:white; text-align:center">Descripción</td>
                     <td style="width: 60px; background-color:#2c3e50; padding: 4px 4px 4px; font-weight:bold;  color:white; text-align:center">Cant</td>
    
            <td style="width: 80px; background-color:#2c3e50; padding: 4px 4px 4px; font-weight:bold;  color:white; text-align:center">Precio</td>
            <td style="width: 100px; background-color:#2c3e50; padding: 4px 4px 4px; font-weight:bold;  color:white; text-align:center">SubTotal</td>
            <td style="width: 100px; background-color:#2c3e50; padding: 4px 4px 4px; font-weight:bold;  color:white; text-align:center">Total</td>
    
            </tr>
    
        </table>
    
    EOF;

        $pdf->writeHTML($bloque3, false, false, false, false, '');

        $contador = 0;
        foreach ($listProducts as $key => $value) {



            if ($contador % 2 == 0) {
                $clase = 'style=" background-color:#ecf0f1; padding: 3px 4px 3px; ';
            } else {
                $clase = 'style="background-color:white; padding: 3px 4px 3px; ';
            }

            $precio = number_format($value["price"], 2, ".");
            $subTotal = number_format($value["total"], 2, ".");
            $total = number_format($value["neto"], 2, ".");
            $bloque4 = <<<EOF
    
        <table style="font-size:10px; padding:5px 10px;">
    
            <tr>
    
                <td  $clase width:100px; text-align:center">
                    $value[codeProduct]
                </td>
    
    
                <td  $clase width:200px; text-align:center">
                    $value[description]
                </td>
    
                <td $clase width:60px; text-align:center">
                    $value[cant]
                </td>
    
                <td $clase width:80px; text-align:right">
                    $precio
                </td>
    
                <td $clase width:100px; text-align:center">
                $subTotal
            </td>
    
                <td $clase width:100px; text-align:right">
                $total
                </td>
    
               
    
    
            </tr>
    
        </table>
    
    
    EOF;
            $contador++;
            $pdf->writeHTML($bloque4, false, false, false, false, '');
        }




        /**
         * TOTALES
         */
        $pdf->Setx(43);
        $subTotal = number_format($dataSells["subTotal"], 2, ".");
        $impuestos = number_format($dataSells["taxes"], 2, ".");
        $total = number_format($dataSells["total"], 2, ".");
        $IVARetenido = number_format($dataSells["IVARetenido"], 2, ".");
        $ISRRetenido = number_format($dataSells["ISRRetenido"], 2, ".");

        if ($IVARetenido > 0) {

            $bloqueIVARetenido = <<<EOF
                    <tr>
            
                    <td style="border-right: 0px solid #666; color:#333; background-color:white; width:340px; text-align:right"></td>
    
                    <td style="border: 0px solid #666; background-color:white; width:100px; text-align:right">
                    IVA Retenido:
                    </td>
    
                    <td style="border: 0px solid #666; color:#333; background-color:white; width:100px; text-align:right">
                        $IVARetenido
                    </td>
    
                </tr>
    
            EOF;
        } else {

            $bloqueIVARetenido = "";
        }


        if ($ISRRetenido > 0) {

            $bloqueISRRetenido = <<<EOF
                    <tr>
            
                    <td style="border-right: 0px solid #666; color:#333; background-color:white; width:340px; text-align:right"></td>
    
                    <td style="border: 0px solid #666; background-color:white; width:100px; text-align:right">
                    ISR Retenido:
                    </td>
    
                    <td style="border: 0px solid #666; color:#333; background-color:white; width:100px; text-align:right">
                        $ISRRetenido
                    </td>
    
                </tr>
    
            EOF;
        } else {

            $bloqueISRRetenido = "";
        }





        $bloque5 = <<<EOF

      <table style="font-size:10px; padding:5px 10px;">
  
          <tr>
  
              <td style="color:#333; background-color:white; width:340px; text-align:right"></td>
  
              <td style="border-bottom: 0px solid #666; background-color:white; width:100px; text-align:right"></td>
  
              <td style="border-bottom: 0px solid #666; color:#333; background-color:white; width:100px; text-align:right"></td>
  
          </tr>
  
          <tr>
  
              <td style="border-right: 0px solid #666; color:#333; background-color:white; width:340px; text-align:right"></td>
  
              <td style="border: 0px solid #666;  background-color:white; width:100px; text-align:right">
              Subtotal:
              </td>
  
              <td style="border: 0px solid #666; color:#333; background-color:white; width:100px; text-align:right">
                   $subTotal
              </td>
  
          </tr>
  
          <tr>
  
              <td style="border-right: 0px solid #666; color:#333; background-color:white; width:340px; text-align:right"></td>
  
              <td style="border: 0px solid #666; background-color:white; width:100px; text-align:right">
               IVA:
              </td>
  
              <td style="border: 0px solid #666; color:#333; background-color:white; width:100px; text-align:right">
                   $impuestos
              </td>
  
          </tr>
  
  
          $bloqueIVARetenido
          $bloqueISRRetenido
  
  
          <tr>
  
              <td style="border-right: 0px solid #666; color:#333; background-color:white; width:340px; text-align:right"></td>
  
              <td style="border: 0px solid #666; background-color:white; width:100px; text-align:right">
                  Total:
              </td>
  
              <td style="border: 0px solid #666; color:#333; background-color:white; width:100px; text-align:right">
                  $ $total
              </td>
  
          </tr>
  
  
      </table>
      <br>
      <div style="font-size:11pt;text-align:center;font-weight:bold">Gracias por su compra!</div>
  <br><br>
                  
          <div style="font-size:8.5pt;text-align:left;font-weight:ligth">UUID DOCUMENTO: $dataSells[UUID]</div>
          
     
      <div style="font-size:8.5pt;text-align:left;font-weight:ligth">ES RESPONSABILIDAD DEL CLIENTE REVISAR A DETALLE ESTA COTIZACION PARA SU POSTERIOR SURTIDO, UNA VEZ CONFIRMADA, NO HAY CAMBIOS NI DEVOLUCIONES.</div>
  
      
  
  
  EOF;

        $pdf->writeHTML($bloque5, false, false, false, false, 'R');

        if ($isMail == 0) {
            ob_end_clean();
            $this->response->setHeader("Content-Type", "application/pdf");
            $pdf->Output('notaVenta.pdf', 'I');
        } else {

            $attachment = $pdf->Output('notaVenta.pdf', 'S');

            return $attachment;
        }


        //============================================================+
        // END OF FILE
        //============================================================+
    }

    public function obtenerFacturasPendientes() {

        $datos = $this->request->getPost();

        $empresa = $datos["idEmpresa"];
        $sucursal = $datos["idSucursal"];
        $cliente = $datos["idCustumers"];

        $listaFacturas = $this->pagos->mdlObtenerVentasFacturadasPendientesDePago($empresa, $sucursal, $cliente);
        $facturas = "";

        foreach ($listaFacturas as $key => $value) {

            $facturas .= <<<EOF
                <div class="form-group row nuevoProduct\">
                <div class ="col-1"> <button type="button" class="btn btn-danger quitProduct" ><span class="far fa-trash-alt"></span></button>
                <button type="button"  data-toggle="modal" data-target="#modelMoreInfoRow" class="btn btn-primary  btnInfo" ><span class="fa fa-fw fa-pencil-alt"></span></button> </div>
                <div class ="col-1"> <input disabled type="text" id="serie" class="form-control serie"  name="serie" value="$value[serie]" required=""> 
                <input disabled type="hidden" id="idSell" class="form-control idSell"  name="idSell" value="$value[id]" required="">    </div>
                <div class ="col-5"> <input disabled type="text" id="folio" class="form-control folio"  name="folio" value="$value[folio]" required=""> </div>
                <div class ="col-1"> <input disabled type="text" id="fecha" class="form-control fecha" name="fecha" value="$value[date]" =""></div>
                <div class ="col-1"> <input disabled type="text" id="price" class="form-control fechaVen" name="fechaVen" value="$value[dateVen]" required="">  </div>
                <div class ="col-1"> <input disabled type="text" id="total" class="form-control total" name="total" value="$value[total]" required=""> </div>
                <div class ="col-1"> <input disabled type="text" id="saldo" class="form-control saldo" name="total" value="$value[balance]" required=""> </div>        
                <div class ="col-1"> <input  type="number" id="importeAPagar" class="form-control importeAPagar" name="importeAPagar" value="0.00" required=""> </div></div>
            EOF;
        }

        echo $facturas;
    }

}

Creamos la vista para generar un nuevo complemento de pago en App/Views/newPayment.php con el siguiente código

<?= $this->include('load/toggle') ?>
<?= $this->include('julio101290\boilerplate\Views\load\select2') ?>
<?= $this->include('julio101290\boilerplate\Views\load\datatables') ?>
<?= $this->include('julio101290\boilerplate\Views\load\nestable') ?>
<!-- Extend from layout index -->
<?= $this->extend('julio101290\boilerplate\Views\layout\index') ?>

<!-- Section content -->
<?= $this->section('content') ?>

<?= $this->include('modulesPayment/dataHeadPayment') ?>
<?= $this->include('modulesPayment/moreInfoRow') ?>
<?= $this->include('modulesChoferes/modalCaptureChoferes') ?>
<?= $this->include('modulesVehiculos/modalCaptureVehiculos') ?>

<?= $this->endSection() ?>

Creamos el archivo de la vista en App/Views/modulesPayment/dataHeadPayment.php para en el encabezado del complemento de pago

<div class="row">

    <div class="col-12">

        <div class="card card-primary">
            <div class="card-header">
                <h3 class="card-title">Encabezado</h3>

                <div class="card-tools">
                    <button type="button" class="btn btn-tool" data-card-widget="collapse">
                        <i class="fas fa-minus"></i>
                    </button>

                </div>
            </div>



            <div class="card-body">


                <ul class="nav nav-tabs" id="myTab" role="tablist">
                    <li class="nav-item" role="presentation">
                        <button class="nav-link active" id="generales-tab" data-toggle="tab" data-target="#generales" type="button" role="tab" aria-controls="generales" aria-selected="true">Generales</button>
                    </li>
                    <li class="nav-item" role="presentation">
                        <button class="nav-link" id="profile-tab" data-toggle="tab" data-target="#otrosDatos" type="button" role="tab" aria-controls="otrosDatos" aria-selected="false">Otros
                            Datos</button>
                    </li>


                    <li class="nav-item" role="presentation">
                        <button class="nav-link" id="profile-tab" data-toggle="tab" data-target="#facturacionMX" type="button" role="tab" aria-controls="facturacionMX" aria-selected="false">
                            Facturación MX
                        </button>
                    </li>

                </ul>

                <div class="tab-content" id="myTabContent">
                    <div class="tab-pane fade show active" id="generales" role="tabpanel" aria-labelledby="generales">

                        <?= $this->include('modulesPayment/generalPayment') ?>

                    </div>

                    <div class="tab-pane fade" id="otrosDatos" role="tabpanel" aria-labelledby="otrosDatos">

                        <?= $this->include('modulesPayment/otrosDatos') ?>

                    </div>



                    <div class="tab-pane fade" id="facturacionMX" role="tabpanel" aria-labelledby="otrosDatos">

                        <?= $this->include('modulesPayment/facturacionMX') ?>

                    </div>




                </div>


            </div>

        </div>

    </div>

    <div class="row">
        <div class="col-12">
            <div class="card card-default">
                <div class="card-header">
                    <h3 class="card-title">Detalle de la venta</h3>
                    <div class="card-tools">
                        <button type="button" class="btn btn-tool" data-card-widget="collapse">
                            <i class="fas fa-minus"></i>
                        </button>

                    </div>
                </div>

                <div class="card-body">
                    <div class="row">


                        <div class="col-md-12">

                            <div class="box-body">

                                <div class="box" style="overflow-y: scroll; height:250px;">




                                    <div class="row">

                                        <!--=====================================
                                    ENCABEZADO
                                    ======================================-->
                                        <div class="col-1">#</div>
                                        <div class="col-1">Serie </div>
                                        <div class="col-5">Folio </div>
                                        <div class="col-1">Fecha </div>
                                        <div class="col-1">Vencimiento </div>
                                        <div class="col-1">Total </div>
                                        <div class="col-1">Saldo </div>
                                        <div class="col-1">Importe a Pagar </div>


                                    </div>
                                    <hr class="hr" />
                                    <!--=====================================
                                ENTRADA PARA AGREGAR PRODUCTO
                                ======================================-->
                                    <div class="rowProducts">

                                        <?php
                                        if (isset($listPagos)) {

                                            $list = "";
                                            foreach ($listPagos as $key => $value) {



                                                $list .= <<<EOF
                                                    
                                                 <div class="form-group row nuevoProduct\">
                                                <div class ="col-1"> <button type="button" class="btn btn-danger quitProduct" ><span class="far fa-trash-alt"></span></button>
                                                <button type="button"  data-toggle="modal" data-target="#modelMoreInfoRow" class="btn btn-primary  btnInfo" ><span class="fa fa-fw fa-pencil-alt"></span></button> </div>
                                                <div class ="col-1"> <input disabled type="text" id="serie" class="form-control serie"  name="serie" value="$value[serie]" required=""> 
                                                <input disabled type="hidden" id="idSell" class="form-control idSell"  name="idSell" value="$value[idSell]" required="">    </div>
                                                <div class ="col-5"> <input disabled type="text" id="folio" class="form-control folio"  name="folio" value="$value[folio]" required=""> </div>
                                                <div class ="col-1"> <input disabled type="text" id="fecha" class="form-control fecha" name="fecha" value="$value[fecha]" =""></div>
                                                <div class ="col-1"> <input disabled type="text" id="price" class="form-control fechaVen" name="fechaVen" value="$value[fechaVen]" required="">  </div>
                                                <div class ="col-1"> <input disabled type="text" id="total" class="form-control total" name="total" value="$value[total]" required=""> </div>
                                                <div class ="col-1"> <input disabled type="text" id="saldo" class="form-control saldo" name="total" value="$value[saldo]" required=""> </div>        
                                                <div class ="col-1"> <input  type="number" id="importeAPagar" class="form-control importeAPagar" name="importeAPagar" value="$value[importeAPagar]" required=""> </div></div>
                                                    
                                                    
                                            EOF;
                                            }

                                            echo $list;
                                        }
                                        ?>

                                    </div>

                                    <input type="hidden" id="listProducts" name="listProducts" value="[]">
                                    <!--=====================================
                                BOTÓN PARA AGREGAR PRODUCTO
                                ======================================-->


                                    <hr>
                                </div>
                            </div>



                            <div class="box-footer" style="
                                 text-align: right;
                                 ">
                                <div class="row form-group" hidden>

                                    <div class="col-7">

                                    </div>
                                    <div class="col-3" style="
                                         vertical-align: middle;
                                         ">
                                        <label style="vertical-align: sub;margin-bottom: 0px;">Sub Total:</label>
                                    </div>

                                    <div class="col-2">
                                        <input readonly="" type="text" id="subTotal" class="form-control subTotal" name="subTotal" value="" style="
                                               text-align: right;
                                               ">
                                    </div>


                                </div>


                                <div class="row form-group" hidden>

                                    <div class="col-7">

                                    </div>
                                    <div class="col-3" style="
                                         vertical-align: middle;
                                         ">
                                        <label style="
                                               vertical-align: sub;
                                               ">Impuesto:</label>
                                    </div>

                                    <div class="col-2">
                                        <input readonly="" type="text" id="totalImpuesto" class="form-control totalImpuesto" name="totalImpuesto" value="" style="
                                               text-align: right;
                                               ">
                                    </div>


                                </div>


                                <div class="row form-group grupoTotalRetencionIVA" hidden>

                                    <div class="col-7">

                                    </div>
                                    <div class="col-3" style="
                                         vertical-align: middle;
                                         ">
                                        <label style="
                                               vertical-align: sub;
                                               ">Retencion IVA:</label>
                                    </div>

                                    <div class="col-2">
                                        <input readonly="" type="text" id="totalRetencionIVA" class="form-control totalRetencionIVA" name="totalRetencionIVA" value="" style="
                                               text-align: right;
                                               ">
                                    </div>


                                </div>


                                <div class="row form-group grupoTotalRetencionISR" hidden>

                                    <div class="col-7">

                                    </div>
                                    <div class="col-3" style="
                                         vertical-align: middle;
                                         ">
                                        <label style="
                                               vertical-align: sub;
                                               ">Retencion ISR:</label>
                                    </div>

                                    <div class="col-2">
                                        <input readonly="" type="text" id="totalRetencionISR" class="form-control totalRetencionISR" name="totalRetencionISR" value="" style="
                                               text-align: right;
                                               ">
                                    </div>


                                </div>

                                <div class="row form-group">

                                    <div class="col-7">

                                    </div>
                                    <div class="col-3" style="
                                         vertical-align: middle;
                                         ">
                                        <label style="
                                               vertical-align: sub;
                                               ">Total:</label>
                                    </div>

                                    <div class="col-2">
                                        <input readonly="" type="text" id="granTotal" class="form-control granTotal" name="granTotal" value="<?= $total ?>" style="
                                               text-align: right;
                                               ">
                                    </div>


                                </div>


                                <button type="button" class="btn btn-primary pull-right btnSavePayment" data-toggle="modal">
                                    <i class="fa far fa-save"> </i>Guardar</button>

                                <button type="button" class="btn bg-maroon btnPrint" data-toggle="modal" required="" data-placement="top" title="Imprimir">
                                    <i class="fa fa-print"> </i> Guardar, Imprimir y cerrar
                                </button>

                                <button type="button" class="btn bg-maroon btnTimbrar" data-toggle="modal" required="" data-placement="top" title="Timbrar">
                                    <i class="fas fa-qrcode"> </i> Timbrar
                                </button>

                            </div>

                        </div>

                    </div>

                </div>

            </div>
        </div>
    </div>





    <?= $this->section('js') ?>


    <script>
        $("#metodoPagoVenta").select2();
        $("#usoCFDIVenta").select2();
        $("#formaPagoVenta").select2();
        $("#regimenFiscalReceptor").select2();





        /**
         * Obtiene el ultimo folio por almacen
         */

        $("#custumerPago").on("change", function () {


            var idEmpresa = $(this).val();
            var idSucursal = $("#idSucursal").val();

            var datos = new FormData();
            datos.append("idEmpresa", idEmpresa);

            // TRAE ULTIMO FOLIO
            $.ajax({

                url: "<?= base_url('admin/pagos/getLastCode') ?>",
                method: "POST",
                data: datos,
                cache: false,
                contentType: false,
                processData: false,
                dataType: "json",
                success: function (respuesta) {

                    console.log(respuesta);

                    $("#codeSell").val(respuesta["folio"]);


                }

            });



            //TRAE DATOS EMPRESA

            $.ajax({

                url: "<?= base_url('admin/empresas/obtenerEmpresa') ?>",
                method: "POST",
                data: datos,
                cache: false,
                contentType: false,
                processData: false,
                dataType: "json",
                success: function (respuesta) {

                    console.log(respuesta);
                    if (respuesta["facturacionRD"] == "on") {

                        $(".comprobantesRD").removeAttr("hidden");

                    } else {

                        $(".comprobantesRD").attr("hidden", true);

                    }





                }

            });



        });


        $("#idSucursal").on("change", function () {


            var idEmpresa = $("#idEmpresaSells").val();
            var idSucursal = $(this).val();

            console.log("idSucursal", idSucursal);

            var datos = new FormData();
            datos.append("idEmpresa", idEmpresa);
            datos.append("idSucursal", idSucursal);

            // TRAE ULTIMO FOLIO
            $.ajax({

                url: "<?= base_url('admin/pagos/getLastCode') ?>",
                method: "POST",
                data: datos,
                cache: false,
                contentType: false,
                processData: false,
                dataType: "json",
                success: function (respuesta) {

                    console.log(respuesta);

                    $("#codeSell").val(respuesta["folio"]);


                }

            });

        });


        $(document).on('click', '#btnSaveChoferes', function (e) {


            var idChoferes = $("#idChoferes").val();
            var idEmpresa = $("#idEmpresaChoferes").val();
            var nombre = $("#nombre").val();
            var Apellido = $("#Apellido").val();


            if (idEmpresa == 0 || idEmpresa == null) {

                Toast.fire({
                    icon: 'error',
                    title: "Tiene que seleccionar la empresa"
                });
                return;
            }

            $("#btnSaveChoferes").attr("disabled", true);

            var datos = new FormData();
            datos.append("idChoferes", idChoferes);
            datos.append("idEmpresa", idEmpresa);
            datos.append("nombre", nombre);
            datos.append("Apellido", Apellido);


            $.ajax({

                url: "<?= base_url('admin/choferes/save') ?>",
                method: "POST",
                data: datos,
                cache: false,
                contentType: false,
                processData: false,
                success: function (respuesta) {
                    if (respuesta.match(/Correctamente.*/)) {

                        Toast.fire({
                            icon: 'success',
                            title: "Guardado Correctamente"
                        });

                        tableChoferes.ajax.reload();
                        $("#btnSaveChoferes").removeAttr("disabled");


                        $('#modalAddChoferes').modal('hide');
                    } else {

                        Toast.fire({
                            icon: 'error',
                            title: respuesta
                        });

                        $("#btnSaveChoferes").removeAttr("disabled");


                    }

                }

            }

            )

        });

        /**
         * Obtiene el ultimo folio por almacen
         */

        $("#idEmpresaSells").on("change", function () {


            var idEmpresa = $(this).val();
            var idSucursal = $("#idSucursal").val();

            var datos = new FormData();
            datos.append("idEmpresa", idEmpresa);
            datos.append("idSucursal", idSucursal);

            // TRAE ULTIMO FOLIO
            $.ajax({

                url: "<?= base_url('admin/pagos/getLastCode') ?>",
                method: "POST",
                data: datos,
                cache: false,
                contentType: false,
                processData: false,
                dataType: "json",
                success: function (respuesta) {

                    console.log(respuesta);

                    $("#codeSell").val(respuesta["folio"]);


                }

            });



            $("#idSucursal").select2({
                ajax: {
                    url: "<?= site_url('admin/sucursales/getSucursalesAjax') ?>",
                    type: "post",
                    dataType: 'json',
                    delay: 250,
                    data: function (params) {
                        // CSRF Hash
                        var csrfName = $('.txt_csrfname').attr('name'); // CSRF Token name
                        var csrfHash = $('.txt_csrfname').val(); // CSRF hash
                        var idEmpresa = $('.idEmpresaSells').val(); // CSRF hash

                        return {
                            searchTerm: params.term, // search term
                            [csrfName]: csrfHash, // CSRF Token
                            idEmpresa: idEmpresa // search term
                        };
                    },
                    processResults: function (response) {

                        // Update CSRF Token
                        $('.txt_csrfname').val(response.token);
                        return {
                            results: response.data
                        };
                    },
                    cache: true
                }
            });




            //TRAE DATOS EMPRESA

            $.ajax({

                url: "<?= base_url('admin/empresas/obtenerEmpresa') ?>",
                method: "POST",
                data: datos,
                cache: false,
                contentType: false,
                processData: false,
                dataType: "json",
                success: function (respuesta) {

                    console.log(respuesta);
                    if (respuesta["facturacionRD"] == "on") {

                        $(".comprobantesRD").removeAttr("hidden");

                    } else {

                        $(".comprobantesRD").attr("hidden", true);

                    }





                }

            });



        });



        /**
         * Obtiene el ultimo folio por almacen
         */

        $("#tipoComprobanteRD").on("change", function () {


            var idComprobantes_rd = $(this).val();

            var datos = new FormData();
            datos.append("idComprobantes_rd", idComprobantes_rd);

            // TRAE ULTIMO FOLIO
            $.ajax({

                url: "<?= base_url('admin/comprobantes_rd/getComprobantes_rd') ?>",
                method: "POST",
                data: datos,
                cache: false,
                contentType: false,
                processData: false,
                dataType: "json",
                success: function (respuesta) {

                    console.log(respuesta);

                    $("#folioComprobanteRD").val(respuesta["folioActual"]);

                }

            });

        });


        $("#idEmpresaSells").select2();

        // Initialize select2 storages
        $("#custumerPago").select2({
            ajax: {
                url: "<?= site_url('admin/custumers/getCustumersAjax') ?>",
                type: "post",
                dataType: 'json',
                delay: 250,
                data: function (params) {
                    // CSRF Hash
                    var csrfName = $('.txt_csrfname').attr('name'); // CSRF Token name
                    var csrfHash = $('.txt_csrfname').val(); // CSRF hash
                    var idEmpresa = $('.idEmpresaSells').val(); // CSRF hash

                    return {
                        searchTerm: params.term, // search term
                        [csrfName]: csrfHash, // CSRF Token
                        idEmpresa: idEmpresa // search term
                    };
                },
                processResults: function (response) {

                    // Update CSRF Token
                    $('.txt_csrfname').val(response.token);

                    return {
                        results: response.data
                    };
                },
                cache: true
            }
        });



        // Initialize select2 storages
        $("#idSucursal").select2({
            ajax: {
                url: "<?= site_url('admin/sucursales/getSucursalAjax') ?>",
                type: "post",
                dataType: 'json',
                delay: 250,
                data: function (params) {
                    // CSRF Hash
                    var csrfName = $('.txt_csrfname').attr('name'); // CSRF Token name
                    var csrfHash = $('.txt_csrfname').val(); // CSRF hash
                    var idEmpresa = $('.idEmpresaSells').val(); // CSRF hash

                    return {
                        searchTerm: params.term, // search term
                        [csrfName]: csrfHash, // CSRF Token
                        idEmpresa: idEmpresa // search term
                    };
                },
                processResults: function (response) {

                    // Update CSRF Token
                    $('.txt_csrfname').val(response.token);

                    return {
                        results: response.data
                    };
                },
                cache: true
            }
        });




        /**
         * Get data Custumer on change
         */

        $("#custumerPago").on("change", function () {


            var idCustumer = $(this).val();

            var datos = new FormData();
            datos.append("idCustumers", idCustumer);

            // Trae los datos del cliente
            $.ajax({

                url: "<?= base_url('admin/custumers/getCustumers') ?>",
                method: "POST",
                data: datos,
                cache: false,
                contentType: false,
                processData: false,
                dataType: "json",
                success: function (respuesta) {


                    console.log(respuesta);

                    $("#RFCReceptor").val(respuesta["taxID"]);
                    $("#razonSocialReceptor").val(respuesta["razonSocial"]);
                    $("#codigoPostalReceptor").val(respuesta["codigoPostal"]);
                    $("#usoCFDIVenta").val(respuesta["usoCFDI"]);
                    $("#usoCFDIVenta").trigger("change");
                    $("#metodoPagoVenta").val(respuesta["metodoPago"]);
                    $("#metodoPagoVenta").trigger("change");
                    $("#formaPagoVenta").val(respuesta["formaPago"]);
                    $("#formaPagoVenta").trigger("change");
                    $("#regimenFiscalReceptor").val(respuesta["regimenFiscal"]);
                    $("#regimenFiscalReceptor").trigger("change");


                }

            });




            var idCustumer = $(this).val();
            var idEmpresa = $("#idEmpresaSells").val();
            var idSucursal = $("#idSucursal").val();

            var datos = new FormData();
            datos.append("idCustumers", idCustumer);
            datos.append("idEmpresa", idEmpresa);
            datos.append("idSucursal", idSucursal);

            // Traemos las facturas pendientes de pago
            $.ajax({

                url: "<?= base_url('admin/sells/obtenerVentasPendientes') ?>",
                method: "POST",
                data: datos,
                cache: false,
                contentType: false,
                processData: false,

                success: function (respuesta) {

                    $(".rowProducts").html(respuesta);


                }

            });

        });





        $("#idEmpresaVehiculos").select2();

        // Initialize select2 storages
        $("#idChoferSell").select2({
            ajax: {
                url: "<?= site_url('admin/choferes/getChoferesAjax') ?>",
                type: "post",
                dataType: 'json',
                delay: 250,
                data: function (params) {
                    // CSRF Hash
                    var csrfName = $('.txt_csrfname').attr('name'); // CSRF Token name
                    var csrfHash = $('.txt_csrfname').val(); // CSRF hash
                    var idEmpresa = $('.idEmpresaSells').val(); // CSRF hash

                    return {
                        searchTerm: params.term, // search term
                        [csrfName]: csrfHash, // CSRF Token
                        idEmpresa: idEmpresa // search term
                    };
                },
                processResults: function (response) {

                    // Update CSRF Token
                    $('.txt_csrfname').val(response.token);

                    return {
                        results: response.data
                    };
                },
                cache: true
            }
        });


        $("#idTipoVehiculo").select2({
            ajax: {
                url: "<?= site_url('admin/vehiculos/getTipoVehiculoAjax') ?>",
                type: "post",
                dataType: 'json',
                delay: 250,
                data: function (params) {
                    // CSRF Hash
                    var csrfName = $('.txt_csrfname').attr('name'); // CSRF Token name
                    var csrfHash = $('.txt_csrfname').val(); // CSRF hash
                    var idEmpresa = $('.idEmpresaVehiculos').val(); // CSRF hash

                    return {
                        searchTerm: params.term, // search term
                        [csrfName]: csrfHash, // CSRF Token
                        idEmpresa: idEmpresa // search term
                    };
                },
                processResults: function (response) {

                    // Update CSRF Token
                    $('.txt_csrfname').val(response.token);
                    return {
                        results: response.data
                    };
                },
                cache: true
            }
        });



        // Initialize select2 storages
        $("#idVehiculoSell").select2({
            ajax: {
                url: "<?= site_url('admin/vehiculos/getVehiculossAjax') ?>",
                type: "post",
                dataType: 'json',
                delay: 250,
                data: function (params) {
                    // CSRF Hash
                    var csrfName = $('.txt_csrfname').attr('name'); // CSRF Token name
                    var csrfHash = $('.txt_csrfname').val(); // CSRF hash
                    var idEmpresa = $('.idEmpresaSells').val(); // CSRF hash

                    return {
                        searchTerm: params.term, // search term
                        [csrfName]: csrfHash, // CSRF Token
                        idEmpresa: idEmpresa // search term
                    };
                },
                processResults: function (response) {

                    // Update CSRF Token
                    $('.txt_csrfname').val(response.token);

                    return {
                        results: response.data
                    };
                },
                cache: true
            }
        });



        /**
         * Get data Custumer on change
         */

        $("#idVehiculoSell").on("change", function () {


            var idVehiculo = $(this).val();

            var datos = new FormData();
            datos.append("idVehiculos", idVehiculo);

            // TRAE ULTIMO FOLIO
            $.ajax({

                url: "<?= base_url('admin/vehiculos/getVehiculos') ?>",
                method: "POST",
                data: datos,
                cache: false,
                contentType: false,
                processData: false,
                dataType: "json",
                success: function (respuesta) {


                    console.log(respuesta);

                    $("#tipoVehiculo").val(respuesta["descripcionTipo"]);



                }

            });

        });






        $(document).on('click', '#btnSaveVehiculos', function (e) {


            var idVehiculos = $("#idVehiculos").val();
            var idEmpresa = $("#idEmpresaVehiculos").val();
            var idTipoVehiculo = $("#idTipoVehiculo").val();
            var descripcion = $("#descripcion").val();
            var placas = $("#placas").val();



            if (idEmpresa == 0 || idEmpresa == null) {

                Toast.fire({
                    icon: 'error',
                    title: "Tiene que seleccionar la empresa"
                });
                return;
            }

            if (idTipoVehiculo == 0 || idTipoVehiculo == null) {

                Toast.fire({
                    icon: 'error',
                    title: "Tiene que seleccionar el tipo de vehiculo"
                });
                return;
            }



            $("#btnSaveVehiculos").attr("disabled", true);

            var datos = new FormData();
            datos.append("idVehiculos", idVehiculos);
            datos.append("idEmpresa", idEmpresa);
            datos.append("idTipoVehiculo", idTipoVehiculo);
            datos.append("descripcion", descripcion);
            datos.append("placas", placas);


            $.ajax({

                url: "<?= base_url('admin/vehiculos/save') ?>",
                method: "POST",
                data: datos,
                cache: false,
                contentType: false,
                processData: false,
                success: function (respuesta) {
                    if (respuesta.match(/Correctamente.*/)) {

                        Toast.fire({
                            icon: 'success',
                            title: "Guardado Correctamente"
                        });

                        tableVehiculos.ajax.reload();
                        $("#btnSaveVehiculos").removeAttr("disabled");


                        $('#modalAddVehiculos').modal('hide');
                    } else {

                        Toast.fire({
                            icon: 'error',
                            title: respuesta
                        });

                        $("#btnSaveVehiculos").removeAttr("disabled");


                    }

                }

            }

            )

        });

        // Initialize select2 storages
        $("#tipoComprobanteRD").select2({
            ajax: {
                url: "<?= site_url('admin/comprobantes_rd/getTiposComprobanteAjax') ?>",
                type: "post",
                dataType: 'json',
                delay: 250,
                data: function (params) {
                    // CSRF Hash
                    var csrfName = $('.txt_csrfname').attr('name'); // CSRF Token name
                    var csrfHash = $('.txt_csrfname').val(); // CSRF hash
                    var idEmpresa = $('.idEmpresaSells').val(); // CSRF hash

                    return {
                        searchTerm: params.term, // search term
                        [csrfName]: csrfHash, // CSRF Token
                        idEmpresa: idEmpresa // search term
                    };
                },
                processResults: function (response) {

                    // Update CSRF Token
                    $('.txt_csrfname').val(response.token);

                    return {
                        results: response.data
                    };
                },
                cache: true
            }
        });







        /**
         * Save Quote
         */

        $(".btnSavePayment").on("click", function () {

            console.log("Prueba Guardar");
            listarPagos();
            savePayment();

        });


        function timbrarComplemento() {


            var UUID = $("#uuid").val();


            $(".btnTimbrar").attr("disabled", true);



            $.ajax({

                url: "<?= base_url('admin/timbrarComplemento/') ?>" + UUID,
                method: "GET",
                cache: false,
                contentType: false,
                processData: false,
                //dataType:"json",
                success: function (respuesta) {


                    if (respuesta.match(/success.*/)) {


                        Toast.fire({
                            icon: 'success',
                            title: "Timbrada Correctamente"
                        });

                        $(".btnTimbrar").removeAttr("disabled");


                        window.open("<?= base_url('admin/xml/generarPDFDesdePago') ?>" + "/" + UUID, "_blank");
                        return true;

                    } else {

                        Toast.fire({
                            icon: 'error',
                            title: respuesta
                        });

                        $(".btnTimbrar").removeAttr("disabled");

                        return false;


                    }

                }

            }

            )

            return true;
        }


        /**
         * Al cambiar el importe a pagar valirdar que no sobrepase el saldo
         */


        $(".rowProducts").on("change", ".importeAPagar", function () {


            var importeAPagar = Number($(this).val());

            var saldo = $(this).parent().parent().find(".saldo").val();

            if (importeAPagar > saldo) {

                $(this).val("0.00");

                Toast.fire({
                    icon: 'error',
                    title: "El importe a pagar es mayor al saldo"
                });

                return;
            }


            if (importeAPagar < 0) {

                $(this).val("0.00");

                Toast.fire({
                    icon: 'error',
                    title: "El importe a pagar no puede ser menor a cero"
                });

                return;
            }


            listarPagos();

        });


        function savePayment() {


            var UUID = $("#uuid").val();
            var folio = $("#folio").val();
            var idQuote = $("#idQuote").val();
            var idEmpresa = $("#idEmpresaSells").val();
            var custumerPago = $("#custumerPago").val();
            var date = $("#date").val();
            var dateVen = $("#dateVen").val()
            var idUser = $("#idUser").val();
            var generalObservations = $("#obsevations").val();
            var listProducts = $("#listProducts").val();
            var quoteTo = $("#quoteTo").val();
            var delivaryTime = $("#delivaryTime").val();

            var subTotal = $("#subTotal").val();
            var taxes = $("#totalImpuesto").val();
            var IVARetenido = $("#totalRetencionIVA").val();
            var ISRRetenido = $("#totalRetencionISR").val();
            var total = $("#granTotal").val();

            var datePayment = $("#datePayment").val();
            var metodoPago = $("#metodoPago").val();
            var pago = $("#pago").val();
            var cambio = $("#cambio").val();

            var tipoComprobanteRD = $("#tipoComprobanteRD").val();
            var folioComprobanteRD = $("#folioComprobanteRD").val();

            var RFCReceptor = $("#RFCReceptor").val();
            var usoCFDIVenta = $("#usoCFDIVenta").val();
            var metodoPagoVenta = $("#metodoPagoVenta").val();
            var formaPagoVenta = $("#formaPagoVenta").val();
            var razonSocialReceptor = $("#razonSocialReceptor").val();
            var codigoPostalReceptor = $("#codigoPostalReceptor").val();
            var regimenFiscalReceptor = $("#regimenFiscalReceptor").val();


            var idVehiculo = $("#idVehiculoSell").val();
            var idChofer = $("#idChoferSell").val();
            var tipoVehiculo = $("#tipoVehiculo").val();

            var idSucursal = $("#idSucursal").val();


            var ajaxGuardarConsulta = "ajaxGuardarConsulta";


            /**
             * Validaciones
             * 
             */
            if (idEmpresa == 0 || idEmpresa == "") {

                Toast.fire({
                    icon: 'error',
                    title: "Tiene que seleccionar la empresa"
                });

                return false;

            }

            if (custumerPago == 0 || custumerPago == "") {

                Toast.fire({
                    icon: 'error',
                    title: "Tiene que seleccionar un cliente"
                });

                return false;

            }


            if (idSucursal == 0 || idSucursal == "") {

                Toast.fire({
                    icon: 'error',
                    title: "Tiene que seleccionar una sucursal"
                });

                return false;

            }


            if (listProducts == "[]") {

                Toast.fire({
                    icon: 'error',
                    title: "Tiene que agregar al menos un producto"
                });

                return false;

            }



            $(".btnSaveSells").attr("disabled", true);


            var datos = new FormData();
            datos.append("idCustumer", custumerPago);
            datos.append("idEmpresa", idEmpresa);
            datos.append("idQuote", idQuote);
            datos.append("folio", folio);
            datos.append("date", date);
            datos.append("idUser", idUser);
            datos.append("listPagos", listProducts);
            datos.append("generalObservations", generalObservations);
            datos.append("dateVen", dateVen);
            datos.append("quoteTo", quoteTo);
            datos.append("delivaryTime", delivaryTime);

            datos.append("subTotal", subTotal);
            datos.append("taxes", taxes);
            datos.append("IVARetenido", IVARetenido);
            datos.append("ISRRetenido", ISRRetenido);
            datos.append("total", total);

            datos.append("importPayment", pago);
            datos.append("importBack", cambio);
            datos.append("datePayment", datePayment);
            datos.append("metodoPago", metodoPago);

            datos.append("tipoComprobanteRD", tipoComprobanteRD);
            datos.append("folioComprobanteRD", folioComprobanteRD);

            datos.append("RFCReceptor", RFCReceptor);
            datos.append("usoCFDI", usoCFDIVenta);
            datos.append("metodoPago", metodoPagoVenta);
            datos.append("formaPago", formaPagoVenta);
            datos.append("razonSocialReceptor", razonSocialReceptor);
            datos.append("codigoPostalReceptor", codigoPostalReceptor);
            datos.append("regimenFiscalReceptor", regimenFiscalReceptor);

            datos.append("idVehiculo", idVehiculo);
            datos.append("idChofer", idChofer);
            datos.append("tipoVehiculo", tipoVehiculo);
            datos.append("idSucursal", idSucursal);

            datos.append("UUID", UUID);

            $.ajax({

                url: "<?= base_url('admin/complementoPago/save') ?>",
                method: "POST",
                data: datos,
                cache: false,
                contentType: false,
                processData: false,
                //dataType:"json",
                success: function (respuesta) {


                    if (respuesta.match(/Correctamente.*/)) {


                        Toast.fire({
                            icon: 'success',
                            title: "Guardado Correctamente"
                        });

                        $(".btnSaveSells").removeAttr("disabled");

                        return true;

                    } else {

                        Toast.fire({
                            icon: 'error',
                            title: respuesta
                        });

                        $(".btnSaveSells").removeAttr("disabled");

                        return false;


                    }

                }

            }

            )

            return true;
        }


        function listarPagos() {




            var listaPagos = [];

            var idSell = $(".idSell");
            var serie = $(".serie");
            var folio = $(".folio");
            var fecha = $(".fecha");
            var fechaVen = $(".fechaVen");
            var total = $(".total");
            var saldo = $(".saldo");
            var importeAPagar = $(".importeAPagar");

            var importeTotalAPagar = 0;


            for (var i = 0; i < serie.length; i++) {

                listaPagos.push({
                    "idSell": $(idSell[i]).val(),
                    "serie": $(serie[i]).val(),
                    "folio": $(folio[i]).val(),
                    "fecha": $(fecha[i]).val(),
                    "fechaVen": $(fechaVen[i]).val(),
                    "saldo": $(saldo[i]).val(),
                    "total": $(total[i]).val(),
                    "importeAPagar": $(importeAPagar[i]).val()

                });


                importeTotalAPagar = Number(Number(importeTotalAPagar) + Number($(importeAPagar[i]).val())).toFixed(2);
            }

            $("#granTotal").val(importeTotalAPagar);


            //Asignamos el JSON en el input

            $("#listProducts").val(JSON.stringify(listaPagos));

        }


        /*=============================================
         IMPRIMIR CONSULTA
         =============================================*/



        $(".btnPrint").on("click", function () {


            var saved = saveSell();
            var uuid = $("#uuid").val();


            if (saved == true) {

                var uuid = $("#uuid").val();


                window.open("<?= base_url('admin/sells/report') ?>" + "/" + uuid, "_blank");

                window.location = "<?= base_url('admin/sells') ?>";

            }

        })


        $(".btnTimbrar").on("click", function () {


            timbrarComplemento();

        });

        $("#idSucursal").select2();

<?php
echo '$("#usoCFDIVenta").val("' . $usoCFDIReceptor . '"); ';
echo '$("#usoCFDIVenta").trigger("change"); ';
echo '$("#metodoPagoVenta").val("' . $metodoPagoReceptor . '"); ';
echo '$("#metodoPagoVenta").trigger("change"); ';
echo '$("#formaPagoVenta").val("' . $formaPagoReceptor . '"); ';
echo '$("#formaPagoVenta").trigger("change"); ';
echo '$("#regimenFiscalReceptor").val("' . $regimenFiscalReceptor . '"); ';
echo '$("#regimenFiscalReceptor").trigger("change"); ';
?>
    </script>


    <?= $this->endSection() ?>

Creamos el archivo para ver mas información por renglon en App/Views/modulesPayment/moreInfoRow.php con el siguiente código

<!-- Modal More Info -->
<div class="modal fade" id="modelMoreInfoRow" tabindex="-1" role="dialog" aria-labelledby="modelMoreInfoRow" aria-hidden="true">
    <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title">Información del Renglon</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body">
                <form id="form-otrosDatosRenglon" class="form-horizontal">




                    <div class="form-group row">
                        <label for="unidadSATRow" class="col-sm-2 col-form-label">
                            Clave Unidad SAT
                        </label>
                        <div class="col-sm-10">
                            <div class="input-group">
                                <div class="input-group-prepend">
                                    <span class="input-group-text"><i class="fas fa-pencil-alt"></i></span>
                                </div>
                                <select name="unidadSATRow" id="unidadSATRow" style="width: 90%;" class="form-control unidadSAT form-controlProducts">
                                    <option value="0" selected>
                                        Seleccione Clave De Unidad SAT
                                    </option>
                                </select>


                            </div>
                        </div>

                    </div>

                    <div class="form-group row">
                        <label for="claveProductoSATRow" class="col-sm-2 col-form-label">
                            Clave Producto SAT
                        </label>
                        <div class="col-sm-10">
                            <div class="input-group">
                                <div class="input-group-prepend">
                                    <span class="input-group-text"><i class="fas fa-pencil-alt"></i></span>
                                </div>
                                <select name="claveProductoSATRow" id="claveProductoSATRow" style="width: 90%;" class="form-control claveProductoSAT form-controlProducts">
                                    <option value="0" selected>
                                        Seleccione Clave de Producto SAT
                                    </option>

                                </select>


                            </div>
                        </div>

                    </div>




                    <div class="form-group row">
                        <label for="claveProductoSATRow" class="col-sm-2 col-form-label">
                            Unidad Producto
                        </label>
                        <div class="col-sm-10">
                            <div class="input-group">
                                <div class="input-group-prepend">
                                    <span class="input-group-text"><i class="fas fa-pencil-alt"></i></span>
                                </div>
                                <input name="unidadProducto" id="unidadProducto" class="form-control unidadProducto form-controlProducts">

                            </div>
                        </div>

                    </div>



                </form>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal"><?= lang('boilerplate.global.close') ?></button>
                <button type="button" class="btn btn-primary btn-sm btnGuardarRenglon" id="btnGuardarRenglon"  data-dismiss="modal">Guardar</button>
            </div>
        </div>
    </div>
</div>

<?= $this->section('js') ?>


<script>
    /* 
     * AL hacer click al editar
     */



    $(document).on('click', '.btnGuardarRenglon', function (e) {


        nombreDiv.parent().parent().find(".claveUnidadSatR").val($("#unidadSATRow").val());
        nombreDiv.parent().parent().find(".claveProductoSATR").val($("#claveProductoSATRow").val());
        nombreDiv.parent().parent().find(".unidad").val($("#unidadProducto").val());

        listProducts();
    });



    /**
     * Categorias por empresa
     */

    $(".unidadSATRow").select2({
        ajax: {
            url: "<?= base_url('admin/products/getUnidadSATAjax') ?>",
            type: "post",
            dataType: 'json',
            delay: 250,

            data: function (params) {
                // CSRF Hash
                var csrfName = $('.txt_csrfname').attr('name'); // CSRF Token name
                var csrfHash = $('.txt_csrfname').val(); // CSRF hash
                var idEmpresa = $('.idEmpresa').val(); // CSRF hash

                return {
                    searchTerm: params.term, // search term
                    [csrfName]: csrfHash, // CSRF Token
                    idEmpresa: idEmpresa // search term
                };
            },
            processResults: function (response) {

                // Update CSRF Token
                $('.txt_csrfname').val(response.token);

                return {
                    results: response.data
                };
            },

            cache: true
        }
    });


    /**
     * Categorias por empresa
     */

    $(".claveProductoSATRow").select2({
        ajax: {
            url: "<?= base_url('admin/products/getProductosSATAjax') ?>",
            type: "post",
            dataType: 'json',
            delay: 250,
            data: function (params) {
                // CSRF Hash
                var csrfName = $('.txt_csrfname').attr('name'); // CSRF Token name
                var csrfHash = $('.txt_csrfname').val(); // CSRF hash
                var idEmpresa = $('.idEmpresa').val(); // CSRF hash

                return {
                    searchTerm: params.term, // search term
                    [csrfName]: csrfHash, // CSRF Token
                    idEmpresa: idEmpresa // search term
                };
            },
            processResults: function (response) {

                // Update CSRF Token
                $('.txt_csrfname').val(response.token);

                return {
                    results: response.data
                };
            },
            cache: true
        }
    });
</script>


<?= $this->endSection() ?>

Las capturas de choferes y vehículos ya la tenemos, y al parecer a estas alturas ni se necesitan

Agregamos la vista para ver la lista de los complementos en App/Views/Pagos.php con el siguiente código

<?= $this->include('load/daterangapicker') ?>
<?= $this->include('load/toggle') ?>
<?= $this->include('julio101290\boilerplate\Views\load\datatables') ?>
<?= $this->include('julio101290\boilerplate\Views\load\select2') ?>


<!-- Extend from layout index -->
<?= $this->extend('julio101290\boilerplate\Views\layout\index') ?>


<!-- Section content -->
<?= $this->section('content') ?>

<?= $this->include('modulesSells/modaSendMail') ?>


<?= $this->include('modulesPayment/listaFacturas') ?>
<?= $this->include('modulesPayment/xmlList') ?>


<!-- SELECT2 EXAMPLE -->
<div class="card card-default">
    <div class="card-header">

        <div class="float-left">
            <div class="btn-group">

                <div id="reportrange" style="background: #fff; cursor: pointer; padding: 5px 10px; border: 1px solid #ccc; width: 100%">
                    <i class="fa fa-calendar"></i>&nbsp;
                    <span></span> <i class="fa fa-caret-down"></i>
                </div>


            </div>

            <div class="btn-group">



                <div class="form-group">
                    <label for="idEmpresa">Empresa </label>
                    <select id='idEmpresa' name='idEmpresa' class="idEmpresa" style='width: 80%;'>

                        <?php
                        if (isset($idEmpresa)) {

                            echo "   <option value='$idEmpresa'>$idEmpresa - $nombreEmpresa</option>";
                        } else {

                            echo "  <option value='0'>Todas las empresas</option>";

                            foreach ($empresas as $key => $value) {

                                echo "<option value='$value[id]'>$value[id] - $value[nombre] </option>  ";
                            }
                        }
                        ?>

                    </select>
                </div>

            </div>


            <div class="btn-group">



                <div class="form-group">
                    <label for="idSucursal">Sucursal </label>
                    <select id='idSucursal' name='idSucursal' class="idSucursal" style='width: 100%;'>

                        <?php
                        echo "  <option value='0'>Todas las Sucursales</option>";
                        if (isset($idSucursal)) {

                            echo "   <option value='$idSucursal'>$idSucursal - $nombreSucursal</option>";
                        }
                        ?>

                    </select>
                </div>

            </div>




            <div class="btn-group">



                <div class="form-group">
                    <label for="productos">Cliente </label>
                    <select id='clientes' name='clientes' class="clientes" style='width: 100%;'>

                        <?php
                        echo "  <option value='0'>Todas los clientes</option>";
                        ?>

                    </select>
                </div>

            </div>

            <div class="btn-group">



                <input type="checkbox" id="chkTodasLasVentas" name="chkTodasLasVentas" class="chkTodasLasVentas" data-width="250" data-height="40" checked data-toggle="toggle" data-on="Todas las ventas" data-off="Pendientes de Pago" data-onstyle="success" data-offstyle="danger">

            </div>


        </div>

        <div class="float-right">
            <div class="btn-group">

                <a href="<?= base_url("admin/newSells") ?>" class="btn btn-primary btnAddCustumers" data-target="#modalAddCustumers"><i class="fa fa-plus"></i>

                    Nueva Venta

                </a>

            </div>
        </div>
    </div>
    <div class="card-body">
        <div class="row">

            <div class="col-md-12">

                <div class="table-responsive">

                    <table id="tablePagos" class="table table-striped table-hover va-middle tablePagos">

                        <thead>

                            <tr>

                                <th>#</th>
                                <th>
                                    Folio
                                </th>
                                <th>
                                    Cliente
                                </th>
                                <th>
                                    Fecha
                                </th>

                                <th>
                                    Total
                                </th>
                              
                                <th>
                                    Creado
                                </th>
                                <th>
                                    Modificado
                                </th>

                                <th>
                                    Acciones
                                </th>

                            </tr>
                        </thead>
                        <tbody>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
</div>
<!-- /.card -->

<?= $this->endSection() ?>


<?= $this->section('js') ?>
<script>
    /**
     * Cargamos la tabla
     */

    var tableQuotes = $('#tablePagos').DataTable({
        processing: true,
        serverSide: true,
        responsive: true,
        autoWidth: false,
        order: [
            [1, 'desc']
        ],

        ajax: {
            url: '<?= base_url('admin/pagos') ?>',
            method: 'GET',
            dataType: "json"
        },
        columnDefs: [{
                orderable: false,
                targets: [7],
                searchable: false,
                targets: [7]

            }],
        columns: [{
                'data': 'id'
            },

            {
                'data': 'folio'
            },
            {
                'data': 'nameCustumer'
            },

            {
                'data': 'date'
            },


            {
                'data': 'total'
            },


            {
                'data': 'created_at'
            },

            {
                'data': 'updated_at'
               
            },

 
            {
                "data": function (data) {

         

                    return `<td class="text-right py-0 align-middle">
                         <div class="btn-group btn-group-sm">
                             <a href="<?= base_url('admin/editPago') ?>/${data.UUID}" class="btn btn-primary btn-edit"><i class="fas fa-pencil-alt"></i></a>
                             <button class="btn btn-success btnSendMail" data-toggle="modal" correoCliente ="${data.correoCliente}" uuid="${data.UUID}" folio="${data.folio}" data-toggle="modal" data-target="#modalSendMail"  >  <i class=" fas fa-envelope"></i></button>
                             <button class="btn bg-warning btnImprimirVenta" uuid="${data.UUID}" ><i class="far fa-file-pdf"></i></button>
                             <button class="btn bg-maroon btnTimbrar" uuid="${data.UUID}" ><i class="fas fa-qrcode"></i></button>
                             <button class="btn btn-danger btn-delete" data-id="${data.id}"><i class="fas fa-trash"></i></button>
                           
                             <button class="btn bg-success btnInvoiceList" data-toggle="modal"  uuid="${data.UUID}" data-toggle="modal" data-target="#modalInvoiceList"  >  <i class="fas fa-search"></i></button>
                             <button class="btn bg-gray btnListXML" data-toggle="modal"  uuid="${data.UUID}" data-toggle="modal" data-target="#modalListXML"  >  <i class="fas fa-list"></i></button>
                         </div>
                         </td>`
                }
            }
        ]
    });




    $("#idEmpresa").select2();

    $("#idSucursal").select2({
        ajax: {
            url: "<?= site_url('admin/sucursales/getSucursalesAjax') ?>",
            type: "post",
            dataType: 'json',
            delay: 250,
            data: function (params) {
                // CSRF Hash
                var csrfName = $('.txt_csrfname').attr('name'); // CSRF Token name
                var csrfHash = $('.txt_csrfname').val(); // CSRF hash
                var idEmpresa = $('.idEmpresa').val(); // CSRF hash

                return {
                    searchTerm: params.term, // search term
                    [csrfName]: csrfHash, // CSRF Token
                    idEmpresa: idEmpresa // search term
                };
            },
            processResults: function (response) {

                // Update CSRF Token
                $('.txt_csrfname').val(response.token);
                return {
                    results: response.data
                };
            },
            cache: true
        }
    });

    $("#productos").select2({
        ajax: {
            url: "<?= site_url('admin/products/getProductsAjax') ?>",
            type: "post",
            dataType: 'json',
            delay: 250,
            data: function (params) {
                // CSRF Hash
                var csrfName = $('.txt_csrfname').attr('name'); // CSRF Token name
                var csrfHash = $('.txt_csrfname').val(); // CSRF hash
                var idEmpresa = $('.idEmpresa').val(); // CSRF hash

                return {
                    searchTerm: params.term, // search term
                    [csrfName]: csrfHash, // CSRF Token
                    idEmpresa: idEmpresa // search term
                };
            },
            processResults: function (response) {

                // Update CSRF Token
                $('.txt_csrfname').val(response.token);
                return {
                    results: response.data
                };
            },
            cache: true
        }
    });


    // Initialize select2 storages
    $("#clientes").select2({
        ajax: {
            url: "<?= site_url('admin/custumers/getCustumersTodosAjax') ?>",
            type: "post",
            dataType: 'json',
            delay: 250,
            data: function (params) {
                // CSRF Hash
                var csrfName = $('.txt_csrfname').attr('name'); // CSRF Token name
                var csrfHash = $('.txt_csrfname').val(); // CSRF hash
                var idEmpresa = $('.idEmpresa').val(); // CSRF hash

                return {
                    searchTerm: params.term, // search term
                    [csrfName]: csrfHash, // CSRF Token
                    idEmpresa: idEmpresa // search term
                };
            },
            processResults: function (response) {

                // Update CSRF Token
                $('.txt_csrfname').val(response.token);

                return {
                    results: response.data
                };
            },
            cache: true
        }
    });


    /**@abstract
     * 
     * Al cambiar la el rango de fecha
     */

    $("#chkTodasLasVentas").on("change", function () {

        var datePicker = $('#reportrange').data('daterangepicker');
        var desdeFecha = datePicker.startDate.format('YYYY-MM-DD');
        var hastaFecha = datePicker.endDate.format('YYYY-MM-DD');
        var idEmpresa = $("#idEmpresa").val();
        var idSucursal = $("#idSucursal").val();
        var idCliente = $("#clientes").val();


        if ($(this).is(':checked')) {

            todas = true;

        } else {

            todas = false;

        }

        tableQuotes.ajax.url(`<?= base_url('admin/pagos') ?>/` + desdeFecha + '/' + hastaFecha + '/' + todas + '/' + idEmpresa + '/' + idSucursal + '/' + idCliente).load();

    });







    /*=============================================
     Carga XML sin asignar
     =============================================*/

    $(".tablePagos").on("click", '.btnListXML', function () {


        var uuid = $(this).attr("uuid");
        
        $("#idVentaSinAsignar").val(uuid);
        
        tableListXML.ajax.url(`<?= base_url('admin/xml/xmlSinAsignar/p') ?>`).load();

    });


    /*=============================================
     Load invouce List 
     =============================================*/

    $(".tablePagos").on("click", '.btnInvoiceList', function () {


        var uuid = $(this).attr("uuid");

        console.log(uuid);

        tableInvoice.ajax.url(`<?= base_url('admin/xmlenlace/getXMLEnlazados') ?>/` + uuid).load();

    });


    /*=============================================
     ENVIAR CORREO  
     =============================================*/

    $(".tablePagos").on("click", '.btnSendMail', function () {

        var uuid = $(this).attr("uuid");
        var folio = $(this).attr("folio");
        var correo = $(this).attr("correocliente");


        var newOption = new Option(correo, correo);
        $('#correos').append(newOption).trigger('change');

        $("#uuidMail").val(uuid);
        $("#folioVentanMail").val(folio);


    });


    /*=============================================
     ENVIAR CORREO  
     =============================================*/

    $(".tablePagos").on("click", '.btnTimbrar', function () {

        var uuid = $(this).attr("uuid");



        timbrarComplemento(uuid);


    });


    /**
     * Imprimir factura desde la lista de facturas
     */

    $(".tableInvoice").on("click", '.btn-printInvoice', function () {

        var uuid = $(this).attr("data-id");
        window.open("<?= base_url('admin/xml/generarPDF') ?>" + "/" + uuid, "_blank");

    });

    /**
     * Imprimir factura desde la lista de facturas
     */

    $(".tableInvoice").on("click", '.btnDeleteEnlace', function () {

        var idEnlace = $(this).attr("data-id");
        Swal.fire({
            title: '<?= lang('boilerplate.global.sweet.title') ?>',
            text: "<?= lang('boilerplate.global.sweet.text') ?>",
            icon: 'warning',
            showCancelButton: true,
            confirmButtonColor: '#3085d6',
            cancelButtonColor: '#d33',
            confirmButtonText: '<?= lang('boilerplate.global.sweet.confirm_delete') ?>'
        })
                .then((result) => {
                    if (result.value) {
                        $.ajax({
                            url: `<?= base_url('admin/enlacexml/delete/') ?>/` + idEnlace,
                            method: 'GET',
                        }).done((data, textStatus, jqXHR) => {
                            Toast.fire({
                                icon: 'success',
                                title: jqXHR.statusText,
                            });
                            tableInvoice.ajax.reload();
                        }).fail((error) => {
                            Toast.fire({
                                icon: 'error',
                                title: error.responseJSON.messages.error,
                            });
                        })
                    }
                })

    });





    function timbrarComplemento(UUID) {





        $(".btnTimbrar").attr("disabled", true);



        $.ajax({

            url: "<?= base_url('admin/timbrarComplemento/') ?>" + UUID,
            method: "GET",
            cache: false,
            contentType: false,
            processData: false,
            //dataType:"json",
            success: function (respuesta) {


                if (respuesta.match(/success.*/)) {


                    Toast.fire({
                        icon: 'success',
                        title: "Timbrada Correctamente"
                    });

                    $(".btnTimbrar").removeAttr("disabled");


                    window.open("<?= base_url('admin/xml/generarPDFDesdeComplemento') ?>" + "/" + UUID, "_blank");
                    return true;

                } else {

                    Toast.fire({
                        icon: 'error',
                        title: respuesta
                    });

                    $(".btnTimbrar").removeAttr("disabled");

                    return false;


                }

            }

        }

        )

        return true;
    }







    /*=============================================
     IMPRIMIR VEnta
     =============================================*/

    $(".tablePagos").on("click", '.btnImprimirVenta', function () {

        var uuid = $(this).attr("uuid");


        window.open("<?= base_url('admin/pagos/report') ?>" + "/" + uuid, "_blank");

    });


    /*=============================================
     ELIMINAR custumers
     =============================================*/
    $(".tablePagos").on("click", ".btn-delete", function () {

        var idPago = $(this).attr("data-id");

        Swal.fire({
            title: '<?= lang('boilerplate.global.sweet.title') ?>',
            text: "<?= lang('boilerplate.global.sweet.text') ?>",
            icon: 'warning',
            showCancelButton: true,
            confirmButtonColor: '#3085d6',
            cancelButtonColor: '#d33',
            confirmButtonText: '<?= lang('boilerplate.global.sweet.confirm_delete') ?>'
        })
                .then((result) => {
                    if (result.value) {
                        $.ajax({
                            url: `<?= base_url('admin/pagos') ?>/` + idPago,
                            method: 'DELETE',
                        }).done((data, textStatus, jqXHR) => {
                            Toast.fire({
                                icon: 'success',
                                title: jqXHR.statusText,
                            });


                            tableQuotes.ajax.reload();
                        }).fail((error) => {
                            Toast.fire({
                                icon: 'error',
                                title: error.responseJSON.messages.error,
                            });
                        })
                    }
                })
    })





    $(function () {

        var start = moment().subtract(29, 'days');
        var end = moment();
        var todas = true;

        function cb(start, end) {
            $('#reportrange span').html(start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY'));

            if ($('#chkTodasLasVentas').is(':checked')) {

                todas = true;

            } else {

                todas = false;

            }



            var desdeFecha = start.format('YYYY-MM-DD');
            var hastaFecha = end.format('YYYY-MM-DD');
            var idEmpresa = $("#idEmpresa").val();
            var idSucursal = $("#idSucursal").val();
            var idCliente = $("#clientes").val();

            tableQuotes.ajax.url(`<?= base_url('admin/pagos') ?>/` + desdeFecha + '/' + hastaFecha + '/' + todas + '/' + idEmpresa + '/' + idSucursal + '/' + idCliente).load();


        }

        $('#reportrange').daterangepicker({
            startDate: start,
            endDate: end,
            ranges: {
                'Hoy': [moment(), moment()],
                'Ayer': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
                'Ultimos 7 Dias': [moment().subtract(6, 'days'), moment()],
                'Ultimos 30 Dias': [moment().subtract(29, 'days'), moment()],
                'Este Mes': [moment().startOf('month'), moment().endOf('month')],
                'Último Mes': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
                'Todo': [moment().subtract(100, 'year').startOf('month'), moment().add(100, 'year').endOf('year')]
            }
        }, cb);

        cb(start, end);





    });

</script>
<?= $this->endSection() ?>

Creamos el modal para ver que XML tiene ligado en App/Views/modulesPayment/listaFacturas.php con el siguiente código

<!-- Modal Pacientes -->
<div class="modal fade" id="modalInvoiceList" tabindex="-1" role="dialog" aria-labelledby="modalPaymentsList"
     aria-hidden="true">
    <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title">Lista de facturas timbradas</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body">
                <div class="row">
                    <div class="col-md-12">
                        <div class="table-responsive">
                            <table id="table-invoice" class="table table-striped table-hover va-middle tableInvoice">
                                <thead>
                                    <tr>
                                        <th>#</th>
                                        <th>UUID Timbre</th>
                                        <th>Total</th>
                                        <th>Acciones</th>
                                    </tr>
                                </thead>
                                <tbody>
                                </tbody>
                            </table>
                        </div>
                    </div>
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">
                    <?= lang('boilerplate.global.close') ?>
                </button>

            </div>
        </div>
    </div>
</div>



<?= $this->section('js') ?>


<script>


    var tableInvoice = $('#table-invoice').DataTable({
        processing: true,
        serverSide: true,
        autoWidth: false,
        order: [[1, 'asc']],
        ajax: {
            url: '<?= base_url('admin/xmlenlace/getXMLEnlazados') ?>/0',
            method: 'GET',
            dataType: "json"
        },
        columnDefs: [{
                orderable: false,
                targets: [2],
                searchable: false,
                targets: [2]

            }],
        columns: [{
                'data': 'id'
            },
            {
                'data': 'uuidXML'
            },
            {
                'data': 'importe'
            },

            {
                "data": function (data) {
                    return `<td class="text-right py-0 align-middle">
                            <div class="btn-group btn-group-sm">
                                <button class="btn-danger btn-delete btnDeleteEnlace" data-id="${data.id}" ><i class="fas fa-trash"></i></button>
                                <button class="btn bg-warning btn-printInvoice" data-id="${data.uuidXML}" ><i class="far fa-file-pdf"></i></button>
                            </div>
                            </td>`
                }
            }
        ]
    });
    /**
     * Eliminar Renglon Diagnostico
     */

    $("#table-payments").on("click", ".btnDeletePayment", function () {

        var idPago = $(this).attr("data-id");
        Swal.fire({
            title: '<?= lang('boilerplate.global.sweet.title') ?>',
            text: "<?= lang('boilerplate.global.sweet.text') ?>",
            icon: 'warning',
            showCancelButton: true,
            confirmButtonColor: '#3085d6',
            cancelButtonColor: '#d33',
            confirmButtonText: '<?= lang('boilerplate.global.sweet.confirm_delete') ?>'
        })
                .then((result) => {
                    if (result.value) {
                        $.ajax({
                            url: `<?= base_url('admin/payments/delete/') ?>/` + idPago,
                            method: 'GET',
                        }).done((data, textStatus, jqXHR) => {
                            Toast.fire({
                                icon: 'success',
                                title: jqXHR.statusText,
                            });
                            tableProducts.ajax.reload();
                            tableQuotes.ajax.reload();
                        }).fail((error) => {
                            Toast.fire({
                                icon: 'error',
                                title: error.responseJSON.messages.error,
                            });
                        })
                    }
                })
    })










</script>


<?= $this->endSection() ?>

Creamos la vista para ver los XML de complemento sin asignar para poderlos asignar manualmente en App/Views/modulesPayment/xmlList.php con el siguiente código

<!-- Modal Pacientes -->
<div class="modal fade" id="modalListXML" tabindex="-1" role="dialog" aria-labelledby="modalListXML"
     aria-hidden="true">
    <div class="modal-dialog modal-lg" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title">Lista de XML Timbrados</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                    <input type="hidden" id="idVentaSinAsignar" name="idVentaSinAsignar" value="">
                </button>
            </div>
            <div class="modal-body">
                <div class="row">
                    <div class="col-md-12">
                        <div class="table-responsive">
                            <table id="table-listXML" class="table table-striped table-hover va-middle tableListXML">
                                <thead>
                                    <tr>
                                        <th>#</th>
                                        <th>TipoComprobante</th>
                                        <th>Fecha</th>
                                        <th>RFC</th>
                                        <th>Nombre Receptor</th>
                                        <th>UUID</th>
                                        <th>Serie</th>
                                        <th>folio</th>
                                        <th>total</th>
                                        <th>Acciones</th>
                                    </tr>
                                </thead>
                                <tbody>
                                </tbody>
                            </table>
                        </div>
                    </div>
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">
                    <?= lang('boilerplate.global.close') ?>
                </button>

            </div>
        </div>
    </div>
</div>



<?= $this->section('js') ?>


<script>


    var tableListXML = $('#table-listXML').DataTable({
        processing: true,
        serverSide: true,
        responsive: true,
        autoWidth: false,
        order: [[1, 'asc']],
        ajax: {
            url: '<?= base_url('admin/xml/xmlSinAsignar/P') ?>',
            method: 'GET',
            dataType: "json"
        },
        columnDefs: [{
                orderable: false,
                targets: [9],
                searchable: false,
                targets: [9]

            }],
        columns: [{
                'data': 'id'
            },
            {
                'data': 'tipoComprobante'
            },
            {
                'data': 'fecha'
            },
            {
                'data': 'rfcReceptor'
            },
            {
                'data': 'nombreReceptor'
            },
            {
                'data': 'uuidTimbre'
            },

            {
                'data': 'serie'
            },

            {
                'data': 'folio'
            },

            {
                'data': 'total'
            },

            {
                "data": function (data) {
                    return `<td class="text-right py-0 align-middle">
                            <div class="btn-group btn-group-sm">
                                <button class="btn-success btn-addXMLSell" data-id="${data.uuidTimbre}" ><i class="fas fa-plus-circle"></i></button>
                            </div>
                            </td>`
                }
            }
        ]
    });
    /**
     * Eliminar Renglon Diagnostico
     */

    $("#table-listXML").on("click", ".btn-addXMLSell", function () {

        var uuidTimbre = $(this).attr("data-id");
        var uuidVenta = $("#idVentaSinAsignar").val();
        
       

        var datos = new FormData();
        datos.append("uuidTimbre", uuidTimbre);
        datos.append("uuidVenta", uuidVenta);

        $.ajax({

            url: "<?= base_url('admin/xmlenlace/enlazaVenta') ?>",
            method: "POST",
            data: datos,
            cache: false,
            contentType: false,
            processData: false,
            success: function (respuesta) {
                if (respuesta.match(/Correctamente.*/)) {

                    Toast.fire({
                        icon: 'success',
                        title: "Guardado Correctamente"
                    });

                    tableListXML.ajax.reload();
       


                   // $('#modalAddCustumers').modal('hide');
                } else {

                    Toast.fire({
                        icon: 'error',
                        title: respuesta
                    });

                    //$("#btnSaveCustumers").removeAttr("disabled");


                }

            }
        })

       
    });



</script>


<?= $this->endSection() ?>

Creamos el menú para poder crear un complemento de pago con los siguientes datos

Creamos el menú para ver la lista de los complementos con los siguientes datos

Creamos el permiso para el complemento de pago

Y listo ya tenemos nuestro modulo de complemento de pago