<?php

// Nota: si renombraste la carpeta a algo diferente de "ticket" cambia el nombre en esta línea
require __DIR__ . '/ticket/autoload.php';

require 'simple_html_dom.php';

use FontLib\Table\Type\post;
use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;
use Mike42\Escpos\EscposImage;
use Mike42\Escpos\Printer;

use function PHPSTORM_META\map;

class Inicio extends CI_Controller
{
  public function __construct()
  {
    parent::__construct();
    $this->load->model(modelo(), 'Controlador_model');
    $this->controlador = controlador();
    $this->titulo_controlador = humanize($this->controlador);
    $this->url = base_url() . $this->controlador;
    $this->vista = $this->controlador;
    $this->perfil = $this->session->userdata('perfil') ? $this->session->userdata('perfil') : FALSE;
    $this->caja = $this->session->userdata('caja') ? $this->session->userdata('caja') : FALSE;
    $this->venta = $this->session->userdata('venta') ? $this->session->userdata('venta') : FALSE;
    $this->usuario = $this->session->userdata('usuario') ? $this->session->userdata('usuario') : FALSE;
    $this->empresa = $this->session->userdata('empresa') ? $this->session->userdata('empresa') : FALSE;
    $this->NumberTable = $this->session->userdata('NumberTable') ? $this->session->userdata('NumberTable') : FALSE;
  }

  public function index()
  {
    $mesotas = $this->Controlador_model->getMesasConZona();

    // Count unique non-temporary zones that actually have tables
    $unique_zones = [];
    foreach ($mesotas as $m) {
      if ($m->is_dynamic == 0 || $m->is_dynamic == null) {
        $unique_zones[$m->znombre] = true;
      }
    }

    if (count($unique_zones) > 1) {
      foreach ($mesotas as $m) {
        if ($m->is_dynamic == 0 || $m->is_dynamic == null) {
          $m->nombre = $m->znombre . ' | ' . $m->nombre;
        }
      }
    }

    // --- Performance Optimization: Pre-load active sales and users ---
    $active_sales_query = $this->db->where('estado', '0')->get('venta')->result();
    $active_sales = [];
    foreach ($active_sales_query as $s) {
      $active_sales[$s->mesa] = $s;
    }

    $item_counts = [];
    if (!empty($active_sales_query)) {
      $venta_ids = array_map(function($s) { return $s->id; }, $active_sales_query);
      $item_counts_query = $this->db->select('venta, COUNT(id) as count')
                                    ->where_in('venta', $venta_ids)
                                    ->group_by('venta')
                                    ->get('ventadetalle')->result();
      foreach ($item_counts_query as $ic) {
        $item_counts[$ic->venta] = $ic->count;
      }
    }

    $usuarios_list = $this->db->get('usuario')->result();
    $usuarios = [];
    foreach ($usuarios_list as $u) {
      $usuarios[$u->id] = $u;
    }
    // ------------------------------------------------------------------

    $data = array(
      'contenido' => $this->vista,
      'empresa' => $this->Controlador_model->get($this->empresa, 'empresa'),
      'zonas' => $this->caja ? $this->Controlador_model->ventapendiente($this->caja) : '',
      'header' => $this->venta ? $this->Controlador_model->getmesa($this->venta) : '',
      'tiendas' => $this->db->where('facturar', '1')->get('empresa')->result(),  // Controlador_model->getAll('empresa'),
      // 'zonasa' => $this->Controlador_model->getZonasEmpresa($this->empresa),
      'zonasa' => $this->Controlador_model->getZonasEmpresa(1),  // empresa 1 tiene las zona
      // 'mesotas' => $this->Controlador_model->getMesasEmpresa($this->empresa),
      'mesotas' => $mesotas,
      'categorias' => $this->db->where('id !=', 14)->get('productocategoria')->result(),
      'cajachica' => $this->Controlador_model->efectivoAnterior($this->empresa),
      'active_sales' => $active_sales,
      'item_counts' => $item_counts,
      'usuarios' => $usuarios,
    );
    $this->load->view(THEME . TEMPLATE, $data);
  }

  public function openregister()
  {
    $apertura = $this->Controlador_model->cajabierta('0', $this->input->post('empresaIH'));
    if ($apertura) {
      redirect($this->url);
      exit();
    }

    $numero = $this->Controlador_model->maximo('caja', $this->input->post('empresaIH'));
    $numeros = $numero ? $numero->numero + 1 : 1;
    $cadena = '';
    for ($i = 0; $i < 5 - strlen($numeros); $i++) {
      $cadena = $cadena . '0';
    }
    $data['descripcion'] = 'CAJA N° ' . $cadena . $numeros;
    $data['numero'] = $numeros;
    $data['empresa'] = $this->input->post('empresaIH');
    $data['saldoinicial'] = $this->input->post('saldoinicial');
    $data['usuario'] = $this->usuario;
    $data['apertura'] = date('Y-m-d H:i:s');
    $data['created'] = date('Y-m-d');
    $registro = $this->Controlador_model->save('caja', $data);
    if ($registro) {
      $CI = &get_instance();
      $CI->session->set_userdata('caja', $registro);
      $CI->session->set_userdata('empresa', $this->input->post('empresaIH'));
      // $this->caja = $CI->session->userdata('caja') ? $CI->session->userdata('caja') : FALSE;
      echo json_encode(array('status' => TRUE));
    }
  }

  public function aperturar($tienda)
  {
    $CI = &get_instance();
    $CI->session->set_userdata('empresa', $tienda);
    $apertura = $this->Controlador_model->cajabierta('0', $tienda);
    $open_reg = $apertura ? $apertura : $this->Controlador_model->maximo('caja', $tienda);
    $CI->session->set_userdata('caja', $open_reg->id);
    redirect($this->url);
  }

  public function crearpedido($id)
  {
    $datas = $this->db->where('mesa', $id)->where('estado', '0')->where('created', date('Y-m-d'))->get('venta')->row();
    $mesa = $this->Controlador_model->get($id, 'mesa');
    if ($datas) {
      // if ($mesa->open_by == $this->usuario) {
      $campo['estado'] = '1';
      $campo['time'] = date('H:i');
      $campo['checked'] = date('Y-m-d') . ' 00:00:00';
      $this->Controlador_model->update(array('id' => $id), $campo, 'mesa');
      redirect($this->url);
      // } else {
      //  redirect($this->url);
      // }
    } else {
      $data['cliente'] = 1;
      $data['empresa'] = $this->empresa;
      $data['usuario'] = $this->usuario;
      $data['caja'] = $this->caja;
      $data['mesa'] = $id;
      $data['timecreated'] = date('H:i:s');
      $data['created'] = date('Y-m-d');
      $insert = $this->Controlador_model->save('venta', $data);

      $campo['estado'] = '1';
      $campo['time'] = date('H:i');
      $campo['checked'] = date('Y-m-d') . ' 00:00:00';
      $campo['open_by'] = $this->usuario;
      $this->Controlador_model->update(array('id' => $id), $campo, 'mesa');

      $CI = &get_instance();
      $CI->session->set_userdata('venta', $insert);
      // $CI->session->set_userdata('NumberTable', 1);
      redirect($this->url);
    }
  }

  public function limpiar($id)
  {
    $venta = $this->Controlador_model->get($id, 'venta');

    $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
    if ($mesa->open_by != $this->usuario) {
      if ($this->perfil == 1 || $this->perfil == 3) {
        $campo['estado'] = '0';
        $campo['time'] = '';
        $campo['checked'] = '';
        $this->Controlador_model->update(array('id' => $venta->mesa), $campo, 'mesa');
        $this->Controlador_model->delete_by_venta($id, 'ventadetalle');
        $this->Controlador_model->delete_by_venta($id, 'ventatemporal');
        $this->Controlador_model->delete_by_id($id, 'venta');
        redirect($this->url);
      } else {
        redirect($this->url);
      }
    } else {
      $campo['estado'] = '0';
      $campo['time'] = '';
      $campo['checked'] = '';
      $this->Controlador_model->update(array('id' => $venta->mesa), $campo, 'mesa');
      $this->Controlador_model->delete_by_venta($id, 'ventadetalle');
      $this->Controlador_model->delete_by_venta($id, 'ventatemporal');
      $this->Controlador_model->delete_by_id($id, 'venta');
      redirect($this->url);
    }
  }

  public function eliminar($id)
  {
    $venta = $this->Controlador_model->get($id, 'venta');
    if ($venta) {
      $mesa_id = $venta->mesa;
      $this->Controlador_model->delete_by_venta($id, 'ventadetalle');
      $this->Controlador_model->delete_by_venta($id, 'ventatemporal');
      $this->Controlador_model->delete_by_id($id, 'venta');
      $this->Controlador_model->delete_by_id($mesa_id, 'mesa');
    }
    redirect($this->url);
  }

  public function seleccionarpedido($id)
  {
    $venta = $this->Controlador_model->get($id, 'venta');
    if ($venta) {
      $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
      $usuario = $this->Controlador_model->get($mesa->open_by, 'usuario');
      if ($mesa->open_by != $this->usuario) {
        // if ($this->perfil == 1 || $this->perfil == 3) {
        $CI = &get_instance();
        $CI->session->set_userdata('venta', $id);
        $CI->session->set_userdata('NumberTable', 1);
        redirect($this->url);
        // } else {
        // redirect($this->url);
        // }
      } else {
        $CI = &get_instance();
        $CI->session->set_userdata('venta', $id);
        $CI->session->set_userdata('NumberTable', 1);
        redirect($this->url);
      }
    } else {
      redirect($this->url);
    }
  }

  public function switshregister()
  {
    $CI = &get_instance();
    $CI->session->set_userdata('caja', NULL);
    redirect($this->url);
  }

  public function switshtable()
  {
    $CI = &get_instance();
    $CI->session->set_userdata('venta', NULL);
    $CI->session->set_userdata('NumberTable', NULL);
    redirect($this->url);
  }

  // TODO-----------------------------------------------------------------------------------------
  // ! Traia los datos de la tabla venta temporal, SE TIENE QUE BORRAR load_posales()
  // TODO-----------------------------------------------------------------------------------------
  public function load_posales()
  {
    $row = '';
    if ($this->NumberTable == 1) {
      if ($this->venta) {
        $posales = $this->Controlador_model->pedidotemporal($this->venta);
        if ($posales) {
          foreach ($posales as $posale) {
            $producto = $this->Controlador_model->get($posale->producto, 'producto');
            $register = $this->Controlador_model->get($this->caja, 'caja');
            $stock = $this->Controlador_model->getStock($register->empresa, $posale->producto);
            $type = $producto->tipo;
            $options = $posale->opcion;
            $options = trim($options, ',');
            $alert = $type == '0' ? ($stock->cantidad - $posale->cantidad <= $producto->alertqt ? 'background-color:pink' : '') : '';
            $row .= '
            <div class="col-xs-12">
            <div class="panel panel-default product-details">
            <div class="panel-body" style="' . $alert . '">
            <div class="col-xs-5 nopadding">
            <div class="col-xs-2 nopadding">
            <a onclick="delete_posale(' . $posale->id . ')">
            <span class="fa-stack fa-sm productD">
            <i class="fa fa-circle fa-stack-2x delete-product"></i>
            <i class="fa fa-remove fa-stack-1x fa-fw fa-inverse"></i>
            </span>
            </a>
            </div>
            <div class="col-xs-10 nopadding">
            <span class="textPD">' . $posale->nombre . '</span>
            </div>
            </div>
            <div class="col-xs-2">
            <span class="textPD">' . $posale->precio . '</span>
            </div>
            <div class="col-xs-3 nopadding productNum">
            <a href="javascript:void(0)">
            <span class="fa-stack fa-sm decbutton">
            <i class="fa fa-square fa-stack-2x light-grey"></i>
            <i class="fa fa-minus fa-stack-1x fa-inverse white"></i>
            </span>
            </a>
            <input type="text" id="qt-' . $posale->id . '" onchange="edit_posale(' . $posale->id . ')" class="form-control" value="' . $posale->cantidad . '" placeholder="0" maxlength="3">
            <a href="javascript:void(0)"><span class="fa-stack fa-sm incbutton">
            <i class="fa fa-square fa-stack-2x light-grey"></i>
            <i class="fa fa-plus fa-stack-1x fa-inverse white"></i>
            </span>
            </a>
            </div>
            <div class="col-xs-2 nopadding "><span class="subtotal textPD">' . number_format($posale->precio * $posale->cantidad, 2) . ' Soles</span>
            </div>
            </div>

            <button type="button" onclick="addoptions(' . $posale->id . ')" class="btn btn-success col-xs-12 btn-xs">Opcion</button>
            <span id="pooptions-' . $posale->id . '">' . $options . '</span>

            </div>
            </div>';
          }
          // adding script for the +/- buttons
          $row .= '
          <script type="text/javascript">
             $(".incbutton").on("click", function() {
               var $button = $(this);
               var oldValue = $button.parent().parent().find("input").val();
               var newVal = parseFloat(oldValue) + 1;
               $button.parent().parent().find("input").val(newVal);
               edit_posale($button.parent().parent().find("input").attr("id").slice(3));
              });
            $(".decbutton").on("click", function() {
              var $button = $(this);
              var oldValue = $button.parent().parent().find("input").val();
              if (oldValue > 1) {
                var newVal = parseFloat(oldValue) - 1;
              } else {
                newVal = 1;
              }
              $button.parent().parent().find("input").val(newVal);
              edit_posale($button.parent().parent().find("input").attr("id").slice(3));
            });
              </script>';
        } else {
          $row .= '<div class="messageVide">NO HAY PRODUCTOS <span>(Selecciona una producto para empezar)</span></div>';
        }
      } else {
        $row .= '<div class="messageVide">NO HAY PRODUCTOS <span>(Selecciona una producto para empezar)</span></div>';
      }
    } else {
      if ($this->venta) {
        $pedido = $this->Controlador_model->get($this->venta, 'venta');
        if ($pedido->estado == '0') {
          $posales = $this->Controlador_model->pedidodetalle($this->venta);
          if ($posales) {
            foreach ($posales as $posale) {
              $producto = $this->Controlador_model->get($posale->producto, 'producto');
              $options = $posale->opcion;
              $options = trim($options, ',');
              $row .= '<div class="col-xs-12"><div class="panel panel-default product-details">
              <div class="panel-body"><div class="col-xs-5 nopadding"><div class="col-xs-10 nopadding">
              <span class="textPD">' . $posale->nombre . '</span></div></div><div class="col-xs-2">
              <span class="textPD">' . $posale->precio . '</span></div>
              <div class="col-xs-3 text-center">' . $posale->cantidad . '</div><div class="col-xs-2 nopadding ">
              <span class="subtotal textPD">' . number_format($posale->precio * $posale->cantidad, 2) . ' Soles</span></div>
              <span id="pooptions-' . $posale->id . '">' . $options . '</span></div></div></div>';
            }
          } else {
            $row .= '<div class="messageVide">NO HA GENERA PEDIDO <span>(Generar su pedido para empezar)</span></div>';
          }
        } else {
          $row .= '<div class="messageVide">VENTA GENERADA <span>(Debe cerrar la mesa para finalizar)</span></div>';
        }
      } else {
        $row .= '<div class="messageVide">NO HA GENERA PEDIDO <span>(Generar su pedido para empezar)</span></div>';
      }
    }
    echo $row;
  }

  public function habilitar()
  {
    if ($this->Controlador_model->habilitar($this->caja, 'caja')) {
      mensaje_alerta('hecho', 'habilitar');
    } else {
      mensaje_alerta('error', 'habilitar');
    }
    redirect($this->url);
  }

  public function botonpedido()
  {
    $row = '';
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    $empresa = $this->Controlador_model->get($venta->empresa, 'empresa');
    if ($this->NumberTable == 1) {
      if ($this->venta) {
        $pedidotemporal = $this->Controlador_model->pedidotemporal($this->venta);
        if ($pedidotemporal) {
          $icon = "<i class='fa fa-spinner fa-spin'></i>";
          $row .= '<a href="javascript:void(0)" onclick="GenerarPedido(' . $empresa->tipoimpresora . ')" id="generarpedido" data-loading-text="' . $icon . '" class="btn btn-red col-xs-12 col-md-12 flat-box-btn">
          <h5 class="text-bold">GENERAR PEDIDO</h5></a>';
        } else {
          $row .= '
          <a disabled href="javascript:void(0)" class="btn btn-red col-xs-12 col-md-12 flat-box-btn">
          <h5 class="text-bold">GENERAR PEDIDO</h5>
          </a>';
        }
      }
    } else {
      if ($this->venta) {
        $pedido = $this->Controlador_model->get($this->venta, 'venta');
        $pedidodetalle = $this->Controlador_model->pedidodetalle($this->venta);
        if ($pedidodetalle) {
          if ($pedido->estado == '1') {
            $row .= '<button type="button" disabled class="btn btn-green col-md-12 flat-box-btn"><h5 class="text-bold">PROCESAR VENTA</h5></button>';
          } else {
            if ($this->perfil != 4) {
              $row .= '<a href="javascript:void(0)" onclick="grabar()" class="btn btn-green col-md-12 flat-box-btn">
              <h5 class="text-bold">PROCESAR VENTA</h5></a>';
            }
          }
        } else {
          $row .= '<button type="button" disabled class="btn btn-green col-md-12 flat-box-btn"><h5 class="text-bold">PROCESAR VENTA</h5></button>';
        }
      }
    }
    echo $row;
  }

  public function opcionmenu()
  {
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    $data = '';
    if ($venta->dcuenta == '1') {
      $data .= '<li data-toggle="tooltip" data-html="true" data-placement="left" title="Regreso">
    <a onclick="salirventa(' . $this->venta . ')"><i class="fa fa-reply" aria-hidden="true"></i></a></li>';
    } else {
      $data .= '<li data-toggle="tooltip" data-html="true" data-placement="left" title="Regreso">
    <a href="' . $this->url . '/switshtable"><i class="fa fa-reply" aria-hidden="true"></i></a></li>';
    }

    $data .= '<li data-toggle="tooltip" data-html="true" data-placement="left" title="Cargar&nbsp;Pagina">
    <a href="javascript:void(0)" onclick="location.reload()"><i class="fa fa-refresh" aria-hidden="true"></i></a></li>';
    if ($venta->estado == '0') {
      $pedidodetalle = $this->Controlador_model->pedidodetalle($this->venta);
      $data .= '<li data-toggle="tooltip" data-html="true" data-placement="left" title="Ir&nbsp;a&nbsp;la&nbsp;página&nbsp;de&nbsp;la&nbsp;cocina">
      <a href="cocina"><i class="fa fa-cutlery" aria-hidden="true"></i></a></li>';

      if ($this->perfil == 1 || $this->perfil == 2) {
        if ($pedidodetalle) {
          // $data .= '<li data-toggle="tooltip" data-html="true" data-placement="left" title="Editar&nbsp;Pedido"><a href="javascript:void(0)" onclick="EditarPedido()"><i class="fa fa-lock" aria-hidden="true"></i></a></li>';
          $data .= '<li data-toggle="tooltip" data-html="true" data-placement="left" title="Editar&nbsp;Pedido"><a href="javascript:void(0)" onclick="open_editarproducto()"><i class="fa fa-lock" aria-hidden="true"></i></a></li>';
        } else {
          $data .= '<li data-toggle="tooltip" data-html="true" data-placement="left" title="Pedido&nbsp;Abierto">
          <a href="javascript:void(0)"><i class="fa fa-unlock-alt" aria-hidden="true"></i></a></li>';
        }
      }
    } else {
      $id = 0;
      $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
      if ($mesa) {
        $id = $mesa->id;
      }
      $data .= '<li data-toggle="tooltip" data-html="true" data-placement="left" title="Nuevo&nbsp;Pedido">
      <a href="' . $this->url . '/crearpedido/' . $id . '"><i class="fa fa-cart-plus" aria-hidden="true"></i></a></li>';
    }
    echo $data;
  }

  public function listaproducto()
  {
    $pedido = $this->Controlador_model->get($this->venta, 'venta');
    $productos = $this->Controlador_model->getProductosMasVendidos();
    $data = '';
    if ($pedido->estado == '0') {
      if ($this->NumberTable == 1) {
        foreach ($productos as $product) {
          if ($product->estado == '0') {
            $isVariante = $product->variante ? 'Contiene variantes' : $product->precioventa . ' SOLES';
            $data .= '<div class="col-sm-2 col-xs-4">
            <a href="javascript:void(0)" class="addPct" onclick="add_posale(' . $product->id . ', ' . $product->variante . ')">
            <div class="product ' . $product->color . ' flat-box" id="box' . $product->id . '">
            <h3 id="proname" style="margin-bottom:0px">' . $product->nombre . '</h3>
            <input type="hidden" id="category" name="category" value="' . $product->categoria . '">
            <div class="mask"><h3>' . $isVariante . '</h3><p>' . substr($product->descripcion, 0, 40) . '</p></div>';
            if ($product->photo) {
              $data .= '<img src="' . base_url() . 'files/products/' . $product->photothumb . '" alt="' . $product->nombre . '">';
            }
            $data .= '</div></a></div>';
          }
        }
      }
    }
    echo $data;
  }

  public function holdList()
  {
    $Tholds = '';
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
    if ($this->NumberTable == 1) {
      $Tholds .= '<span class="Hold selectedHold" onclick="SelectHold(1)">PEDIDO<span id="Time">' . date('g:i A', strtotime($mesa->time)) . '</span></span>';
      $Tholds .= '<span class="Hold" onclick="SelectHold(2)">VENTA<span id="Time"></span></span>';
      $estado = TRUE;
    } else {
      $Tholds .= '<span class="Hold" onclick="SelectHold(1)">PEDIDO<span id="Time"></span></span>';
      $Tholds .= '<span class="Hold selectedHold" onclick="SelectHold(2)">VENTA<span id="Time">' . date('g:i A') . '</span></span>';
      $estado = '0';
    }
    echo $Tholds;
  }

  public function addpdc($id)
  {
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    $producto = $this->Controlador_model->get($id, 'producto');
    $posale = $this->Controlador_model->pedidotemporaldet($this->venta, $id);
    if ($producto->tipo == '0') {
      /* sock version */
      $stock = $this->Controlador_model->getStock($venta->empresa, $producto->id);
      $quantity = $stock ? $stock->cantidad : 0;
      if ($posale) {
        if ($posale->cantidad < $quantity) {
          $cantidad = $posale->cantidad + 1;
          $attributes['cantidad'] = $cantidad;
          $attributes['time'] = date('Y-m-d H:i:s');
          $this->Controlador_model->update(array('id' => $posale->id), $attributes, 'ventatemporal');
          echo json_encode(array('status' => TRUE));
        } else {
          echo 'stock';
        }
      } else if ($quantity != 0) {
        $data['producto'] = $id;
        $data['nombre'] = $producto->nombre;
        $data['preciocompra'] = $producto->preciocompra;
        $data['precio'] = $producto->precioventa;
        $data['venta'] = $this->venta;
        $data['cantidad'] = 1;
        $data['time'] = date('Y-m-d H:i:s');
        $this->Controlador_model->save('ventatemporal', $data);
        echo json_encode(array('status' => TRUE));
      } else {
        echo 'stock';
      }
    } else if ($producto->tipo == '2') {
      /* combo version */
      $quantity = 1;
      $combos = $this->Controlador_model->combo($this->input->post('producto'));
      foreach ($combos as $combo) {
        $prd = $this->Controlador_model->get($combo->item_id, 'producto');
        if ($prd->tipo == '0') {
          $stock = $this->Controlador_model->getStock($venta->empresa, $prd->id);
          if ($posale) {
            $diff = $stock ? ($stock->cantidad - $combo->cantidad * ($posale->cantidad + 1)) : 1;
          } else {
            $diff = $stock ? ($stock->cantidad - $combo->cantidad) : 1;
          }
          $quantity = $stock ? ($diff >= 0 ? 1 : 0) : $quantity;
        }
      }
      if ($posale) {
        if ($quantity > 0) {
          $cantidad = $posale->cantidad + 1;
          $attributes['cantidad'] = $cantidad;
          $attributes['time'] = date('Y-m-d H:i:s');
          $this->Controlador_model->update(array('id' => $posale->id), $attributes, 'ventatemporal');
          echo json_encode(array('status' => TRUE));
        } else {
          echo 'stock';
        }
      } else if ($quantity > 0) {
        $data['producto'] = $id;
        $data['nombre'] = $producto->nombre;
        $data['preciocompra'] = $producto->preciocompra;
        $data['precio'] = $producto->precioventa;
        $data['venta'] = $this->venta;
        $data['cantidad'] = 1;
        $data['time'] = date('Y-m-d H:i:s');
        $this->Controlador_model->save('ventatemporal', $data);
        echo json_encode(array('status' => TRUE));
      } else {
        echo 'stock';
      }
    } else {
      /* service version */
      if ($posale) {
        $cantidad = $posale->cantidad + 1;
        $attributes['cantidad'] = $cantidad;
        $attributes['time'] = date('Y-m-d H:i:s');
        $this->Controlador_model->update(array('id' => $posale->id), $attributes, 'ventatemporal');
        echo json_encode(array('status' => TRUE));
      } else {
        $data['producto'] = $id;
        $data['nombre'] = $producto->nombre;
        $data['preciocompra'] = $producto->preciocompra;
        $data['precio'] = $producto->precioventa;
        $data['venta'] = $this->venta;
        $data['cantidad'] = 1;
        $data['time'] = date('Y-m-d H:i:s');
        $this->Controlador_model->save('ventatemporal', $data);
        echo json_encode(array('status' => TRUE));
      }
    }
  }

  public function delete($id)
  {
    $this->Controlador_model->delete_by_id($id, 'ventatemporal');
    echo json_encode(array('status' => TRUE));
  }

  public function edit($id)
  {
    $posale = $this->Controlador_model->get($id, 'ventatemporal');
    $product = $this->Controlador_model->get($posale->producto, 'producto');
    $register = $this->Controlador_model->get($this->caja, 'caja');
    if ($product->tipo == '0') {
      /* sock version */
      $stock = $this->Controlador_model->getStock($register->empresa, $posale->producto);
      $quantity = $stock ? $stock->cantidad : 0;
      if (intval($this->input->post('qt')) <= intval($quantity)) {
        $attributes['cantidad'] = $this->input->post('qt');
        $attributes['time'] = date('H:i:s');
        $this->Controlador_model->update(array('id' => $id), $attributes, 'ventatemporal');
        echo json_encode(array('status' => TRUE));
      } else {
        echo 'stock';
      }
    } else if ($product->tipo == '2') {
      /* combo version */
      $quantity = 1;
      $combos = $this->Controlador_model->combo($posale->producto);
      foreach ($combos as $combo) {
        $prd = $this->Controlador_model->get($combo->item_id, 'producto');
        if ($prd->tipo == '0') {
          $stock = $this->Controlador_model->getStock($register->tienda, $combo->item_id);
          $diff = $stock ? ($stock->cantidad - $combo->cantidad * ($this->input->post('qt'))) : 1;
          $quantity = $stock ? ($diff >= 0 ? 1 : 0) : $quantity;
        }
      }
      if ($quantity > 0) {
        $attributes['cantidad'] = $this->input->post('qt');
        $attributes['time'] = date('H:i:s');
        $this->Controlador_model->update(array('id' => $id), $attributes, 'ventatemporal');
        echo json_encode(array('status' => TRUE));
      } else {
        echo 'stock';
      }
    } else {
      /* service version */
      $attributes['cantidad'] = $this->input->post('qt');
      $attributes['time'] = date('H:i:s');
      $this->Controlador_model->update(array('id' => $id), $attributes, 'ventatemporal');
      echo json_encode(array('status' => TRUE));
    }
  }

