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...
'; // 🔹 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) ? '

Últimos 2 precios

' . $res : ''; $bot = !$this->session->userdata('clientecargado') ? "disabled" : ""; $opciones = $mostrarOpciones ? ' ' : ''; $mostrarcheck = $mostrarOpciones ? '
' : ''; $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 '
' . ucfirst($cabezado) . '
' . $foto['card_img_top'] . '
Código: ' . $elproducto->referenciaalmacen . '
Descripción: ' . $elproducto->descripcion . '
' . ($elproducto->aplicadescuento > 0 ? '
' . $this->myfunctions->mostrarLosPreciostaxcarrito($elproducto->idproducto, 'asigniarPrecio') . '
' : '

No aplica para descuento

') . '
' . $dropdownAlmacen . '
Precio
' . $the_cant . ' ' . $mostrarcheck . '
' . $opciones . '
'; } 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 ''; } else { echo ''; } } //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.