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

class NotaDebito_model extends CI_Model {

    public function listar() {
        return $this->db
            ->select('
                nd.*,
                tnd.descripcion as tipo_nd,
                tnd.codigo as tipo_nd_codigo,
                cl.razon_social as cliente,
                cl.nro_documento as cliente_ruc,
                c.serie as comprob_serie,
                c.numero as comprob_numero,
                tc.nombre as tipo_comprobante,
                m.abreviado as moneda
            ')
            ->from('vt_nota_debito nd')
            ->join('mt_tipo_nota_debito tnd', 'tnd.id = nd.tipo_nd_id')
            ->join('vt_cliente cl',           'cl.id = nd.cliente_id')
            ->join('vt_comprobante c',        'c.id = nd.comprob_id')
            ->join('mt_tipo_comprobante tc',  'tc.id = c.comprobante_id', 'left')
            ->join('mt_moneda m',             'm.id = nd.moneda_id',      'left')
            ->order_by('nd.id', 'DESC')
            ->get()->result();
    }

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

    public function obtener_completo($id) {
        return $this->db
            ->select('
                nd.*,
                tnd.descripcion as tipo_nd,
                tnd.codigo as tipo_nd_codigo,
                cl.razon_social as cliente,
                cl.nro_documento as cliente_ruc,
                cl.domicilio_fiscal as cliente_direccion,
                c.serie as comprob_serie,
                c.numero as comprob_numero,
                c.fecha as comprob_fecha,
                tc.nombre as tipo_comprobante,
                m.nombre as moneda,
                m.abreviado as moneda_abreviado,
                u.usuario as usuario_creador
            ')
            ->from('vt_nota_debito nd')
            ->join('mt_tipo_nota_debito tnd', 'tnd.id = nd.tipo_nd_id')
            ->join('vt_cliente cl',           'cl.id = nd.cliente_id')
            ->join('vt_comprobante c',        'c.id = nd.comprob_id')
            ->join('mt_tipo_comprobante tc',  'tc.id = c.comprobante_id', 'left')
            ->join('mt_moneda m',             'm.id = nd.moneda_id',      'left')
            ->join('usuarios u',              'u.id = nd.created_by',     'left')
            ->where('nd.id', $id)
            ->get()->row();
    }

    public function obtener_detalle($nd_id) {
        return $this->db
            ->where('nd_id', $nd_id)
            ->order_by('id', 'ASC')
            ->get('vt_nota_debito_det')
            ->result();
    }

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

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

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

    public function siguiente_numero($serie) {
        $this->db->select_max('CAST(numero AS UNSIGNED)', 'max_num');
        $this->db->from('vt_nota_debito');
        $this->db->where('serie', $serie);
        $row       = $this->db->get()->row();
        $siguiente = ($row && $row->max_num) ? (int)$row->max_num + 1 : 1;
        return str_pad($siguiente, 8, '0', STR_PAD_LEFT);
    }

    public function buscar_comprobante($term) {
        $this->db->select('
            c.id, c.serie, c.numero, c.fecha,
            c.pago_neto as total, c.moneda_id,
            c.cliente_id, c.igv_porcentaje,
            cl.razon_social as cliente,
            cl.nro_documento as cliente_ruc,
            tc.nombre as tipo_comprobante,
            m.abreviado as moneda
        ');
        $this->db->from('vt_comprobante c');
        $this->db->join('vt_cliente cl',         'cl.id = c.cliente_id');
        $this->db->join('mt_tipo_comprobante tc', 'tc.id = c.comprobante_id', 'left');
        $this->db->join('mt_moneda m',           'm.id = c.moneda_id',        'left');
        $this->db->where_in('c.estado_id', array(23, 26, 27));
        $this->db->group_start();
        $this->db->like('c.numero', $term);
        $this->db->or_like('c.serie', $term);
        $this->db->or_like('cl.razon_social', $term);
        $this->db->group_end();
        $this->db->limit(20);
        return $this->db->get()->result();
    }

    public function obtener_completo_comprobante($id) {
        return $this->db
            ->select('
                c.*,
                cl.razon_social as cliente,
                cl.nro_documento as cliente_ruc,
                cl.domicilio_fiscal as cliente_direccion,
                tc.nombre as tipo_comprobante,
                m.nombre as moneda,
                m.abreviado as moneda_abreviado
            ')
            ->from('vt_comprobante c')
            ->join('vt_cliente cl',         'cl.id = c.cliente_id')
            ->join('mt_tipo_comprobante tc', 'tc.id = c.comprobante_id', 'left')
            ->join('mt_moneda m',            'm.id = c.moneda_id',        'left')
            ->where('c.id', $id)
            ->get()->row();
    }

    public function listar_tipos_nd() {
        return $this->db->where('estado', 1)->order_by('codigo', 'ASC')->get('mt_tipo_nota_debito')->result();
    }

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

    public function obtener_serie_nd($comprob_id) {
        $comprob = $this->db->select('serie')->where('id', $comprob_id)->get('vt_comprobante')->row();
        return $comprob ? $comprob->serie : 'F001';
    }
}