  public function CustomerName()
  {
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    $cliente = $this->Controlador_model->get($venta->cliente, 'cliente');
    echo $cliente ? $cliente->nombre : 'Cliente sin registrar';
  }

  public function SelectHold($number)
  {
    $CI = &get_instance();
    $CI->session->set_userdata('NumberTable', $number);
    echo json_encode(array('status' => TRUE));
  }

  public function GenerarPedido()
  {
    $pedido = $this->Controlador_model->get($this->venta, 'venta');
    $mesa = $this->Controlador_model->get($pedido->mesa, 'mesa');
    $pedidotemporal = $this->Controlador_model->pedidotemporal($this->venta);
    $montototal = 0;
    $totalitems = 0;
    foreach ($pedidotemporal as $value) {
      $producto = $this->Controlador_model->get($value->producto, 'producto');
      $montototal += ($value->precio * $value->cantidad);
      $totalitems += $value->cantidad;
      $data['venta'] = $this->venta;
      // $data['created'] = date('Y-m-d');
      $data['producto'] = $value->producto;
      $data['nombre'] = $value->nombre;
      $data['preciocompra'] = $value->preciocompra;
      $data['precio'] = $value->precio;
      $data['cantidad'] = $value->cantidad;
      $data['subtotal'] = $value->cantidad * $value->precio;
      $data['opcion'] = $value->opcion;
      $data['time'] = $value->time;
      if ($producto->categoria <> '9' && $producto->categoria <> '11' && $producto->categoria <> '12' && $producto->categoria <> '19' && $producto->categoria <> '22') {
        $data['estado'] = '0';
      } else {
        $data['estado'] = '1';
      }
      $this->Controlador_model->save('ventadetalle', $data);
      $temporal['estado'] = '1';
      $this->Controlador_model->update(array('id' => $value->id), $temporal, 'ventatemporal');
    }
    $datamesa['estado'] = '2';
    $datamesa['checked'] = date('Y-m-d H:i:s');
    $this->Controlador_model->update(array('id' => $mesa->id), $datamesa, 'mesa');
    $dataventa['atender'] = '0';
    $dataventa['sound'] = '0';
    $dataventa['created'] = date('Y-m-d');
    $dataventa['montototal'] = $pedido->montototal + $montototal;
    $dataventa['montoactual'] = $pedido->montoactual + $montototal;
    $dataventa['totalitems'] = $pedido->totalitems + $totalitems;
    $this->Controlador_model->update(array('id' => $this->venta), $dataventa, 'venta');
    echo json_encode(array('status' => TRUE));
  }

  public function EditarPedido()
  {
    $ventadetalle = $this->Controlador_model->getVentaDetalle($this->venta);
    $dataventa = $this->Controlador_model->get($this->venta, 'venta');
    $dataVD = [];
    $recober = '';
    foreach ($ventadetalle as $key => $value) {
      $recober .= 'Nombre producto: ' . $value->nombre . ' - Cantidad: ' . $value->cantidad . ' - Total: ' . $value->subtotal . ' - Hora pedido: ' . $value->time . ' | ';
      $queryproducto = $this->VeriCuentaStock($value->producto);  // ? si el estado es TRUE si cuenta con stock
      $dataproducto = $this->Controlador_model->get($value->producto, 'producto');
      if ($queryproducto == TRUE) {
        $botonmas = FALSE;  // ? si el boton es false No se bloquea
      } else {
        $botonmas = TRUE;
      }

      if ($value->cantidad == 1) {
        $botonomenos = TRUE;
      } else {
        $botonomenos = FALSE;  // ? si el boton es false No se bloquea
      }

      if (is_null($value->variante) or $value->variante == false or $value->variante == 0) {
        $idvarianteenvio = FALSE;
        $datavarianteenvio = FALSE;
      } else {
        $idvarianteenvio = $value->variante;
        $datavarianteenvio = $value->nombrevariante;
      }

      $dataVD[] = [
        $value->producto,
        $value->cantidad,
        $value->opcion,
        $value->subtotal,
        $botonmas,
        $botonomenos,
        $value->nombre,
        $value->precio,
        $dataproducto->categoria,
        $idvarianteenvio,
        $datavarianteenvio,
        $value->opciones,
      ];
    }

    $datarecover = [
      'v_id' => $this->venta,
      'v_empresa' => $this->empresa,
      'v_montototal' => $dataventa->montototal,
      'v_items' => $dataventa->totalitems,
      'v_timecreated' => $dataventa->timecreated,
      'v_productos' => $recober,
      'v_created' => $dataventa->created,
      'v_usuario' => $dataventa->usuario,
      'usuario' => $this->usuario,
      'hora' => date('H:i:s'),
      'created' => date('Y-m-d')
    ];

    $this->Controlador_model->save('recoverventa', $datarecover);

    foreach ($ventadetalle as $value) {
      $this->Controlador_model->eliminar($value->id, 'ventadetalle');
    }

    $data['montototal'] = 0;
    $data['montoactual'] = 0;
    $data['totalitems'] = 0;
    $this->Controlador_model->update(array('id' => $this->venta), $data, 'venta');

    echo json_encode(array('DataVD' => $dataVD, 'venta' => $this->venta));
  }

  public function cambiarmesa()
  {
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
    $datamesa['estado'] = $mesa->estado;
    $datamesa['time'] = $mesa->time;
    $datamesa['checked'] = $mesa->checked;
    $this->Controlador_model->update(array('id' => $this->input->post('mesa')), $datamesa, 'mesa');
    $data['estado'] = '0';
    $data['time'] = '';
    $data['checked'] = '';
    $this->Controlador_model->update(array('id' => $venta->mesa), $data, 'mesa');
    $dataventa['mesa'] = $this->input->post('mesa');
    $this->Controlador_model->update(array('id' => $this->venta), $dataventa, 'venta');
    redirect($this->url);
  }

  public function showticket()
  {
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
    $usuario = $this->Controlador_model->get($venta->usuario, 'usuario');
    $empresa = $this->Controlador_model->get($venta->empresa, 'empresa');
    $posales = $this->Controlador_model->comanda($this->venta);
    $ticket = '';
    $ticket .= '<div class="table-responsive">';
    if ($empresa->tipo == '0') {
      $ticket .= '<div class="text-center">' . $empresa->nombre . '</div>
     <div class="text-center">' . $empresa->razonsocial . '</div>';
    } else {
      $ticket .= '<div class="text-center">' . $empresa->razonsocial . '</div>';
    }
    $ticket .= '<div class="text-center">RUC: ' . $empresa->ruc . '</div>
   <div style="clear:both;"></div><div>Fecha: ' . date('Y-m-d H:i:s') . '</div>
   <div>Camarero: ' . $usuario->nombre . ' ' . $usuario->apellido . '</div>
   <div>Mesa : ' . $mesa->nombre . '</div>
   <table class="table"><thead><tr><th>#</th><th>Descripcion</th>
   <th>Cant</th><th>SubTotal</th></tr></thead><tbody>';
    $i = 1;
    foreach ($posales as $posale) {
      $suma = $this->Controlador_model->sumacomanda($this->venta, $posale->producto);
      $ticket .= '<tr><td style="text-align:center; width:30px;">' . $i . '</td>
     <td>' . $posale->nombre . '<br>
     <span style="font-size:12px;color:#666">' . $posale->opcion . '</span></td>
     <td style="text-align:center; width:50px;">' . $suma->cantidad . '</td>
     <td style="text-align:right; width:70px;font-size:14px; ">' . number_format($suma->cantidad * $posale->precio, 2) . '</td></tr>';
      $i++;
    }
    $ticket .= '</tbody></table><table class="table"><tbody><tr><td>Total Items</td>
   <td style="text-align:right; padding-right:1.5%;">' . $venta->totalitems . '</td><td>Total</td>
   <td style="text-align:right;font-weight:bold;">' . $venta->montototal . '</td></tr></tbody></table></div>';
    echo $ticket;
  }

  public function showticket_new($det = '')
  {
    $dets = explode('_', $det);
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
    $usuario = $this->Controlador_model->get($venta->usuario, 'usuario');
    $empresa = $this->Controlador_model->get($venta->empresa, 'empresa');
    // $posales = $this->Controlador_model->pedidodetalle($this->venta);
    $posales = $this->Controlador_model->pedidodetalleselect($this->venta, $dets);
    $ticket = '';
    $ticket .= '<div class="table-responsive">';
    if ($empresa->tipo == '0') {
      $ticket .= '<div class="text-center">' . $empresa->nombre . '</div>
     <div class="text-center">' . $empresa->razonsocial . '</div>';
    } else {
      $ticket .= '<div class="text-center">' . $empresa->razonsocial . '</div>';
    }
    /* foreach ($dets as $key => $value) {
      $ticket .= $value . ' ';
    } */
    $ticket .= '<div class="text-center">RUC: ' . $empresa->ruc . '</div>
   <div style="clear:both;"></div><div>Fecha: ' . date('Y-m-d H:i:s') . '</div>
   <div>Camarero: ' . $usuario->nombre . ' ' . $usuario->apellido . '</div>
   <div>Mesa : ' . $mesa->nombre . '</div>
   <table class="table"><thead><tr><th>#</th><th>Descripcion</th>
   <th>Cant</th><th>SubTotal</th></tr></thead><tbody>';
    $i = 1;
    $montototal = 0;
    $totalitems = 0;
    foreach ($posales as $posale) {  // ' . $producto->opcion . '
      $producto = $this->Controlador_model->get($posale->producto, 'producto');
      // $suma = $this->Controlador_model->sumacomanda($this->venta, $posale->producto);
      $ticket .= '<tr><td style="text-align:center; width:30px;">' . $i . '</td>
     <td>' . $producto->nombre . '<br>
     <span style="font-size:12px;color:#666">' . $posale->time . '</span> <span style="font-size:12px;color:#666">' . $posale->opcion . '</span></td>
     <td style="text-align:center; width:50px;">' . $posale->cantidad . '</td>
     <td style="text-align:right; width:70px;font-size:14px; ">' . number_format($posale->cantidad * $producto->precioventa, 2) . '</td></tr>';
      $i++;
      $montototal += $posale->cantidad * $producto->precioventa;
      $totalitems += $posale->cantidad;
    }
    $ticket .= '</tbody></table><table class="table"><tbody><tr><td>Total Items</td>
   <td style="text-align:right; padding-right:1.5%;">' . $totalitems . '</td><td>Total</td>
   <td style="text-align:right;font-weight:bold;">' . $montototal . '</td></tr></tbody></table></div>';
    echo $ticket;
  }

  public function autocompletar()
  {
    if (isset($_GET['term'])) {
      $q = strtoupper($_GET['term']);
      $this->Controlador_model->autocompletar($q);
    }
  }

  public function autocompletarrapido()
  {
    if (isset($_GET['term'])) {
      $q = strtoupper($_GET['term']);
      $this->Controlador_model->autocompletarrapido($q);
    }
  }

  private function _validate()
  {
    $data = array();
    $data['error_string'] = array();
    $data['inputerror'] = array();
    $data['status'] = TRUE;

    if ($this->input->post('cliente') == '') {
      $data['inputerror'][] = 'clientes';
      $data['error_string'][] = 'Este campo es obligatorio.';
      $data['status'] = FALSE;
    }

    if ($data['status'] === FALSE) {
      echo json_encode($data);
      exit();
    }
  }

  public function ajax_update()
  {
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    if ($venta->estado == 1) {
      redirect($this->url);
    }
    $this->_validate();
    $data['tipoventa'] = $this->input->post('tipoventa');
    $data['cliente'] = $this->input->post('cliente');
    if ($this->Controlador_model->update(array('id' => $this->venta), $data, 'venta')) {
      echo json_encode(array('status' => TRUE));
    }
  }

  private function _validaterapido()
  {
    $data = array();
    $data['error_string'] = array();
    $data['inputerror'] = array();
    $data['status'] = TRUE;

    if ($this->input->post('clienterapido') == '') {
      $data['inputerror'][] = 'clientesrapido';
      $data['error_string'][] = 'Este campo es obligatorio.';
      $data['status'] = FALSE;
    }

    if ($data['status'] === FALSE) {
      echo json_encode($data);
      exit();
    }
  }

  public function ajax_updaterapido()
  {
    $venta = $this->Controlador_model->get($this->input->post('ventaapagar'), 'venta');
    if ($venta->estado == 1) {
      redirect($this->url);
    }
    $this->_validaterapido();
    $data['tipoventa'] = $this->input->post('tipoventarapida');
    $data['cliente'] = $this->input->post('clienterapido');
    if ($this->Controlador_model->update(array('id' => $this->input->post('ventaapagar')), $data, 'venta')) {
      echo json_encode(array('status' => TRUE));
    }
  }

  public function ajax_update_rapido()
  {
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    if ($venta->estado == 1) {
      redirect($this->url);
    }
    $this->_validate();
    $data['tipoventa'] = $this->input->post('tipoventa');
    $data['cliente'] = $this->input->post('cliente');
    if ($this->Controlador_model->update(array('id' => $this->venta), $data, 'venta')) {
      echo json_encode(array('status' => TRUE));
    }
  }

  public function ajax_updateventa()
  {
    $datas = $this->Controlador_model->get($this->venta, 'venta');
    $cliente = $this->Controlador_model->get($datas->cliente, 'cliente');
    $usuario = $this->Controlador_model->get($datas->usuario, 'usuario');
    $data['tipoventa'] = $datas->tipoventa;
    $data['estado'] = $datas->estado;
    $data['NumberTable'] = $this->NumberTable;
    $data['numeracion'] = $datas->serie . '-' . $datas->numero;
    $productos = array();
    if ($this->NumberTable == 1) {
      $montototal = 0;
      $totalitems = 0;
      $posales = $this->Controlador_model->pedidotemporal($this->venta);
      foreach ($posales as $posale) {
        $montototal += ($posale->precio * $posale->cantidad);
        $totalitems += $posale->cantidad;
        $productos[] = $posale->producto;
      }
      $data['totalitems'] = $totalitems;
      $data['montototal'] = number_format($montototal, 2);
      $data['montoactual'] = number_format($montototal, 2);
    } else {
      $data['totalitems'] = $datas->totalitems;
      $data['montototal'] = $datas->montototal;
      $data['montoactual'] = $datas->montoactual;
    }
    $data['cliente'] = $datas->cliente;
    $data['nombrecompleto'] = $cliente->documento . ' | ' . $cliente->nombre . ' ' . $cliente->apellido;
    $data['productos'] = $productos;
    echo json_encode($data);
  }

  public function ajax_updateventaCuentaNueva()
  {
    $datas = $this->Controlador_model->get($this->input->post('venta'), 'venta');
    $cliente = $this->Controlador_model->get($datas->cliente, 'cliente');
    $usuario = $this->Controlador_model->get($datas->usuario, 'usuario');

    $data['tipoventa'] = $datas->tipoventa;
    $data['formapago'] = $datas->formapago;
    $data['estado'] = $datas->estado;
    $data['numeracion'] = $datas->serie . '-' . $datas->numero;

    $data['totalitems'] = $datas->totalitems;
    $data['montototal'] = $datas->montototal;
    $data['montoactual'] = $datas->montoactual;

    $data['cliente'] = $datas->cliente;
    $data['nombrecompleto'] = $cliente->documento . ' | ' . $cliente->nombre . ' ' . $cliente->apellido;
    $data['venta'] = $this->input->post('venta');

    echo json_encode($data);
  }



  private function _validatecliente()
  {
    $data = array();
    $data['error_string'] = array();
    $data['inputerror'] = array();
    $data['status'] = TRUE;
    $detallelist = $this->Controlador_model->check($this->input->post('documento'));

    if ($this->input->post('documento') == '') {
      $data['inputerror'][] = 'documento';
      $data['error_string'][] = 'Este campo es obligatorio.';
      $data['status'] = FALSE;
    }

    if ($this->input->post('nombre') == '') {
      $data['inputerror'][] = 'nombre';
      $data['error_string'][] = 'Este campo es obligatorio.';
      $data['status'] = FALSE;
    }

    if ($detallelist) {
      $data['inputerror'][] = 'documento';
      $data['error_string'][] = 'Este campo ya existe en la base de datos.';
      $data['status'] = FALSE;
    }

    if ($data['status'] === FALSE) {
      echo json_encode($data);
      exit();
    }
  }

  public function ajax_addcliente()
  {
    $this->_validatecliente();
    $data['tipodocumento'] = $this->input->post('tipo');
    $data['documento'] = $this->input->post('documento');
    $data['nombre'] = $this->input->post('nombre');
    $data['apellido'] = $this->input->post('apellido');
    $data['direccion'] = $this->input->post('direccion');
    $data['telefono'] = $this->input->post('telefono');
    $data['nacimiento'] = $this->input->post('tipo') == 'dni' ? $this->input->post('nacimiento') : NULL;
    $ultimo = $this->Controlador_model->save('cliente', $data);
    $venta['cliente'] = $ultimo;
    $this->Controlador_model->update(array('id' => $this->venta), $venta, 'venta');
    $recoverCliente = $this->Controlador_model->get($ultimo, 'cliente');
    $cliente = $recoverCliente->id;
    $clientes = $recoverCliente->documento . ' | ' . $recoverCliente->nombre . ' ' . $recoverCliente->apellido;
    echo json_encode(array('status' => TRUE, 'cliente' => $cliente, 'clientes' => $clientes));
  }

  function _validatecliente3()
  {
    $data = array();
    $data['error_string'] = array();
    $data['inputerror'] = array();
    $data['status'] = TRUE;
    $detallelist = $this->Controlador_model->check($this->input->post('documento3'));

    if ($this->input->post('documento3') == '') {
      $data['inputerror'][] = 'documento3';
      $data['error_string'][] = 'Este campo es obligatorio.';
      $data['status'] = FALSE;
    }

    if ($this->input->post('nombre3') == '') {
      $data['inputerror'][] = 'nombre3';
      $data['error_string'][] = 'Este campo es obligatorio.';
      $data['status'] = FALSE;
    }

    if ($detallelist) {
      $data['inputerror'][] = 'documento3';
      $data['error_string'][] = 'Este campo ya existe en la base de datos.';
      $data['status'] = FALSE;
    }

    if ($data['status'] === FALSE) {
      echo json_encode($data);
      exit();
    }
  }

  public function ajax_addcliente3($idventa)
  {
    $this->_validatecliente3();
    $data['tipodocumento'] = $this->input->post('tipo3');
    $data['documento'] = $this->input->post('documento3');
    $data['nombre'] = $this->input->post('nombre3');
    $data['apellido'] = $this->input->post('apellido3');
    $data['direccion'] = $this->input->post('direccion3');
    $data['telefono'] = $this->input->post('telefono3');
    $data['nacimiento'] = $this->input->post('tipo3') == 'dni' ? $this->input->post('nacimiento3') : NULL;
    $ultimo = $this->Controlador_model->save('cliente', $data);
    if ($ultimo) {
      $venta['cliente'] = $ultimo;
      $this->Controlador_model->update(array('id' => $idventa), $venta, 'venta');
      $recoverCliente = $this->Controlador_model->get($ultimo, 'cliente');

      $cliente = $recoverCliente->id;
      $clientes = $recoverCliente->documento . ' | ' . $recoverCliente->nombre . ' ' . $recoverCliente->apellido;
      echo json_encode(array('status' => TRUE, 'cliente' => $cliente, 'clientes' => $clientes));
    }
  }

  public function _validatecliente2()
  {
    $data = array();
    $data['error_string'] = array();
    $data['inputerror'] = array();
    $data['status'] = TRUE;
    $detallelist = $this->Controlador_model->check($this->input->post('documento2'));

    if ($this->input->post('documento2') == '') {
      $data['inputerror'][] = 'documento2';
      $data['error_string'][] = 'Este campo es obligatorio.';
      $data['status'] = FALSE;
    }

    if ($this->input->post('nombre2') == '') {
      $data['inputerror'][] = 'nombre2';
      $data['error_string'][] = 'Este campo es obligatorio.';
      $data['status'] = FALSE;
    }

    if ($detallelist) {
      $data['inputerror'][] = 'documento2';
      $data['error_string'][] = 'Este campo ya existe en la base de datos.';
      $data['status'] = FALSE;
    }

    if ($data['status'] === FALSE) {
      echo json_encode($data);
      exit();
    }
  }

  public function ajax_addcliente2()
  {
    $this->_validatecliente2();
    $data['tipodocumento'] = $this->input->post('tipo2');
    $data['documento'] = $this->input->post('documento2');
    $data['nombre'] = $this->input->post('nombre2');
    $data['apellido'] = $this->input->post('apellido2');
    $data['direccion'] = $this->input->post('direccion2');
    $data['telefono'] = $this->input->post('telefono');
    $data['fecha_nacimiento'] = $this->input->post('fecha_nacimiento2');

    $ultimo = $this->Controlador_model->save('cliente', $data);
    $recoverCliente = $this->Controlador_model->get($ultimo, 'cliente');
    $cliente = $recoverCliente->id;
    $clientes = $recoverCliente->documento . ' | ' . $recoverCliente->nombre . ' ' . $recoverCliente->apellido;
    echo json_encode(array('status' => TRUE, 'cliente' => $cliente, 'clientes' => $clientes));
  }

  public function ajax_addproductolibre()
  {
    $data['nombre'] = $this->input->post('nombre');
    $data['precioventa'] = $this->input->post('precioventa');
    $data['categoria'] = 14;
    $data['empresa'] = $this->empresa;
    $data['tipo'] = '1';
    $data['unidad'] = 'UND';
    $producto = $this->Controlador_model->save('producto', $data);
    if ($producto > 0) {
      $productos = $this->Controlador_model->get($producto, 'producto');
      echo json_encode(array('status' => TRUE, 'producto' => $productos->id, 'venta' => $this->venta, 'categoria' => 14, 'precio' => $productos->precioventa));
    } else {
      echo json_encode(array('status' => FALSE));
    }
  }

  private function _validatprocesar()
  {
    $data = array();
    $data['error_string'] = array();
    $data['inputerror'] = array();
    $data['status'] = TRUE;
    $contador = $this->Controlador_model->contador($this->venta);
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    $cliente = $this->Controlador_model->get($venta->cliente, 'cliente');
    $datapago = $this->input->post('totalpagar') - $this->input->post('descuento');

    /* if ($this->input->post('pago') < $datapago) {
      $data['inputerror'][] = 'pago';
      $data['error_string'][] = 'No puedes cancelar la venta con el monto insertado';
      $data['status'] = FALSE;
    } */

    if ($this->input->post('fecha') == '') {
      $data['inputerror'][] = 'fecha';
      $data['error_string'][] = 'Este campo es obligatorio.';
      $data['status'] = FALSE;
    }

    if ($contador == 0) {
      $data['inputerror'][] = 'pago';
      $data['error_string'][] = 'Debe agregar productos para poder procesar.';
      $data['status'] = FALSE;
    }

    if ($venta->tipoventa == 'FACTURA' && $cliente->tipodocumento == 'DNI') {
      $data['inputerror'][] = 'pago';
      $data['error_string'][] = 'Debe agregar cliente con RUC.';
      $data['status'] = FALSE;
    }

    if ($venta->tipoventa == 'BOLETA' && $cliente->tipodocumento == 'RUC') {
      $data['inputerror'][] = 'pago';
      $data['error_string'][] = 'Debe agregar cliente con DNI.';
      $data['status'] = FALSE;
    }

    if ($this->input->post('formapago') == 'CONTADO') {
      if ($this->input->post('metodopago') == 'EFECTIVO') {
        if ($this->input->post('pago') == '') {
          $data['inputerror'][] = 'pago';
          $data['error_string'][] = 'Este campo es obligatorio.';
          $data['status'] = FALSE;
        }
      } else {
        /*
         * if ($this->input->post('operacion') == '') {
         *   $data['inputerror'][] = 'operacion';
         *   $data['error_string'][] = 'Este campo es obligatorio.';
         *   $data['status'] = FALSE;
         * }
         */
      }
    }

    if ($data['status'] === FALSE) {
      echo json_encode($data);
      exit();
    }
  }

  private function _validatprocesarrapido()
  {
    $data = array();
    $data['error_string'] = array();
    $data['inputerror'] = array();
    $data['status'] = TRUE;
    $contador = $this->Controlador_model->contador($this->input->post('idapagar'));
    $venta = $this->Controlador_model->get($this->input->post('idapagar'), 'venta');
    $cliente = $this->Controlador_model->get($venta->cliente, 'cliente');
    $monto = $this->input->post('totalpagar') - $this->input->post('descuento');

    /* if ($this->input->post('pago') < $monto) {
      $data['inputerror'][] = 'pagorapido';
      $data['error_string'][] = 'No puedes cancelar la venta con el monto insertado';
      $data['status'] = FALSE;
    } */

    if ($this->input->post('fecha') == '') {
      $data['inputerror'][] = 'fecha';
      $data['error_string'][] = 'Este campo es obligatorio.';
      $data['status'] = FALSE;
    }

    if ($contador == 0) {
      $data['inputerror'][] = 'pago';
      $data['error_string'][] = 'Debe agregar productos para poder procesar.';
      $data['status'] = FALSE;
    }

    if ($venta->tipoventa == 'FACTURA' && $cliente->tipodocumento == 'DNI') {
      $data['inputerror'][] = 'pago';
      $data['error_string'][] = 'Debe agregar cliente con RUC.';
      $data['status'] = FALSE;
    }

    if ($venta->tipoventa == 'BOLETA' && $cliente->tipodocumento == 'RUC') {
      $data['inputerror'][] = 'pago';
      $data['error_string'][] = 'Debe agregar cliente con DNI.';
      $data['status'] = FALSE;
    }

    if ($this->input->post('formapago') == 'CONTADO') {
      if ($this->input->post('metodopago') == 'EFECTIVO') {
        if ($this->input->post('pago') == '') {
          $data['inputerror'][] = 'pago';
          $data['error_string'][] = 'Este campo es obligatorio.';
          $data['status'] = FALSE;
        }
      } else {
        /*
         * if ($this->input->post('operacion') == '') {
         *   $data['inputerror'][] = 'operacion';
         *   $data['error_string'][] = 'Este campo es obligatorio.';
         *   $data['status'] = FALSE;
         * }
         */
      }
    }

    if ($data['status'] === FALSE) {
      echo json_encode($data);
      exit();
    }
  }

