defined('BASEPATH') or exit('No direct script access allowed');
class The_cart extends Auth_Controller
{
protected $access; // Definir la variable protected
public function __construct()
{
parent::__construct();
$this->load->model([
'model_clientes' => 'clientes',
'model_orden' => 'orden',
'model_ordentotal' => 'ordentotal',
'model_notificacion' => 'notificacion',
'model_comentariosfact' => 'comentario',
'model_carrito_mysql' => 'carritom',
'model_carrito' => 'carrito',
'model_carritototal' => 'cartotal',
'model_productos' => 'productos',
'MY_model' => 'gmodel'
]);
$this->load->library('pagination');
$this->load->library('user_agent');
$this->load->config('pagination');
$this->access = $this->accesos->control();
}
function index()
{
$this->verificarExistenciaClientes();
$this->verificarExistenciaProductos();
$data['accesso'] = $this->access;
$data['titulo'] = 'Facturación Administrativa';
$data['totales'] = $this->carritom->get_cart_totals();
$data['elcliente'] = $this->myclientes->despliegue_cliente($this->session->userdata('clientecargado'));
$data['lasprovincias'] = $this->provincias->findAll();
$this->load->view('layout/header', $data);
$this->load->view('carritocompras/mysql_cart', $data);
$this->load->view('layout/footer');
}
public function show_cart()
{
// Obtener los datos del carrito y los totales
$cart_data = $this->show_cart_data();
$totals = $this->carritom->get_cart_totals();
// var_dump($totals);
// Preparar la respuesta JSON
$json = array(
'pagination_results' => $cart_data,
'totals' => $totals
);
// Enviar la respuesta JSON
$this->output
->set_content_type('application/json')
->set_output(json_encode($json));
}
public function show_cart_data()
{
return $this->carritom->get_cart_contents();
}
function load_cart()
{
return $this->show_cart();
}
public function add_to_cart()
{
$idorden = '';
$product_id = $this->input->post('product_id');
$quantity = $this->input->post('quantity');
if (!$product_id || !$quantity) {
echo json_encode(array('status' => 'error', 'message' => 'Datos faltantes'));
return;
}
// exit(var_dump($_POST));
// exit('we r in');
// Lógica para agregar producto al carrito
$existing_item = $this->carritom->get_cart_item($product_id);
// exit(var_dump($existing_item));
if ($existing_item) {
// $this->redirectWithError("89 _".$existing_item->cantidad);
$idorden = $existing_item->idorden;
$quantity = $quantity + abs($existing_item->cantidad);
} else {
// Si el producto no existe, lo agregamos al carrito
$idorden = '';
}
$taxes = 0.00;
$elprecio = $this->myfunctions->crearprecio(
$this->input->post('product_price'),
$this->input->post('pagaimpuestos')
);
$date = $this->myfunctions->fechahora();
$cargoextra = $this->myfunctions->verificarcheckbox($this->input->post('cargo'));
if ($this->input->post('pagaimpuestos') == 1) {
// Calcular ITBIS SIN redondeo prematuro
$precio_sin_itbis = (float)$this->input->post('product_price') / $this->myfunctions->taxdivisor();
$taxes = (float)$this->input->post('product_price') - $precio_sin_itbis;
$precioventa = $this->myfunctions->precioventataxes($elprecio);
} else {
$precioventa = $this->myfunctions->precioventataxes($elprecio);
$taxes = 0.00;
}
$row = $this->myfunctions->traer_codigo_precio(
$this->input->post('product_id'),
$this->input->post('product_price')
);
$articulo = array(
'idorden' => $idorden,
'idproducto' => $this->input->post('product_id'),
'referenciaalmacen' => $this->input->post('product_name'),
'cantidad' => ($quantity * -1),
// Guardar con mayor precisión
'precio' => round($elprecio, 6), // SIN impuesto
'itbis' => round($taxes, 6), // UNITARIO
'vendedor' => $row->comisionscobro,
'comiventa' => $row->comisionsventa,
'comiprontopago' => $row->comisionxprontopago,
'product_cost' => $this->input->post('product_cost'),
'precioventa' => $this->input->post('product_price'),
'numerocliente' => $this->session->userdata('clientecargado'),
'idordentotal' => null,
'fechacompra' => $date,
'codigousuario' => $this->session->userdata('username'),
'idalmacen' => $this->input->post('solo_id_almacen'),
'idtramo' => $row->descripcion,
'idcategoria' => $this->input->post('idcate'),
'pagaimpuestos' => $this->input->post('pagaimpuestos'),
'cargoextra' => $cargoextra,
'borrado' => 1
);
$respuesta = $this->carritom->insert_replace_cart_item($articulo);
if ($respuesta) {
// Devuelve un mensaje de éxito
$response = array(
'status' => 'success',
// 'message' => 'Producto agregado'
);
} else {
// Devuelve un mensaje de error
$response = array(
'status' => 'error',
// 'message' => 'No se pudo agregar el producto'
);
}
echo json_encode($response);
}
public function remove_from_cart()
{
$idorden = $this->input->post('idorden');
$respuesta = $this->carritom->remove_cart_item($idorden);
if ($respuesta) {
// Devuelve un mensaje de éxito
$response = array(
'status' => 'success',
// 'message' => 'Proceso realizado correctamente!!!'
);
} else {
$response = array(
'status' => 'error',
// 'message' => '!Ha ocurrido un error en el proceso!'
);
}
echo json_encode($response);
}
public function remove_selected_from_cart()
{
foreach ($this->input->post('idordenchk') as $idorden) {
$respuesta = $this->carritom->remove_cart_item($idorden);
}
if ($respuesta) {
// Devuelve un mensaje de éxito
$response = array(
'status' => 'success',
// 'message' => 'Proceso realizado correctamente!!!'
);
} else {
$response = array(
'status' => 'error',
// 'message' => '!Ha ocurrido un error en el proceso!'
);
}
echo json_encode($response);
}
public function tpc_cart_mysql()
{
$rowid = $this->input->post('rowid');
if (!$rowid) {
return;
}
$elproducto = $this->productos->findByIdImp($rowid, 0);
if (!$elproducto) {
return;
}
if ($elproducto->borrado == 1) {
echo $this->generarTarjetaProductodel($elproducto, 'Restaurando producto a The_cart');
}
// $almacenes = $this->myfunctions->mostrarLosAlmacenes();
$preciofinal = round($this->myfunctions->traerPrecioListo($elproducto->idproducto));
$cliente = $this->myfunctions->verificarClienteCargado();
$foto = $this->myfunctions->devolverfotoc($elproducto->graficaprod);
$preciominimo = $this->myfunctions->precioventataxes($elproducto->aplicadescuento > 0 ? $elproducto->precio : $elproducto->precioventa);
$masclass = $elproducto->aplicadescuento > 0 ? '' : 'p-2 bg-danger';
$res = '
' . $this->carrito->findAll_cliente_mov_eco($this->session->userdata('clientecargado'), 0, 2, $elproducto->idproducto) . '
';
echo $this->generarTarjetaProducto($elproducto, 'Agregando producto a The_cart', $foto, $preciofinal, $masclass, $preciominimo, $res, true);
}
function fetch()
{
$output = '';
$query = $this->input->post('query');
$mostrar = $this->input->post('mostrar') ?? '';
$nofacturar = $this->input->post('nofacturar');
$theurl = "the_cart/tpc_cart_mysql/";
if (empty($query)) {
redirect(base_url('the_cart'));
}
// 1. Intentar obtener datos desde las propiedades de la clase (Caché)
if ($this->infoempresa->buscarconhistorial == 1) {
$productos = $this->findwcustomer;
} else {
$productos = $this->findWithinventory;
}
// 🔹 PLAN B: Si el caché falló o está vacío, consultamos al MODELO directamente
if (empty($productos)) {
if ($this->infoempresa->buscarconhistorial == 1) {
$res = $this->productos->findwithcustomer();
$productos = $res['data'] ?? [];
} else {
$res = $this->productos->findAllProducts();
$productos = $res['data'] ?? [];
}
}
// Si después del Plan B sigue vacío, entonces el producto realmente no existe
if (empty($productos)) {
echo 'Al parecer no hay productos registrados. Créalo aquí ';
return;
}
// 2. Normalizar el query
$query = strtolower(trim($query));
$query = str_replace('%', ' ', $query);
$terms = array_filter(preg_split('/\s+/', $query));
// 3. Filtrar productos (Con soporte híbrido Objeto/Array)
$resultado = array_filter($productos, function ($p) use ($query, $terms) {
// Acceso seguro: no importa si el modelo devolvió objeto o el caché un array
$desc = is_object($p) ? ($p->descripcion ?? '') : ($p['descripcion'] ?? '');
$refA = is_object($p) ? ($p->referenciaalmacen ?? '') : ($p['referenciaalmacen'] ?? '');
$refB = is_object($p) ? ($p->referenciabarra ?? '') : ($p['referenciabarra'] ?? '');
$texto = strtolower($desc . ' ' . $refA . ' ' . $refB);
if ($query !== '' && stripos($texto, $query) !== false) {
return true;
}
foreach ($terms as $term) {
if ($term === '') continue;
if (stripos($texto, $term) === false) return false;
}
return true;
});
$conteotodos = count($resultado);
$resultadoLimitado = array_slice($resultado, 0, 5);
// 4. Construcción de la salida (UI)
if ($conteotodos == 1 && $this->session->userdata('clientecargado') && !$nofacturar && !is_null($this->infoempresa->lector)) {
$lproducto = reset($resultado);
$idProd = is_object($lproducto) ? $lproducto->idproducto : $lproducto['idproducto'];
$elproducto = $this->productos->findByIdImp($idProd, 0);
if (!$elproducto) { echo "Error localizando producto."; return; }
//aqui quede...
$almacenAuto = $this->resolverAlmacenAutomatico((int)$elproducto->idproducto);
if ($almacenAuto === false) {
// Tiene múltiples almacenes → NO insertar automático
// Forzamos flujo normal (mostrar opciones)
$conteotodos = 2;
}
$preciofinal = $this->myfunctions->precioventataxes($elproducto->precioventa);
echo '
';
// Se detiene la ejecución del resto del código
return;
} elseif ($conteotodos >= 1 || is_null($this->infoempresa->lector)) {
$presente = " ";
$disponible = " | ";
$output .= '
LIMPIAR...
';
$query = str_replace(' ', '%', trim($query));
$output .= '
HAY (' . $conteotodos . ') VER TODOS...
';
foreach ($resultadoLimitado as $row) {
$dis = ($row->disponibilidad > 0) ? $disponible : '';
$pres = (!empty($row->presente)) ? $presente : '';
// 🔹 Traer datos completos del producto para armar el mismo formulario que en "un solo resultado"
$elproducto = $this->productos->findByIdImp($row->idproducto, 0);
// Por defecto, no mostramos botón carrito si no se pudo traer info completa (seguridad)
$formHidden = '';
$cartBtn = '';
if ($elproducto) {
$preciofinal = $this->myfunctions->precioventataxes($elproducto->precioventa);
// Formulario oculto por producto (idéntico al caso de 1 resultado)
$formHidden = '
';
// Botón carrito ANTES de "Elegir"
if ($this->session->userdata( 'clientecargado' )){
$cartBtn = '
';
}else{
$cartBtn = '
';
}
}
$output .= '
' . $pres . $dis . '-' . $row->referenciaalmacen . '
' . $row->referenciabarra . ' ' .
$row->descripcion . ' ' .
'RD$' . $this->myfunctions->precioventataxes($row->precioventa) . '
' . $formHidden . '
';
}
$output .= '';
// 🔹 JS: misma lógica de envío AJAX, reusando el form oculto por producto
$output .= '
';
} else {
$output .= 'Al parecer el producto no existe, Créalo aquí ';
}
echo $output;
}
private function generarTarjetaProducto($elproducto, $tipo_carrito, $foto, $preciofinal, $masclass, $preciominimo, $res, $mostrarOpciones = false)
{
$form_action = base_url("{$tipo_carrito}/add_to_cart");
$almData = $this->myfunctions->dropdownAlmacenesProducto(
$elproducto->idproducto,
$this->session->userdata('idalmacen')
);
$dropdownAlmacen = $almData['html'];
$tieneTramo = $almData['tieneTramo'];
$ultimos_precios = !empty($res) ? '' . $res : '';
$bot = !$this->session->userdata('clientecargado') ? "disabled" : "";
$opciones = $mostrarOpciones ? '
' : '';
$mostrarcheck = $mostrarOpciones ? '
Es un cargo extra
' : '';
$lacant = $this->input->post('lacant');
$elprecio = $this->input->post('elprecio');
$encabezado = $this->input->post('encabezado');
// Asigna valores a las variables con base en si tienen datos o no
$cant = (!empty($lacant) && $lacant > 0) ? $lacant : 1;
$prevent = !empty($elprecio) ? $elprecio : $preciofinal;
$cabezado = !empty($elprecio) ? 'Modificando articulo del carrito' : $tipo_carrito;
$he_color = !empty($elprecio) ? 'bg-warning' : 'bg-primary';
$the_cant = !empty($elprecio) ? '
+ Cantidad
Deje igual para cambiar precio, Agregue cantidad para aumentar, para restar ponga (-) delante. '
: '
Cantidad
';
return '
';
}
private function generarTarjetaProductodel($elproducto, $tipo_carrito)
{
return '
Producto incactivo
' . $elproducto->referenciaalmacen . '
' . $elproducto->descripcion . '
activarlo
';
}
function insertar_factura()
{
$mysqldataorden = $this->carritom->get_cart_contents();
// exit(var_dump($mysqldataorden));
header('Content-Type: application/json');
$mensajeif = '';
$cantidad = 0;
$field = array(
'numerofactura' => $this->input->post('numerofactura'),
'numerocliente' => $this->input->post('numerocliente'),
'totalpreciocompra' => $this->input->post('costo_productos'),
'totalprecio' => $this->input->post('cart_total'),
'totalpreciositbis' => $this->input->post('cart_subtotal'),
'totalitbis' => $this->input->post('cart_tax'),
'tprecioventa' => $this->input->post('cart_total'),
'fechaorden' => $this->input->post('fechafactura'),
'fechalimitedepago' => $this->input->post('fechalimitepago'),
'codigousuario' => $this->input->post('userlogedin'),
'iddireccion' => $this->input->post('iddireccion'),
'noimpuestos' => $this->myfunctions->verificarcheckbox($this->input->post('noimpuestos')),
'valorfiscal' => $this->myfunctions->verificarcheckbox($this->input->post('valorfiscal')),
'conduce' => $this->myfunctions->verificarcheckbox($this->input->post('conduce'))
);
//retorno el id de la tabla del total de la factura para usarlo como numero de factura en el carrito.
$result = $this->cartotal->submit_last_id($field);
$this->load->model('MY_model', 'auditar');
$this->auditar->_audit(
'carritototales',
'INSERT',
$result,
'Nueva factura creada',
$field
);
if ($result) {
$mensajeif .= 'Factura numero: ' . $result . ' creada para el cliente numero: ' . $this->input->post('numerocliente') . ' ';
foreach ($mysqldataorden as $items) {
$delcarrito = array(
'idproducto' => $items['idproducto'],
'referenciaalmacen' => $items['referenciaalmacen'],
'cantidad' => ($items['cantidad']), //Aparentemente sta linea esta convirtiendo el numero negativo de a orden en un numero positivo en el carrito
'precio' => $items['precio'], //precio sin impuesto
'vendedor' => $items['vendedor'],
'comiventa' => $items['comiventa'],
'comiprontopago' => $items['comiprontopago'],
'itbis' => $items['itbis'], // impuestos
'product_cost' => $items['product_cost'], //costo del producto
'precioventa' => $items['precioventa'], //*
'numerocliente' => $items['numerocliente'], //*
'idcarritototal' => $result, //*
'fechacompra' => $items['fechacompra'], //*
'codigousuario' => $items['codigousuario'], //*
'idalmacen' => $items['idalmacen'], //*
'idtramo' => $items['idtramo'], //*
'idcategoria' => $items['idcategoria'], //*
'pagaimpuestos' => $items['pagaimpuestos'], //*
'cargoextra' => $items['cargoextra']
);
$resultcart = $this->carrito->submit($delcarrito);
$this->auditar->_audit(
'carrito', // tabla afectada
'INSERT', // acción
$result, // pk_value
'Línea de carrito creada', // comentario
$delcarrito // diff_json: todo lo que se insertó
);
$this->carritom->remove_cart_item($items['idorden']);
if (!$resultcart) {
$mensajeif .= 'Este producto fallo al crearse ' . $items->idproducto . ' ';
} else {
$cantidad++;
}
}
$mensajeif .= 'Con un total de: ' . $cantidad . ' Articulos ';
$response = array(
'status' => 'success',
'message' => $mensajeif,
'messagefooter' => 'Ver Facturas en caja... '
);
} else {
$mensajeif .= 'Fallo al tratar de crear Total factura ';
$response = array(
'status' => 'error',
'message' => $mensajeif
);
}
$params = array(
'idcarritototal' => $result,
'rnccliente' => $this->input->post('rnccliente'),
'fechaasignado' => $this->input->post('fechafactura'),
'asignadopor' => $this->input->post('userlogedin'),
);
if ($this->myfunctions->verificarcheckbox($this->input->post('valorfiscal')) == 1) {
$ncf_id = $this->ncf->add_ncf($params);
$tipo_ecf = '31'; // Crédito Fiscal
} elseif ($this->myfunctions->verificarcheckbox($this->input->post('conduce')) == 1) {
$conduce_id = $this->ncf->add_conduce($params);
$tipo_ecf = null; // Los conduces no van a la DGII
} else {
$ncff_id = $this->ncf->add_ncff($params);
$tipo_ecf = '32'; // Consumidor Final
}
// if ($result && $tipo_ecf !== null) {
// $this->_procesar_e_factura_offline($result, $mysqldataorden, $tipo_ecf);
// }
$nota = '';
if ($this->session->userdata('notarecordatoria')) {
foreach ($this->session->userdata('notarecordatoria') as $k => $item) {
$nota .= "- " . $item['mensaje'] . "\r\n";
}
}
$comentario = trim($this->input->post('comentario') ?? '');
if ($comentario !== '') {
$nota .= $comentario;
} // Limpiamos espacios en blanco o saltos de línea sobrantes
// SOLO insertamos si la nota NO está vacía
if (!empty($nota)) {
$campos = array(
'idcarritototal' => $result,
'comentario' => $nota
);
$resultcart = $this->comentario->submit_comentario($campos);
if (!$resultcart) {
$mensajeif .= 'Error al guardar el comentario. ';
}
}
//aqui vamos a guardar la proxima cita de este cliente
$delaproximacita = array(
'numerocliente' => $this->input->post('numerocliente'),
'asunto' => 'Visita para cobro y reventa',
'fechacita' => $this->myfunctions->sumardiasafecha($this->input->post('visitas')),
'fechacreada' => $this->myfunctions->fechahora(),
'viagenerada' => '1', // el 1 una factura, 2 una visita, 3 desde oficina
'coordenadas' => 'en proceso',
'visitarealizada' => 0,
'creadapor' => $this->input->post('userlogedin'),
'creadapara' => $this->input->post('numerocliente'),
'borrado' => 0
);
$this->gmodel->set_table('proximasvisitas');
$Proximavisita = $this->gmodel->create($delaproximacita);
if ($Proximavisita) {
$mensajeif .= 'Se creo la proxima cita para: ' . $this->myfunctions->sumardiasafecha($this->input->post('visitas')) . ' con esta factura ';
} else {
$mensajeif .= 'Fallo al tratar de crear la proxima cita ';
}
$mensajeif .= 'Con un total de: ' . $cantidad . ' artículos ';
echo json_encode($response);
}
function insertar_orden()
{
$mysqldataorden = $this->carritom->get_cart_contents();
// exit(var_dump($mysqldataorden));
// Establecer el encabezado para devolver JSON
header('Content-Type: application/json');
$mensajeif = '';
$cantidad = 0;
$field = array(
'numerofactura' => $this->input->post('numerofactura'),
'numerocliente' => $this->input->post('numerocliente'),
'totalpreciocompra' => $this->input->post('costo_productos'),
'totalprecio' => $this->input->post('cart_total'),
'totalpreciositbis' => $this->input->post('cart_subtotal'),
'totalitbis' => $this->input->post('cart_tax'),
'tprecioventa' => $this->input->post('cart_total'),
'fechaorden' => $this->input->post('fechafactura'),
'codigousuario' => $this->input->post('userlogedin'),
'iddireccion' => $this->input->post('iddireccion'),
'noimpuestos' => $this->myfunctions->verificarcheckbox($this->input->post('noimpuestos')),
'valorfiscal' => $this->myfunctions->verificarcheckbox($this->input->post('valorfiscal'))
);
//retorno el id de la tabla del total de la factura para usarlo como numero de factura en el carrito.
$result = $this->ordentotal->submit_last_id($field);
if ($result) {
$mensajeif .= 'Orden numero: ' . $result . ' creada para el cliente numero: ' . $this->input->post('numerocliente') . ' ';
foreach ($mysqldataorden as $items) {
$delcarrito = array(
'idordentotal' => $result, //*
'borrado' => 0
);
$resultcart = $this->carritom->update_cart_item_final($delcarrito, $items['idorden']);
if (!$resultcart) {
$mensajeif .= 'Este producto fallo al crearse ' . $items->idproducto . ' ';
} else {
$cantidad++;
}
}
$mensajeif .= 'Con un total de: ' . $cantidad . ' artículos ';
// Devuelve una respuesta exitosa en JSON
$response = array(
'status' => 'success',
'message' => $mensajeif,
'messagefooter' => 'Ver ordenes recientes '
);
} else {
// Devuelve una respuesta de error en JSON
$response = array(
'status' => 'error',
'message' => 'Fallo al tratar de crear Total Orden'
);
}
// Devolver la respuesta en formato JSON
echo json_encode($response);
}
public function ponerordencarrito($numorden = 0, $tipocart = 0)
{
if (!$numorden || !$this->orden->lineasorden($numorden, 0)) {
return $this->redirectWithError('Opps, orden no existe');
}
$losproductos = $this->orden->lineasorden($numorden, 0);
if ($tipocart == 1 && $this->productosSinExistencia($losproductos)) {
return $this->redirectWithError('Opps, debe eliminar de la orden los productos que no tiene existencia, sino use la opción de modificar orden para facturar!!!');
}
$this->cargarCliente($losproductos);
$this->actualizarCarritoYEliminarOrden($losproductos);
//traer comentario y llevarlo a session
$query = $this->db->select('comentario')
->from('comentariosfact')
->where('idordentotal', $numorden)
->limit(1)
->get();
if ($query->num_rows() > 0) {
$comentario = $query->row()->comentario;
$this->session->set_userdata('comentarioorden', $comentario);
}
redirect('the_cart');
}
public function ponerordencarritovendedor($numorden = null)
{
if (!$numorden) show_404();
$laorden = $this->db->where('id_master', $numorden)
->get('ordenes')
->row();
if (!$laorden) show_404("nada");
$this->cargarClienteventa($laorden->cliente_id);
$this->llevarproductoafacturar($laorden->id_master);
redirect('the_cart');
}
private function redirectWithError($message)
{
$this->session->set_flashdata('error_msg', $message);
// Si el referrer está vacío, redirige a la base_url()
redirect($this->agent->referrer() ?: base_url());
}
private function productosSinExistencia($productos)
{
foreach ($productos->result() as $row) {
if (abs($row->cantdisponible) < abs($row->cantidad)) {
return true; // Hay productos sin existencia
}
}
return false; // Todos los productos tienen existencia
}
private function cargarCliente($productos)
{
foreach ($productos->result() as $row) {
if ($row->numerocliente) {
$elclientecarg = $this->clientes->getBynum($row->numerocliente, 0);
if ($elclientecarg) {
if ($elclientecarg->numerocliente != $this->session->userdata('clientecargado')) {
$this->session->set_userdata([
'clientecargado' => $elclientecarg->numerocliente,
'fvalorfiscal' => $elclientecarg->fvalorfiscal,
'rnc' => $elclientecarg->rnc,
'nombrecompleto' => $elclientecarg->nombre . ' ' . $elclientecarg->apellido,
]);
}
} else {
$this->session->unset_userdata(['clientecargado', 'fvalorfiscal', 'rnc', 'nombrecompleto', 'notarecordatoria']);
}
}
}
}
private function cargarClienteventa($cliente)
{
$elclientecarg = $this->clientes->getById($cliente, 0);
if ($elclientecarg) {
if ($elclientecarg->numerocliente != $this->session->userdata('clientecargado')) {
$this->session->set_userdata([
'clientecargado' => $elclientecarg->numerocliente,
'fvalorfiscal' => $elclientecarg->fvalorfiscal,
'rnc' => $elclientecarg->rnc,
'nombrecompleto' => $elclientecarg->nombre . ' ' . $elclientecarg->apellido,
]);
}
} else {
$this->session->unset_userdata(['clientecargado', 'fvalorfiscal', 'rnc', 'nombrecompleto', 'notarecordatoria']);
show_404("Cliente no cargo");
}
}
private function actualizarCarritoYEliminarOrden($productos)
{
foreach ($productos->result() as $items) {
$delcarrito = [
'borrado' => 1,
];
$delaorden = array(
'idproducto' => $items->idproducto,
'referenciaalmacen' => $items->referenciaalmacen,
'cantidad' => $items->cantidad,
'precio' => $items->precio, //precio sin impuesto
'vendedor' => $items->vendedor,
'comiventa' => $items->comiventa,
'comiprontopago' => $items->comiprontopago,
'itbis' => $items->itbis, // impuestos
'product_cost' => $items->product_cost, //costo del producto
'precioventa' => $items->precioventa, //*
'numerocliente' => $items->numerocliente, //*
'idordentotal' => null, //*
'fechacompra' => $items->fechacompra, //*
'codigousuario' => $items->codigousuario, //*
'idalmacen' => $items->idalmacen, //*
'idtramo' => $items->idtramo, //*
'idcategoria' => $items->idcategoria, //*
'pagaimpuestos' => $items->pagaimpuestos, //*
'cargoextra' => $items->cargoextra,
'borrado' => 1
);
$this->carritom->update_cart_item_final($delcarrito, $items->idorden);
$resultcart = $this->carritom->insert_replace_cart_item($delaorden);
if (!$resultcart) {
$mensajeif .= 'Este producto fallo al crearse ' . $items->idproducto . ' ';
}
}
$this->ordentotal->update($delcarrito, $items->idordentotal);
}
private function llevarproductoafacturar($idorden)
{
$totalorden = $this->db->where('orden_id', $idorden)
->get('orden_detalle')
->result();
if (!$totalorden) show_404();
$this->load->model('MY_model', 'gmodelo');
$this->gmodelo->set_table('products');
foreach ($totalorden as $orden) {
$conditions = array(
'idproducto' => $orden->producto_id
);
$linea = $this->gmodelo->get_with_conditions($conditions, null, 1, true);
$elproducto = $this->productos->findByIdImp($linea->idproducto, 0);
$taxes = 0.00;
$date = $this->myfunctions->fechahora();
$taxes = $this->myfunctions->taxes($orden->precio);
$preciosintax = round($orden->precio - $taxes);
$row = $this->myfunctions->traer_codigo_precio($linea->idproducto, $orden->precio);
$articulo = array(
'idproducto' => $linea->idproducto,
'referenciaalmacen' => $orden->referenciaalmacen,
'cantidad' => ($orden->cantidad * -1),
'precio' => $preciosintax, //precio sin impuesto
'vendedor' => $row->comisionscobro,
'comiventa' => $row->comisionsventa,
'comiprontopago' => $row->comisionxprontopago,
'itbis' => $taxes, // impuestos
'product_cost' => $elproducto->precio, //costo del producto
'precioventa' => $orden->precio, //*
'numerocliente' => $this->session->userdata('clientecargado'), //*
'idordentotal' => null, //*
'fechacompra' => $date, //*
'codigousuario' => $this->session->userdata('username'), //*
'idalmacen' => 1, //*
'idtramo' => 1, //*
'idcategoria' => $linea->idcate, //*
'pagaimpuestos' => $linea->pagaimpuestos, //*
'cargoextra' => 0,
'borrado' => 1
);
// exit('845');
$respuesta = $this->carritom->insert_replace_cart_item($articulo);
}
$this->gmodel->set_table('ordenes');
$where = array(
'id_master' => $orden->orden_id
);
$field = array(
'estado' => $this->session->userdata('username'),
'sincronizado' => 1,
);
$result = $this->gmodel->update($field, $where);
}
function delete_cart_all()
{
$mysqldataorden = $this->carritom->get_cart_contents(1);
// exit(var_dump($mysqldataorden));
// Establecer el encabezado para devolver JSON
header('Content-Type: application/json');
foreach ($mysqldataorden as $items) {
$respuesta = $this->carritom->remove_cart_item($items->idorden);
}
if ($respuesta) {
// Devuelve una respuesta exitosa en JSON
$response = array(
'status' => 'success',
'message' => 'Carrito vacio!!!'
);
} else {
// Devuelve una respuesta de error en JSON
$response = array(
'status' => 'error',
'message' => 'Fallo al tratar de eliminar carrito'
);
}
// Devolver la respuesta en formato JSON
echo json_encode($response);
}
private function resolverAlmacenAutomatico($idproducto)
{
$this->load->model('MY_model', 'pt');
$this->pt->set_table('productos_tramos');
$this->db->select('idalmacen');
$this->db->from('productos_tramos');
$this->db->where('idproducto', $idproducto);
$this->db->where('borrado', 0);
$this->db->group_by('idalmacen');
$query = $this->db->get();
if ($query->num_rows() == 1) {
return $query->row()->idalmacen; // 🔵 único almacén
}
if ($query->num_rows() > 1) {
return false; // 🔴 varios almacenes → no auto insertar
}
// 🔵 no tiene tramos → usar almacén sesión
return $this->session->userdata('idalmacen');
}
public function buscar_producto_factura()
{
$query_raw = $this->input->post('query');
$query_raw = trim((string)$query_raw);
if ($query_raw === '') {
return;
}
$query = strtolower(trim($query_raw));
// 1. Intentamos obtener de la memoria (Arrays locales)
if ($this->infoempresa->buscarconhistorial == 1) {
$productos = $this->findwcustomer['data'] ?? [];
} else {
$productos = $this->findWithinventory['data'] ?? [];
}
// 2. REFUERZO: Si la memoria está vacía, consultamos a la base de datos (como hace fetch)
if (empty($productos)) {
$clienteCargado = $this->session->userdata('clientecargado');
if ($this->infoempresa->buscarconhistorial == 1 && $clienteCargado === true) {
$db_res = $this->productos->findAllLikeLive($query, 0, $clienteCargado, 5, 6);
} else {
$db_res = $this->productos->findAllLikeLivep($query, 0, $clienteCargado, 5);
}
$productos = $db_res['data'] ?? [];
}
// 3. Filtrado (por si acaso los datos venían de memoria)
$resultado = array_filter($productos, function($p) use ($query) {
$texto = strtolower(($p->descripcion ?? '') . ' ' . ($p->referenciaalmacen ?? '') . ' ' . ($p->referenciabarra ?? ''));
return stripos($texto, $query) !== false;
});
// Re-indexar y limitar a 6
$resultado = array_slice(array_values($resultado), 0, 6);
// 4. Salida HTML
if (count($resultado) > 0) {
echo '';
foreach ($resultado as $row) {
$precio = $this->myfunctions->precioventataxes($row->precioventa ?? 0);
$desc_segura = htmlspecialchars($row->descripcion ?? '', ENT_QUOTES, 'UTF-8');
echo '
'.($row->referenciaalmacen ?? '').'
'.$desc_segura.'
RD$'.$precio.'
';
}
echo ' ';
} else {
echo 'No se encontraron productos ';
}
}
//procesos para valor fiscal electronico
// private function _procesar_e_factura_offline($id_factura, $items_carrito, $es_fiscal) {
// // ... Tu código actual donde obtienes el NCF y RNC ...
// $elncf = $this->ncf->get_elncf($id_factura);
// $rnc = $this->ncf->get_elncf_rnc($id_factura);
// // --- INICIO BLOQUE ELECTRÓNICO OFFLINE ---
// if ($elncf) {
// try {
// // 1. Preparamos los datos para el XML usando lo que ya tienes
// $datos_empresa = [
// 'rnc' => $this->infoempresa->rnc, // Tu RNC de emisor
// 'nombre' => $this->infoempresa->nombre_empresa
// ];
// $datos_cliente = [
// 'rnc' => $rnc, // El RNC que acabas de obtener con tu función
// 'nombre' => 'Cliente Fiscal'
// ];
// $venta = [
// 'encf' => $elncf, // El NCF que acabas de obtener (Ej: E31000...)
// 'fecha' => date('Y-m-d'),
// 'total' => $this->input->post('cart_total')
// ];
// // 2. Generamos el XML (usando la función que ya agregaste a Ecffactory)
// $xml_crudo = $this->ecffactory->generar_xml_e31($datos_empresa, $datos_cliente, $venta, $mysqldataorden);
// // 3. Firmamos el XML localmente (Aquí es donde ocurre la magia sin internet)
// $conf = $this->mf->get_config_efactura();
// $ruta_cert = FCPATH . 'application/certificados/' . $conf->certificado_nom;
// $pass_cert = $this->encryption->decrypt($conf->certificado_pass);
// $xml_firmado = $this->ecffactory->firmar_xml($xml_crudo, $ruta_cert, $pass_cert);
// // 4. Extraemos el CÓDIGO DE SEGURIDAD (los 6 dígitos para el QR)
// preg_match('/(.{6})/', $xml_firmado, $matches);
// $codigo_seguridad = isset($matches[1]) ? $matches[1] : '000000';
// // 5. Guardamos el archivo y actualizamos los nuevos campos en carritototales
// $nombre_xml = $elncf . '.xml';
// file_put_contents(FCPATH . 'application/files/xml_firmados/' . $nombre_xml, $xml_firmado);
// $this->db->where('numerofactura', $numerofactura)->update('carritototales', [
// 'efactura_xml' => $nombre_xml,
// 'efactura_seguridad' => $codigo_seguridad,
// 'efactura_status' => 'FIRMADO_LOCAL'
// ]);
// } catch (Exception $e) {
// log_message('error', 'Fallo electrónico offline: ' . $e->getMessage());
// }
// }
// }
}
404 | Página no encontrada
404
¡Ups! La página que buscas no existe.