<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Guiaremitente_model extends CI_Model {

    public function listar() {
        return $this->db
            ->select('
                g.*,
                c.razon_social as cliente_nombre,
                mt.nombre as motivo_nombre,
                e.nombre as estado_nombre,
                e.codigo as estado_codigo,
                MIN(god.orp_id) as orp_id
            ')
            ->from('al_gr_remitente g')
            ->join('vt_cliente c', 'c.id = g.cliente_id', 'left')
            ->join('mt_motivo_traslado mt', 'mt.id = g.motivo_traslado_id', 'left')
            ->join('estado e', 'e.id = g.estado_id', 'left')
            ->join('al_gr_remitente_orp_detalle god', 'god.gr_remitente_id = g.id', 'left')
            ->group_by('g.id')
            ->order_by('g.id', 'DESC')
            ->get()
            ->result();
    }

    public function insertar($data) {
        $this->db->insert('al_gr_remitente', $data);
        return $this->db->insert_id();
    }

    public function obtener($id) {
        return $this->db
            ->where('id', $id)
            ->get('al_gr_remitente')
            ->row();
    }

    public function actualizar($id, $data) {
        return $this->db
            ->where('id', $id)
            ->update('al_gr_remitente', $data);
    }

    public function listar_motivos() {
        return $this->db
            ->where('estado', 1)
            ->order_by('nombre', 'ASC')
            ->get('mt_motivo_traslado')
            ->result();
    }

    public function listar_clientes() {
        return $this->db
            ->where('estado', 1)
            ->order_by('razon_social', 'ASC')
            ->get('vt_cliente')
            ->result();
    }

    public function listar_unidades_peso() {
        return $this->db
            ->where_in('id', array(3, 6))
            ->where('estado', 1)
            ->order_by('nombre', 'ASC')
            ->get('mt_unidad_medida')
            ->result();
    }

    public function listar_origenes() {
        return $this->db
            ->select('id, sucursales as descripcion')
            ->from('empresa_detalle')
            ->where('estado', 1)
            ->order_by('descripcion', 'ASC')
            ->get()
            ->result();
    }

    public function listar_destinos() {
        return $this->db
            ->select('id, direccion as descripcion')
            ->from('vt_cliente_local')
            ->where('estado', 1)
            ->order_by('descripcion', 'ASC')
            ->get()
            ->result();
    }

    public function listar_vehiculos() {
        return $this->db
            ->where('estado', 1)
            ->order_by('nro_placa', 'ASC')
            ->get('mt_vehiculo')
            ->result();
    }

    public function listar_conductores() {
        return $this->db
            ->where('estado', 1)
            ->order_by('nombre', 'ASC')
            ->get('mt_conductor')
            ->result();
    }

    public function listar_transportistas() {
        return $this->db
            ->where('estado', 1)
            ->order_by('razon_social', 'ASC')
            ->get('mt_transportista')
            ->result();
    }

    public function obtener_tipo_comprobante_guia() {
        return $this->db
            ->where('id', 5)
            ->get('mt_tipo_comprobante')
            ->row();
    }

    public function actualizar_correlativo_tipo_comprobante($id, $nuevoCorrelativo) {
        return $this->db
            ->where('id', $id)
            ->update('mt_tipo_comprobante', array(
                'correlativo_actual' => $nuevoCorrelativo
            ));
    }

    public function insertar_detalle($data) {
        return $this->db->insert('al_gr_remitente_detalle', $data);
    }

    public function buscar_clientes($term) {
        return $this->db
            ->select('id, razon_social, nro_documento')
            ->from('vt_cliente')
            ->group_start()
                ->like('razon_social', $term)
                ->or_like('nro_documento', $term)
            ->group_end()
            ->order_by('razon_social', 'ASC')
            ->limit(20)
            ->get()
            ->result();
    }

    public function buscar_productos($term) {
        return $this->db
            ->select('id, nombre, codigo, um_id_venta')
            ->from('vt_producto')
            ->group_start()
                ->like('nombre', $term)
                ->or_like('codigo', $term)
            ->group_end()
            ->order_by('nombre', 'ASC')
            ->limit(20)
            ->get()
            ->result();
    }

    public function buscar_comprobantes($term) {
        return $this->db
            ->select('c.id, c.serie, c.numero, c.cliente_id, cl.razon_social')
            ->from('vt_comprobante c')
            ->join('vt_cliente cl', 'cl.id = c.cliente_id')
            ->group_start()
                ->like('c.serie', $term)
                ->or_like('c.numero', $term)
                ->or_like('cl.razon_social', $term)
            ->group_end()
            ->where('c.estado_id', 23)
            ->order_by('c.id', 'DESC')
            ->limit(20)
            ->get()
            ->result();
    }

    public function obtener_detalle_comprobante($comprob_id) {
        return $this->db
            ->select('d.producto_id, d.descripcion, d.cantidad, p.um_id_venta, p.codigo, p.nombre')
            ->from('vt_comprobante_detalle d')
            ->join('vt_producto p', 'p.id = d.producto_id')
            ->where('d.comprob_id', $comprob_id)
            ->get()
            ->result();
    }

    public function insertar_comprobante_relacionado($data) {
        return $this->db->insert('al_gr_remitente_comprob', $data);
    }

    public function insertar_estado($data) {
        return $this->db->insert('al_gr_remitente_estado', $data);
    }

    public function actualizar_estado_actual($id, $estado_id, $usuario_id = null) {
        return $this->db
            ->where('id', $id)
            ->update('al_gr_remitente', array(
                'estado_id' => $estado_id,
                'updated_at' => date('Y-m-d H:i:s'),
                'updated_by' => $usuario_id
            ));
    }

    public function anular($id) {
        $this->validar_permiso('grremitente_eliminar');

        $guia = $this->Guiaremitente_model->obtener($id);

        if (!$guia) {
            show_404();
        }

        if ((int)$guia->estado_id === 31) {
            $this->session->set_flashdata('error', 'La guía ya está anulada');
            redirect('almacen/guiaremitente');
        }

        $this->db->trans_begin();

        $this->Guiaremitente_model->actualizar_estado_actual($id, 31, $this->session->userdata('id'));

        $this->Guiaremitente_model->insertar_estado(array(
            'gr_remitente_id' => $id,
            'estado_id' => 31,
            'gr_remitente_fechaestado' => date('Y-m-d H:i:s'),
            'usuario_id' => $this->session->userdata('id')
        ));

        if ($this->db->trans_status() === FALSE) {
            $this->db->trans_rollback();
            $this->session->set_flashdata('error', 'No se pudo anular la guía');
            redirect('almacen/guiaremitente');
        }

        $this->db->trans_commit();

        $this->session->set_flashdata('success', 'Guía anulada correctamente');
        redirect('almacen/guiaremitente');
    }

    public function obtener_completo($id) {
        return $this->db
            ->select("
                g.*,

                m.nombre as motivo_nombre,

                cli.razon_social as cliente_nombre,
                cli.nro_documento as cliente_nro_documento,

                tdoc.nombre as cliente_doc_nombre,
                tdoc.abreviado as cliente_doc_abreviado,

                ori.sucursales as origen_descripcion,
                des.direccion as destino_descripcion,

                ump.nombre as um_peso_bruto_nombre,
                ump.abreviado as um_peso_bruto_abreviado,

                veh.nro_placa as vehiculo_placa,
                veh.marca as vehiculo_marca,
                veh.nro_autorizacion as vehiculo_nro_autorizacion,

                ee.nombre as vehiculo_entidad_emisora,

                cond.nombre as conductor_nombre,
                cond.nro_licencia as conductor_licencia,
                cond.nro_documento as conductor_nro_documento,

                cdoc.nombre as conductor_doc_nombre,
                cdoc.abreviado as conductor_doc_abreviado,

                tr.ruc as transportista_ruc,
                tr.razon_social as transportista_nombre,
                tr.nro_registro_mtc as transportista_registro_mtc,
                tr.nro_autorizacion as transportista_nro_autorizacion,

                est.nombre as estado_nombre
            ")
            ->from('al_gr_remitente g')
            ->join('mt_motivo_traslado m', 'm.id = g.motivo_traslado_id', 'left')
            ->join('vt_cliente cli', 'cli.id = g.cliente_id', 'left')
            ->join('mt_documento_identidad tdoc', 'tdoc.id = cli.documento_identidad_id', 'left')
            ->join('empresa_detalle ori', 'ori.id = g.origen_id', 'left')
            ->join('vt_cliente_local des', 'des.id = g.destino_id', 'left')
            ->join('mt_unidad_medida ump', 'ump.id = g.um_peso_bruto_id', 'left')
            ->join('mt_vehiculo veh', 'veh.id = g.vehiculo_id', 'left')
            ->join('mt_entidad_emisora ee', 'ee.id = veh.entidad_emisora_id', 'left')
            ->join('mt_conductor cond', 'cond.id = g.conductor_id', 'left')
            ->join('mt_documento_identidad cdoc', 'cdoc.id = cond.documento_identidad_id', 'left')
            ->join('mt_transportista tr', 'tr.id = g.transportista_id', 'left')
            ->join('estado est', 'est.id = g.estado_id', 'left')
            ->where('g.id', $id)
            ->get()
            ->row();
    }

    public function obtener_detalle_guia($id) {
        return $this->db
            ->select("
                d.*,
                p.codigo,
                p.nombre,
                p.descripcion as producto_descripcion,
                um.nombre as unidad_medida_nombre,
                um.abreviado as unidad_medida_abreviado
            ")
            ->from('al_gr_remitente_detalle d')
            ->join('vt_producto p', 'p.id = d.producto_id', 'left')
            ->join('mt_unidad_medida um', 'um.id = d.um_id', 'left')
            ->where('d.gr_remitente_id', $id)
            ->order_by('d.id', 'ASC')
            ->get()
            ->result();
    }

    public function obtener_comprobantes_relacionados($id) {
        return $this->db
            ->select("
                rc.*,
                c.serie,
                c.numero,
                tc.nombre as tipo_comprobante_nombre,
                tc.nombre_corto as tipo_comprobante_corto,
                cli.razon_social as cliente_nombre,
                cli.nro_documento as cliente_nro_documento
            ")
            ->from('al_gr_remitente_comprob rc')
            ->join('vt_comprobante c', 'c.id = rc.nrofactbolt_id', 'left')
            ->join('mt_tipo_comprobante tc', 'tc.id = c.comprobante_id', 'left')
            ->join('vt_cliente cli', 'cli.id = c.cliente_id', 'left')
            ->where('rc.gr_remitente_id', $id)
            ->order_by('rc.id', 'ASC')
            ->get()
            ->result();
    }

    public function listar_historial_estados($gr_remitente_id) {
        return $this->db
            ->select('
                he.*,
                e.nombre as estado_nombre,
                u.usuario
            ')
            ->from('al_gr_remitente_estado he')
            ->join('estado e', 'e.id = he.estado_id', 'left')
            ->join('usuarios u', 'u.id = he.usuario_id', 'left')
            ->where('he.gr_remitente_id', $gr_remitente_id)
            ->order_by('he.id', 'DESC')
            ->get()
            ->result();
    }

    public function insertar_orp_detalle($data) {
        return $this->db->insert('al_gr_remitente_orp_detalle', $data);
    }

    public function obtener_total_guiado_detalle_orden($orpd_id) {
        $row = $this->db
            ->select('IFNULL(SUM(cantidad_guiada), 0) as total_guiado')
            ->from('al_gr_remitente_orp_detalle')
            ->where('orpd_id', $orpd_id)
            ->get()
            ->row();

        return $row ? (float)$row->total_guiado : 0;
    }

    public function obtener_para_comprobante($ids) {
        return $this->db
            ->select('
                g.*,
                c.razon_social as cliente_nombre,
                c.nro_documento,
                c.domicilio_fiscal,
                c.moneda_id,
                c.vendedor_id,
                c.fp_id,
                m.nombre as moneda_nombre,
                m.abreviado as moneda_abreviado,
                e.codigo as estado_codigo,
                e.nombre as estado_nombre,
                MIN(go.orp_id) as orp_id
            ')
            ->from('al_gr_remitente g')
            ->join('vt_cliente c', 'c.id = g.cliente_id')
            ->join('mt_moneda m', 'm.id = c.moneda_id', 'left')
            ->join('estado e', 'e.id = g.estado_id', 'left')
            ->join('al_gr_remitente_orp_detalle go', 'go.gr_remitente_id = g.id', 'left')
            ->where_in('g.id', $ids)
            ->group_by('g.id')
            ->order_by('g.id', 'ASC')
            ->get()
            ->result();
    }

    public function obtener_detalle_para_comprobante($ids) {
        return $this->db
            ->select('
                gd.producto_id,
                p.codigo as producto_codigo,
                p.nombre as producto_nombre,
                p.detraccion_id,
                md.nombre as detraccion_nombre,
                md.porcentaje as detraccion_porcentaje,
                md.monto_minimo as detraccion_monto_minimo,
                um.abreviado as unidad_abreviada,
                p.um_id_venta,
                opd.orpd_precio_unitario,
                SUM(gd.cantidad) as cantidad
            ')
            ->from('al_gr_remitente_detalle gd')
            ->join('al_gr_remitente_orp_detalle god', 'god.gr_remitente_id = gd.gr_remitente_id', 'left')
            ->join('vt_orden_pedido_detalle opd', 'opd.id = god.orpd_id AND opd.producto_id = gd.producto_id', 'left')
            ->join('vt_producto p', 'p.id = gd.producto_id')
            ->join('mt_unidad_medida um', 'um.id = gd.um_id', 'left')
            ->join('mt_detraccion md', 'md.id = p.detraccion_id', 'left')
            ->where_in('gd.gr_remitente_id', $ids)
            ->group_by('gd.producto_id, opd.orpd_precio_unitario')
            ->order_by('p.nombre', 'ASC')
            ->get()
            ->result();
    }

    public function insertar_comprobante_relacion($data) {
        return $this->db->insert('al_gr_remitente_comprob', $data);
    }

    public function actualizar_estado($id, $estado_id) {
        return $this->db
            ->where('id', $id)
            ->update('al_gr_remitente', array(
                'estado_id' => $estado_id,
                'updated_at' => date('Y-m-d H:i:s'),
                'updated_by' => $this->session->userdata('id')
            ));
    }

/*
    public function obtener_detalle_para_comprobante($gr_id) {
        return $this->db
            ->select('
                gd.*,
                p.codigo as producto_codigo,
                p.nombre as producto_nombre,
                p.um_id_venta,
                p.precio_unidad,
                p.precio_doce,
                p.precio_veinticinco,
                p.precio_cincuenta,
                p.precio_cien,
                p.precio_millar,
                p.detraccion_id,
                md.nombre as detraccion_nombre,
                md.porcentaje as detraccion_porcentaje,
                md.monto_minimo as detraccion_monto_minimo,
                um.abreviado as unidad_abreviada,
                rel.orp_id,
                rel.orpd_id,
                opd.orpd_precio_unitario,
                opd.orpd_total,
                opd.orpd_saldo
            ')
            ->from('al_gr_remitente_detalle gd')
            ->join('vt_producto p', 'p.id = gd.producto_id')
            ->join('mt_unidad_medida um', 'um.id = gd.um_id', 'left')
            ->join('mt_detraccion md', 'md.id = p.detraccion_id', 'left')
            ->join('al_gr_remitente_orp_detalle rel', 'rel.gr_remitente_id = gd.gr_remitente_id', 'left')
            ->join('vt_orden_pedido_detalle opd', 'opd.id = rel.orpd_id AND opd.producto_id = gd.producto_id', 'left')
            ->where('gd.gr_remitente_id', $gr_id)
            ->get()
            ->result();
    }
*/
    public function obtener_orp_id_de_guia($gr_id) {
        $row = $this->db
            ->select('orp_id')
            ->from('al_gr_remitente_orp_detalle')
            ->where('gr_remitente_id', $gr_id)
            ->group_by('orp_id')
            ->get()
            ->row();

        return $row ? (int)$row->orp_id : 0;
    }


            
}