  public function AddNewSalerapido()
  {
    $this->_validatprocesarrapido();
    $idventa = $this->input->post('idapagar');
    $venta = $this->Controlador_model->get($idventa, 'venta');

    if ($venta->estado == 1) {
      redirect($this->url);
    }
    $consumo = $this->input->post('is_consumo');
    /* if ($consumo) {
      $dataventa['consumo'] = '1';
    } else {
      $dataventa['consumo'] = '0';
    } */
    $dataventa['consumo'] = $consumo ? '1' : '0';

    if ($venta->consecutivo == 0) {
      $empresa = $this->Controlador_model->get($venta->empresa, 'empresa');
      $serie = substr($venta->tipoventa, 0, 1) . substr($empresa->serie, 1, 3);
      $numero = $this->Controlador_model->codigos($venta->tipoventa, $serie);
      $numeros = $numero ? $numero->consecutivo + 1 : 1;
      $cadena = '';
      for ($i = 0; $i < 6 - strlen($numeros); $i++) {
        $cadena = $cadena . '0';
      }

      $dataventa['serie'] = $serie;
      $dataventa['numero'] = $cadena . $numeros;
      $dataventa['consecutivo'] = $numeros;
    }

    $efectivo_completo = TRUE;
    $montopago = ($this->input->post('pago') + $this->input->post('descuento'));
    $dataventa['descuento'] = $venta->descuento + $this->input->post('descuento');
    if ($this->input->post('formapago') == 'CONTADO') {
      $deudaactual = $venta->montoactual - $this->input->post('descuento');
      if ($this->input->post('pago') >= $deudaactual) {
        $efectivo_completo = TRUE;
        $dataingreso['monto'] = $venta->montoactual - $this->input->post('descuento');

        // $dataventa['serie'] = $serie;
        // $dataventa['numero'] = $cadena . $numeros;
        // $dataventa['consecutivo'] = $numeros;
        $dataventa['vence'] = date('Y-m-d');
        $dataventa['montoactual'] = 0;
        $dataventa['estado'] = '1';

        $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
        if (!$mesa->is_temporal) {
          $datamesa['estado'] = '0';
          $datamesa['time'] = '';
          $datamesa['checked'] = '';
          $datamesa['open_by'] = '0';
          $this->Controlador_model->update(array('id' => $venta->mesa), $datamesa, 'mesa');
        } else {
          $dataventa['mesa'] = NULL;
          $this->Controlador_model->update(array('id' => $idventa), array('mesa' => NULL), 'venta');
          $this->Controlador_model->delete_by_id($mesa->id, 'mesa');
        }
      } else {
        $efectivo_completo = FALSE;
        $dataingreso['monto'] = $this->input->post('pago');

        $dataventa['montoactual'] = $venta->montoactual - $this->input->post('pago') - $this->input->post('descuento');
        $dataventa['vence'] = date('Y-m-d');
      }

      if ($this->input->post('metodopago') == 'EFECTIVO') {
        $dataventa['pago'] = $venta->pago + $this->input->post('pago');
      } else {
        $dataventa['pago'] = $venta->pago;
      }

      $dataingreso['empresa'] = $this->empresa;
      $dataingreso['usuario'] = $this->usuario;
      $dataingreso['concepto'] = $this->tipoconcepto($this->input->post('metodopago'));  // 3;3;
      $dataingreso['caja'] = $this->caja;
      $dataingreso['venta'] = $idventa;
      $dataingreso['metodopago'] = $this->input->post('metodopago');
      $dataingreso['tipotarjeta'] = $this->input->post('tipotarjeta');
      // $dataingreso['operacion'] = $this->input->post('operacion');
      $dataingreso['created'] = date('Y-m-d');
      $this->Controlador_model->save('ingreso', $dataingreso);
    } else {
      // $dataventa['serie'] = $serie;
      // $dataventa['numero'] = $cadena . $numeros;
      // $dataventa['consecutivo'] = $numeros;
      $dataventa['montoactual'] = $venta->montoactual - $this->input->post('descuento');
      $dataventa['estado'] = '1';
      $dataventa['vence'] = $this->input->post('vence');

      $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
      if (!$mesa->is_temporal) {
        $datamesa['estado'] = '0';
        $datamesa['time'] = '';
        $datamesa['checked'] = '';
        $datamesa['open_by'] = '0';
        $this->Controlador_model->update(array('id' => $venta->mesa), $datamesa, 'mesa');
      } else {
        $dataventa['mesa'] = NULL;
        $this->Controlador_model->update(array('id' => $idventa), array('mesa' => NULL), 'venta');
        $this->Controlador_model->delete_by_id($mesa->id, 'mesa');
      }
    }

    $dataventa['formapago'] = $this->input->post('formapago');
    $dataventa['created'] = $this->input->post('fecha');
    $dataventa['hora'] = date('H:i:s');

    $this->Controlador_model->update(array('id' => $idventa), $dataventa, 'venta');

    if ($this->input->post('formapago') == 'CONTADO') {
      // TODO: ---------------------algoritmo pago por partes de la deuda----------------------------
      $ventadetalleDeuda = $this->Controlador_model->ventadetalleDeuda($idventa);
      if ($efectivo_completo) {
        foreach ($ventadetalleDeuda as $value) {
          if ($montopago > 0) {
            if ($montopago > $value->subtotal) {
              $DataVentaDetalle['estadopago'] = '1';
              $montopago = $montopago - $value->subtotal;
            } else {
              if (($value->subtotal - $montopago) == '0') {
                $DataVentaDetalle['estadopago'] = '1';
              } else {
                $DataVentaDetalle['estadopago'] = '0';
              }
              $montopago = 0;
            }
            $this->Controlador_model->update(array('id' => $value->id), $DataVentaDetalle, 'ventadetalle');
          }
        }
      } else {
        foreach ($ventadetalleDeuda as $value) {
          $this->Controlador_model->update(['id' => $value->id], ['estadopago' => '1'], 'ventadetalle');
        }
      }
      // TODO: -----------------------------------------------------------------
    }

    $queryDeuda = $this->db->where('estadopago', '0')->where('venta', $idventa)->get('ventadetalle')->num_rows();
    if ($queryDeuda > 0) {
      $deudaEstado = TRUE;
    } else {
      $ventax = $this->Controlador_model->get($idventa, 'venta');
      if ($ventax->montoactual > 0)
        $deudaEstado = TRUE;
      else
        $deudaEstado = FALSE;
    }

    echo json_encode(array(
      'status' => TRUE,
      'querydeuda' => $deudaEstado,
      'formapago' => $this->input->post('formapago'),
      'ecompleto' => $efectivo_completo,
    ));
  }

  public function AddNewSale()
  {
    $this->_validatprocesar();
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    if ($venta->estado == 1) {
      redirect($this->url);
    }
    // $consumo = $this->input->post('is_consumo');
    $dataventa['consumo'] = $this->input->post('is_consumo') ? '1' : '0';

    $empresa = $this->Controlador_model->get($venta->empresa, 'empresa');
    $serie = substr($venta->tipoventa, 0, 1) . substr($empresa->serie, 1, 3);
    $numero = $this->Controlador_model->codigos($venta->tipoventa, $serie);
    $numeros = $numero ? $numero->consecutivo + 1 : 1;
    $cadena = '';
    for ($i = 0; $i < 6 - strlen($numeros); $i++) {
      $cadena = $cadena . '0';
    }

    $montopago = ($this->input->post('pago') + $this->input->post('descuento'));

    if ($this->input->post('formapago') == 'CONTADO') {
      $deudaactual = $venta->montoactual - $this->input->post('descuento');
      if ($this->input->post('pago') >= $deudaactual) {
        $dataventa['descuento'] = $venta->descuento + $this->input->post('descuento');
        $dataventa['serie'] = $serie;
        $dataventa['numero'] = $cadena . $numeros;
        $dataventa['consecutivo'] = $numeros;
        $dataventa['vence'] = date('Y-m-d');
        $dataventa['montoactual'] = 0;
        $dataventa['estado'] = '1';

        $dataingreso['monto'] = $venta->montoactual - $this->input->post('descuento');

        $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
        if (!$mesa->is_temporal) {
          $datamesa['estado'] = '0';
          $datamesa['time'] = '';
          $datamesa['checked'] = '';
          $datamesa['open_by'] = '0';
          $this->Controlador_model->update(array('id' => $venta->mesa), $datamesa, 'mesa');  // desactivado para probar
        } else {
          $dataventa['mesa'] = NULL;
          $this->Controlador_model->update(array('id' => $this->venta), array('mesa' => NULL), 'venta');
          $this->Controlador_model->delete_by_id($mesa->id, 'mesa');  // desactivado para probar
        }
      } else {
        $dataingreso['monto'] = $this->input->post('pago');
        $dataventa['montoactual'] = $venta->montoactual - $this->input->post('pago');
      }

      if ($this->input->post('metodopago') == 'EFECTIVO') {
        $dataventa['pago'] = $venta->pago + $this->input->post('pago');
      } else {
        $dataventa['pago'] = $venta->pago;
      }

      $dataingreso['empresa'] = $this->empresa;
      $dataingreso['usuario'] = $this->usuario;
      $dataingreso['concepto'] = $this->tipoconcepto($this->input->post('metodopago'));  // 3;3;
      $dataingreso['caja'] = $this->caja;
      $dataingreso['venta'] = $this->venta;
      $dataingreso['metodopago'] = $this->input->post('metodopago');
      $dataingreso['tipotarjeta'] = $this->input->post('tipotarjeta');
      $dataingreso['operacion'] = $this->input->post('operacion');
      $dataingreso['hora'] = date('H:i:s');
      $dataingreso['created'] = date('Y-m-d');
      $this->Controlador_model->save('ingreso', $dataingreso);  // desactivado para probar
    } else {
      $dataventa['serie'] = $serie;
      $dataventa['numero'] = $cadena . $numeros;
      $dataventa['consecutivo'] = $numeros;
      $dataventa['montoactual'] = $venta->montoactual - $this->input->post('descuento');
      $dataventa['estado'] = '1';
      $dataventa['vence'] = $this->input->post('vence');
      $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
      if (!$mesa->is_temporal) {
        $datamesa['estado'] = '0';
        $datamesa['time'] = '';
        $datamesa['checked'] = '';
        $datamesa['open_by'] = '0';
        $this->Controlador_model->update(array('id' => $venta->mesa), $datamesa, 'mesa');  // desactivado para probar
      } else {
        $dataventa['mesa'] = NULL;
        $this->Controlador_model->update(array('id' => $this->venta), array('mesa' => NULL), 'venta');
        $this->Controlador_model->delete_by_id($mesa->id, 'mesa');  // desactivado para probar
      }
    }

    $dataventa['formapago'] = $this->input->post('formapago');
    $dataventa['created'] = $this->input->post('fecha');
    $dataventa['hora'] = date('H:i:s');

    $this->Controlador_model->update(array('id' => $this->venta), $dataventa, 'venta');  // desactivado para probar

    if ($this->input->post('formapago') == 'CONTADO') {
      // TODO: ---------------------algoritmo pago por partes de la deuda----------------------------
      $ventadetalleDeuda = $this->Controlador_model->ventadetalleDeuda($this->venta);
      foreach ($ventadetalleDeuda as $value) {
        if ($montopago > 0) {
          if ($montopago > $value->subtotal) {
            $DataVentaDetalle['estadopago'] = '1';
            $montopago = $montopago - $value->subtotal;
          } else {
            if (($value->subtotal - $montopago) == '0') {
              $DataVentaDetalle['estadopago'] = '1';
            } else {
              $DataVentaDetalle['estadopago'] = '0';
            }
            $montopago = 0;
          }
          $this->Controlador_model->update(array('id' => $value->id), $DataVentaDetalle, 'ventadetalle');  // desactivado para probar
        }
      }
      // TODO: -----------------------------------------------------------------
    }

    $queryDeuda = $this->db->where('estadopago', '0')->where('venta', $this->venta)->get('ventadetalle')->num_rows();
    $deudaEstado = $queryDeuda > 0 ? TRUE : FALSE;

    echo json_encode([
      'status' => TRUE,
      'querydeuda' => $deudaEstado,
      'formapago' => $this->input->post('formapago'),
      // 'tipopago' => 'unico',
      // 'venta' => $venta,
      // 'montovd' => $montovd,
      // 'ventanuevo' => $dataventa,
      // 'ingreso' => $dataingreso,
    ]);
  }

  public function verificarModo() {}

  public function printfcomprobante()
  {
    $idventa = $this->input->post('idventa');
    $venta = $this->Controlador_model->get($idventa, 'venta');
    $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
    $empresa = $this->Controlador_model->get($venta->empresa, 'empresa');
    $usuario = $this->Controlador_model->get($venta->usuario, 'usuario');
    $cliente = $this->Controlador_model->get($venta->cliente, 'cliente');

    $ticket = $this->_build_receipt_html($venta, $cliente, $empresa);
    $fotter = $this->_build_footer_html($venta, $empresa);
    $dataWhatApp = $this->_build_whatsapp_html($venta, $cliente);

    echo json_encode(['html' => $ticket, 'fotter' => $fotter, 'dataWhatApp' => $dataWhatApp]);
  }

  public function data_printfcomprobanterapido()
  {
    $idventa = $this->input->post('idventa');
    $venta = $this->Controlador_model->get($idventa, 'venta');
    $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
    $empresa = $this->Controlador_model->get($venta->empresa, 'empresa');
    $usuario = $this->Controlador_model->get($venta->usuario, 'usuario');
    $cliente = $this->Controlador_model->get($venta->cliente, 'cliente');

    $ticket = $this->_build_receipt_html($venta, $cliente, $empresa);
    $fotter = $this->_build_footer_html($venta, $empresa);
    $msjWP = $this->_build_whatsapp_html($venta, $cliente);

    echo json_encode(['html' => $ticket, 'fotter' => $fotter, 'msjWP' => $msjWP]);
  }

  function printfcomprobante_CD()
  {
    $idventa = $this->input->post('venta');
    $venta = $this->Controlador_model->get($idventa, 'venta');
    $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
    $empresa = $this->Controlador_model->get($venta->empresa, 'empresa');
    $usuario = $this->Controlador_model->get($venta->usuario, 'usuario');
    $cliente = $this->Controlador_model->get($venta->cliente, 'cliente');

    $ticket = $this->_build_receipt_html($venta, $cliente, $empresa);

    $fotter = $this->_build_footer_html($venta, $empresa);
    $wp = $this->_build_whatsapp_html($venta, $cliente);

    echo json_encode(['html' => $ticket, 'fotter' => $fotter, 'wp' => $wp]);
  }

  private function _build_receipt_html($venta, $cliente, $empresa)
  {
    $logo_path = ($empresa && $empresa->logo && $empresa->logo != '5dda8da7287e07792b4ce7094f1270c6.png') 
                 ? base_url() . 'files/Setting/' . $empresa->logo 
                 : base_url() . 'assets/adminlte/logo/logo.png';

    $ticket = '<div class="receipt-container" style="font-family: \'Inter\', sans-serif; color: #1e293b; width: 100%; margin: 0 auto;">
                <div class="text-center mb-4">
                  <div style="margin-bottom: 15px;">
                    <img src="' . $logo_path . '" alt="Logo" style="height: 60px; object-fit: contain; filter: drop-shadow(0 4px 6px rgba(0,0,0,0.1));">
                  </div>
                  <h4 style="font-weight: 800; margin-bottom: 5px; color: #0f172a; font-size: 24px;">Venta Núm: ' . $venta->serie . '-' . $venta->numero . '</h4>
                  <div style="font-size: 14px; color: #64748b;">' . date('d/m/Y H:i', strtotime($venta->created)) . '</div>
                </div>
                
                <div class="mb-4" style="font-size: 15px; padding: 15px; background: #f1f5f9; border-radius: 12px; display: flex; justify-content: space-between; align-items: center;">
                  <div><span style="font-weight: 600; color: #475569;">Cliente:</span> ' . ($cliente ? $cliente->nombre : 'PUBLICO GENERAL') . '</div>
                  <div><span style="font-weight: 600; color: #475569;">DNI/RUC:</span> ' . ($cliente ? $cliente->documento : '---------') . '</div>
                </div>

                <table style="width: 100%; border-collapse: separate; border-spacing: 0 4px; text-align: left;">
                  <thead>
                    <tr style="font-size: 12px; text-transform: uppercase; color: #94a3b8; font-weight: 800;">
                      <th style="padding: 10px 0; border-bottom: 2px solid #f1f5f9;">Item / Descripción</th>
                      <th style="text-align: center; padding: 10px 0; border-bottom: 2px solid #f1f5f9;">Cant</th>
                      <th style="text-align: right; padding: 10px 0; border-bottom: 2px solid #f1f5f9;">Precio</th>
                      <th style="text-align: right; padding: 10px 0; border-bottom: 2px solid #f1f5f9;">Total</th>
                    </tr>
                  </thead>
                  <tbody>';

    if ($venta->consumo == '1') {
      $ticket .= '
                  <tr>
                    <td style="padding: 12px 0; font-weight: 500;">Por consumo</td>
                    <td style="padding: 12px 0; text-align: center;">1</td>
                    <td style="padding: 12px 0; text-align: right;">' . number_format($venta->montototal, 2) . '</td>
                    <td style="padding: 12px 0; text-align: right; font-weight: 700;">' . number_format(($venta->montototal), 2) . '</td>
                  </tr>';
    } else {
      $ventadetalle = $this->Controlador_model->pedidodetalle($venta->id);
      foreach ($ventadetalle as $key => $value) {
        $textoproducto = ($value->variante == FALSE or is_null($value->variante)) 
                          ? $value->nombre 
                          : $value->nombre . " <small style='color: #2563eb;'>(" . $value->nombrevariante . ")</small>";

        $ticket .= '
                  <tr>
                    <td style="padding: 12px 0; font-weight: 500; font-size: 15px;">' . $textoproducto . '</td>
                    <td style="padding: 12px 0; text-align: center; font-size: 15px;">' . $value->cantidad . '</td>
                    <td style="padding: 12px 0; text-align: right; font-size: 15px;">' . number_format($value->precio, 2) . '</td>
                    <td style="padding: 12px 0; text-align: right; font-weight: 700; font-size: 15px;">' . number_format($value->cantidad * $value->precio, 2) . '</td>
                  </tr>';
      }
    }

    $ticket .= '</tbody></table>
                <div style="margin-top: 20px; padding-top: 20px; border-top: 2px solid #f1f5f9;">
                  <div style="display: flex; justify-content: flex-end; gap: 40px;">
                    <div style="text-align: right;">
                      <div style="color: #64748b; font-size: 13px; font-weight: 600;">Subtotal</div>
                      <div style="font-weight: 700; font-size: 16px;">S/ ' . number_format($venta->montototal + $venta->descuento, 2) . '</div>
                    </div>
                    <div style="text-align: right;">
                      <div style="color: #ef4444; font-size: 13px; font-weight: 600;">Descuento</div>
                      <div style="font-weight: 700; font-size: 16px; color: #ef4444;">-S/ ' . number_format($venta->descuento, 2) . '</div>
                    </div>
                    <div style="text-align: right; padding-left: 20px; border-left: 2px solid #f1f5f9;">
                      <div style="color: #2563eb; font-size: 14px; font-weight: 800; text-transform: uppercase;">Total a Pagar</div>
                      <div style="font-weight: 800; font-size: 28px; color: #2563eb;">S/ ' . number_format($venta->montototal, 2) . '</div>
                    </div>
                  </div>
                </div>

                <div style="margin-top: 25px; padding: 20px; background: #f8fafc; border-radius: 16px; border: 1px solid #f1f5f9;">
                  <div style="display: flex; flex-wrap: wrap; gap: 20px;">';
    
    $pagos = $this->Controlador_model->pagos($venta->id);
    $vuelto = 0;
    foreach ($pagos as $value) {
      if ($value->metodopago == 'EFECTIVO') {
        $vuelto = $venta->pago - $value->monto;
      }
      $ticket .= '
                    <div style="flex: 1; min-width: 140px;">
                      <div style="color: #64748b; font-size: 12px; font-weight: 600;">Pago (' . $value->metodopago . ')</div>
                      <div style="font-weight: 700; font-size: 16px;">S/ ' . number_format($value->monto, 2) . '</div>
                    </div>';
    }

    $ticket .= '
                    <div style="flex: 1; min-width: 140px; border-left: 1px dashed #cbd5e1; padding-left: 20px;">
                      <div style="color: #64748b; font-size: 12px; font-weight: 600;">Recibido</div>
                      <div style="font-weight: 700; font-size: 16px;">S/ ' . number_format($venta->pago, 2) . '</div>
                    </div>
                    <div style="flex: 1; min-width: 140px; background: #ecfdf5; padding: 10px; border-radius: 10px; border: 1px solid #bbf7d0;">
                      <div style="color: #059669; font-size: 12px; font-weight: 700; text-transform: uppercase;">Vuelto</div>
                      <div style="font-weight: 800; font-size: 18px; color: #059669;">S/ ' . number_format($vuelto, 2) . '</div>
                    </div>
                  </div>
                </div>
              </div>';
    return $ticket;
  }

  private function _build_whatsapp_html($venta, $cliente)
  {
    return '<div class="whatsapp-integration" style="padding: 10px 25px 30px;">
              <div class="input-group" style="background: #f0fdf4; border: 2px solid #bbf7d0; border-radius: 16px; overflow: hidden; padding: 4px; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);">
                <span class="input-group-addon" style="background: transparent; border: none; color: #166534; font-weight: 800; padding: 0 15px; font-size: 16px;">+51</span>
                <input type="text" id="telefonoWP" value="' . ($cliente->telefono ? $cliente->telefono : '') . '" class="form-control" style="background: transparent; border: none; font-weight: 700; color: #166534; box-shadow: none; height: 50px; font-size: 18px;" placeholder="999999999">
                <span class="input-group-btn">
                  <button class="btn btn-success" onclick="sentTicketWA2(' . $venta->id . ')" type="button" style="border-radius: 12px; width: 60px; height: 46px; display: flex; align-items: center; justify-content: center; margin: 2px; background: #22c55e; border: none; transition: all 0.2s ease;">
                    <i class="fab fa-whatsapp" style="font-size: 24px;"></i>
                  </button>
                </span>
              </div>
            </div>';
  }

  private function _build_footer_html($venta, $empresa)
  {
    return '
      <div style="display: flex; gap: 12px; width: 100%; padding: 0 10px;">
        <button type="button" class="btn-modal-dismiss" style="flex: 1; margin: 0;" data-dismiss="modal" onclick="location.reload()">
          <i class="fas fa-times mr-2"></i> CERRAR
        </button>
        <button type="button" class="btn-modal-action" style="flex: 2; margin: 0;" onclick="imprimircomprobante(' . $empresa->tipoimpresora . ',' . $venta->id . ' )" id="btncomprobante">
          <i class="fas fa-print mr-2"></i> IMPRIMIR COMPROBANTE
        </button>
      </div>';
  }

