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

class Cotizacion_model extends CI_Model {

    public function listar($estado_id = null, $limite = 200) {
        $this->db
            ->select('
                c.id, c.ctc_fecha, c.ctc_total, c.ctc_tipo_coti, c.ctc_ordcomp_cliente,
                c.estado_id, c.comprobante_id, c.created_by,
                cli.razon_social,
                cli.nro_documento,
                tc.nombre as comprobante,
                fp.nombre as forma_pago,
                e.nombre as estado_nombre,
                e.codigo as estado_codigo,
                u.usuario as usuario_creador
            ')
            ->from('vt_cotizacion c')
            ->join('vt_cliente cli', 'cli.id = c.cliente_id')
            ->join('mt_tipo_comprobante tc', 'tc.id = c.comprobante_id')
            ->join('mt_forma_pago fp', 'fp.id = c.fp_id', 'left')
            ->join('estado e', 'e.id = c.estado_id')
            ->join('usuarios u', 'u.id = c.created_by', 'left');

        if ($estado_id !== null && $estado_id !== '') {
            $this->db->where('c.estado_id', $estado_id);
        }

        return $this->db
            ->order_by('c.id', 'DESC')
            ->limit($limite)
            ->get()
            ->result();
    }

    public function listar_estados() {
        return $this->db
            ->where('tipo', 'COTIZACION')
            ->where('estado', 1)
            ->order_by('id', 'ASC')
            ->get('estado')
            ->result();
    }

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

    public function obtener_detalle($ctc_id) {
        return $this->db
            ->select('
                d.*,
                p.codigo as producto_codigo,
                p.nombre as producto_nombre
            ')
            ->from('vt_cotizacion_detalle d')
            ->join('vt_producto p', 'p.id = d.producto_id')
            ->where('d.ctc_id', $ctc_id)
            ->order_by('d.id', 'ASC')
            ->get()
            ->result();
    }

    public function obtener_historial_estados($ctc_id) {
        return $this->db
            ->select('
                ce.*,
                e.nombre as estado_nombre,
                e.codigo as estado_codigo,
                u.usuario
            ')
            ->from('vt_cotizacion_estado ce')
            ->join('estado e', 'e.id = ce.estado_id')
            ->join('usuarios u', 'u.id = ce.usuario_id', 'left')
            ->where('ce.ctc_id', $ctc_id)
            ->order_by('ce.id', 'ASC')
            ->get()
            ->result();
    }

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

    public function insertar_detalle_batch($data) {
        return $this->db->insert_batch('vt_cotizacion_detalle', $data);
    }

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

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

    public function eliminar_detalle($ctc_id) {
        return $this->db
            ->where('ctc_id', $ctc_id)
            ->delete('vt_cotizacion_detalle');
    }

    public function buscar_cliente($term) {
        $this->db->select('id, razon_social, nro_documento, fp_id, fp_descripcion, vendedor_id');
        $this->db->from('vt_cliente');
        $this->db->where('estado', 1);
        $this->db->group_start();
        $this->db->like('razon_social', $term);
        $this->db->or_like('nro_documento', $term);
        $this->db->group_end();
        $this->db->limit(20);
        return $this->db->get()->result();
    }

    public function obtener_cliente($cliente_id) {
        return $this->db
            ->select('
                c.*,
                fp.nombre as forma_pago_nombre,
                CONCAT(IFNULL(e.apellidos, ""), " ", IFNULL(e.nombres, "")) as vendedor_nombre
            ')
            ->from('vt_cliente c')
            ->join('mt_forma_pago fp', 'fp.id = c.fp_id', 'left')
            ->join('rh_empleado e', 'e.id = c.vendedor_id', 'left')
            ->where('c.id', $cliente_id)
            ->get()
            ->row();
    }

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

    public function obtener_locales_cliente($cliente_id) {
        return $this->db
            ->where('cliente_id', $cliente_id)
            ->where('estado', 1)
            ->order_by('direccion', 'ASC')
            ->get('vt_cliente_local')
            ->result();
    }

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

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

    public function buscar_producto($term, $almacen_id = null) {
        $this->db->select('
            p.id,
            p.codigo,
            p.nombre,
            p.descripcion,
            p.precio_unidad,
            p.precio_doce,
            p.precio_veinticinco,
            p.precio_cincuenta,
            p.precio_cien,
            p.precio_millar,
            p.um_id_venta,
            um.nombre as unidad_nombre,
            um.abreviado as unidad_abreviado,
            pa.cantidad_stock
        ');
        $this->db->from('vt_producto p');
        $this->db->join('mt_unidad_medida um', 'um.id = p.um_id_venta', 'left');
        $this->db->join('vt_producto_almacen pa', 'pa.producto_id = p.id', 'left');
        $this->db->where('p.estado', 1);
        $this->db->where('p.activo_venta', 1);

        if ($almacen_id !== null && $almacen_id !== '') {
            $this->db->where('pa.almacen_id', $almacen_id);
        }

        $this->db->group_start();
        $this->db->like('p.codigo', $term);
        $this->db->or_like('p.nombre', $term);
        $this->db->group_end();

        $this->db->limit(20);

        return $this->db->get()->result();
    }

    public function obtener_producto($producto_id, $almacen_id = null) {
        $this->db->select('
            p.*,
            um.nombre as unidad_nombre,
            um.abreviado as unidad_abreviado,
            pa.cantidad_stock
        ');
        $this->db->from('vt_producto p');
        $this->db->join('mt_unidad_medida um', 'um.id = p.um_id_venta', 'left');
        $this->db->join('vt_producto_almacen pa', 'pa.producto_id = p.id', 'left');
        $this->db->where('p.id', $producto_id);

        if ($almacen_id !== null && $almacen_id !== '') {
            $this->db->where('pa.almacen_id', $almacen_id);
        }

        return $this->db->get()->row();
    }

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

    public function obtener_tipos_comprobante_venta() {
        return $this->db
            ->where('estado', 1)
            ->where('grupo', 'VENTA')
            ->order_by('nombre', 'ASC')
            ->get('mt_tipo_comprobante')
            ->result();
    }

    public function obtener_tributo_igv() {
        return $this->db
            ->where('estado', 1)
            ->where('codigo', '1000')
            ->get('mt_tributo')
            ->row();
    }

    public function obtener_estado_por_tipo_codigo($tipo, $codigo) {
        return $this->db
            ->where('tipo', $tipo)
            ->where('codigo', $codigo)
            ->where('estado', 1)
            ->get('estado')
            ->row();
    }

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

    public function obtener_completo($id) {
        return $this->db
            ->select('
                c.*,
                cli.razon_social,
                cli.nro_documento,
                fp.nombre as forma_pago_nombre,
                tc.nombre as comprobante_nombre,
                e.nombre as estado_nombre,
                e.codigo as estado_codigo,
                CONCAT(IFNULL(v.apellidos, ""), " ", IFNULL(v.nombres, "")) as vendedor_nombre
            ')
            ->from('vt_cotizacion c')
            ->join('vt_cliente cli', 'cli.id = c.cliente_id')
            ->join('mt_forma_pago fp', 'fp.id = c.fp_id', 'left')
            ->join('mt_tipo_comprobante tc', 'tc.id = c.comprobante_id', 'left')
            ->join('estado e', 'e.id = c.estado_id')
            ->join('rh_empleado v', 'v.id = c.vendedor_id', 'left')
            ->where('c.id', $id)
            ->get()
            ->row();
    }

    public function obtener_orden_pedido_por_cotizacion($ctc_id) {
        return $this->db
            ->where('ctc_id', $ctc_id)
            ->get('vt_orden_pedido')
            ->row();
    }

}