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

class OrdenCompra extends MY_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('logistica/OrdenCompra_model');
    }

    protected function validar_permiso_ajax($slug) {
        if (!tiene_permiso($slug)) {
            echo json_encode(array('status' => false, 'message' => 'No tienes permisos para esta acción'));
            exit;
        }
    }

    // ---------------------------------------------------------------
    // LISTADO
    // ---------------------------------------------------------------
    public function index() {
        $this->validar_permiso('orden_compra_ver');

        $data['titulo']         = 'Órdenes de Compra';
        $data['ordenes']        = $this->OrdenCompra_model->listar();
        $this->layout('logistica/orden_compra/index', $data);
    }

    // ---------------------------------------------------------------
    // FORMULARIO NUEVO
    // ---------------------------------------------------------------
    public function create() {
        $this->validar_permiso('orden_compra_crear');

        $tributo       = $this->OrdenCompra_model->obtener_tributo_igv();
        $tipo_comp_oc  = $this->OrdenCompra_model->obtener_tipo_comprobante_oc();
        $formas_pago   = $this->OrdenCompra_model->obtener_formas_pago();
        $requerimientos = $this->OrdenCompra_model->listar_requerimientos_pendientes();

        $data['titulo']          = 'Nueva Orden de Compra';
        $data['tributo_igv']     = $tributo;
        $data['tipo_comp_oc']    = $tipo_comp_oc;
        $data['formas_pago']     = $formas_pago;
        $data['requerimientos']  = $requerimientos;

        $this->layout('logistica/orden_compra/create', $data);
    }

    // ---------------------------------------------------------------
    // GUARDAR
    // ---------------------------------------------------------------
    public function store() {
        $this->validar_permiso('orden_compra_crear');

        $this->form_validation->set_rules('proveedor_id',  'Proveedor',       'required');
        $this->form_validation->set_rules('fecha',         'Fecha',           'required');
        $this->form_validation->set_rules('tipocs',        'Tipo',            'required');
        $this->form_validation->set_rules('fechaentrega',  'Fecha entrega',   'required');

        if ($this->form_validation->run() == FALSE) {
            $this->create();
            return;
        }

        $proveedor_id  = $this->input->post('proveedor_id', TRUE);
        $tipocs        = $this->input->post('tipocs', TRUE);
        $fecha         = $this->input->post('fecha', TRUE);
        $tipocambio    = $this->input->post('tipocambio', TRUE);
        $fechaentrega  = $this->input->post('fechaentrega', TRUE);
        $comentarios   = trim($this->input->post('comentarios', TRUE));
        $fp_id         = $this->input->post('fp_id', TRUE) ?: null;
        $fp_descripcion = trim($this->input->post('fp_descripcion', TRUE));
        $detalle       = $this->input->post('detalle');
        $estado_id     = $this->input->post('estado_id', TRUE);

        if (empty($detalle) || !is_array($detalle)) {
            $this->session->set_flashdata('error', 'Debes agregar al menos un producto al detalle');
            redirect('logistica/orden_compra/create');
        }

        $tributo = $this->OrdenCompra_model->obtener_tributo_igv();
        if (!$tributo) {
            $this->session->set_flashdata('error', 'No se encontró la configuración del IGV');
            redirect('logistica/orden_compra/create');
        }

        $igvPorcentaje  = (float)$tributo->valor_porcentual;
        $detalleInsert  = array();
        $sumaSubtotales = 0;

        foreach ($detalle as $item) {
            $producto_id    = isset($item['producto_id'])    ? (int)$item['producto_id']      : 0;
            $req_id         = isset($item['req_id'])         ? (int)$item['req_id']           : null;
            $descripcion    = isset($item['descripcion'])    ? trim($item['descripcion'])      : '';
            $cantidad       = isset($item['cantidad'])       ? (float)$item['cantidad']        : 0;
            $precio_unitario = isset($item['precio_unitario']) ? (float)$item['precio_unitario'] : 0;

            if ($producto_id <= 0 || $cantidad <= 0) continue;

            if ($descripcion === '') {
                $prod = $this->OrdenCompra_model->obtener_producto($producto_id);
                $descripcion = $prod ? $prod->nombre : '';
            }

            $subtotal        = round($cantidad * $precio_unitario, 2);
            $sumaSubtotales += $subtotal;

            $detalleInsert[] = array(
                'producto_id'    => $producto_id,
                'req_id'         => ($req_id > 0) ? $req_id : null,
                'descripcion'    => $descripcion,
                'cantidad'       => $cantidad,
                'precio_unitario' => round($precio_unitario, 4),
                'subtotal'       => $subtotal,
                'saldo'          => $cantidad,
                'estado_id'      => $estado_id
            );
        }

        if (empty($detalleInsert)) {
            $this->session->set_flashdata('error', 'No hay detalle válido para registrar');
            redirect('logistica/orden_compra/create');
        }

        $subtotal_cab = round($sumaSubtotales, 2);
        $igv          = round($subtotal_cab * ($igvPorcentaje / 100), 2);
        $total        = round($subtotal_cab + $igv, 2);

        // Generar código correlativo
        $tipo_comp = $this->OrdenCompra_model->obtener_tipo_comprobante_oc();
        $correlativo = (int)$tipo_comp->correlativo_actual + 1;
        $codigo = $tipo_comp->serie . '-' . str_pad($correlativo, 7, '0', STR_PAD_LEFT);

        $cabecera = array(
            'tipocs'         => $tipocs,
            'codigo'         => $codigo,
            'proveedor_id'   => $proveedor_id,
            'fecha'          => $fecha,
            'tipocambio'     => $tipocambio ?: null,
            'fechaentrega'   => $fechaentrega,
            'comentarios'    => $comentarios !== '' ? $comentarios : null,
            'subtotal'       => $subtotal_cab,
            'igv_porcentaje' => round($igvPorcentaje, 4),
            'igv'            => $igv,
            'total'          => $total,
            'usuario_id'     => $this->session->userdata('id'),
            'fp_id'          => $fp_id,
            'fp_descripcion' => $fp_descripcion !== '' ? $fp_descripcion : null,
            'estado_id'      => $estado_id,
            'created_by'     => $this->session->userdata('id')
        );

        $this->db->trans_begin();

        $ordc_id = $this->OrdenCompra_model->insertar_cabecera($cabecera);

        if (!$ordc_id) {
            $this->db->trans_rollback();
            $this->session->set_flashdata('error', 'No se pudo registrar la orden de compra');
            redirect('logistica/orden_compra/create');
        }

        foreach ($detalleInsert as &$d) {
            $d['ordc_id'] = $ordc_id;
        }
        unset($d);

        $this->OrdenCompra_model->insertar_detalle_batch($detalleInsert);

        $this->OrdenCompra_model->insertar_estado(array(
            'ordc_id'          => $ordc_id,
            'estado_id'        => $estado_id,
            'fecha_estado'     => date('Y-m-d H:i:s'),
            'usuario_id'       => $this->session->userdata('id')
        ));

        // Incrementar correlativo
        $this->OrdenCompra_model->incrementar_correlativo($tipo_comp->id);

        if ($this->db->trans_status() === FALSE) {
            $this->db->trans_rollback();
            $this->session->set_flashdata('error', 'Ocurrió un error al guardar la orden de compra');
            redirect('logistica/orden_compra/create');
        }

        $this->db->trans_commit();

        $this->session->set_flashdata('success', 'Orden de compra ' . $codigo . ' registrada correctamente');
        redirect('logistica/orden_compra');
    }

    // ---------------------------------------------------------------
    // VER DETALLE
    // ---------------------------------------------------------------
    public function ver($id) {
        $this->validar_permiso('orden_compra_ver');

        $orden = $this->OrdenCompra_model->obtener_completo($id);
        if (!$orden) show_404();

        $data['titulo']    = 'Detalle Orden de Compra';
        $data['orden']     = $orden;
        $data['detalle']   = $this->OrdenCompra_model->obtener_detalle($id);
        $data['historial'] = $this->OrdenCompra_model->obtener_historial_estados($id);
        $data['es_visador'] = $this->OrdenCompra_model->es_visador_oc($this->session->userdata('id'));

        $this->layout('logistica/orden_compra/ver', $data);
    }

    // ---------------------------------------------------------------
    // FORMULARIO EDITAR (estado EMITIDO=17 u OBSERVADO=44)
    // ---------------------------------------------------------------
    public function edit($id) {
        $this->validar_permiso('orden_compra_editar');

        $orden = $this->OrdenCompra_model->obtener_completo($id);
        if (!$orden) show_404();

        if (!in_array($orden->estado_id, array(17, 44))) {
            $this->session->set_flashdata('error', 'Solo se puede editar una OC en estado EMITIDO u OBSERVADO');
            redirect('logistica/orden_compra');
        }

        $tributo      = $this->OrdenCompra_model->obtener_tributo_igv();
        $formas_pago  = $this->OrdenCompra_model->obtener_formas_pago();
        $requerimientos = $this->OrdenCompra_model->listar_requerimientos_pendientes();

        $data['titulo']         = 'Editar Orden de Compra';
        $data['orden']          = $orden;
        $data['detalle']        = $this->OrdenCompra_model->obtener_detalle($id);
        $data['tributo_igv']    = $tributo;
        $data['formas_pago']    = $formas_pago;
        $data['requerimientos'] = $requerimientos;

        $this->layout('logistica/orden_compra/edit', $data);
    }

    // ---------------------------------------------------------------
    // ACTUALIZAR
    // ---------------------------------------------------------------
    public function update($id) {
        $this->validar_permiso('orden_compra_editar');

        $orden = $this->OrdenCompra_model->obtener($id);
        if (!$orden) show_404();

        if (!in_array($orden->estado_id, array(17, 44))) {
            $this->session->set_flashdata('error', 'Solo se puede editar una OC en estado EMITIDO u OBSERVADO');
            redirect('logistica/orden_compra');
        }

        $this->form_validation->set_rules('proveedor_id',  'Proveedor',     'required');
        $this->form_validation->set_rules('fecha',         'Fecha',         'required');
        $this->form_validation->set_rules('tipocs',        'Tipo',          'required');
        $this->form_validation->set_rules('fechaentrega',  'Fecha entrega', 'required');

        if ($this->form_validation->run() == FALSE) {
            $this->edit($id);
            return;
        }

        $proveedor_id   = $this->input->post('proveedor_id', TRUE);
        $tipocs         = $this->input->post('tipocs', TRUE);
        $fecha          = $this->input->post('fecha', TRUE);
        $tipocambio     = $this->input->post('tipocambio', TRUE);
        $fechaentrega   = $this->input->post('fechaentrega', TRUE);
        $comentarios    = trim($this->input->post('comentarios', TRUE));
        $fp_id          = $this->input->post('fp_id', TRUE) ?: null;
        $fp_descripcion = trim($this->input->post('fp_descripcion', TRUE));
        $detalle        = $this->input->post('detalle');

        if (empty($detalle) || !is_array($detalle)) {
            $this->session->set_flashdata('error', 'Debes agregar al menos un producto al detalle');
            redirect('logistica/orden_compra/edit/' . $id);
        }

        $tributo = $this->OrdenCompra_model->obtener_tributo_igv();
        if (!$tributo) {
            $this->session->set_flashdata('error', 'No se encontró la configuración del IGV');
            redirect('logistica/orden_compra/edit/' . $id);
        }

        $igvPorcentaje  = (float)$tributo->valor_porcentual;
        $detalleInsert  = array();
        $sumaSubtotales = 0;

        foreach ($detalle as $item) {
            $producto_id     = isset($item['producto_id'])     ? (int)$item['producto_id']      : 0;
            $req_id          = isset($item['req_id'])          ? (int)$item['req_id']           : null;
            $descripcion     = isset($item['descripcion'])     ? trim($item['descripcion'])      : '';
            $cantidad        = isset($item['cantidad'])        ? (float)$item['cantidad']        : 0;
            $precio_unitario = isset($item['precio_unitario']) ? (float)$item['precio_unitario'] : 0;

            if ($producto_id <= 0 || $cantidad <= 0) continue;

            if ($descripcion === '') {
                $prod = $this->OrdenCompra_model->obtener_producto($producto_id);
                $descripcion = $prod ? $prod->nombre : '';
            }

            $subtotal        = round($cantidad * $precio_unitario, 2);
            $sumaSubtotales += $subtotal;

            $detalleInsert[] = array(
                'ordc_id'        => $id,
                'producto_id'    => $producto_id,
                'req_id'         => ($req_id > 0) ? $req_id : null,
                'descripcion'    => $descripcion,
                'cantidad'       => $cantidad,
                'precio_unitario' => round($precio_unitario, 4),
                'subtotal'       => $subtotal,
                'saldo'          => $cantidad,
                'estado_id'      => $orden->estado_id
            );
        }

        if (empty($detalleInsert)) {
            $this->session->set_flashdata('error', 'No hay detalle válido para actualizar');
            redirect('logistica/orden_compra/edit/' . $id);
        }

        $subtotal_cab = round($sumaSubtotales, 2);
        $igv          = round($subtotal_cab * ($igvPorcentaje / 100), 2);
        $total        = round($subtotal_cab + $igv, 2);

        $estado_nuevo = 17; // Siempre vuelve a EMITIDO al guardar

        $cabecera = array(
            'tipocs'         => $tipocs,
            'proveedor_id'   => $proveedor_id,
            'fecha'          => $fecha,
            'tipocambio'     => $tipocambio ?: null,
            'fechaentrega'   => $fechaentrega,
            'comentarios'    => $comentarios !== '' ? $comentarios : null,
            'subtotal'       => $subtotal_cab,
            'igv_porcentaje' => round($igvPorcentaje, 4),
            'igv'            => $igv,
            'total'          => $total,
            'fp_id'          => $fp_id,
            'fp_descripcion' => $fp_descripcion !== '' ? $fp_descripcion : null,
            'estado_id'      => $estado_nuevo,
            'updated_at'     => date('Y-m-d H:i:s'),
            'updated_by'     => $this->session->userdata('id')
        );

        $this->db->trans_begin();

        $this->OrdenCompra_model->actualizar($id, $cabecera);
        $this->OrdenCompra_model->eliminar_detalle($id);
        $this->OrdenCompra_model->insertar_detalle_batch($detalleInsert);

        // Si venía de OBSERVADO registrar el reenvío en historial
        if ($orden->estado_id == 44) {
            $this->OrdenCompra_model->insertar_estado(array(
                'ordc_id'      => $id,
                'estado_id'    => $estado_nuevo,
                'fecha_estado' => date('Y-m-d H:i:s'),
                'usuario_id'   => $this->session->userdata('id'),
                'observacion'  => 'OC corregida y reenviada para autorización'
            ));
        }

        if ($this->db->trans_status() === FALSE) {
            $this->db->trans_rollback();
            $this->session->set_flashdata('error', 'No se pudo actualizar la orden de compra');
            redirect('logistica/orden_compra/edit/' . $id);
        }

        $this->db->trans_commit();

        $this->session->set_flashdata('success', 'Orden de compra actualizada correctamente');
        redirect('logistica/orden_compra');
    }

    // ---------------------------------------------------------------
    // AUTORIZAR (solo visadores de OC)
    // ---------------------------------------------------------------
    public function autorizar($id) {
        $this->validar_permiso('orden_compra_autorizar');

        if (!$this->OrdenCompra_model->es_visador_oc($this->session->userdata('id'))) {
            $this->session->set_flashdata('error', 'No tienes autorización para visar órdenes de compra');
            redirect('logistica/orden_compra');
        }

        $orden = $this->OrdenCompra_model->obtener($id);
        if (!$orden) show_404();

        if ($orden->estado_id != 17) {
            $this->session->set_flashdata('error', 'Solo se puede autorizar una OC en estado EMITIDO');
            redirect('logistica/orden_compra');
        }

        $estado_autorizado = $this->OrdenCompra_model->obtener_estado_por_tipo_codigo('ORDEN COMPRA', 'AUT');
        if (!$estado_autorizado) {
            $this->session->set_flashdata('error', 'No se encontró el estado AUTORIZADO');
            redirect('logistica/orden_compra');
        }

        $this->db->trans_begin();

        $this->OrdenCompra_model->actualizar($id, array(
            'estado_id'  => $estado_autorizado->id,
            'updated_at' => date('Y-m-d H:i:s'),
            'updated_by' => $this->session->userdata('id')
        ));

        $this->OrdenCompra_model->insertar_estado(array(
            'ordc_id'      => $id,
            'estado_id'    => $estado_autorizado->id,
            'fecha_estado' => date('Y-m-d H:i:s'),
            'usuario_id'   => $this->session->userdata('id')
        ));

        // Descontar saldo en requerimientos vinculados
        $this->OrdenCompra_model->descontar_saldo_requerimiento($id);

        if ($this->db->trans_status() === FALSE) {
            $this->db->trans_rollback();
            $this->session->set_flashdata('error', 'No se pudo autorizar la orden de compra');
            redirect('logistica/orden_compra');
        }

        $this->db->trans_commit();

        $this->session->set_flashdata('success', 'Orden de compra autorizada correctamente');
        redirect('logistica/orden_compra/ver/' . $id);
    }

    // ---------------------------------------------------------------
    // ANULAR
    // ---------------------------------------------------------------
    public function anular($id) {
        $this->validar_permiso('orden_compra_anular');

        $orden = $this->OrdenCompra_model->obtener($id);
        if (!$orden) show_404();

        if ($orden->estado_id == 22) {
            $this->session->set_flashdata('error', 'La orden de compra ya se encuentra anulada');
            redirect('logistica/orden_compra');
        }

        if (!in_array($orden->estado_id, array(17, 18))) {
            $this->session->set_flashdata('error', 'Solo se puede anular una OC en estado EMITIDO o AUTORIZADO');
            redirect('logistica/orden_compra');
        }

        $estado_anulado = $this->OrdenCompra_model->obtener_estado_por_tipo_codigo('ORDEN COMPRA', 'ANU');
        if (!$estado_anulado) {
            $this->session->set_flashdata('error', 'No se encontró el estado ANULADO');
            redirect('logistica/orden_compra');
        }

        $this->db->trans_begin();

        $this->OrdenCompra_model->actualizar($id, array(
            'estado_id'  => $estado_anulado->id,
            'updated_at' => date('Y-m-d H:i:s'),
            'updated_by' => $this->session->userdata('id')
        ));

        $this->OrdenCompra_model->insertar_estado(array(
            'ordc_id'      => $id,
            'estado_id'    => $estado_anulado->id,
            'fecha_estado' => date('Y-m-d H:i:s'),
            'usuario_id'   => $this->session->userdata('id')
        ));

        // Si estaba AUTORIZADO(18) revertir saldo en requerimientos
        if ($orden->estado_id == 18) {
            $this->OrdenCompra_model->revertir_saldo_requerimiento($id);
        }

        if ($this->db->trans_status() === FALSE) {
            $this->db->trans_rollback();
            $this->session->set_flashdata('error', 'No se pudo anular la orden de compra');
            redirect('logistica/orden_compra');
        }

        $this->db->trans_commit();

        $this->session->set_flashdata('success', 'Orden de compra anulada correctamente');
        redirect('logistica/orden_compra');
    }

    // ---------------------------------------------------------------
    // BANDEJA DE AUTORIZACIÓN
    // ---------------------------------------------------------------
    public function bandeja() {
        $this->validar_permiso('orden_compra_autorizar');

        if (!$this->OrdenCompra_model->es_visador_oc($this->session->userdata('id'))) {
            $this->session->set_flashdata('error', 'No tienes acceso a la bandeja de autorización');
            redirect('logistica/orden_compra');
        }

        $data['titulo']  = 'Bandeja de Autorización - Órdenes de Compra';
        $data['ordenes'] = $this->OrdenCompra_model->listar_pendientes_autorizacion();
        $this->layout('logistica/orden_compra/bandeja', $data);
    }

    // ---------------------------------------------------------------
    // OBSERVAR (visador devuelve OC con comentario)
    // ---------------------------------------------------------------
    public function observar($id) {
        $this->validar_permiso('orden_compra_autorizar');

        if (!$this->OrdenCompra_model->es_visador_oc($this->session->userdata('id'))) {
            echo json_encode(array('status' => false, 'message' => 'No tienes autorización'));
            exit;
        }

        $orden = $this->OrdenCompra_model->obtener($id);
        if (!$orden) {
            echo json_encode(array('status' => false, 'message' => 'OC no encontrada'));
            exit;
        }

        if ($orden->estado_id != 17) {
            echo json_encode(array('status' => false, 'message' => 'Solo se puede observar una OC en estado EMITIDO'));
            exit;
        }

        $observacion = trim($this->input->post('observacion', TRUE));
        if (empty($observacion)) {
            echo json_encode(array('status' => false, 'message' => 'Debes ingresar el motivo de la observación'));
            exit;
        }

        $this->db->trans_begin();

        $this->OrdenCompra_model->actualizar($id, array(
            'estado_id'  => 44,
            'updated_at' => date('Y-m-d H:i:s'),
            'updated_by' => $this->session->userdata('id')
        ));

        $this->OrdenCompra_model->insertar_estado(array(
            'ordc_id'      => $id,
            'estado_id'    => 44,
            'fecha_estado' => date('Y-m-d H:i:s'),
            'usuario_id'   => $this->session->userdata('id'),
            'observacion'  => $observacion
        ));

        if ($this->db->trans_status() === FALSE) {
            $this->db->trans_rollback();
            echo json_encode(array('status' => false, 'message' => 'Error al guardar la observación'));
            exit;
        }

        $this->db->trans_commit();
        echo json_encode(array('status' => true, 'message' => 'OC observada correctamente'));
    }

    // ---------------------------------------------------------------
    // IMPRIMIR
    // ---------------------------------------------------------------
    public function imprimir($id) {
        $this->validar_permiso('orden_compra_ver');

        $orden = $this->db
            ->select('
                oc.*,
                p.razon_social, p.nro_documento, p.domicilio_fiscal,
                p.telefono as telefono_prov, p.email as email_prov,
                p.contacto, p.contacto_cargo,
                fp.nombre as forma_pago_nombre,
                e.nombre as estado_nombre, e.codigo as estado_codigo,
                u.nombre as usuario_nombre
            ')
            ->from('lt_orden_compra oc')
            ->join('lt_proveedor p',   'p.id = oc.proveedor_id')
            ->join('mt_forma_pago fp', 'fp.id = oc.fp_id', 'left')
            ->join('estado e',         'e.id = oc.estado_id')
            ->join('usuarios u',       'u.id = oc.usuario_id', 'left')
            ->where('oc.id', $id)
            ->get()->row();

        if (!$orden) show_404();

        $empresa = $this->db->where('estado', 1)->limit(1)->get('empresa')->row();

        $data['orden']          = $orden;
        $data['detalle']        = $this->OrdenCompra_model->obtener_detalle($id);
        $data['empresa']        = $empresa;
        $data['usuario_nombre'] = $orden->usuario_nombre;

        $this->load->view('logistica/orden_compra/print', $data);
    }

    // ---------------------------------------------------------------
    // AJAX - PROVEEDOR
    // ---------------------------------------------------------------
    public function buscar_proveedor() {
        $this->validar_permiso_ajax('orden_compra_crear');

        $term = trim($this->input->get('term', TRUE));
        if (strlen($term) < 2) { echo json_encode(array()); return; }

        $proveedores = $this->OrdenCompra_model->buscar_proveedor($term);
        $resultado   = array();

        foreach ($proveedores as $item) {
            $prov = $this->OrdenCompra_model->obtener_proveedor($item->id);
            $resultado[] = array(
                'id'                => $item->id,
                'label'             => $item->razon_social . ' | ' . $item->nro_documento,
                'value'             => $item->razon_social,
                'razon_social'      => $item->razon_social,
                'nro_documento'     => $item->nro_documento,
                'fp_id'             => $item->fp_id,
                'fp_descripcion'    => $item->fp_descripcion,
                'forma_pago_nombre' => $prov ? $prov->forma_pago_nombre : '',
                'moneda_id'         => $item->moneda_id,
                'moneda_nombre'     => $prov ? $prov->moneda_nombre : '',
                'contacto'          => $item->contacto,
                'contacto_cargo'    => $item->contacto_cargo
            );
        }

        echo json_encode($resultado);
    }

    // ---------------------------------------------------------------
    // AJAX - PRODUCTO
    // ---------------------------------------------------------------
    public function buscar_producto() {
        $this->validar_permiso_ajax('orden_compra_crear');

        $term = trim($this->input->get('term', TRUE));
        if (strlen($term) < 2) { echo json_encode(array()); return; }

        $productos = $this->OrdenCompra_model->buscar_producto($term);
        $resultado = array();

        foreach ($productos as $item) {
            $resultado[] = array(
                'id'               => $item->id,
                'label'            => $item->codigo . ' | ' . $item->nombre,
                'value'            => $item->nombre,
                'codigo'           => $item->codigo,
                'nombre'           => $item->nombre,
                'descripcion'      => $item->descripcion,
                'unidad_nombre'    => $item->unidad_nombre,
                'unidad_abreviado' => $item->unidad_abreviado
            );
        }

        echo json_encode($resultado);
    }

    // ---------------------------------------------------------------
    // AJAX - DETALLE DE REQUERIMIENTO
    // ---------------------------------------------------------------
    public function detalle_requerimiento($req_id) {
        $this->validar_permiso_ajax('orden_compra_crear');

        $detalle = $this->OrdenCompra_model->obtener_detalle_requerimiento($req_id);
        echo json_encode($detalle);
    }
}