  public function CloseRegister()
  {
    $c = 0;
    $mesasAbiertas = '';
    /* foreach ($this->Controlador_model->getAll('mesa') as $mesa) {
      if ($mesa->estado != "0" && $mesa->empresa == $this->empresa) {
        $c++;
        $mesasAbiertas .= "*" . $mesa->nombre . "\n";
      }
    } */
    if ($c == 0) {
      $empresa = $this->Controlador_model->get($this->empresa, 'empresa');
      $registro = $this->Controlador_model->get($this->caja, 'caja');
      $usuario = $this->Controlador_model->get($registro->usuario, 'usuario');
      $sales = $this->Controlador_model->getCaja($this->caja, 'venta');
      $payaments = $this->Controlador_model->getCaja($this->caja, 'ingreso');
      $expences = $this->Controlador_model->getCaja($this->caja, 'egreso');
      $desc = 0;
      $cash = 0;
      $cc = 0;
      $cy = 0;
      $cp = 0;
      $ct = 0;
      $cont = 0;
      $cred = 0;
      $gasto = 0;
      foreach ($payaments as $payament) {
        if ($payament->metodopago == 'EFECTIVO') {
          $cash += $payament->monto;
        } else if ($payament->metodopago == 'TARJETA') {
          $cc += $payament->monto;
        } else if ($payament->metodopago == 'YAPE') {
          $cy += $payament->monto;
        } elseif ($payament->metodopago == 'PLIN') {
          $cp += $payament->monto;
        } else if ($payament->metodopago == 'TRANSFERENCIA') {
          $ct += $payament->monto;
        } else {
        }
      }
      foreach ($sales as $sale) {
        if ($sale->estado == '1') {
          if ($sale->formapago == 'CONTADO') {
            $cont += $sale->montototal;
            $desc += $sale->descuento;
          } else {
            $cred += $sale->montototal;
          }
        }
      }
      foreach ($expences as $expence) {
        $gasto += $expence->montototal;
      }
      /* ' . strtoupper($registro->descripcion) . ' */
      $data = '<div class="col-md-3"><blockquote><footer>ENCARGADO</footer><p>' . $usuario->nombre . '</p></blockquote></div>
      <div class="col-md-3"><blockquote><footer>SALDO EFECTIVO</footer><p>' . number_format($cash, 2) . ' SOLES</p></blockquote></div>
      <div class="col-md-4"><blockquote><footer>FECHA DE APERTURA</footer><p>' . $registro->apertura . '</p></blockquote></div>
      <div class="col-md-2"><img src="' . site_url() . '/assets/adminlte/img/register.svg" alt=""></div>
      <h2 class="text-center">RESUMEN DE CAJA DIARIO</h2>
      <table class="table table-striped"><tr><th width="25%">TIPO DE PAGO</th><th width="25%">MONTOS (Soles)</th></tr>
      <tr><td>SALDO INICIAL</td><td>' . number_format($registro->saldoinicial, 2) . '</td></tr>
      <tr><td>VENTA DIARIO</td><td>' . number_format($cont + $cred - $desc, 2) . '</td></tr>
      <tr><td>EFECTIVO</td><td>' . number_format($cash, 2) . '</td></tr>
      <tr><td>CREDITO</td><td>' . number_format($cred, 2) . '</td></tr>
      <tr><td>TARJETA</td><td>' . number_format($cc, 2) . '</td></tr>
      <tr><td>YAPE</td><td>' . number_format($cy, 2) . '</td></tr>
      <tr><td>PLIN</td><td>' . number_format($cp, 2) . '</td></tr>
      <tr><td>TRANSFERENCIA</td><td>' . number_format($ct, 2) . '</td></tr>
      <tr><td>GASTO</td><td>' . number_format($gasto, 2) . '</td></tr>
      <!--tr><td>DESCUENTO</td><td>' . number_format($desc, 2) . '</td></tr-->
      <tr class="warning"><td>TOTAL</td><td>' . number_format(($registro->saldoinicial + $cash - $gasto), 2) . '</td></tr></table>
      <input type="hidden" name="contado" id="contado" value="' . $cont . '">
      <input type="hidden" name="descuento" id="descuento" value="' . $desc . '">
      <input type="hidden" name="credito" id="credito" value="' . $cred . '">
      <input type="hidden" name="efectivo" id="efectivo" value="' . $cash . '">
      <input type="hidden" name="tarjeta" id="tarjeta" value="' . $cc . '">
      <input type="hidden" name="yape" id="yape" value="' . $cy . '">
      <input type="hidden" name="plin" id="plin" value="' . $cp . '">
      <input type="hidden" name="transferencia" id="transferencia" value="' . $ct . '">
      <input type="hidden" name="gasto" id="gasto" value="' . $gasto . '">
      <input type="hidden" name="montototalcaja" id="montototalcaja" value="' . ($registro->saldoinicial + $cash - $gasto) . '">
      <input type="hidden" name="tipoproceso" id="tipoproceso" value="1">';

      $mostrar = '
         <div class="col-md-3"><blockquote><footer>ENCARGADO</footer><p>' . $usuario->nombre . '</p></blockquote></div>
      <div class="col-md-3"><blockquote><footer>SALDO EFECTIVO</footer><p>' . number_format($cash, 2) . ' SOLES</p></blockquote></div>
      <div class="col-md-4"><blockquote><footer>FECHA DE APERTURA</footer><p>' . $registro->apertura . '</p></blockquote></div>
      <div class="col-md-2"><img src="' . site_url() . '/assets/adminlte/img/register.svg" alt=""></div>
      <h2 class="text-center">RESUMEN DE CAJA DIARIO ' . $registro->descripcion . '</h2>
       
     <input type="hidden" value="1" name="tipoproceso" id="tipoproceso">
   
     <div class="col-lg-12">
       <div class="tabs-vertical-env">
         <ul class="nav tabs-vertical">
           <li class="active">
             <a href="#procesoone" data-toggle="tab" aria-expanded="true" style="font-size:16px; font-weight:bold" onclick="cambiarproceso(1)">Proceso 1</a>
           </li>
           <li class="">
             <a href="#procesotwo" data-toggle="tab" aria-expanded="false" style="font-size:16px;font-weight:bold" onclick="cambiarproceso(0)">Proceso 2</a>
           </li>
         </ul>
   
         <div class="tab-content" style="width:100%">

           <div class="tab-pane active" id="procesoone">
             <div class="form-group text-center">
                <label>Inserte el monto total de efectivo</label>
                <input type="number" name="montototalcaja" class="form-control" id="montototalcaja" placeholder="Digitar">
                <span class="help-block"></span>
             </div>
             
          </div>
          <div class="tab-pane" id="procesotwo">
            <table class="table table-striped" >
              <tr><th>TIPO DE MONEDA (SOLES)</th><th>CANTIDAD MONEDA</th></tr>
              <tr><td>  0.10</td><td><input type="text" class="form-control" name="diezcentimos" id="diezcentimos" value="0"></td></tr>
              <tr><td>  0.20</td><td><input type="text" class="form-control" name="veintecentimos" id="veintecentimos" value="0"></td></tr>
              <tr><td>  0.50</td><td><input type="text" class="form-control" name="cincuentacentimos" id="cincuentacentimos" value="0"></td></tr>
              <tr><td>  1.00</td><td><input type="text" class="form-control" name="unsol" id="unsol" value="0"></td></tr>
              <tr><td>  2.00</td><td><input type="text" class="form-control" name="dossoles" id="dossoles" value="0"></td></tr>
              <tr><td>  5.00</td><td><input type="text" class="form-control" name="cincosoles" id="cincosoles" value="0"></td></tr>
              <tr><td> 10.00</td><td><input type="text" class="form-control" name="diezsoles" id="diezsoles" value="0"></td></tr>
              <tr><td> 20.00</td><td><input type="text" class="form-control" name="veintesoles" id="veintesoles" value="0"></td></tr>
              <tr><td> 50.00</td><td><input type="text" class="form-control" name="cincuentasoles" id="cincuentasoles" value="0"></td></tr>
              <tr><td>100.00</td><td><input type="text" class="form-control" name="ciensoles" id="ciensoles" value="0"></td></tr>
              <tr><td>200.00</td><td><input type="text" class="form-control" name="doscientossoles" id="doscientossoles" value="0"></td></tr>
            </table>   
          </div>
         </div>
       </div>
     </div>
      
      <input type="hidden" class="form-control" name="contado" id="contado" value="' . $cont . '">
      <input type="hidden" class="form-control" name="descuento" id="descuento" value="' . $desc . '">
      <input type="hidden" class="form-control" name="credito" id="credito" value="' . $cred . '">
      <input type="hidden" class="form-control" name="efectivo" id="efectivo" value="' . $cash . '">
      <input type="hidden" class="form-control" name="tarjeta" id="tarjeta" value="' . $cc . '">
      <input type="hidden" name="yape" id="yape" value="' . $cy . '">
      <input type="hidden" name="plin" id="plin" value="' . $cp . '">
      <input type="hidden" name="transferencia" id="transferencia" value="' . $ct . '">
      <input type="hidden" class="form-control" name="gasto" id="gasto" value="' . $gasto . '">';

      echo json_encode(array('data' => $data, 'status' => TRUE));
    } else {
      echo json_encode(array('data' => $mesasAbiertas, 'status' => FALSE));
    }
  }

  private function _validateCierre()
  {
    $data = array();
    $data['error_string'] = array();
    $data['inputerror'] = array();
    $data['status'] = TRUE;

    if ($this->input->post('montototalcaja') == '') {
      $data['inputerror'][] = 'montototalcaja';
      $data['error_string'][] = 'Este campo es obligatorio.';
      $data['status'] = FALSE;
    }

    if ($data['status'] === FALSE) {
      echo json_encode($data);
      exit();
    }
  }

  public function SubmitRegister()
  {
    if ($this->input->post('tipoproceso') == 1) {
      $this->_validateCierre();
    } else {
    }
    $data['contado'] = $this->input->post('contado');
    $data['descuento'] = $this->input->post('descuento');
    $data['credito'] = $this->input->post('credito');
    $data['efectivo'] = $this->input->post('efectivo');
    $data['tarjeta'] = $this->input->post('tarjeta');
    $data['yape'] = $this->input->post('yape');
    $data['plin'] = $this->input->post('plin');
    $data['transferencia'] = $this->input->post('transferencia');
    $data['gasto'] = $this->input->post('gasto');
    $data['cierre'] = date('Y-m-d H:i:s');
    $data['estado'] = '1';

    $this->Controlador_model->update(array('id' => $this->caja), $data, 'caja');

    $datamonedero['empresa'] = $this->empresa;
    $datamonedero['usuario'] = $this->usuario;
    $datamonedero['caja'] = $this->caja;
    $datamonedero['status'] = $this->input->post('tipoproceso');

    if ($this->input->post('tipoproceso') == '0') {
      $diezcentimos = $this->input->post('diezcentimos');
      $veintecentimos = $this->input->post('veintecentimos');
      $cincuentacentimos = $this->input->post('cincuentacentimos');
      $unsol = $this->input->post('unsol');
      $dossoles = $this->input->post('dossoles');
      $cincosoles = $this->input->post('cincosoles');
      $diezsoles = $this->input->post('diezsoles');
      $veintesoles = $this->input->post('veintesoles');
      $cincuentasoles = $this->input->post('cincuentasoles');
      $ciensoles = $this->input->post('ciensoles');
      $doscientossoles = $this->input->post('doscientossoles');

      $datamonedero['diezcentimos'] = $diezcentimos;
      $datamonedero['veintecentimos'] = $veintecentimos;
      $datamonedero['cincuentacentimos'] = $cincuentacentimos;
      $datamonedero['unsol'] = $unsol;
      $datamonedero['dossoles'] = $dossoles;
      $datamonedero['cincosoles'] = $cincosoles;
      $datamonedero['diezsoles'] = $diezsoles;
      $datamonedero['veintesoles'] = $veintesoles;
      $datamonedero['cincuentasoles'] = $cincuentasoles;
      $datamonedero['ciensoles'] = $ciensoles;
      $datamonedero['doscientossoles'] = $doscientossoles;
      $total = ($diezcentimos * 0.1) + ($veintecentimos * 0.2) + ($cincuentacentimos * 0.5) + ($unsol * 1) + ($dossoles * 2) + ($cincosoles * 5) + ($diezsoles * 10) + ($veintesoles * 20) + ($cincuentasoles * 50) + ($ciensoles * 100) + ($doscientossoles * 200);
      $datamonedero['montototal'] = $total;
    } else {
      $datamonedero['montototal'] = $this->input->post('montototalcaja');
    }

    $productos = $this->Controlador_model->getAll('stock');  // db->get('stock')->results();
    foreach ($productos as $value) {
      $datastockcaja['empresa'] = $this->empresa;
      $datastockcaja['caja'] = $this->caja;
      $datastockcaja['producto'] = $value->producto;
      $datastockcaja['stock'] = $value->cantidad;

      $vendido = $this->Controlador_model->productoventacaja($this->caja, $value->producto);
      $datastockcaja['vendido'] = $vendido->cantidad ? $vendido->cantidad : 0;
      $this->Controlador_model->save('stockdiario', $datastockcaja);
    }

    $this->Controlador_model->save('monedero', $datamonedero);
    $this->deleteCPETemp();
    // perfil 3 = caja
    echo json_encode(array('status' => TRUE, 'usuarioperfil' => $this->perfil));
  }

  public function stocks()  // no sirve solo de prueba
  {
    $productos = $this->Controlador_model->getAll('stock');
    foreach ($productos as $value) {
      $datastockcaja['empresa'] = $value->empresa;
      $datastockcaja['caja'] = $this->caja;
      $datastockcaja['producto'] = $value->producto;
      $datastockcaja['stock'] = $value->cantidad;

      $vendido = $this->Controlador_model->productoventacaja($this->caja, $value->producto);
      $datastockcaja['vendido'] = $vendido->cantidad ? $vendido->cantidad : 0;

      var_dump($datastockcaja);
      echo '<br>';
    }
  }

  public function ajax_updatecaja()
  {
    $datas = $this->Controlador_model->get($this->caja, 'caja');
    $empresa = $this->Controlador_model->get($datas->empresa, 'empresa');
    $data['tipoimpresora'] = $empresa->tipoimpresora;
    echo json_encode($data);
  }

  public function imprimircomanda()
  {
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
    $usuario = $this->Controlador_model->get($venta->usuario, 'usuario');
    $cliente = $this->Controlador_model->get($venta->cliente, 'cliente');
    $empresa = $this->Controlador_model->get($venta->empresa, 'empresa');
    if ($venta->estado == '0') {
      $pedidotemporal = $this->input->post('dataLS');
      $numerobebida = 0;
      $numerocomida = 0;
      foreach ($pedidotemporal as $value) {
        $producto = $this->Controlador_model->get($value['id_producto'], 'producto');
        if ($producto->categoria == 5) {
          $numerobebida++;
        } else {
          $numerocomida++;
        }
      }
      if ($numerobebida > 1000) {
        $nombre_impresora = $empresa->nombreimpresora;
        $connector = new WindowsPrintConnector($nombre_impresora);
        $printer = new Printer($connector);
        $printer->setJustification(Printer::JUSTIFY_LEFT);
        $printer->setTextSize(2, 2);
        $printer->text('------------------------------------------------' . "\n");
        $printer->text('CAJA --> BEBIDAS' . "\n");
        $printer->text(date('Y-m-d H:i:s') . "\n");
        $printer->text('------------------------------------------------' . "\n");
        $printer->text('Mesa: ' . ($mesa) ? $mesa->nombre : 'MESA TEMPORAL' . "\n");
        $printer->text('Camarera: ' . $usuario->nombre . "\n");
        $printer->text('------------------------------------------------' . "\n");
        /* Ahora vamos a imprimir los productos. Alinear a la izquierda para la cantidad y el nombre */
        $printer->setJustification(Printer::JUSTIFY_LEFT);
        $total = 0;
        foreach ($pedidotemporal as $value) {
          $total += $value['precio_producto'] * $value['cantidad'];
          $producto = $this->Controlador_model->get($value['id_producto'], 'producto');
          if ($producto->categoria == 5) {
            $printer->text($value['cantidad'] . ' UND. ' . $value['text_proudcto'] . ' ' . $value['opcion'] . "      \n");
          }
        }
        /* Terminamos de imprimir los productos, ahora va el total */
        $printer->text('------------------------------------------------' . "\n");
        /* Alimentamos el papel 3 veces */
        $printer->feed(3);
        /* Cortamos el papel. Si nuestra impresora no tiene soporte para ello, no generará ningún error */
        $printer->cut();
        /* Por medio de la impresora mandamos un pulso. Esto es útil cuando la tenemos conectada por ejemplo a un cajón */
        $printer->pulse();
        /* Para imprimir realmente, tenemos que "cerrar" la conexión con la impresora. Recuerda incluir esto al final de todos los archivos */
        $printer->close();
      }
      if ($numerocomida > 1000) {
        $nombre_impresora = $empresa->nombreimpresora;
        $connector = new WindowsPrintConnector($nombre_impresora);
        $printer = new Printer($connector);
        $printer->setJustification(Printer::JUSTIFY_LEFT);
        $printer->setTextSize(2, 2);
        // $printer->text("------------------------------------------------"."\n");
        // $printer->text("------------------------"."\n");
        $printer->text('------------------------' . "\n");
        $printer->text('CAJA --> COMIDAS' . "\n");
        $printer->text(date('Y-m-d H:i:s') . "\n");
        $printer->text('------------------------' . "\n");
        $printer->text('Mesa: ' . ($mesa) ? $mesa->nombre : 'MESA TEMPORAL' . "\n");
        $printer->text('Camarera: ' . $usuario->nombre . "\n");
        $printer->text('------------------------' . "\n");
        /* Ahora vamos a imprimir los productos. Alinear a la izquierda para la cantidad y el nombre */
        $printer->setJustification(Printer::JUSTIFY_LEFT);
        $total = 0;
        foreach ($pedidotemporal as $value) {
          $total += $value['precio_producto'] * $value['cantidad'];
          $producto = $this->Controlador_model->get($value['id_producto'], 'producto');
          if ($producto->categoria <> 5) {
            $printer->text($value['cantidad'] . ' UND. ' . $value['nombre'] . ' ' . $value['opcion'] . ' ' . $value['precio_producto'] . "      \n");
          }
        }
        /* Terminamos de imprimir los productos, ahora va el total */
        $printer->text('------------------------' . "\n");
        /* Alimentamos el papel 3 veces */
        $printer->feed(3);
        /* Cortamos el papel. Si nuestra impresora no tiene soporte para ello, no generará ningún error */
        $printer->cut();
        /* Por medio de la impresora mandamos un pulso. Esto es útil cuando la tenemos conectada por ejemplo a un cajón */
        $printer->pulse();
        /* Para imprimir realmente, tenemos que "cerrar" la conexión con la impresora. Recuerda incluir esto al final de todos los archivos */
        $printer->close();
      }
    }
  }

  public function showcomandaopcion($ventaid)
  {
    $venta = $this->Controlador_model->get($ventaid > 0 ? $ventaid : $this->venta, 'venta');

    $this->db->join('producto p', 'p.id=vd.producto');
    $this->db->join('productocategoria pc', 'pc.id=p.categoria');
    $this->db->where('vd.venta', $venta->id)->where('vd.estadocomanda', '1')->where('pc.estadococina', '1');
    $this->db->select('vd.id');
    $cocina = $this->db->order_by('pc.nombre', 'asc')->get('ventadetalle vd')->num_rows();

    $this->db->join('producto p', 'p.id=vd.producto');
    $this->db->join('productocategoria pc', 'pc.id=p.categoria');
    $this->db->where('vd.venta', $venta->id)->where('vd.estadocomanda', '1')->where('pc.estadococina', '0');
    $this->db->select('vd.id');
    $barra = $this->db->order_by('pc.nombre', 'asc')->get('ventadetalle vd')->num_rows();

    // Fallback: If both are 0 (everything already sent), load all items for reprinting!
    if ($cocina == 0 && $barra == 0) {
      $this->db->join('producto p', 'p.id=vd.producto');
      $this->db->join('productocategoria pc', 'pc.id=p.categoria');
      $this->db->where('vd.venta', $venta->id)->where('pc.estadococina', '1');
      $this->db->select('vd.id');
      $cocina = $this->db->get('ventadetalle vd')->num_rows();

      $this->db->join('producto p', 'p.id=vd.producto');
      $this->db->join('productocategoria pc', 'pc.id=p.categoria');
      $this->db->where('vd.venta', $venta->id)->where('pc.estadococina', '0');
      $this->db->select('vd.id');
      $barra = $this->db->get('ventadetalle vd')->num_rows();
    }

    echo json_encode(['barra' => $barra, 'cocina' => $cocina]);
  }

  public function printshowcomanda($ventaid, $tipo)
  {
    $venta = $this->Controlador_model->get($ventaid > 0 ? $ventaid : $this->venta, 'venta');

    // 1. Fetch unprinted COMIDA items
    $this->db->join('producto p', 'p.id=vd.producto');
    $this->db->join('productocategoria pc', 'pc.id=p.categoria');
    $this->db->where('vd.venta', $venta->id)->where('vd.estadocomanda', '1')->where('pc.estadococina', '1');
    $this->db->select('vd.*');
    $pedidotemporalc = $this->db->order_by('pc.nombre', 'asc')->get('ventadetalle vd')->result();

    // 2. Fetch unprinted BEBIDA items
    $this->db->join('producto p', 'p.id=vd.producto');
    $this->db->join('productocategoria pc', 'pc.id=p.categoria');
    $this->db->where('vd.venta', $venta->id)->where('vd.estadocomanda', '1')->where('pc.estadococina', '0');
    $this->db->select('vd.*');
    $pedidotemporalb = $this->db->order_by('pc.nombre', 'asc')->get('ventadetalle vd')->result();

    // 3. Fallback: If both are completely empty (reprinting), fetch all items!
    if (empty($pedidotemporalc) && empty($pedidotemporalb)) {
      $this->db->join('producto p', 'p.id=vd.producto');
      $this->db->join('productocategoria pc', 'pc.id=p.categoria');
      $this->db->where('vd.venta', $venta->id)->where('pc.estadococina', '1');
      $this->db->select('vd.*');
      $pedidotemporalc = $this->db->order_by('pc.nombre', 'asc')->get('ventadetalle vd')->result();

      $this->db->join('producto p', 'p.id=vd.producto');
      $this->db->join('productocategoria pc', 'pc.id=p.categoria');
      $this->db->where('vd.venta', $venta->id)->where('pc.estadococina', '0');
      $this->db->select('vd.*');
      $pedidotemporalb = $this->db->order_by('pc.nombre', 'asc')->get('ventadetalle vd')->result();
    }

    $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
    $data = array(
      'venta' => $venta,
      'tipo' => $tipo,
      'ventadetallec' => $pedidotemporalc,
      'ventadetalleb' => $pedidotemporalb,
      'mesa' => $mesa,
      'zona' => $this->Controlador_model->get($mesa->zona, 'zona'),
      'cliente' => $this->Controlador_model->get($venta->cliente, 'cliente'),
      'usuario' => $this->Controlador_model->get($venta->usuario, 'usuario'),
      'empresa' => $this->Controlador_model->get($venta->empresa, 'empresa')
    );
    $this->load->view('imprimircomanda', $data);
  }

  public function showcomanda()
  {
    $idventa = $this->venta;
    if (!$idventa) {
      $latest = $this->db->order_by('id', 'desc')->limit(1)->get('venta')->row();
      if ($latest) {
        $idventa = $latest->id;
      }
    }
    $venta = $this->Controlador_model->get($idventa, 'venta');

    // $pedidotemporal = $this->db->where("estado", "0")->where("venta", $this->venta)->where("time <", date("H:i:s"))->get("ventadetalle")->result();
    // $pedidotemporal = $this->Controlador_model->pedidotemporal($this->venta);
    $numerobebida = 0;
    $numerocomida = 0;

    /* $pedidotemporal = json_decode($_GET["data"], true);
    foreach ($pedidotemporal as $value) {
      $producto = $this->Controlador_model->get($value["id_producto"], 'producto');
      if ($producto->categoria == 5) {
        $numerobebida++;
      } else {
        $numerocomida++;
      }
    } */

    $this->db->join('producto p', 'p.id=vd.producto');
    $this->db->join('productocategoria pc', 'pc.id=p.categoria');
    $this->db->where('vd.venta', $venta->id)->where('vd.estadocomanda', '1')->where('pc.estadococina', '1');
    $this->db->select('vd.*');
    $pedidotemporalc = $this->db->order_by('pc.nombre', 'asc')->get('ventadetalle vd')->result();

    $this->db->join('producto p', 'p.id=vd.producto');
    $this->db->join('productocategoria pc', 'pc.id=p.categoria');
    $this->db->where('vd.venta', $venta->id)->where('vd.estadocomanda', '1')->where('pc.estadococina', '0');
    $this->db->select('vd.*');
    $pedidotemporalb = $this->db->order_by('pc.nombre', 'asc')->get('ventadetalle vd')->result();

    $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
    $data = array(
      'venta' => $venta,
      'tipo' => 'both',
      'numerobebida' => $numerobebida,
      'numerocomida' => $numerocomida,
      'ventadetallec' => $pedidotemporalc,
      'ventadetalleb' => $pedidotemporalb,
      'mesa' => $mesa,
      'zona' => $this->Controlador_model->get($mesa->zona, 'zona'),
      'cliente' => $this->Controlador_model->get($venta->cliente, 'cliente'),
      'usuario' => $this->Controlador_model->get($venta->usuario, 'usuario'),
      'empresa' => $this->Controlador_model->get($venta->empresa, 'empresa')
    );
    $this->load->view('imprimircomanda', $data);
  }

  public function imprimirprecuenta($id = FALSE)
  {
    $idventa = $this->venta ? $this->venta : $id;
    $venta = $this->Controlador_model->get($idventa, 'venta');
    $empresa = $this->Controlador_model->get($venta->empresa, 'empresa');
    $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
    $usuario = $this->Controlador_model->get($venta->usuario, 'usuario');
    $cliente = $this->Controlador_model->get($venta->cliente, 'cliente');
    $nombre_impresora = $empresa->nombreimpresora;
    $connector = new WindowsPrintConnector($nombre_impresora);
    $printer = new Printer($connector);
    // Mando un numero de respuesta para saber que se conecto correctamente.
    // Vamos a alinear al centro lo próximo que imprimamos
    $printer->setJustification(Printer::JUSTIFY_CENTER);
    /* Intentaremos cargar e imprimir el logo */
    try {
      $url = 'files/Setting/' . $empresa->ruc . '.png';
      $logo = EscposImage::load($url, false);
      // $printer->bitImage($logo);
    } catch (Exception $e) {
      /* No hacemos nada si hay error */
    }
    /* Ahora vamos a imprimir un encabezado */
    $printer->text('PRE-CUENTA' . "\n");
    $printer->text('DELIVERY: ' . $empresa->telefono . "\n");
    // La fecha también
    $printer->text(date('Y-m-d') . ' ' . date('H:i:s') . "\n");
    $printer->text('------------------------------------------------' . "\n");
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text('Mesa: ' . ($mesa) ? $mesa->nombre : 'MESA TEMPORAL' . "\n");
    $printer->text('Camarera: ' . $usuario->nombre . ' ' . $usuario->apellido . "\n");
    $printer->text('Cliente: ' . ($cliente ? $cliente->nombre : 'Cliente sin Registrar') . "\n");
    $printer->text('------------------------------------------------' . "\n");
    $printer->text("[CANT.]    DESCRIPCION          P/U       TOTAL\n");
    $printer->text('------------------------------------------------' . "\n");
    /* Ahora vamos a imprimir los productos. Alinear a la izquierda para la cantidad y el nombre */
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $total = 0;
    $posales = $this->Controlador_model->comanda($idventa);
    foreach ($posales as $value) {
      $suma = $this->Controlador_model->sumacomanda($idventa, $value->producto);
      $total += $value->precio * $suma->cantidad;
      $producto = $this->Controlador_model->get($value->producto, 'producto');
      $printer->text($producto->codigo . ' ' . $value->nombre . "\n");
      $printer->text('[' . $suma->cantidad . ']                          ' . $value->precio . '    ' . number_format($value->precio * $suma->cantidad, 2) . " \n");
    }
    /* Terminamos de imprimir los productos, ahora va el total */
    $printer->text('------------------------------------------------' . "\n");
    $printer->setJustification(Printer::JUSTIFY_RIGHT);
    $printer->text('TOTAL: S/      ' . number_format($total, 2) . "\n");
    /* Podemos poner también un pie de página */
    $printer->setJustification(Printer::JUSTIFY_CENTER);
    $printer->text("comprobante sin valor\n");
    $printer->text("Muchas gracias por su compra\n");
    /* Alimentamos el papel 3 veces */
    $printer->feed(3);
    /* Cortamos el papel. Si nuestra impresora no tiene soporte para ello, no generará ningún error */
    $printer->cut();
    /* Por medio de la impresora mandamos un pulso. Esto es útil cuando la tenemos conectada por ejemplo a un cajón */
    $printer->pulse();
    /* Para imprimir realmente, tenemos que "cerrar" la conexión con la impresora. Recuerda incluir esto al final de todos los archivos */
    $printer->close();
  }

  public function showprecuenta($id, $det = '')
  {
    if ($det == '') {
      $venta = $this->Controlador_model->get($id, 'venta');
      $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
      $data = array(
        'venta' => $venta,
        'mesa' => $mesa,
        'zona' => $this->Controlador_model->get($mesa->zona, 'zona'),
        'empresa' => $this->Controlador_model->get($venta->empresa, 'empresa'),
        'cliente' => $this->Controlador_model->get($venta->cliente, 'cliente'),
        'usuario' => $this->Controlador_model->get($venta->usuario, 'usuario'),
        'ventadetalle' => $this->Controlador_model->comanda($id)
      );
      $this->load->view('imprimirprecuenta', $data);
    } else {
      $dets = explode('_', $det);
      $venta = $this->Controlador_model->get($id, 'venta');
      $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
      $data = array(
        'venta' => $venta,
        'mesa' => $mesa,
        'zona' => $this->Controlador_model->get($mesa->zona, 'zona'),
        'empresa' => $this->Controlador_model->get($venta->empresa, 'empresa'),
        'cliente' => $this->Controlador_model->get($venta->cliente, 'cliente'),
        'usuario' => $this->Controlador_model->get($venta->usuario, 'usuario'),
        'ventadetalle' => $this->Controlador_model->comandaselect($id, $dets)
      );
      $this->load->view('imprimirprecuentaselect', $data);
    }
  }

  public function imprimircomprobante()
  {
    $venta = $this->Controlador_model->get($this->input->post('venta'), 'venta');
    $empresa = $this->Controlador_model->get($venta->empresa, 'empresa');
    $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
    $usuario = $this->Controlador_model->get($venta->usuario, 'usuario');
    $cliente = $this->Controlador_model->get($venta->cliente, 'cliente');
    $nombre_impresora = $empresa->nombreimpresora;
    $connector = new WindowsPrintConnector($nombre_impresora);
    $printer = new Printer($connector);
    $comprobante = $venta->serie . '|' . $venta->numero;
    $numerocomprobante = $venta->serie . '-' . $venta->numero;
    $tipocom = $venta->tipoventa == 'FACTURA' ? '01' : '03';
    $tipo = $venta->tipoventa == 'FACTURA' ? 6 : 1;
    $url_base = 'archivos_xml_sunat/imgqr/';
    $encriptado = password_hash($venta->numero, PASSWORD_BCRYPT);
    $encriptadohash = substr(str_replace('$2y$10$', '', $encriptado), 0, 27) . '=';
    $codigohash = $venta->hash ? $venta->hash : $encriptadohash;
    $params['data'] = $empresa->ruc . '|' . $tipocom . '|' . $comprobante . '|0.00|' . $venta->montototal . '|' . date('d/m/Y', strtotime($venta->created)) . '|' . $tipo . '|' . $cliente->documento . '|' . $codigohash . '|';
    $params['level'] = 'H';
    $params['size'] = 3;
    $params['savename'] = $url_base . $numerocomprobante . '.png';
    $this->ciqrcode->generate($params);
    // Mando un numero de respuesta para saber que se conecto correctamente.
    // Vamos a alinear al centro lo próximo que imprimamos
    $printer->setJustification(Printer::JUSTIFY_CENTER);
    /* Intentaremos cargar e imprimir el logo */
    try {
      $url = 'files/Setting/' . $empresa->ruc . '.png';
      $logo = EscposImage::load($url, false);
      // $printer->bitImage($logo);
    } catch (Exception $e) {
      /* No hacemos nada si hay error */
    }
    /* Ahora vamos a imprimir un encabezado */
    if ($venta->tipoventa == 'OTROS') {
      $printer->text("\n" . 'NOTA DE VENTA' . "\n");
    } else {
      if ($empresa->tipo == 1) {
        $printer->text("\n" . $empresa->razonsocial . "\n");
      } else {
        $printer->text("\n" . $empresa->nombre . "\n");
        $printer->text($empresa->razonsocial . "\n");
      }
      $printer->text($empresa->direccion . "\n");
      $printer->text($empresa->departamento . ' ' . $empresa->provincia . ' ' . $empresa->distrito . "\n");
      $printer->text('RUC: ' . $empresa->ruc . "\n");
      $printer->text('DELIVERY ' . $empresa->telefono . "\n");
      // La fecha también
      $printer->text('------------------------------------------------' . "\n");
      $printer->text($venta->tipoventa . ' DE VENTA ELECTRONICA' . "\n");
      $printer->text($venta->serie . '-' . $venta->numero . "\n");
    }
    $printer->text('------------------------------------------------' . "\n");
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text($cliente->tipodocumento . ': ' . $cliente->documento . "\n");
    $printer->text('CLIENTE: ' . $cliente->nombre . ' ' . $cliente->apellido . "\n");
    $printer->text('DIRECCION: ' . $cliente->direccion . "\n");
    $printer->text('FECHA EMISION: ' . $venta->created . ' ' . $venta->hora . "\n");
    $printer->text('FECHA VENCIMIENTO: ' . $venta->created . "\n");
    $printer->text("MODEDA: SOLES\n");
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text("------------------------------------------------\n");
    $printer->text("[CANT.]    DESCRIPCION          P/U       TOTAL\n");
    $printer->text('------------------------------------------------' . "\n");
    /* Ahora vamos a imprimir los productos. Alinear a la izquierda para la cantidad y el nombre */
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $total = 0;
    if ($venta->consumo == '1') {
      $total = $venta->montototal;
      $printer->text('Por consumosssssss' . "\n");
      $printer->text('[1]                    ' . $venta->montototal . '    ' . number_format($venta->montototal, 2) . " \n");
    } else {
      $ventadetalle = $this->Controlador_model->pedidodetalle($this->venta);
      foreach ($ventadetalle as $value) {
        $total += $value->precio * $value->cantidad;
        $producto = $this->Controlador_model->get($value->producto, 'producto');
        $printer->text($producto->codigo . ' ' . $value->nombre . "\n");
        $printer->text('[' . $value->cantidad . 'ssssssssss]                    ' . $value->precio . '    ' . number_format($value->precio * $value->cantidad, 2) . " \n");
      }
    }

    /* Terminamos de imprimir los productos, ahora va el total */
    $printer->text('------------------------------------------------' . "\n");
    $printer->setJustification(Printer::JUSTIFY_RIGHT);
    if ($venta->tipoventa == 'OTROS') {
      $printer->text('TOTAL:   S/   ' . number_format($total, 2) . "\n");
    } else {
      $printer->text('OP. EXONERADA:   S/   ' . number_format($total, 2) . "\n");
      $printer->text('IGV:   S/   ' . number_format(0, 2) . "\n");
      $printer->text('TOTAL:   S/   ' . number_format($total, 2) . "\n");
    }
    $pago = 0;
    $vuelto = 0;
    $pagos = $this->Controlador_model->getDetalle($this->venta, 'ingreso');
    foreach ($pagos as $value) {
      if ($value->metodopago == 'EFECTIVO') {
        $vuelto = $venta->pago - $value->monto;
      }
      $printer->text("PAGO ($value->metodopago):   S/   " . number_format($value->monto, 2) . "\n");
    }
    $printer->text('RECIBIO:   S/   ' . number_format($venta->pago, 2) . "\n");
    $printer->text('VUELTO:   S/   ' . number_format($vuelto, 2) . "\n");
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text('------------------------------------------------' . "\n");
    $printer->text('SON: ' . num_to_letras($total) . "\n");
    $printer->text('VENDEDOR: ' . $usuario->usuario . "\n");
    $printer->text('MESA: ' . ($mesa) ? $mesa->nombre : 'MESA TEMPORAL' . "\n");
    $printer->text('------------------------------------------------' . "\n");
    $printer->setJustification(Printer::JUSTIFY_CENTER);
    if ($venta->tipoventa == 'OTROS') {
      $printer->text('GRACIAS POR SU COMPRA' . "\n");
    } else {
      $printer->text($codigohash . "\n");
      $printer->text('------------------------------------------------' . "\n");
      /* Intentaremos cargar e imprimir el logo */
      try {
        $codeurl = $url_base . $numerocomprobante . '.png';
        $codeqr = EscposImage::load($codeurl, false);
        $printer->bitImage($codeqr);
      } catch (Exception $e) {
        /* No hacemos nada si hay error */
      }
      $printer->text("NO SE ACEPTAN DEVOLUCIONES Y/O\n");
      $printer->text("CAMBIO DESPUES DE LAS 24 HORAS\n");
      $printer->text("------------------------------------------------\n");
      $printer->text("REPRESENTACION IMPRESA DE\n");
      $printer->text("COMPROBANTE ELECTRONICO\n");
      $printer->text("AUTORIZADO MEDIANTE LA RESOLUCION DE\n");
      $printer->text("INTENDENCIA N°. 034-005-0005315\n");
    }
    /* Alimentamos el papel 3 veces */
    $printer->feed(3);
    /* Cortamos el papel. Si nuestra impresora no tiene soporte para ello, no generará ningún error */
    $printer->cut();
    /* Por medio de la impresora mandamos un pulso. Esto es útil cuando la tenemos conectada por ejemplo a un cajón */
    $printer->pulse();
    /* Para imprimir realmente, tenemos que "cerrar" la conexión con la impresora. Recuerda incluir esto al final de todos los archivos */
    $printer->close();
  }

  public function showcomprobante($ventaid)
  {
    $venta = $this->Controlador_model->get($ventaid, 'venta');
    $empresa = $this->Controlador_model->get($venta->empresa, 'empresa');
    $cliente = $this->Controlador_model->get($venta->cliente, 'cliente');
    $comprobante = $venta->serie . '|' . $venta->numero;
    $numerocomprobante = $venta->serie . '-' . $venta->numero;
    $tipo = $venta->tipoventa == 'FACTURA' ? 6 : 1;
    $tipocom = $venta->tipoventa == 'FACTURA' ? '01' : '03';
    $url_base = 'archivos_xml_sunat/imgqr/';
    $encriptado = password_hash($venta->numero, PASSWORD_BCRYPT);
    $encriptadohash = substr(str_replace('$2y$10$', '', $encriptado), 0, 27) . '=';
    $codigohash = $venta->hash ? $venta->hash : $encriptadohash;
    $params['data'] = $empresa->ruc . '|' . $tipocom . '|' . $comprobante . '|0.00|' . $venta->montototal . '|' . date('d/m/Y', strtotime($venta->created)) . '|' . $tipo . '|' . $cliente->documento . '|' . $codigohash . '|';
    $params['level'] = 'H';
    $params['size'] = 5;
    $params['savename'] = $url_base . $numerocomprobante . '.png';
    $this->ciqrcode->generate($params);
    $data = array(
      'venta' => $venta,
      'empresa' => $empresa,
      'cliente' => $cliente,
      'codigohash' => $codigohash,
      'qrcode' => '../../' . $url_base . $numerocomprobante . '.png',
      'mesa' => $this->Controlador_model->get($venta->mesa, 'mesa'),
      'usuario' => $this->Controlador_model->get($venta->usuario, 'usuario'),
      'ingresos' => $this->Controlador_model->getDetalle($ventaid, 'ingreso'),
      'ventadetalle' => $this->Controlador_model->comanda2($ventaid)
    );
    $this->load->view('imprimircomprobante', $data);
  }

  public function getimprimir()
  {
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    $cliente = $this->Controlador_model->get($venta->cliente, 'cliente');
    $empresa = $this->Controlador_model->get($venta->empresa, 'empresa');
    $comprobante = $venta->serie . '|' . $venta->numero;
    $numerocomprobante = $venta->serie . '-' . $venta->numero;
    $tipo = $venta->tipoventa == 'FACTURA' ? 6 : 1;
    $tipocom = $venta->tipoventa == 'FACTURA' ? '01' : '03';
    $url_base = 'archivos_xml_sunat/imgqr/';
    $encriptado = password_hash($venta->numero, PASSWORD_BCRYPT);
    $encriptadohash = substr(str_replace('$2y$10$', '', $encriptado), 0, 27) . '=';
    $codigohash = $venta->hash ? $venta->hash : $encriptadohash;
    $data = array(
      'ventas' => $venta,
      'empresa' => $empresa,
      'cliente' => $cliente,
      'usuario' => $this->Controlador_model->get($venta->usuario, 'usuario'),
      'vuelto' => number_format($venta->pago - $venta->total, 2),
      'codigoqr' => $empresa->ruc . '|' . $tipocom . '|' . $comprobante . '|0.00|' . $venta->montototal . '|' . date('d/m/Y', strtotime($venta->created)) . '|' . $tipo . '|' . $cliente->documento . '|' . $codigohash . '|',
      'importeletra' => num_to_letras($venta->total),
      'pagos' => $this->Controlador_model->getDetalle($this->venta, 'ingreso'),
      'ventadetalle' => $this->Controlador_model->getDetalle($this->venta, 'ventadetalle')
    );
    echo json_encode($data);
  }

  // ################
  // ## NO SE USA ###
  // ################
  public function imprimircierre()
  {
    $caja = $this->Controlador_model->get($this->caja, 'caja');
    $empresa = $this->Controlador_model->get($caja->empresa, 'empresa');
    $usuario = $this->Controlador_model->get($caja->usuario, 'usuario');
    $monedero = $this->db->where('caja', $this->caja)->get('monedero')->row();
    $diezcentimos = $monedero->diezcentimos * 0.1;
    $veintecentimos = $monedero->veintecentimos * 0.2;
    $cincuentacentimos = $monedero->cincuentacentimos * 0.5;
    $unsol = $monedero->unsol * 1;
    $dossoles = $monedero->dossoles * 2;
    $cincosoles = $monedero->cincosoles * 5;
    $diezsoles = $monedero->diezsoles * 10;
    $veintesoles = $monedero->veintesoles * 20;
    $cincuentasoles = $monedero->cincuentasoles * 50;
    $ciensoles = $monedero->ciensoles * 100;
    $doscientossoles = $monedero->doscientossoles * 200;
    $montototal = $diezcentimos + $veintecentimos + $cincuentacentimos + $unsol + $dossoles + $cincosoles + $diezsoles + $veintesoles + $cincuentasoles + $ciensoles + $doscientossoles;
    $nombre_impresora = $empresa->nombreimpresora;
    $connector = new WindowsPrintConnector($nombre_impresora);
    $printer = new Printer($connector);
    // Mando un numero de respuesta para saber que se conecto correctamente.
    // Vamos a alinear al centro lo próximo que imprimamos
    $printer->setJustification(Printer::JUSTIFY_CENTER);
    if ($empresa->tipo == 0) {
      $printer->text($empresa->nombre . "\n");
      $printer->text($empresa->razonsocial . "\n");
    } else {
      $printer->text($empresa->razonsocial . "\n");
    }
    $printer->text($empresa->departamento . ' ' . $empresa->provincia . ' ' . $empresa->distrito . "\n");
    $printer->text('RUC: ' . $empresa->ruc . "\n");
    $printer->text('Telf: ' . $empresa->telefono . "\n");
    /* Ahora vamos a imprimir un encabezado */
    $printer->text("CIERRRE CAJA DIARIO \n");
    $printer->text('------------------------------------------------' . "\n");
    // La fecha también
    $printer->text(strtoupper($caja->descripcion) . "\n");
    $printer->text('FECHA DE APERTURA: ' . $caja->apertura . "\n");
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text('ENCARGADO: ' . $usuario->nombre . "\n");
    $printer->text('SALDO INICIAL: ' . $caja->saldoinicial . "\n");
    $printer->text('------------------------------------------------' . "\n");
    $printer->text("TIPO DE MONEDA                 CANTIDAD DE MONEDA\n");
    $printer->text('------------------------------------------------' . "\n");
    /* Ahora vamos a imprimir los productos. Alinear a la izquierda para la cantidad y el nombre */
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text('0.10                                   ' . $monedero->diezcentimos . "\n");
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text('0.20                                   ' . $monedero->veintecentimos . "\n");
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text('0.50                                   ' . $monedero->cincuentacentimos . "\n");
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text('1.00                                   ' . $monedero->unsol . "\n");
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text('2.00                                   ' . $monedero->dossoles . "\n");
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text('5.00                                   ' . $monedero->cincosoles . "\n");
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text('10.00                                  ' . $monedero->diezsoles . "\n");
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text('20.00                                  ' . $monedero->veintesoles . "\n");
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text('50.00                                  ' . $monedero->cincuentasoles . "\n");
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text('100.00                                 ' . $monedero->ciensoles . "\n");
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text('200.00                                 ' . $monedero->doscientossoles . "\n");
    /* Terminamos de imprimir los productos, ahora va el total */
    $printer->text('------------------------------------------------' . "\n");
    $printer->setJustification(Printer::JUSTIFY_LEFT);
    $printer->text('TOTAL VENTA:                          ' . number_format($montototal, 2) . "\n");
    /* Podemos poner también un pie de página */
    $printer->setJustification(Printer::JUSTIFY_CENTER);
    $printer->text('------------------------------------------------' . "\n");
    $printer->text("PRODUCTOS VENDIDOS\n");
    $posales = $this->Controlador_model->resumenventa($this->caja);
    $totalventas = 0;
    foreach ($posales as $value) {
      $producto = $this->Controlador_model->get($value->producto, 'producto');
      $sumacantidad = $this->Controlador_model->ventaresumencantidad($caja->id, $value->producto);
      $sumasubtotal = $this->Controlador_model->ventaresumensubtotal($caja->id, $value->producto);
      $totalventas += $sumasubtotal->subtotal;
      $printer->setJustification(Printer::JUSTIFY_LEFT);
      $printer->text(ucwords(strtolower($producto->nombre)) . "\n");
      $printer->setJustification(Printer::JUSTIFY_RIGHT);
      $printer->text($sumacantidad->cantidad . " UND\n");
    }
    $printer->setJustification(Printer::JUSTIFY_CENTER);
    $printer->text('------------------------------------------------' . "\n");
    /* Podemos poner también un pie de página */
    $printer->text("EL MUNDO ES DE QUIEN SE ATREVE\n");
    /* Alimentamos el papel 3 veces */
    $printer->feed(3);
    /* Cortamos el papel. Si nuestra impresora no tiene soporte para ello, no generará ningún error */
    $printer->cut();
    /* Por medio de la impresora mandamos un pulso. Esto es útil cuando la tenemos conectada por ejemplo a un cajón */
    $printer->pulse();
    /* Para imprimir realmente, tenemos que "cerrar" la conexión con la impresora. Recuerda incluir esto al final de todos los archivos */
    $printer->close();
  }

  public function showcierre()
  {
    $monedero = $this->db->where('caja', $this->caja)->get('monedero')->row();
    $diezcentimos = $monedero->diezcentimos * 0.1;
    $veintecentimos = $monedero->veintecentimos * 0.2;
    $cincuentacentimos = $monedero->cincuentacentimos * 0.5;
    $unsol = $monedero->unsol * 1;
    $dossoles = $monedero->dossoles * 2;
    $cincosoles = $monedero->cincosoles * 5;
    $diezsoles = $monedero->diezsoles * 10;
    $veintesoles = $monedero->veintesoles * 20;
    $cincuentasoles = $monedero->cincuentasoles * 50;
    $ciensoles = $monedero->ciensoles * 100;
    $doscientossoles = $monedero->doscientossoles * 200;
    $montototal = $monedero->montototal;

    $data = array(
      'monedero' => $monedero,
      'montototal' => $montototal,
      'caja' => $caja = $this->Controlador_model->get($this->caja, 'caja'),
      'usuario' => $this->Controlador_model->get($caja->usuario, 'usuario'),
      'empresa' => $this->Controlador_model->get($caja->empresa, 'empresa'),
      'posales' => $this->Controlador_model->resumenventa($this->caja)
    );

    $this->load->view('imprimircierre', $data);
  }

  public function backup()
  {
    /*
     * $this->Controlador_model->backup(); //todo: para hacer copia de seguridad
     * mensaje_alerta('hecho', 'crear');
     */

    $CI = &get_instance();
    $CI->session->set_userdata('caja', NULL);
    redirect($this->url);
  }

  public function autocompleteCodigoBarra()
  {
    if (isset($_GET['term'])) {
      $q = strtoupper($_GET['term']);
      $this->Controlador_model->autocompletarcodigobarra($q);
    }
  }

  public function ajax_codigodebarra()
  {
    $codigobarra = $this->input->post('codigodebarra');
    $query = $this->Controlador_model->getCodigoBarra($codigobarra);
    if ($query) {
      $queryStock = $this->db->where('producto', $query->id)->where('cantidad >', 0)->get('stock')->row();
      if ($queryStock) {
        echo json_encode(
          [
            'status' => TRUE,
            'idproducto' => $query->id,
            'idcategoria' => $query->categoria,
            'precioproducto' => $query->precioventa
          ]
        );
      } else {
        echo json_encode(['status' => FALSE, 'sinstock' => TRUE, 'codeproducto' => $query->codigoBarra]);
      }
    } else {
      echo json_encode(['status' => FALSE, 'sininfo' => TRUE]);
    }
  }

  public function alertaStock()
  {
    $stocks = $this->Controlador_model->getAlertaStock();
    $html = '';
    $numeroStock = 0;
    foreach ($stocks as $stock) {
      $html .= "<li class='list-group-item '><a ><h4 class='list-group-item-heading'>" . $stock->nombre . '</h4>' . "<p class='list-group-item-text'>CANTIDAD: " . $stock->cantidad . '</p></a></li>';
      $numeroStock++;
    }
    echo json_encode(array('data' => $html, 'numeroStock' => $numeroStock));
  }

  public function addmesa()
  {
    $data['nombre'] = strtoupper($this->input->post('nombre'));
    $data['zona'] = $this->input->post('zonaT');
    $data['empresa'] = $this->empresa;
    $data['estado'] = '0';
    $data['is_temporal'] = 1;
    $mesatemporal = $this->Controlador_model->save('mesa', $data);
    redirect($this->url . '/crearpedido/' . $mesatemporal);
  }

  public function listModificador($producto)
  {
    $producto = $this->Controlador_model->get($producto, 'producto');
    $modificadores = $this->Controlador_model->getModificador($producto->categoria);
    $html = '';
    foreach ($modificadores as $modificador) {
      $html .= "<a href='#' id='m" . $modificador->id . "' onclick='setModificador(" . $modificador->id . ")' class='btn modificadores list-group-item'>" . $modificador->nombre . "<span class='pull-right'><strong>" . $modificador->precio . '</strong></span></a><br>';
    }
    echo $html;
  }

  public function addpdcVariante($producto, $variante, $modificadores = '0')
  {
    // var_dump($producto, $variante, $modificadores);
    // exit;
    $producto = $this->Controlador_model->get($producto, 'producto');
    $variante = $this->Controlador_model->get($variante, 'productovariante');
    if ($modificadores != '0') {
      $modificador = $this->Controlador_model->get($modificadores, 'productomodificador');
      $data['nombre'] = $variante->nombre . ' ' . $producto->nombre . ' ' . $modificador->nombre;
      $data['precio'] = number_format($variante->precio + $modificador->precio, 2);
    } else {
      $data['nombre'] = $variante->nombre . ' ' . $producto->nombre;
      $data['precio'] = $variante->precio;
    }
    $data['producto'] = $producto->id;
    $data['preciocompra'] = $producto->preciocompra;
    $data['venta'] = $this->venta;
    $data['cantidad'] = 1;
    $data['time'] = date('Y-m-d H:i:s');
    $this->Controlador_model->save('ventatemporal', $data);
    echo json_encode(array('status' => TRUE));
  }

  public function showcomprobanteSaved($url, $phone, $idventa)
  {
    $venta = $this->Controlador_model->get($idventa, 'venta');
    $empresa = $this->Controlador_model->get($venta->empresa, 'empresa');
    $cliente = $this->Controlador_model->get($venta->cliente, 'cliente');
    $comprobante = $venta->serie . '|' . $venta->numero;
    $numerocomprobante = $venta->serie . '-' . $venta->numero;
    $tipo = $venta->tipoventa == 'FACTURA' ? 6 : 1;
    $tipocom = $venta->tipoventa == 'FACTURA' ? '01' : '03';
    $url_base = 'archivos_xml_sunat/imgqr/';
    $encriptado = password_hash($venta->numero, PASSWORD_BCRYPT);
    $encriptadohash = substr(str_replace('$2y$10$', '', $encriptado), 0, 27) . '=';
    $codigohash = $venta->hash ? $venta->hash : $encriptadohash;
    $params['data'] = $empresa->ruc . '|' . $tipocom . '|' . $comprobante . '|0.00|' . $venta->montototal . '|' . date('d/m/Y', strtotime($venta->created)) . '|' . $tipo . '|' . $cliente->documento . '|' . $codigohash . '|';
    $params['level'] = 'H';
    $params['size'] = 5;
    $params['savename'] = $url_base . $numerocomprobante . '.png';
    $this->ciqrcode->generate($params);
    $data = array(
      'venta' => $venta,
      'empresa' => $empresa,
      'cliente' => $cliente,
      'codigohash' => $codigohash,
      'qrcode' => base_url() . $url_base . $numerocomprobante . '.png',
      'mesa' => $this->Controlador_model->get($venta->mesa, 'mesa'),
      'usuario' => $this->Controlador_model->get($venta->usuario, 'usuario'),
      'ingresos' => $this->Controlador_model->getDetalle($idventa, 'ingreso'),
      'ventadetalle' => $this->Controlador_model->comanda($idventa)
    );
    // Load view as a string so output buffer remains clean and redirection is clean
    $html = $this->load->view('imprimircomprobante', $data, TRUE);
    $filename = $url . '/' . $venta->serie . '-' . $venta->numero . '-' . $cliente->documento . '-' . date('Y-m-d') . '.pdf';
    
    // Check if a previous PDF exists and delete it to force a fresh update/generation
    if (file_exists($filename)) {
      @unlink($filename);
    }
    
    require_once FCPATH . 'vendor/autoload.php';
    $options = new \Dompdf\Options();
    $options->set('isRemoteEnabled', true);
    $dompdf = new \Dompdf\Dompdf($options);
    $dompdf->loadHtml($html);
    $dompdf->setPaper('A4', 'portrait');
    $dompdf->render();
    $output = $dompdf->output();
    file_put_contents($filename, $output);
    
    // Clear the active session/table so that the POS returns to a clean state
    $CI = &get_instance();
    $CI->session->set_userdata('venta', NULL);
    $CI->session->set_userdata('NumberTable', NULL);
    
    $this->sendCPToNumber($filename, $phone);
  }

  public function sentTicketWA($phone, $venta)
  {
    $url = 'CPETemp';
    if (!file_exists($url)) {
      mkdir($url, 0777, true);
      // var_dump("entro");
    }
    $this->showcomprobanteSaved($url, $phone, $venta);
  }

  public function sendCPToNumber($uri, $phone)
  {
    $texto = 'Hola, gracias por tu consumo. Puedes descargar tu Comprobante Electronico en el siguiente enlace! ' . urlencode(base_url() . $uri);
    redirect('https://wa.me/51' . $phone . '?text=' . $texto);
  }

  public function deleteCPETemp()
  {
    $url = 'CPETemp' . DIRECTORY_SEPARATOR;
    $this->rmdir_recursive($url);
  }

  public function rmdir_recursive($dir)
  {
    if (is_dir($dir)) {
      foreach (scandir($dir) as $file) {
        if ('.' === $file || '..' === $file)
          continue;
        if (is_dir("$dir/$file"))
          $this->rmdir_recursive("$dir/$file");
        else
          unlink("$dir/$file");
      }
      rmdir($dir);
    }
  }

  public function consulta_reniec()
  {
    consuta_reniec_helper();
  }

  public function load_CategriaSeleccionar()
  {
    /*
     * $html = "";
     * $categoria = $this->db->where('estado', '0')->get('productocategoria')->result();
     * foreach ($categoria as $key => $category) {
     *   $html .= '<div class="col-lg-3 col-sm-3 col-xs-6" style="margin-bottom: 10px;">
     *   <a class="carta" onclick="categoria(' . $category->id . ')">
     *     <div class="carta__a">';
     *   if ($category->photo) {
     *     $html .= '<img class="carta__imagen" src="' . base_url() . 'files/productocategoria/' . $category->photothumb . '" alt="' . $category->nombre . '">';
     *   }
     *   $html .= '<div style="flex:1; padding:15px 10px">
     *        <div class="carta__title">' . $category->nombre . '</div>
     *        <div class="carta__des">Es delicioso</div>
     *         </div>
     *         </div>
     *         </a>
     *         </div>';
     * }
     * $html .= '<div class="col-lg-3 col-sm-3 col-xs-6" style="margin-bottom: 10px;">
     *   <a class="carta" onclick="productolibre()">
     *     <div class="carta__a">';
     * $html .= '<div style="flex:1; padding:15px 10px">
     *        <div class="carta__title" style="text-align:center"><i class="fa fa-plus-circle fa-5x" aria-hidden="true"></i></div>
     *        <div class="carta__des">Producto Libre</div>
     *         </div>
     *         </div>
     *         </a>
     *         </div>';
     * echo $html;
     */

    $html = '';
    $categoria = $this->db->where('estado', '0')->where('id !=', 14)->get('productocategoria')->result();
    foreach ($categoria as $key => $category) {
      $img = $category->photo ? base_url() . 'files/productocategoria/' . $category->photothumb : base_url() . 'files/productoDefect/platvacio.jpg';

      $html .= '
      <div class="grid-item">
        <div class="carta-modern" onclick="categoria(' . $category->id . ')">
          <div class="img-container">
            <img src="' . $img . '" alt="' . $category->nombre . '">
          </div>
          <div class="content">
            <div class="title">' . $category->nombre . '</div>
            <div class="subtitle">Ver productos</div>
          </div>
        </div>
      </div>';
    }
    $html .= '
    <div class="grid-item">
      <div class="carta-modern" onclick="productolibre()">
        <div class="img-container" style="background: #eff6ff;">
          <i class="fas fa-plus-circle fa-4x" style="color: #2563eb;"></i>
        </div>
        <div class="content">
          <div class="title">Producto Libre</div>
          <div class="subtitle">Agregar manualmente</div>
        </div>
      </div>
    </div>';
    echo $html;
  }

  function ajax_TodosProductos()
  {
    $html = '';
    $productos = $this
      ->db
      ->select('producto.*')
      ->from('producto')
      ->join('productocategoria', 'productocategoria.id = producto.categoria')
      ->where('producto.estado', '0')
      ->where('productocategoria.estado', '0')
      ->where('productocategoria.id !=', 14)
      ->get()
      ->result();

    $registro_caja = $this->Controlador_model->get($this->caja, 'caja');

    foreach ($productos as $key => $value) {
      $EstadoProducto = FALSE;
      if ($value->tipo == '0') {
        // todo: El tipo de producto 0 es estandar
        $existenciaStock = $this->db->where('producto', $value->id)->get('stock')->row();  // todo: verificamos si el producto esta registra en stock
        if ($existenciaStock) {  // ->where('empr.esa', $registro->empr.esa)
          $stok_D = $this->db->where('producto', $value->id)->where('cantidad <=', 0)->get('stock')->row();
          if ($stok_D) {
            $EstadoProducto = TRUE;
          } else {
            $EstadoProducto = FALSE;
          }
        } else {
          $EstadoProducto = TRUE;
        }
      } else if ($value->tipo == '2') {
        // todo: El tipo de producto 2 es combo
        $combo = $this->db->where('producto', $value->id)->get('combo')->result();  // todo: verificamos si el tiene registro en la tabal combo
        if ($combo) {
          foreach ($combo as $key => $value2) {
            $ProductoCombo = $this->Controlador_model->get($value2->item_id, 'combo');
            // Si no cuenta con sufuciente STOCK el como saldra como agotado//->where("empr.esa", $this->empr.esa)
            $existenciaStockCombo = $this->db->where('producto', $value2->item_id)->get('stock')->row();  // todo: verificamos si el producto esta registra en stock
            if ($existenciaStockCombo) {
              $productoStock = $this->db->where('producto', $value2->item_id)->where('cantidad <', $value2->cantidad)->get('stock')->row();
              if ($productoStock) {
                $EstadoProducto = TRUE;  // cuando $EstadoProducto es TRUE ara que el div/boton este desahabilitado
                break;
              } else {
                $EstadoProducto = FALSE;
              }
            } else {
              $EstadoProducto = TRUE;
              break;
            }
          }
        } else {
          // todo: si no tine que productos en el combo se desahanilita el producto es tipo combo
          $EstadoProducto = TRUE;
        }
      }

      if ($EstadoProducto) {
        $EstadoProductoData = 'opacar_div';
        $badge = '<div class="status-badge">AGOTADO</div>';
        $disabled = 'disabled';
      } else {
        $EstadoProductoData = '';
        $badge = '';
        $disabled = '';
      }

      $datacategoria = $this->Controlador_model->get($value->categoria, 'productocategoria');

      if ($value->variante == TRUE or $value->variante == 1 or $value->variante == '1' or $datacategoria->estadoextras == '1') {
        $evento = ' onclick="procesoagregaarventa(' . $value->id . ',' . $value->categoria . ', ' . $value->precioventa . ')" ';
      } else {
        $evento = ' onclick="agregaarventa(' . $value->id . ',' . $value->categoria . ', ' . $value->precioventa . ', 0)" ';
      }

      $img = $value->photo ? base_url() . 'files/products/' . $value->photothumb : base_url() . 'files/productoDefect/platvacio.jpg';
      $combo_class = ($value->tipo == 2) ? 'is-combo' : '';

      $html .= '
      <div class="grid-item" id="content-producto-' . $value->id . '">
        <input type="hidden" id="precio-producto-' . $value->id . '" value="' . $value->precioventa . '"/>
        <div class="carta-modern ' . $combo_class . ' ' . $EstadoProductoData . '" ' . ($disabled ? '' : $evento) . ' style="' . ($disabled ? 'cursor:not-allowed' : '') . '">
          ' . $badge . '
          <div class="price-badge">S/ ' . number_format($value->precioventa, 2) . '</div>
          <div class="img-container">
            <img src="' . $img . '" alt="' . $value->nombre . '">
          </div>
          <div class="content">
            <div class="title">' . $value->nombre . '</div>
            <div class="subtitle">' . ($value->variante ? 'Varias opciones' : 'Añadir al pedido') . '</div>
          </div>
        </div>
      </div>';
    }
    echo $html;
  }

  public function ajax_productos_categoria()
  {
    $html = '';
    $productos = $this
      ->db
      ->select('producto.*')
      ->from('producto')
      ->join('productocategoria', 'productocategoria.id = producto.categoria')
      ->where('producto.categoria', $this->input->post('categoria'))
      ->where('producto.estado', '0')
      ->where('productocategoria.estado', '0')
      ->where('productocategoria.id !=', 14)
      ->get()
      ->result();

    foreach ($productos as $key => $value) {  // se trabajara sin empresa
      $EstadoProducto = FALSE;
      if ($value->tipo == '0') {
        // todo: El tipo de producto 2 es estandar
        // $registro = $this->Controlador_model->get($this->caja, 'caja');
        $existenciaStock = $this->db->where('producto', $value->id)->get('stock')->row();  // todo: verificamos si el producto esta registra en stock//->where("empr.esa", $registro->empr.esa)
        if ($existenciaStock) {
          $stok_D = $this->db->where('producto', $value->id)->where('cantidad <=', 0)->get('stock')->row();  // ->where('empr.esa', $registro->empr.esa)
          if ($stok_D) {
            $EstadoProducto = TRUE;
          } else {
            $EstadoProducto = FALSE;
          }
        } else {
          $EstadoProducto = TRUE;
        }
      } else if ($value->tipo == '2') {
        // todo: El tipo de producto 2 es combo
        $combo = $this->db->where('producto', $value->id)->get('combo')->result();  // todo: verificamos si el tiene registro en la tabal combo
        if ($combo) {
          foreach ($combo as $key => $value2) {
            $ProductoCombo = $this->Controlador_model->get($value2->item_id, 'combo');
            // Si no cuenta con sufuciente STOCK el como saldra como agotado//->where("empr.esa", $this->empr.esa)
            $existenciaStockCombo = $this->db->where('producto', $value2->item_id)->get('stock')->row();  // todo: verificamos si el producto esta registra en stock
            if ($existenciaStockCombo) {
              $productoStock = $this->db->where('producto', $value2->item_id)->where('cantidad <', $value2->cantidad)->get('stock')->row();
              if ($productoStock) {
                $EstadoProducto = TRUE;  // cuando $EstadoProducto es TRUE ara que el div/boton este desahabilitado
                break;
              } else {
                $EstadoProducto = FALSE;
              }
            } else {
              $EstadoProducto = TRUE;
              break;
            }
          }
        } else {
          // todo: si no tine que productos en el combo se desahanilita el producto es tipo combo
          $EstadoProducto = TRUE;
        }
      } else {
        $EstadoProducto = FALSE;
      }

      $datacategoria = $this->Controlador_model->get($value->categoria, 'productocategoria');

      if ($value->variante == TRUE or $value->variante == 1 or $value->variante == '1' or $datacategoria->estadoextras == '1') {
        $evento = ' onclick="procesoagregaarventa(' . $value->id . ',' . $value->categoria . ', ' . $value->precioventa . ')" ';
      } else {
        $evento = ' onclick="agregaarventa(' . $value->id . ',' . $value->categoria . ', ' . $value->precioventa . ', 0)" ';
      }

      if ($value->variante == TRUE or $value->variante == 1 or $value->variante == '1') {
        $dataMask = '<span class="label label-info">' . ($value->variante == TRUE ? 'variante' : '') . '</span>';
      } else {
        $dataMask = '<div class="mask" style="color:#D6D6D6">' . number_format($value->precioventa, 2, '.', '') . ' Soles </div>';
      }

      if ($datacategoria->estadoextras == '1') {
        $textextras = "<label class='label label-success'>Extras</label>";
      } else {
        $textextras = '';
      }

      if ($EstadoProducto) {
        $EstadoProductoData = 'opacar_div';
        $badge = '<div class="status-badge">AGOTADO</div>';
        $disabled = 'disabled';
      } else {
        $EstadoProductoData = '';
        $badge = '';
        $disabled = '';
      }

      $datacategoria = $this->Controlador_model->get($value->categoria, 'productocategoria');

      if ($value->variante == TRUE or $value->variante == 1 or $value->variante == '1' or $datacategoria->estadoextras == '1') {
        $evento = ' onclick="procesoagregaarventa(' . $value->id . ',' . $value->categoria . ', ' . $value->precioventa . ')" ';
      } else {
        $evento = ' onclick="agregaarventa(' . $value->id . ',' . $value->categoria . ', ' . $value->precioventa . ', 0)" ';
      }

      $img = $value->photo ? base_url() . 'files/products/' . $value->photothumb : base_url() . 'files/productoDefect/platvacio.jpg';
      $combo_class = ($value->tipo == 2) ? 'is-combo' : '';

      $html .= '
      <div class="grid-item" id="content-producto-' . $value->id . '">
        <input type="hidden" id="texto-producto-' . $value->id . '" value="' . $value->nombre . '"/>
        <input type="hidden" id="precio-producto-' . $value->id . '" value="' . $value->precioventa . '"/>
        <div class="carta-modern ' . $combo_class . ' ' . $EstadoProductoData . '" ' . ($disabled ? '' : $evento) . ' style="' . ($disabled ? 'cursor:not-allowed' : '') . '">
          ' . $badge . '
          <div class="price-badge">S/ ' . number_format($value->precioventa, 2) . '</div>
          <div class="img-container">
            <img src="' . $img . '" alt="' . $value->nombre . '">
          </div>
          <div class="content">
            <div class="title">' . $value->nombre . '</div>
            <div class="subtitle">' . ($value->variante ? 'Varias opciones' : 'Añadir al pedido') . '</div>
          </div>
        </div>
      </div>';
    }
    echo $html;
  }

  function ajax_VerifiDesco_stock()
  {
    $idproducto = $this->input->post('idproducto');
    $dataproducto = $this->Controlador_model->get($idproducto, 'producto');

    // verificacion si cuentacon stock
    $EstadoProducto = FALSE;
    if ($dataproducto->tipo == 0) {
      $stok_D = $this->db->where('producto', $dataproducto->id)->where('cantidad', 0)->get('stock')->row();
      if ($stok_D) {
        $EstadoProducto = TRUE;
      }
    } else if ($dataproducto->tipo == 2) {
      $combo = $this->db->where('producto', $dataproducto->id)->get('combo')->result();
      foreach ($combo as $key => $value2) {
        // Si no cuenta con sufuciente STOCK el como saldra como agotado
        $productoStock = $this->db->where('producto', $value2->item_id)->where('cantidad <', $value2->cantidad)->get('stock')->row();
        if ($productoStock) {
          $EstadoProducto = TRUE;  // cuando $EstadoProducto es TRUE ara que el div/boton este desahabilitado
          break;
        }
      }
    } else {
      $EstadoProducto = FALSE;
    }

    if ($EstadoProducto == TRUE) {
      echo json_encode(['stock' => TRUE]);
    } else {
      $html = '';
      $idproducto = $this->input->post('idproducto');
      $correlativo = $this->input->post('correlativo');
      $producto = $this->Controlador_model->get($idproducto, 'producto');
      $html .= '
     <div class="fila row" id="P_' . $idproducto . '" style="margin: 10px 3px">
      <input id="Productos' . $this->venta . '"  value="' . $idproducto . '" type="hidden">
      <div class="row">
      
      <div class="col-lg-4 col-sm-4 col-xs-4">';

      if ($producto->photo) {
        $html .= '<img src="' . base_url() . 'files/products/' . $producto->photothumb . '" alt="' . $producto->nombre . '">';
      } else {
        $html .= '<img class="" style="width:100%; border-radius:5px" src="' . base_url() . 'files/productoDefect/platvacio.jpg">';
      }

      $html .= '
      </div>
      <div class="col-lg-8 col-sm-8 col-xs-8">
          <table class="table">
            <tr>
              <td>' . $producto->nombre . ' S/</td>
              <td class="text-center" id="ProductoPrecio' . $idproducto . '">' . $producto->precioventa . '</td>
              <td  rowspan="2" class="text-center" style="vertical-align:middle;">
      <button title="CANCELAR" style="background:#EEAF14" class="btn btn-warning btn-sm BotonesStock" onclick="EliminaProducto(' . $idproducto . ', ' . $this->venta . ',' . $correlativo . ',' . $producto->categoria . ')">
              <i class="fa fa-minus-circle"></i>
              </button>
              </td>
            </tr>
            <tr>
              <td>Cant.</td>
              <td class="text-center" >
              <div id="spinner4">
                <div class="input-group" style="width:110px;">
                <div class="spinner-buttons input-group-btn">
                <button id="BotonMenos' . $idproducto . '" onClick="MasMenos(1,' . $idproducto . ', ' . $this->venta . ',' . $correlativo . ')" type="button" class="btn spinner-down btn-inverse waves-effect waves-light btn-sm">
                 <i class="fa fa-minus"></i>
                </button>
                 </div>
                    <input readonly id="CantidadProducto' . $idproducto . '" type="text" class="spinner-input form-control input-sm" value="1">
                <div class="spinner-buttons input-group-btn">
                <button id="BotonMas' . $idproducto . '" onClick="MasMenos(0, ' . $idproducto . ',' . $this->venta . ',' . $correlativo . ')" type="button" class="btn spinner-up btn-inverse waves-effect waves-light btn-sm">
                <i class="fa fa-plus"></i>
                </button>
                </div>
                  </div>
               </div>
              </td>
              <td></td>
            </tr>
            <tr>
            <td>Total. S/</td>
            <td class="text-center" id="TotalPagar' . $idproducto . '">' . $producto->precioventa . '</td>
            <td></td>
            </tr>
            
          </table>
        </div>
        </div>

        <div class="row" style="margin-bottom:10px">
        <div class="col-xs-12">
        <button type="button" onclick="addoptions(' . $producto->id . ', ' . $this->venta . ',' . $correlativo . ')" class="btn btn-success btn-block  btn-xs">Opcion</button>
          <span id="pooptions' . $producto->id . '">' . $options . '</span>
        </div>
        </div>

        
      </div>
      ';
      echo json_encode(['stock' => FALSE, 'html' => $html, 'PrecioProducto' => $producto->precioventa, 'categoria' => $producto->categoria]);
    }
  }

  function ajax_agregarventa()
  {
    $idproducto = $this->input->post('idproducto');
    $dataproducto = $this->Controlador_model->get($idproducto, 'producto');

    $options = '';
    // verificacion si cuentacon stock
    $EstadoProducto = FALSE;
    if ($dataproducto->tipo == 0) {
      $stok_D = $this->db->where('producto', $dataproducto->id)->where('cantidad', 0)->get('stock')->row();
      if ($stok_D) {
        $EstadoProducto = TRUE;
      }
    } else if ($dataproducto->tipo == 2) {
      $combo = $this->db->where('producto', $dataproducto->id)->get('combo')->result();
      foreach ($combo as $key => $value2) {
        // Si no cuenta con sufuciente STOCK el como saldra como agotado
        $productoStock = $this->db->where('producto', $value2->item_id)->where('cantidad <', $value2->cantidad)->get('stock')->row();
        if ($productoStock) {
          $EstadoProducto = TRUE;  // cuando $EstadoProducto es TRUE ara que el div/boton este desahabilitado
          break;
        }
      }
    } else {
      $EstadoProducto = FALSE;
    }

    if ($EstadoProducto == TRUE) {
      echo json_encode(['stock' => TRUE]);
    } else {
      $html = '';
      $idproducto = $this->input->post('idproducto');
      $correlativo = $this->input->post('correlativo');
      $producto = $this->Controlador_model->get($idproducto, 'producto');
      $html .= '
     <div class="fila row" id="P_' . $idproducto . '" style="margin: 10px 3px">
      <input id="Productos' . $this->venta . '"  value="' . $idproducto . '" type="hidden">
      <div class="row">
      
      <div class="col-lg-4 col-sm-4 col-xs-4">';

      if ($producto->photo) {
        $html .= '<img src="' . base_url() . 'files/products/' . $producto->photothumb . '" alt="' . $producto->nombre . '">';
      } else {
        $html .= '<img class="" style="width:100%; border-radius:5px" src="' . base_url() . 'files/productoDefect/platvacio.jpg">';
      }

      $html .= '
      </div>
      <div class="col-lg-8 col-sm-8 col-xs-8">
          <table class="table">
            <tr>
              <td>' . $producto->nombre . ' S/</td>
              <td class="text-center" id="ProductoPrecio' . $idproducto . '">' . $producto->precioventa . '</td>
              <td  rowspan="2" class="text-center" style="vertical-align:middle;">
      <button title="CANCELAR" style="background:#EEAF14" class="btn btn-warning btn-sm BotonesStock" onclick="EliminaProducto(' . $idproducto . ', ' . $this->venta . ',' . $correlativo . ',' . $producto->categoria . ')">
              <i class="fa fa-minus-circle"></i>
              </button>
              </td>
            </tr>
            <tr>
              <td>Cant.</td>
              <td class="text-center" >
              <div id="spinner4">
                <div class="input-group" style="width:110px;">
                <div class="spinner-buttons input-group-btn">
                <button id="BotonMenos' . $idproducto . '" onClick="MasMenos(1,' . $idproducto . ', ' . $this->venta . ',' . $correlativo . ')" type="button" class="btn spinner-down btn-inverse waves-effect waves-light btn-sm">
                 <i class="fa fa-minus"></i>
                </button>
                 </div>
                    <input readonly id="CantidadProducto' . $idproducto . '" type="text" class="spinner-input form-control input-sm" value="1">
                <div class="spinner-buttons input-group-btn">
                <button id="BotonMas' . $idproducto . '" onClick="MasMenos(0, ' . $idproducto . ',' . $this->venta . ',' . $correlativo . ')" type="button" class="btn spinner-up btn-inverse waves-effect waves-light btn-sm">
                <i class="fa fa-plus"></i>
                </button>
                </div>
                  </div>
               </div>
              </td>
              <td></td>
            </tr>
            <tr>
            <td>Total. S/</td>
            <td class="text-center" id="TotalPagar' . $idproducto . '">' . $producto->precioventa . '</td>
            <td></td>
            </tr>
            
          </table>
        </div>
        </div>

        <div class="row" style="margin-bottom:10px">
        <div class="col-xs-12">
        <button type="button" onclick="addoptions(' . $producto->id . ', ' . $this->venta . ',' . $correlativo . ')" class="btn btn-success btn-block  btn-xs">Opcion</button>
          <span id="pooptions' . $producto->id . '">' . $options . '</span>
        </div>
        </div>

        
      </div>
      ';
      echo json_encode(['stock' => FALSE, 'html' => $html, 'PrecioProducto' => $producto->precioventa, 'categoria' => $producto->categoria]);
    }
  }

  public function totalStock($idproducto, $cantidadvariante)
  {
    // ? contamos para cuantas selecciones de ese producto le resta
    $queryproducto = $this->Controlador_model->get($idproducto, 'producto');

    $cantidadRestante = [];

    if ($queryproducto->tipo == '0') {
      // todo: El tipo de producto 0 es estandar
      $registro = $this->Controlador_model->get($this->caja, 'caja');  // ->where("empr.esa", $this->empr.esa)
      $existenciaStock = $this->db->where('producto', $queryproducto->id)->get('stock')->row();  // todo: verificamos si el producto esta registra en stock
      if ($existenciaStock) {  // ->where('empr.esa', $registro->empr.esa)
        $stok_D = $this->db->where('producto', $queryproducto->id)->get('stock')->row();
        if ($cantidadvariante > 0) {
          $cantidadRestante[] = $stok_D->cantidad / $cantidadvariante;
        } else {
          $cantidadRestante[] = $stok_D->cantidad;
        }
      } else {
        $cantidadRestante[] = 0;
      }
    } else if ($queryproducto->tipo == '2') {
      // todo: El tipo de producto 2 es combo
      $combo = $this->db->where('producto', $queryproducto->id)->get('combo')->result();  // todo: verificamos si el tiene registro en la tabal combo
      if ($combo) {
        foreach ($combo as $key => $value2) {
          $existenciaStockCombo = $this->db->where('producto', $value2->item_id)->get('stock')->row();  // todo: verificamos si el producto esta registra en stock

          if ($existenciaStockCombo) {
            $verificarCantidad = $this->db->where('producto', $value2->item_id)->where('cantidad >=', $value2->cantidad)->get('stock')->row();

            if ($verificarCantidad) {
              $cantidadTotalStock = $verificarCantidad->cantidad;
              $cantidadCombo = $value2->cantidad;
              $totalSelecciones = ($cantidadTotalStock / $cantidadCombo);
              $cantidadRestante[] = $totalSelecciones;
            } else {
              $cantidadRestante[] = 0;
              break;
            }
          } else {
            $cantidadRestante[] = 0;
          }
        }
      } else {
        $cantidadRestante[] = 0;
      }
    } else {
      $cantidadRestante[] = 'Varios';
    }

    return min($cantidadRestante);
  }

  public function ajax_listVariante($producto)
  {
    $dataproductoAntes = $this->Controlador_model->get($producto, 'producto');

    $variantes = $this->Controlador_model->getVariante($producto);

    $htmlVariantes = '';
    $htmlExtras = '';

    // TODO: ------------------------------------------ VARIANTES ------------------------------------------------------------

    foreach ($variantes->result() as $variante) {
      $dataproducto = $this->Controlador_model->get($variante->producto, 'producto');

      /*
       * $htmlVariantes .= "
       *     <button  type='button' id='boton-variante-" . $variante->id . "' onclick='seleccionarVariante(" . $variante->id . ")' class='btn btn-block'>
       *
       *     <input class='variantes' type='hidden' id='variante-" . $variante->id . "' value='" . $variante->id . "'>
       *
       *     <input type='hidden' id='precioproducto-" . $variante->id . "'  value='" . $variante->precio . "'>
       *     <input type='hidden' id='text-variante-" . $variante->id . "'  value='" . $variante->nombre . "'>
       *     " . $variante->nombre . "
       *
       *     <span class='pull-right'>
       *     <strong>S/" . $variante->precio . "</strong>
       *     </span>
       *     </button>
       *   ";
       */

      $htmlVariantes .= '
          <div style="display:inline-block">
            <label id="label-variante-' . $variante->id . '" for="input-variante-' . $variante->id . '" class="content-variante" >

              <input class="variantes" type="hidden" id="variante-' . $variante->id . '" value="' . $variante->id . '">
              <input type="hidden" id="precioproducto-' . $variante->id . '"  value="' . $variante->precio . '">
              <input type="hidden" id="text-variante-' . $variante->id . '"  value="' . $variante->nombre . '">


              <div >
              <input onclick="seleccionarVariante(' . $variante->id . ')" class="radio" type="radio" id="input-variante-' . $variante->id . '" name="variante">
              </div>

              <div class="dataradio">
                <div>' . $variante->nombre . '</div>
                <div>' . $variante->precio . '</div>
              </div> 
            </label>
          </div> 
          ';
    }

    // TODO: -------------------------------------------- EXTRAS ----------------------------------------------------------

    $queryCategoria = $this->Controlador_model->queryCategoria($dataproductoAntes->categoria);
    if ($queryCategoria) {
      $extras = $this->Controlador_model->getExtras($dataproductoAntes->categoria);

      foreach ($extras->result() as $key => $value) {
        /*
         * $htmlExtras .= "
         *     <div class='col-lg-6 col-md-4 col-sm-4 col-xs-6'>
         *             <div class='row' style='display:flex; align-items:center; justify-content:center; margin-bottom:5px'>
         *             <input type='hidden' class='claseExtra' value='" . $value->id . "'>
         *             <div class='col-lg-12'>
         *
         *               <div style='font-size:16px'>
         *                   <span id='texto-extras-".$value->id."' class='text-bold'>" . $value->nombre . "</span>
         *                   <span class='pull-right'>
         *                   <strong>S/" . $value->precio . "</strong>
         *                   </span>
         *               </div>
         *
         *                 <div class='input-group' >
         *
         *                     <div class='spinner-buttons input-group-btn'>
         *                     ASDF
         *                   </div>
         *
         *                       <input type='text'  class='spinner-input form-control text-center' value='0' id='CantidadExtra-" . $value->id . "' style='font-weight:bold' autocomplete='off'>
         *
         *                       <input type='hidden' id='NombreExtra-" . $value->id . "' value='" . $value->nombre . "'>
         *                       <input type='hidden' id='PrecioExtra-" . $value->id . "' value='" . $value->precio . "'>
         *
         *
         *                       <div class='spinner-buttons input-group-btn'>
         *                           <button type='button' class='btn btn-sm btn-info spinner-down waves-effect' onclick='OperacionExtra(0, " . $value->id . ")'>
         *                               <i class='fa fa-minus'></i>
         *                           </button>
         *                           <button type='button' class='btn btn-sm btn-success spinner-up waves-effect' onclick='OperacionExtra(1, " . $value->id . ")'>
         *                               <i class='fa fa-plus'></i>
         *                           </button>
         *                       </div>
         *                 </div>
         *
         *             </div>
         *
         *       </div>
         *     </div>
         *
         *       ";
         */

        $htmlExtras .= '
            <div style="display: inline-block">
            <div class="main-extra" id="extra-' . $value->id . '" style="position:relative">
            <input type="hidden" class="ExtraIdenti" value="' . $value->id . '">

            <input type="hidden" id="PrecioExtra-' . $value->id . '" value="' . $value->precio . '">
            <input type="hidden" id="NombreExtra-' . $value->id . '" value="' . $value->nombre . '">

                <span id="sinextra-' . $value->id . '" class="sin-extra" onclick="sinextraope(' . $value->id . ')"><i class="fa fa-minus-circle"></i></span>
                <div class="main-extra__uno">
                    <input type="checkbox" onclick="seleccionarExtraChecked(' . $value->id . ')" class="check_extra" id="checkep_extra-' . $value->id . '">
                </div>
                <label class="main-extra__two" onclick="seleccionarExtra(' . $value->id . ')">
                    
                    <span id="extraname-' . $value->id . '">' . $value->nombre . '</span>
                    <span id="extraprecio-' . $value->id . '">S/. ' . $value->precio . '</span>
                   
                </label>
            </div>
            </div>

              ';
      }
      $totalExtras = $extras->num_rows();
    } else {
      $totalExtras = 0;
    }

    if ($variantes->num_rows() > 0) {
      $statusvariante = TRUE;
    } else {
      $statusvariante = 0;
    }

    $htmlBoton = '
    <button type="button" class="btn btn-default" data-dismiss="modal" style="border-radius: 8px; font-weight: 600; padding: 8px 20px; border: 1.5px solid #e2e8f0; color: #475569; background: #ffffff; transition: all 0.2s;">Cerrar</button>
    <button class="btn btn-primary" id="procesoAgregarExtra" onclick="procesoAgregarExtra(' . $producto . ', ' . $dataproductoAntes->categoria . ', ' . $statusvariante . ')" style="border-radius: 8px; font-weight: 600; padding: 8px 24px; background: #3b82f6; border: none; box-shadow: 0 4px 6px -1px rgba(59, 130, 246, 0.3); transition: all 0.2s;">Agregar</button>';

    echo json_encode(['variantes' => $htmlVariantes, 'extras' => $htmlExtras, 'boton' => $htmlBoton, 'totalvariantes' => $variantes->num_rows(), 'totalextras' => $totalExtras]);
  }

  function ajax_verif_stock()
  {
    $EstadoProducto = FALSE;
    $idproducto = $this->input->post('idproducto');

    $queryventa = $this->Controlador_model->get($this->input->post('venta'), 'venta');
    $producto = $this->Controlador_model->get($idproducto, 'producto');
    $productocategoria = $this->Controlador_model->getCategoria($producto->categoria, 'productocategoria');

    /*
     * hacer que la categoria que no es para mostrar no se muestre
     * if($productocategoria->){
     *   $estadococina =
     * }
     */
    if ($queryventa->estado == '0') {
      if ($producto->tipo == '0') {
        // todo: El tipo de producto 0 es estandar
        // $registro = $this->Controlador_model->get($this->caja, 'caja');//salio por misma empresa
        $existenciaStock = $this->db->where('producto', $producto->id)->get('stock')->row();  // todo: verificamos si el producto esta registra en stock
        if ($existenciaStock) {  // ->where('empr.esa', $registro->empr.esa)
          $stok_D = $this->db->where('producto', $producto->id)->where('cantidad <=', 0)->get('stock')->row();
          if ($stok_D) {
            $EstadoProducto = TRUE;  // no existe el producto o no tiene menor q 0
          } else {
            $EstadoProducto = FALSE;
          }
        } else {
          $EstadoProducto = TRUE;
        }
      } else if ($producto->tipo == '2') {
        // todo: El tipo de producto 2 es combo
        $combo = $this->db->where('producto', $producto->id)->get('combo')->result();  // todo: verificamos si el tiene registro en la tabal combo
        if ($combo) {
          foreach ($combo as $key => $value2) {
            // $ProductoCombo = $this->Controlador_model->get($value2->item_id, 'combo');//no se usaba
            // Si no cuenta con sufuciente STOCK el como saldra como agotado
            $existenciaStockCombo = $this->db->where('producto', $value2->item_id)->get('stock')->row();  // todo: verificamos si el producto esta registra en stock
            if ($existenciaStockCombo) {
              $productoStock = $this->db->where('producto', $value2->item_id)->where('cantidad <', $value2->cantidad)->get('stock')->row();
              if ($productoStock) {
                $EstadoProducto = TRUE;  // cuando $EstadoProducto es TRUE ara que el div/boton este desahabilitado
                break;
              } else {
                $EstadoProducto = FALSE;
              }
            } else {
              $EstadoProducto = TRUE;
              break;
            }
          }
        } else {
          // todo: si no tine que productos en el combo se desahanilita el producto es tipo combo
          $EstadoProducto = TRUE;
        }
      } else {
        $EstadoProducto = FALSE;
      }

      if ($EstadoProducto == TRUE) {
        echo json_encode(['status' => true]);  // si no cuenta con stock ara que el producto se bloquee
      } else {
        // si cuenta con stock hacemos el proceso de descontar
        $EstadoProdcutoSeleccion = FALSE;

        if ($producto->tipo == 0) {
          $stock = $this->Controlador_model->getStockProceso($producto->id);
          $updateStock = [
            'cantidad' => ($stock->cantidad - 1)
          ];
          $this->Controlador_model->update(['id' => $stock->id], $updateStock, 'stock');

          // TODO:------------------Le preguntamos si aun se puede elegir el producto otravez-------------------------
          // $registro = $this->Controlador_model->get($this->caja, 'caja');
          $existenciaStock = $this->db->where('producto', $idproducto)->get('stock')->row();  // todo: verificamos si el producto esta registra en stock
          if ($existenciaStock) {  // ->where('empr.esa', $registro->empr.esa)
            $stok_D = $this->db->where('producto', $idproducto)->where('cantidad <=', 0)->get('stock')->row();
            if ($stok_D) {
              $EstadoProdcutoSeleccion = TRUE;
            } else {
              $EstadoProdcutoSeleccion = FALSE;
            }
          } else {
            $EstadoProdcutoSeleccion = TRUE;
          }
          // TODO:------------------Le preguntamos si aun se puede elegir el producto otravez END--------------------------

          echo json_encode(
            [
              'status' => FALSE,
              'EstadoProductoSeleccion' => $EstadoProdcutoSeleccion,
              'productotext' => $producto->nombre,
              'estadoventa' => TRUE
            ]
          );
        } else if ($producto->tipo == 2) {
          $combo = $this->Controlador_model->ProductoCombo($producto->id);
          foreach ($combo as $value) {
            $stock = $this->Controlador_model->getStockProceso($value->item_id);
            $updateStock = [
              'cantidad' => $stock->cantidad - $value->cantidad
            ];
            $this->Controlador_model->update(['id' => $stock->id], $updateStock, 'stock');
          }
          // TODO:------------------Le preguntamos si aun se puede elegir el producto otravez-------------------------
          $combo = $this->db->where('producto', $idproducto)->get('combo')->result();  // todo: verificamos si el tiene registro en la tabal combo
          if ($combo) {
            foreach ($combo as $key => $value2) {
              // $ProductoCombo = $this->Controlador_model->get($value2->item_id, 'combo');//no usado
              // Si no cuenta con sufuciente STOCK el como saldra como agotado
              $existenciaStockCombo = $this->db->where('producto', $value2->item_id)->get('stock')->row();  // todo: verificamos si el producto esta registra en stock
              if ($existenciaStockCombo) {
                $productoStock = $this->db->where('producto', $value2->item_id)->where('cantidad <', $value2->cantidad)->get('stock')->row();
                if ($productoStock) {
                  $EstadoProdcutoSeleccion = TRUE;  // cuando $EstadoProdcutoSeleccion es TRUE ara que el div/boton este desahabilitado
                  break;
                } else {
                  $EstadoProdcutoSeleccion = FALSE;
                }
              } else {
                $EstadoProdcutoSeleccion = TRUE;
                break;
              }
            }
          } else {
            // ? si no tine que productos en el combo se desahanilita el producto es tipo combo
            $EstadoProdcutoSeleccion = TRUE;
          }
          // TODO:------------------Le preguntamos si aun se puede elegir el producto otravez END--------------------------

          echo json_encode([
            'status' => FALSE,
            'EstadoProductoSeleccion' => $EstadoProdcutoSeleccion,
            'productotext' => $producto->nombre,
            'estadococina' => FALSE,
            'estadoventa' => TRUE
          ]);
        } else {
          echo json_encode([
            'status' => FALSE,
            'EstadoProductoSeleccion' => $EstadoProdcutoSeleccion,
            'productotext' => $producto->nombre,
            'estadococina' => FALSE,
            'estadoventa' => TRUE
          ]);
        }
      }
    } else {
      $CI = &get_instance();
      $CI->session->set_userdata('venta', NULL);
      $CI->session->set_userdata('NumberTable', NULL);

      echo json_encode(
        [
          'estadoventa' => FALSE
        ]
      );
    }
  }

  public function ajax_descontar_stock()
  {
    $idproducto = $this->input->post('idproducto');
    $cantidad = 1;
    $producto = $this->Controlador_model->get($idproducto, 'producto');
    if ($producto->tipo == 0) {
      $stock = $this->Controlador_model->getStockProceso($producto->id);
      $updateStock = [
        'cantidad' => ($stock->cantidad - $cantidad)
      ];
      $this->Controlador_model->update(['id' => $stock->id], $updateStock, 'stock');
    } else if ($producto->tipo == 2) {
      $combo = $this->Controlador_model->ProductoCombo($producto->id);
      foreach ($combo as $value) {
        $stock = $this->Controlador_model->getStockProceso($value->item_id);
        $updateStock = [
          'cantidad' => $stock->cantidad - ($value->cantidad * $cantidad)
        ];
        $this->Controlador_model->update(['id' => $stock->id], $updateStock, 'stock');
      }
    } else {
      // el producto no maneja el stock
    }
    $EstadoProducto = $this->VeriCuentaStock($idproducto);
    echo json_encode(['EstadoProducto' => $EstadoProducto]);
  }

  function ajax_ProductosSeleccionados()
  {
    $html = '';
    $idproducto = $this->input->post('idproducto');
    $correlativo = $this->input->post('correlativo');
    $cantidad = $this->input->post('cantidad');
    $opcion = $this->input->post('opcion');
    $total = $this->input->post('total');
    $producto = $this->Controlador_model->get($idproducto, 'producto');
    $html .= '
  <div class="fila row" id="P_' . $idproducto . '" >
    <input id="Productos' . $this->venta . '"  value="' . $idproducto . '" type="hidden">
      <div class="col-lg-4">';
    if ($producto->photo) {
      $html .= '<img src="' . base_url() . 'files/products/' . $producto->photothumb . '" alt="' . $producto->nombre . '">';
    } else {
      $html .= '<img class="" style="width:100%; border-radius:5px" src="' . base_url() . 'files/productoDefect/platvacio.jpg">';
    }
    $html .= '</div>
      <div class="col-lg-8">
        <table class="table">
          <tr>
            <td>' . $producto->nombre . ' S/</td>
            <td class="text-left" id="ProductoPrecio' . $idproducto . '">' . $producto->precioventa . '</td>

            <td  rowspan="2" class="text-center" style="vertical-align:middle;">
            <button title="CANCELAR" style="background:#EEAF14" class="btn btn-warning btn-sm BotonesStock" onclick="EliminaProducto(' . $idproducto . ', ' . $this->venta . ',' . $correlativo . ')"><i class="fa fa-minus-circle"></i>
            </button>
            </td>
          </tr>
          <tr>
            <td>Cant.</td>
            <td class="text-left">
            <div id="spinner4">
                <div class="input-group" style="width:110px;">
                <div class="spinner-buttons input-group-btn">
                <button id="BotonMenos' . $idproducto . '" onClick="MasMenos(1,' . $idproducto . ', ' . $this->venta . ',' . $correlativo . ')" type="button" class="btn spinner-down btn-inverse waves-effect waves-light btn-sm">
                 <i class="fa fa-minus"></i>
                </button>
                 </div>
                    <input readonly id="CantidadProducto' . $idproducto . '" type="text" class="spinner-input form-control input-sm" value="' . $cantidad . '">
                    
                <div class="spinner-buttons input-group-btn">
                <button id="BotonMas' . $idproducto . '" onClick="MasMenos(0, ' . $idproducto . ',' . $this->venta . ',' . $correlativo . ')" type="button" class="btn spinner-up btn-inverse waves-effect waves-light btn-sm">
                <i class="fa fa-plus"></i>
                </button>
                </div>
                  </div>
               </div>
            </td>
            <td></td>
          </tr>
          <tr>
          <td>Total. S/</td>
          <td id="TotalPagar' . $idproducto . '">' . $total . '</td>
          <td></td>
          </tr>
          
        </table>
      </div>
      <div class="row" style="margin-bottom:10px">
        <div class="col-xs-12">
        <button type="button" onclick="addoptions(' . $producto->id . ', ' . $this->venta . ',' . $correlativo . ')" class="btn btn-success btn-block  btn-xs">Opcion</button>
          <span id="pooptions' . $producto->id . '">' . $opcion . '</span>
        </div>
        </div>
    </div>
    ';
    // hacerpedido() era entes, ahora es EnviarPedido() -- eliminar los script que no se utiliza

    echo $html;
  }

  function ajax_restablecer_stock()
  {
    $idproducto = $this->input->post('idproducto');
    $cantidad = $this->input->post('CantidadProducto');
    $producto = $this->Controlador_model->get($idproducto, 'producto');
    if ($producto->tipo == 0) {
      $stock = $this->Controlador_model->getStockProceso($producto->id);
      $updateStock = [
        'cantidad' => ($stock->cantidad + $cantidad)
      ];
      $this->Controlador_model->update(['id' => $stock->id], $updateStock, 'stock');
    } else if ($producto->tipo == 2) {
      $combo = $this->Controlador_model->ProductoCombo($producto->id);
      foreach ($combo as $value) {
        $stock = $this->Controlador_model->getStockProceso($value->item_id);
        $updateStock = [
          'cantidad' => $stock->cantidad + ($value->cantidad * $cantidad)
        ];
        $this->Controlador_model->update(['id' => $stock->id], $updateStock, 'stock');
      }
    } else {
      // el producto no maneja el stock
    }

    $EstadoProducto = $this->VeriCuentaStock($idproducto);  // ? si es true cuenta con stock
    echo json_encode(['EstadoProducto' => $EstadoProducto]);
  }

  public function VeriCuentaStock($idproducto)
  {
    // ? verifica si despues del restablecimiento del stock se puede desbloquear el producto
    $producto = $this->Controlador_model->get($idproducto, 'producto');
    $EstadoProducto = FALSE;
    if ($producto->tipo == 0) {
      $stockRestablecido = $this->Controlador_model->getStockProceso($producto->id);
      // TODO: -----------------------Verificar si hay stock disponible----------------------------
      if ($stockRestablecido->cantidad > 0) {
        $EstadoProducto = TRUE;  // TODO: Si cuenta con stock
      } else {
        $EstadoProducto = FALSE;  // TODO: No cuenta con stock
      }
    } else if ($producto->tipo == 2) {
      // TODO: -----------------------Verificar si hay stock disponible----------------------------
      $comoboActualizado = $this->Controlador_model->ProductoCombo($producto->id);
      foreach ($comoboActualizado as $value) {
        $stock = $this->Controlador_model->getStockProceso($value->item_id);
        if ($stock->cantidad >= $value->cantidad) {
          $EstadoProducto = TRUE;  // TODO: Si cuenta con stock
        } else {
          $EstadoProducto = FALSE;  // TODO: No cuenta con stock
          break;
        }
      }
    } else {
      $EstadoProducto = TRUE;
    }

    return $EstadoProducto;
  }

  function ajax_Datos_Venta()
  {
    /*
     * <input type="checkbox" id="checkbox'.$posale->id.'" '.($posale->procesar == '1' ? 'checked' : '').'>
     *            <label for="checkbox'.$posale->id.'"></label>
     */
    $ventasEnviadas = '';
    $idventa = $this->input->post('idventa');
    $posales = $this->Controlador_model->pedidodetalle($idventa);
    $venta = $this->Controlador_model->get($idventa, 'venta');
    $totalItemventadetalle = $this->Controlador_model->getTotalVentas($venta->id, 'ventadetalle');
    if ($posales) {
      foreach ($posales as $key => $posale) {
        $producto = $this->Controlador_model->get($posale->producto, 'producto');
        $options = $posale->opcion . ',' . $posale->opciones;
        $options = trim($options, ',');

        if ($posale->estadopago == '1') {
          $color = 'alert-success';
        } else {
          $color = '';
        }

        if ($posale->variante == FALSE or is_null($posale->variante)) {
          $textoproducto = $posale->nombre;
        } else {
          $textoproducto = $posale->nombre . "  <span style='color:#DDA433'>" . $posale->nombrevariante . '</span> ';
        }

        $ventasEnviadas .= '
              <div class="sent-product-item ' . $color . '">
                  <div class="spi-main">
                      <div class="spi-check-container" id="contenedorPV">
                          ' . ($posale->estadopago == '0'
          ? '<div class="custom-control custom-checkbox">
                                  <input type="checkbox" class="chechekPVA custom-control-input" id="checkedproducto' . ($key + 1) . '" value="' . $posale->id . '" checked onclick="productopagar(' . $posale->id . ')">
                                  <label class="custom-control-label" for="checkedproducto' . ($key + 1) . '"></label>
                              </div>'
          : '<div class="spi-paid-status"><i class="fas fa-check-circle text-success"></i></div>') . '
                      </div>
                      <div class="spi-info">
                          <div class="spi-name">' . $textoproducto . '</div>
                          <div class="spi-meta">
                              <span class="spi-time"><i class="far fa-clock"></i> ' . $posale->time . '</span>
                              ' . ($options ? '<span class="spi-options"><i class="fas fa-info-circle"></i> ' . $options . '</span>' : '') . '
                          </div>
                      </div>
                      <div class="spi-stats">
                          <div class="spi-qty-price">
                              <span class="spi-qty">' . $posale->cantidad . ' x</span>
                              <span class="spi-price">S/ ' . number_format($posale->precio, 2) . '</span>
                          </div>
                          <div class="spi-total">S/ <span id="PrecioPV' . $posale->id . '">' . number_format($posale->precio * $posale->cantidad, 2) . '</span></div>
                      </div>
                  </div>
                  <!-- Hidden fields for legacy JS compatibility -->
                  <input id="ventadetalle' . $posale->id . '" value="' . $posale->producto . '" type="hidden">
                  <div id="CantidadPV' . $posale->id . '" style="display:none">' . $posale->cantidad . '</div>
                  <span id="pooptions' . $posale->id . '" style="display:none">' . $options . '</span>
              </div>';
      }
    } else {
      $ventasEnviadas .= '<div class="messageVide">NO HA GENERADO PEDIDO <span>(Generar su pedido para empezar)</span></div>';
    }
    echo json_encode([
      'ventasEnviadas' => $ventasEnviadas,
      'totalitems' => $totalItemventadetalle,
      'montototal' => $venta->montototal,
      'montoactual' => $venta->montoactual
    ]);
  }

  function ajax_EnviarPedido()
  {
    /*
     * $producto = $this->input->post('idproducto');
     * $cantidad = $this->input->post("CantidadProducto");
     * $opcion = $this->input->post("opcion");
     * $variante = $this->input->post("id_variante");
     * $nombrevariante = $this->input->post("nombrevariante");
     * $venta = $this->input->post('idventa');
     * $precioproducto = $this->input->post('precio_producto');
     * $productodata = $this->Controlador_model->get($producto, 'producto');
     * $text_producto = $this->input->post('text_proudcto');
     * $dataVentaDetalle =  [
     *   "venta" => $venta,
     *   'producto' => $producto,
     *   'nombre' =>  $text_producto,
     *   'precio' =>  $precioproducto,
     *   "cantidad" => $cantidad,
     *   "variante" => $variante != false ? $variante : NULL,
     *   "nombrevariante" => $variante != false ? $nombrevariante : NULL,
     *   "subtotal" => ($precioproducto * $cantidad),
     *   "opcion" => $opcion,
     *   "estadocomanda" => "1",
     *   "time" => date("H:i:s"),
     *   "estado" => '0' // TODO Estado "0" Significa que ya se envio a cocina
     * ];
     *
     * if ($this->Controlador_model->save('ventadetalle', $dataVentaDetalle)) {
     *   echo json_encode(['status' => TRUE]);
     * }
     */

    $idventa = $this->input->post('idventa');
    // ? los ventadetalle anteriores hacemos que ya no se muestre cambiando el estado a 0
    $dataventadetalleold = $this->Controlador_model->UpdateVentaDetalle($idventa);
    // -------------------------------------proceso de guardar agrega en ventadetalle-------------------------------------------
    if ($dataventadetalleold) {
      $dataproductos = json_decode($this->input->post('dataproductos'));
      $data = '';
      $CantidadItem = 0;
      $DeudaTotal = 0;
      foreach ($dataproductos as $value) {
        $producto = $value->id_producto;
        $cantidad = $value->cantidad;
        $idventa = $idventa;
        $variante = $value->id_variante;
        $totalpagar = $value->total_pagar;
        $precio_producto = $value->precio_producto;
        $productodata = $this->Controlador_model->get($producto, 'producto');
        $nombreproduct = $value->text_proudcto;
        $cantidadEscogido = $value->cantidad;
        $dataVentaDetalle = [
          'venta' => $idventa,
          'producto' => $producto,
          'nombre' => $nombreproduct,
          'precio' => $precio_producto,
          'cantidad' => $cantidad,
          'variante' => ($variante ? $variante : NULL),
          'nombrevariante' => $variante != false ? $value->text_variante : NULL,
          'subtotal' => $totalpagar,
          'opcion' => $value->opcion,
          'opciones' => $value->opciones,
          'estadocomanda' => '1',
          'preciocompra' => $productodata->preciocompra,
          'time' => date('H:i:s'),
          'estado' => '0'  // TODO Estado "0" Significa que ya se envio a cocina
        ];
        $CantidadItem += $cantidadEscogido;
        $DeudaTotal += $value->total_pagar;
        $insert = $this->Controlador_model->save('ventadetalle', $dataVentaDetalle);
      }
      echo json_encode(['cantidaditem' => $CantidadItem, 'deudaTotal' => $DeudaTotal]);
    }
  }

  function imprimir_comanda($idventa)
  {
    $venta = $this->Controlador_model->get($idventa, 'venta');
    // /$pedidocomanda = $this->Controlador_model->getComanda($idventa);

    $this->db->join('producto p', 'p.id=vd.producto');
    $this->db->join('productocategoria pc', 'pc.id=p.categoria');
    $this->db->where('vd.venta', $venta->id)->where('vd.estadocomanda', '1')->where('pc.clase', 'COCINA');
    $this->db->select('vd.*');
    $pedidocomandac = $this->db->order_by('pc.clase', 'asc')->get('ventadetalle vd')->result();

    $this->db->join('producto p', 'p.id=vd.producto');
    $this->db->join('productocategoria pc', 'pc.id=p.categoria');
    $this->db->where('vd.venta', $venta->id)->where('vd.estadocomanda', '1')->where('pc.clase', 'BAR');
    $this->db->select('vd.*');
    $pedidocomandab = $this->db->order_by('pc.clase', 'asc')->get('ventadetalle vd')->result();

    $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
    $data = array(
      'venta' => $venta,
      'ventadetallec' => $pedidocomandac,
      'ventadetalleb' => $pedidocomandab,
      'mesa' => $mesa,
      'zona' => $this->Controlador_model->get($mesa->zona, 'zona'),
      'cliente' => $this->Controlador_model->get($venta->cliente, 'cliente'),
      'usuario' => $this->Controlador_model->get($venta->usuario, 'usuario'),
      'empresa' => $this->Controlador_model->get($venta->empresa, 'empresa')
    );
    $this->load->view('imprimircomandadb', $data);
  }

  function ajax_DatosPago()
  {
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    if ($venta->estado == '1') {
      $data = [
        'estadoventa' => FALSE
      ];
    } else {
      $cliente = $this->Controlador_model->get($venta->cliente, 'cliente');
      $data = [
        'totalItems' => $venta->totalitems,
        'monotaPagar' => $venta->montoactual,
        'cliente' => $cliente->id,
        'nombrecompleto' => $cliente->documento . ' | ' . $cliente->nombre . ' ' . $cliente->apellido,
        'tipoventa' => $venta->tipoventa,
        'nombreapellido' => $cliente->nombre . ' ' . $cliente->apellido,
        'descuento' => $venta->descuento,
        'estadoventa' => TRUE
      ];
    }
    echo json_encode($data);
  }

  function ajax_DatosPagoRapido()
  {
    $venta = $this->Controlador_model->get($this->input->post('idventa'), 'venta');
    if ($venta->estado == '1') {
      $data = ['estadoventa' => FALSE];
    } else {
      $cliente = $this->Controlador_model->get($venta->cliente, 'cliente');
      $data = [
        'totalItems' => $venta->totalitems,
        'monotaPagar' => $venta->montoactual,
        'cliente' => $cliente->id,
        'nombrecompleto' => $cliente->documento . ' | ' . $cliente->nombre . ' ' . $cliente->apellido,
        'tipoventa' => $venta->tipoventa,
        'nombreapellido' => $cliente->nombre . ' ' . $cliente->apellido,
        'formapago' => $venta->formapago,
        'estadoventa' => TRUE
      ];
    }
    echo json_encode($data);
  }

  function ajax_Actualiar_venta()
  {
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
    $dataVEnta = [
      'montototal' => $venta->montototal + $this->input->post('DeudaTotal'),
      'montoactual' => $venta->montoactual + $this->input->post('DeudaTotal'),
      'totalitems' => $venta->totalitems + $this->input->post('CantidadItem'),
      'atender' => '0',
      'sound' => '0',
      'created' => date('Y-m-d')
    ];
    $updateVenta = $this->Controlador_model->update(['id' => $venta->id], $dataVEnta, 'venta');
    // Actulizamos la mesa
    $datamesa['estado'] = '2';
    $datamesa['checked'] = date('Y-m-d H:i:s');
    $this->Controlador_model->update(array('id' => $mesa->id), $datamesa, 'mesa');
    $ventaActualizado = $this->Controlador_model->get($this->venta, 'venta');
    $empresa = $this->Controlador_model->get($this->empresa, 'empresa');
    if ($updateVenta) {
      echo json_encode(['status' => TRUE, 'TotalItemActualizado' => $ventaActualizado->totalitems, 'tipoimpresora' => $empresa->tipoimpresora]);
    }
  }

  function ajax_RestablecerStockOne()
  {
    $idproducto = $this->input->post('idproducto');
    $cantidad = 1;
    $producto = $this->Controlador_model->get($idproducto, 'producto');
    if ($producto->tipo == 0) {
      $stock = $this->Controlador_model->getStockProceso($producto->id);
      $updateStock = [
        'cantidad' => ($stock->cantidad + $cantidad)
      ];
      $this->Controlador_model->update(['id' => $stock->id], $updateStock, 'stock');
    } else if ($producto->tipo == 2) {
      $combo = $this->Controlador_model->ProductoCombo($producto->id);
      foreach ($combo as $value) {
        $stock = $this->Controlador_model->getStockProceso($value->item_id);
        $updateStock = [
          'cantidad' => $stock->cantidad + ($value->cantidad * $cantidad)
        ];
        $this->Controlador_model->update(['id' => $stock->id], $updateStock, 'stock');
      }
    } else {
      // el producto no maneja el stock
    }
    $EstadoProducto = $this->VeriCuentaStock($idproducto);
    echo json_encode(['EstadoProducto' => $EstadoProducto]);
  }

  function ajax_VerificarVenta()
  {
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    $reocoverCliente = $this->Controlador_model->get($venta->cliente, 'cliente');
    $cliente = $reocoverCliente->id;
    $clientes = $reocoverCliente->documento . ' | ' . $reocoverCliente->nombre . ' ' . $reocoverCliente->apellido;
    if ($venta->estado == '1') {
      echo json_encode(['status' => TRUE, 'cliente' => $cliente, 'clientes' => $clientes, 'dividircuenta' => $venta->dcuenta, 'venta' => $venta->id]);
    } else {
      echo json_encode(['status' => FALSE, 'cliente' => $cliente, 'clientes' => $clientes, 'dividircuenta' => $venta->dcuenta, 'venta' => $venta->id]);
    }
  }

  function ajax_separarCuenta()
  {
    $this->_validatprocesar();

    $ventaPartida = $this->Controlador_model->get($this->venta, 'venta');

    $dataV_P = [
      'totalitems' => $ventaPartida->totalitems - $this->input->post('total_items'),
      'montototal' => $ventaPartida->montototal - $this->input->post('monto_total'),
      'montoactual' => $ventaPartida->montoactual - $this->input->post('monto_total')
    ];

    // $actualizarVentaPArtidad =
    $this->Controlador_model->update(['id' => $ventaPartida->id], $dataV_P, 'venta');

    $empresa = $this->Controlador_model->get($ventaPartida->empresa, 'empresa');

    $serie = substr($ventaPartida->tipoventa, 0, 1) . substr($empresa->serie, 1, 3);
    $numero = $this->Controlador_model->codigos($ventaPartida->tipoventa, $serie);
    $numeros = $numero ? $numero->consecutivo + 1 : 1;
    $cadena = '';
    for ($i = 0; $i < 6 - strlen($numeros); $i++) {
      $cadena = $cadena . '0';
    }

    $montopago = $this->input->post('pago');

    $dataNew = [
      'empresa' => $ventaPartida->empresa,
      'usuario' => $ventaPartida->usuario,
      'caja' => $this->caja,
      'mesa' => $ventaPartida->mesa,
      'cliente' => $ventaPartida->cliente,
      'tipoventa' => $ventaPartida->tipoventa,
      'serie' => $serie,
      'numero' => $cadena . $numeros,
      'consecutivo' => $numeros,
      'formapago' => $this->input->post('formapago'),
      'montototal' => $this->input->post('monto_total'),
      'descuento' => $this->input->post('descuento'),
      'totalitems' => $this->input->post('total_items'),
      'sound' => '1',
      'consumo' => $this->input->post('is_consumo') == 1 ? '1' : '0',
      'estado' => '1',
      'created' => date('Y-m-d'),
      'hora' => date('H:i:s'),
      'vence' => $this->input->post('vence')
    ];

    if ($this->input->post('formapago') == 'CONTADO') {
      $dataNew['montoactual'] = '0';
      $dataNew['pago'] = $this->input->post('pago');
    } else {
      $dataNew['montoactual'] = $this->input->post('monto_total');
    }

    $nuevaVenta = $this->Controlador_model->save('venta', $dataNew);
    if ($this->input->post('formapago') == 'CONTADO') {
      $dataingreso2['empresa'] = $this->empresa;
      $dataingreso2['usuario'] = $this->usuario;
      $dataingreso2['concepto'] = $this->tipoconcepto($this->input->post('metodopago'));  // 3;3;
      $dataingreso2['caja'] = $this->caja;
      $dataingreso2['venta'] = $nuevaVenta;
      $dataingreso2['metodopago'] = $this->input->post('metodopago');
      $dataingreso2['tipotarjeta'] = $this->input->post('tipotarjeta') ? $this->input->post('tipotarjeta') : NULL;
      // $dataingreso2['operacion'] = $this->input->post('operacion');
      $dataingreso2['monto'] = $this->input->post('monto_total') - $this->input->post('descuento');
      $dataingreso2['created'] = date('Y-m-d');
      $this->Controlador_model->save('ingreso', $dataingreso2);
    }

    // Venta detalle
    $ventadetalleARRAY = json_decode($this->input->post('ventadetalle'), true);
    foreach ($ventadetalleARRAY as $value) {
      $dataVentaDetaNew = [
        'venta' => $nuevaVenta,
        'estadopago' => '1',
      ];
      $this->Controlador_model->update(['id' => $value], $dataVentaDetaNew, 'ventadetalle');  // ? actulizamos toda la ventadetalle, la nueva venta
    }
    $clienteData = $this->Controlador_model->get($ventaPartida->cliente, 'cliente');
    $clientesdata = $clienteData->documento . ' | ' . $clienteData->nombre . ' | ' . $clienteData->apellido;
    echo json_encode([
      'status' => TRUE,
      'venta' => $nuevaVenta,
      'cliente' => $ventaPartida->cliente,
      'clientes' => $clientesdata,
      // 'tipopago' => 'separado',
    ]);
  }

  function ajax_AddNewSaleMetodoPago()
  {
    $this->_validatprocesar();  // totalpagar

    $venta = $this->Controlador_model->get($this->venta, 'venta');

    if ($venta->consecutivo == 0) {
      $empresa = $this->Controlador_model->get($venta->empresa, 'empresa');
      $serie = substr($venta->tipoventa, 0, 1) . substr($empresa->serie, 1, 3);
      $numero = $this->Controlador_model->codigos($venta->tipoventa, $serie);
      $numeros = $numero ? $numero->consecutivo + 1 : 1;
      $cadena = '';
      for ($i = 0; $i < 6 - strlen($numeros); $i++) {
        $cadena = $cadena . '0';
      }
      $dataventa['serie'] = $serie;
      $dataventa['numero'] = $cadena . $numeros;
      $dataventa['consecutivo'] = $numeros;
    }
    $dataventa['consumo'] = $this->input->post('is_consumo') ? '1' : '0';

    $cuenta = $venta->montoactual - $this->input->post('descuento');

    if ($this->input->post('formapago') == 'CONTADO') {
      $dataventa['vence'] = date('Y-m-d');
      $dataventa['descuento'] = $venta->descuento + $this->input->post('descuento');

      if ($this->input->post('pago') >= $cuenta) {
        $dataventa['estado'] = '1';
        $dataventa['montoactual'] = 0;

        $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
        if (!$mesa->is_temporal) {
          $datamesa['estado'] = '0';
          $datamesa['time'] = '';
          $datamesa['checked'] = '';
          $datamesa['open_by'] = '0';
          $this->Controlador_model->update(array('id' => $venta->mesa), $datamesa, 'mesa');  // desactivado para probar
        } else {
          $dataventa['mesa'] = NULL;
          $this->Controlador_model->update(array('id' => $this->venta), array('mesa' => NULL), 'venta');
          $this->Controlador_model->delete_by_id($mesa->id, 'mesa');  // desactivado para probar
        }
      } else {
        // $dataventa['estado'] = '1';
        $dataventa['montoactual'] = $venta->montoactual - $this->input->post('pago') - $this->input->post('descuento');
      }

      $dataventa['hora'] = date('H:i:s');

      if ($this->input->post('metodopago') == 'EFECTIVO') {
        $dataventa['pago'] = $venta->pago + $this->input->post('pago');
      } else {
        $dataventa['pago'] = $venta->pago;
      }

      if ($this->input->post('pago') >= $cuenta)
        $dataingreso['monto'] = $cuenta;
      else
        $dataingreso['monto'] = $this->input->post('pago');

      $dataingreso['empresa'] = $this->empresa;
      $dataingreso['usuario'] = $this->usuario;
      $dataingreso['concepto'] = $this->tipoconcepto($this->input->post('metodopago'));  // 3;
      $dataingreso['caja'] = $this->caja;
      $dataingreso['venta'] = $this->venta;
      $dataingreso['metodopago'] = $this->input->post('metodopago');
      $dataingreso['tipotarjeta'] = $this->input->post('tipotarjeta');
      $dataingreso['operacion'] = $this->input->post('operacion');
      $dataingreso['hora'] = date('H:i:s');
      $dataingreso['created'] = date('Y-m-d');
      $this->Controlador_model->save('ingreso', $dataingreso);  // desactivado para probar
    } else {  // desarrollo de credito
      // $dataventa['serie'] = $serie;
      // $dataventa['numero'] = $cadena . $numeros;
      // $dataventa['consecutivo'] = $numeros;
      $dataventa['montoactual'] = $venta->montoactual - $this->input->post('descuento');
      $dataventa['estado'] = '1';
      $dataventa['vence'] = $this->input->post('vence');
      $mesa = $this->Controlador_model->get($venta->mesa, 'mesa');
      if (!$mesa->is_temporal) {
        $datamesa['estado'] = '0';
        $datamesa['time'] = '';
        $datamesa['checked'] = '';
        $datamesa['open_by'] = '0';
        $this->Controlador_model->update(array('id' => $venta->mesa), $datamesa, 'mesa');  // desactivado para probar
      } else {
        $dataventa['mesa'] = NULL;
        $this->Controlador_model->update(array('id' => $this->venta), array('mesa' => NULL), 'venta');
        $this->Controlador_model->delete_by_id($mesa->id, 'mesa');  // desactivado para probar
      }
    }

    $this->Controlador_model->update(['id' => $this->venta], $dataventa, 'venta');  // desactivado para probar

    $ventadetalles = $this->Controlador_model->pedidodetalle($this->venta);
    foreach ($ventadetalles as $key => $value) {
      $this->Controlador_model->update(['id' => $value->id], ['estadopago' => '1'], 'ventadetalle');  // desactivado para probar
    }
    echo json_encode([
      'status' => TRUE,
      'querydeuda' => $dataventa['montoactual'],
      'formapago' => $this->input->post('formapago'),
      'cuenta' => $cuenta,
      // 'tipopago' => 'metodopago',
      // 'ventaI' => $venta,
      // 'ventaF' => $dataventa,
      // 'ingreso' => $dataingreso,
    ]);
  }

  function tipoconcepto($mp)
  {
    if ($mp == 'TARJETA') {
      return 95;
    } else if ($mp == 'YAPE') {
      return 96;
    } else if ($mp == 'PLIN') {
      return 97;
    } else if ($mp == 'TRANSFERENCIA') {
      return 98;
    } else {  // 'EFECTIVO'
      return 3;
    }
  }

  function ajax_checkeds()
  {
    $venta = $this->Controlador_model->get($this->venta, 'venta');
    $empresa = $this->Controlador_model->get($venta->empresa, 'empresa');
    if ($venta->dcuenta == '0') {
      echo json_encode(['status' => FALSE, 'datahtml' => '']);
    } else {
      $dataHtml = '<div class="col-lg-12">
      <div class="panel panel-default">
        <div class="panel-title text-center"></div>
        <div class="panel-body">
        <h1 class="panel-title text-center" id="ventatotal' . $this->venta . '">Deuda Total <span>' . $venta->montoactual . '</span> <button class="btn-success btn btn-sm" onclick="AddPagador(' . $this->venta . ', ' . $empresa->tipoimpresora . ')">Agregar</button></h1>
        </div>
      </div>
    </div>';
      echo json_encode(['status' => TRUE, 'datahtml' => $dataHtml]);
    }
  }

  function ajax_procesodividir()
  {
    if ($this->input->post('estado') == 1) {
      $dataventa = ['dcuenta' => '1'];
    } else {
      $dataventa = ['dcuenta' => '0'];
    }
    $update = $this->Controlador_model->update(['id' => $this->venta], $dataventa, 'venta');
    if ($update) {
      $ventaAC = $this->Controlador_model->get($this->venta, 'venta');
      $cliente = $this->Controlador_model->get($ventaAC->cliente, 'cliente');
      $empresa = $this->Controlador_model->get($ventaAC->empresa, 'empresa');
      $dataHtml = '<div class="col-lg-12">
      <div class="panel panel-default">
        <div class="panel-title text-center"></div>
        <div class="panel-body">
        <h1 class="panel-title text-center" id="ventatotal' . $this->venta . '">Deuda Total <span>' . $ventaAC->montoactual . '</span> <button class="btn-success btn btn-sm"  onclick="AddPagador(' . $this->venta . ', ' . $empresa->tipoimpresora . ')">Agregar</button></h1>
        </div>
      </div>
    </div>';
      echo json_encode(
        [
          'dcuenta' => $ventaAC->dcuenta,
          'datahtml' => $dataHtml,
          'cliente' => $ventaAC->cliente,
          'clientes' => $cliente->documento . ' | ' . $cliente->nombre . ' ' . $cliente->apellido,
          'tipoventa' => $ventaAC->tipoventa,
          'montoactual' => $ventaAC->montoactual,
          'venta' => $this->venta
        ]
      );
    }
  }

  public function auto_cuentadividida()
  {
    if (isset($_GET['term'])) {
      $data = strtoupper($_GET['term']);
      $this->Controlador_model->auto_cuentadividida($data);
    }
  }

  public function ajax_PS_cuentadividida()
  {
    $indexMatriz = $this->input->post('idexMatriz');
    $ventaPARTIR = $this->Controlador_model->get($this->venta, 'venta');
    if ($this->input->post('estadoconsumo') == 1) {
      $consumo = '1';
    } else {
      $consumo = '0';
    }
    if ($indexMatriz == 0) {
      // TODO: Acualizamos la venta principal
      $tipoventa = $this->input->post('tipoventa');
      $empresa = $this->Controlador_model->get($ventaPARTIR->empresa, 'empresa');

      $serie = substr($tipoventa, 0, 1) . substr($empresa->serie, 1, 3);
      $numero = $this->Controlador_model->codigos($tipoventa, $serie);
      $numeros = $numero ? $numero->consecutivo + 1 : 1;
      $cadena = '';
      for ($i = 0; $i < 6 - strlen($numeros); $i++) {
        $cadena = $cadena . '0';
      }

      $dataventa = [
        'tipoventa' => $this->input->post('tipoventa'),
        'serie' => $serie,
        'numero' => $cadena . $numeros,
        'consecutivo' => $numeros,
        'formapago' => 'CONTADO',
        'montototal' => $this->input->post('montopagar'),
        'montoactual' => '0',
        'pago' => $this->input->post('montopagar'),
        'estado' => '1',
        'cliente' => $this->input->post('cliente'),
        'consumo' => $consumo,
        'sound' => '1',
        'atender' => '1',
        'hora' => date('H:i:s'),
        'created' => date('Y-m-d')
      ];
      $this->Controlador_model->update(['id' => $this->venta], $dataventa, 'venta');
      // TODO: -------------------------END-------------------------

      // TODO: cancelamos todas las venta de ventadelle
      // ? el campo "estadopago"  es el estado  de que si se cancelo o mo el producto que se llevara
      $ventadetalle = $this->db->where('venta', $this->venta)->where('estadopago', '0')->get('ventadetalle');
      if ($ventadetalle) {
        foreach ($ventadetalle->result() as $value) {
          $dataVD = ['estadopago' => '1'];  // ?  cambiamos el estado a 1 por que ya se cancelara todo
          $this->Controlador_model->update(['id' => $value->id], $dataVD, 'ventadetalle');
        }
      }
      // TODO: ----------------------end---------------------------

      $mesa = $this->Controlador_model->get($ventaPARTIR->mesa, 'mesa');
      $datamesa = ['estado' => '0', 'open_by' => '0'];
      $this->Controlador_model->update(['id' => $mesa->id], $datamesa, 'mesa');

      // TODO: verificamos si la mesa es temporal o no
      $mesa = $this->Controlador_model->get($ventaPARTIR->mesa, 'mesa');
      if ($mesa->is_temporal) {
        // ? si es temporal eliminamos la mesa
        $this->Controlador_model->delete_by_id($mesa->id, 'mesa');
      } else {
        // ? si no es temporal Cambiamos el estado de la mesa
        $datamesa['estado'] = '0';
        $datamesa['time'] = '';
        $datamesa['checked'] = '';
        $datamesa['open_by'] = '0';
        $this->Controlador_model->update(array('id' => $ventaPARTIR->mesa), $datamesa, 'mesa');
      }
      // TODO: --------------------------end---------------------------

      // TODO: REGISTRAMOS el ingreso
      $dataingreso['empresa'] = $this->empresa;
      $dataingreso['usuario'] = $this->usuario;
      $dataingreso['concepto'] = '3';
      $dataingreso['caja'] = $this->caja;
      $dataingreso['venta'] = $this->venta;
      $dataingreso['metodopago'] = 'CONTADO';
      $dataingreso['monto'] = $this->input->post('montopagar');
      $dataingreso['created'] = date('Y-m-d');
      $idingreso = $this->Controlador_model->save('ingreso', $dataingreso);
      // TODO: ---------------------------end------------------------------

      // ? Enviamos el id de la venta para guardaelo en el localStorage
      echo json_encode(['status' => TRUE, 'idventa' => $this->venta]);
      // ? ----------------------------end----------------------------
    } else {
      // TODO: Creamos la venta de los datos del localStorage
      $tipoventa = $this->input->post('tipoventa');
      $empresa = $this->Controlador_model->get($ventaPARTIR->empresa, 'empresa');

      $serie = substr($tipoventa, 0, 1) . substr($empresa->serie, 1, 3);
      $numero = $this->Controlador_model->codigos($tipoventa, $serie);
      $numeros = $numero ? $numero->consecutivo + 1 : 1;
      $cadena = '';
      for ($i = 0; $i < 6 - strlen($numeros); $i++) {
        $cadena = $cadena . '0';
      }

      $dataventa = [
        'empresa' => $this->empresa,
        'usuario' => $this->usuario,
        'caja' => $this->caja,
        'tipoventa' => $this->input->post('tipoventa'),
        'serie' => $serie,
        'numero' => $cadena . $numeros,
        'consecutivo' => $numeros,
        'mesa' => $ventaPARTIR->mesa,
        'formapago' => 'CONTADO',
        'montototal' => $this->input->post('montopagar'),
        'montoactual' => '0',
        'pago' => $this->input->post('montopagar'),
        'estado' => '1',
        'cliente' => $this->input->post('cliente'),
        'consumo' => $consumo,
        'sound' => '1',
        'atender' => '1',
        'hora' => date('H:i:s'),
        'created' => date('Y-m-d')
      ];

      $insert = $this->Controlador_model->save('venta', $dataventa);
      // TODO: -------------------------END-------------------------

      // TODO: REGISTRAMOS el ingreso
      $dataingreso['empresa'] = $this->empresa;
      $dataingreso['usuario'] = $this->usuario;
      $dataingreso['concepto'] = '3';
      $dataingreso['caja'] = $this->caja;
      $dataingreso['venta'] = $insert;
      $dataingreso['metodopago'] = 'CONTADO';
      $dataingreso['monto'] = $this->input->post('montopagar');
      $dataingreso['created'] = date('Y-m-d');
      $idingreso = $this->Controlador_model->save('ingreso', $dataingreso);
      // TODO: ---------------------------end------------------------------

      // ? Enviamos el id de la venta para guardaelo en el localStorage
      echo json_encode(['status' => TRUE, 'idventa' => $insert]);
      // ? ----------------------------end----------------------------
    }
  }

  public function ajax_salir_venta()
  {
    $CI = &get_instance();
    $CI->session->set_userdata('venta', NULL);
    $CI->session->set_userdata('NumberTable', NULL);
    echo json_encode(array('status' => TRUE));
  }

  public function ajax_list_editarproducto($venta)
  {
    $draw = intval($this->input->get('draw'));
    $start = intval($this->input->get('start'));
    $length = intval($this->input->get('length'));

    $creditos = $this->db->where('venta', $venta)->get('ventadetalle')->result();
    $data = [];
    foreach ($creditos as $key => $value) {
      $data[] = array(
        $key + 1,
        $value->cantidad,
        $value->nombre,
        '<div style="text-align:right">' . $value->precio . '</div>',
        '<div style="text-align:right">' . number_format($value->cantidad * $value->precio, 2) . '</div>',
        '<center><button type="button" onclick="quitardetalle(' . $value->id . ')" class="btn btn-danger btn-xs text-center" title="Eliminar Detalle"><i class="fa fa-trash"></i></button></center>'
      );
    }
    $result = array(
      'draw' => $draw,
      'recordsTotal' => count($creditos),  // ->num_rows(),
      'recordsFiltered' => count($creditos),  // ->num_rows(),
      'data' => $data
    );
    echo json_encode($result);
  }

  public function ajax_quitardetalle($detalle)
  {
    $det = $this->Controlador_model->get($detalle, 'ventadetalle');
    $this->db->where('id', $detalle)->delete('ventadetalle');
    $obj = $this->db->where('venta', $det->venta)->select('sum(subtotal) monto,sum(cantidad) items')->get('ventadetalle')->row();
    $this->Controlador_model->update(['id' => $det->venta], ['montototal' => $obj->monto, 'montoactual' => $obj->monto, 'totalitems' => $obj->items], 'venta');

    $producto = $this->Controlador_model->get($det->producto, 'producto');
    if ($producto) {
      if ($producto->tipo == 0) {
        $stock = $this->Controlador_model->getStockProceso($producto->id);
        $updateStock = [
          'cantidad' => ($stock->cantidad + $det->cantidad)
        ];
        $this->Controlador_model->update(['id' => $stock->id], $updateStock, 'stock');
      } else if ($producto->tipo == 2) {
        $combo = $this->Controlador_model->ProductoCombo($producto->id);
        foreach ($combo as $value) {
          $stock = $this->Controlador_model->getStockProceso($value->item_id);
          $updateStock = [
            'cantidad' => $stock->cantidad + ($value->cantidad * $det->cantidad)
          ];
          $this->Controlador_model->update(['id' => $stock->id], $updateStock, 'stock');
        }
      } else {
        // el producto no maneja el stock
      }
      $EstadoProducto = $this->VeriCuentaStock($det->producto);  // ? si es true cuenta con stock
    }

    echo json_encode(['status' => TRUE]);
  }

  public function cargarcheckboxes($producto, $selected)
  {
    $prod = $this->Controlador_model->get($producto, 'producto');
    $opciones = $this->db->where('categoria', $prod->categoria)->get('productocategoriaopcion')->result();
    if ($opciones) {
      $vista = '';
      $cadena = str_replace('%20', ' ', $selected);
      $seleccionados = explode('_', $cadena);
      foreach ($opciones as $key => $value) {
        $ss = '';
        foreach ($seleccionados as $vals) {
          if ($vals == $value->nombre) {
            $ss = 'checked';
          }
        }
        $for = 'checkbox' . $key . '-' . $prod->id;
        $name = 'checkbox' . $prod->id;
        $vista .= '<label for="' . $for . '" class="option-checkbox-container ' . ($ss ? 'checked' : '') . '" style="display: inline-flex; align-items: center; gap: 8px; background-color: #ffffff; border: 1.5px solid #e2e8f0; border-radius: 10px; padding: 10px 16px; margin: 6px; cursor: pointer; transition: all 0.2s ease; box-shadow: 0 2px 4px rgba(0,0,0,0.02);"><input id="' . $for . '" type="checkbox" class="' . $name . ' option-checkbox-input" value="' . $value->nombre . '" ' . $ss . ' onchange="$(this).parent().toggleClass(\'checked\')" style="transform: scale(1.25); cursor: pointer; accent-color: #3b82f6;"><span class="option-checkbox-label" style="font-family: \'Inter\', sans-serif; font-weight: 600; font-size: 13.5px; color: #334155; margin: 0; cursor: pointer;">' . $value->nombre . '</span></label>';
      }
      echo '<div style="display: flex; flex-wrap: wrap; justify-content: center; gap: 4px; padding: 10px 0;">' . $vista . '</div>';
    } else
      echo 'Sin Opciones Disponibles';
  }

  // public function cargarcheckboxes($producto, $selected)
  // {
  //   $prod = $this->Controlador_model->get($producto, 'producto');
  //   if ($prod) {
  //     $val = trim($prod->options, ',');
  //     if ($val != '') {
  //       $options = explode(',', $val);
  //       $vista = '';
  //       foreach ($options as $key => $value) {
  //         $for = "checkbox" . $key . '-' . $producto;
  //         $name = "checkbox"  . $producto;
  //         $vista .= '<input id="' . $for . '" type="checkbox" class="' . $name . '" value="' . $value . '"><label for="' . $for . '">' . $value . '</label>  &nbsp;';
  //       }
  //       echo $vista;
  //     } else echo 'Sin Opciones Disponibles';
  //   } else echo 'Sin Opciones Disponibles';
  // }
}
