var GuiasCompras = Object.assign({}, TablaGenerica);

GuiasCompras.detalleItems = [];

GuiasCompras.renderDetalle = function() {
    var tbody = document.getElementById('gcDetalleBody');
    if (!tbody) return;
    var html = '';
    this.detalleItems.forEach(function(item, idx) {
        html += '<tr>' +
            '<td>' + (item.cod_articulo || '') + '</td>' +
            '<td>' + (item.nombre || '') + '</td>' +
            '<td>' + (item.cod_unidad || '') + '</td>' +
'<td><input type="number" class="gc-det-cant" data-idx="' + idx + '" value="' + (item.cantidad ? parseFloat(item.cantidad).toFixed(3) : '') + '" step="0.001" min="0" style="width:90px;padding:4px 8px;border:1px solid #d1d5db;border-radius:4px;text-align:right;font-family:inherit;font-size:inherit;outline:none"></td>' +
'<td><input type="number" class="gc-det-costo" data-idx="' + idx + '" value="' + (item.costo_unitario ? parseFloat(item.costo_unitario).toFixed(4) : '') + '" step="0.0001" min="0" style="width:110px;padding:4px 8px;border:1px solid #d1d5db;border-radius:4px;text-align:right;font-family:inherit;font-size:inherit;outline:none"></td>' +
'<td><input type="number" class="gc-det-peso" data-idx="' + idx + '" value="' + (item.peso ? parseFloat(item.peso).toFixed(3) : '') + '" step="0.001" min="0" style="width:80px;padding:4px 8px;border:1px solid #d1d5db;border-radius:4px;text-align:right;font-family:inherit;font-size:inherit;outline:none"></td>' +
'<td><input type="number" class="gc-det-unid" data-idx="' + idx + '" value="' + (item.unidades || '') + '" step="1" min="0" readonly style="width:60px;padding:4px 8px;border:1px solid #d1d5db;border-radius:4px;text-align:right;font-family:inherit;font-size:inherit;outline:none;background:#f3f4f6"></td>' +
            '<td><button class="gc-btn-del" data-idx="' + idx + '" title="Eliminar" style="background:none;border:none;color:#ef4444;cursor:pointer;font-size:0.9rem"><i class="fas fa-trash-alt"></i></button></td>' +
            '</tr>';
    });
    tbody.innerHTML = html;
    tbody.querySelectorAll('.gc-det-cant').forEach(function(inp) {
        inp.addEventListener('change', function() {
            var idx = parseInt(this.dataset.idx);
            if (!isNaN(idx) && GuiasCompras.detalleItems[idx]) {
                GuiasCompras.detalleItems[idx].cantidad = parseFloat(this.value) || 0;
                GuiasCompras.detalleItems[idx].unidades = Math.ceil(GuiasCompras.detalleItems[idx].cantidad);
                GuiasCompras.recalcularItem(idx);
                GuiasCompras.renderDetalle();
                GuiasCompras.calcularTotales();
            }
        });
    });
    tbody.querySelectorAll('.gc-det-costo').forEach(function(inp) {
        inp.addEventListener('change', function() {
            var idx = parseInt(this.dataset.idx);
            if (!isNaN(idx) && GuiasCompras.detalleItems[idx]) {
                GuiasCompras.detalleItems[idx].costo_unitario = parseFloat(this.value) || 0;
                GuiasCompras.recalcularItem(idx);
                GuiasCompras.renderDetalle();
                GuiasCompras.calcularTotales();
            }
        });
    });
    tbody.querySelectorAll('.gc-det-peso').forEach(function(inp) {
        inp.addEventListener('change', function() {
            var idx = parseInt(this.dataset.idx);
            if (!isNaN(idx) && GuiasCompras.detalleItems[idx]) {
                GuiasCompras.detalleItems[idx].peso = parseFloat(this.value) || 0;
            }
        });
    });
    tbody.querySelectorAll('.gc-det-unid').forEach(function(inp) {
        inp.addEventListener('change', function() {
            var idx = parseInt(this.dataset.idx);
            if (!isNaN(idx) && GuiasCompras.detalleItems[idx]) {
                GuiasCompras.detalleItems[idx].unidades = parseInt(this.value) || 0;
            }
        });
    });
    tbody.querySelectorAll('.gc-btn-del').forEach(function(btn) {
        btn.addEventListener('click', function() {
            var idx = parseInt(this.dataset.idx);
            if (!isNaN(idx)) {
                GuiasCompras.detalleItems.splice(idx, 1);
                GuiasCompras.renderDetalle();
                GuiasCompras.calcularTotales();
            }
        });
    });
    var count = document.getElementById('gcDetCount');
    if (count) count.textContent = '(' + GuiasCompras.detalleItems.length + ' items)';
};

GuiasCompras.recalcularItem = function(idx) {
    var item = this.detalleItems[idx];
    if (!item) return;
    var cant = parseFloat(item.cantidad) || 0;
    var costo = parseFloat(item.costo_unitario) || 0;
    item.total = cant * costo;
};

GuiasCompras.calcularTotales = function() {
    var subtotal = 0;
    this.detalleItems.forEach(function(item) {
        subtotal += parseFloat(item.total) || 0;
    });
    var porc = parseFloat(GuiasCompras.porcentajeIgv) || 18;
    var igv = subtotal * porc / 100;
    var total = subtotal + igv;

    var elSub = document.getElementById('gcFormSubtotal');
    var elIgv = document.getElementById('gcFormIgv');
    var elTot = document.getElementById('gcFormTotal');
    var elLabel = document.getElementById('gcIgvLabel');
    if (elSub) elSub.value = subtotal.toFixed(2);
    if (elIgv) elIgv.value = igv.toFixed(2);
    if (elTot) elTot.value = total.toFixed(2);
    if (elLabel) elLabel.textContent = 'IGV (' + porc + '%):';
};

GuiasCompras.iniciarAutocompleteProveedor = function() {
    var input = document.getElementById('gcFormProveedor');
    if (!input || input.dataset._autoProvOk) return;
    input.dataset._autoProvOk = '1';
    var hiddenId = document.getElementById('gcFormIdProveedor');

    var dd = document.createElement('div');
    dd.style.cssText = 'position:fixed;z-index:9999;background:#fff;border:1px solid #e2e8f0;border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,0.1);max-height:220px;overflow-y:auto;display:none';
    document.body.appendChild(dd);
    var timer;
    function ocultar() { dd.style.display = 'none'; dd.innerHTML = ''; }
    function posicionar() {
        var r = input.getBoundingClientRect();
        dd.style.top = r.bottom + 'px';
        dd.style.left = r.left + 'px';
        dd.style.width = Math.max(r.width, 420) + 'px';
    }
    input.addEventListener('input', function() {
        clearTimeout(timer);
        var v = this.value.trim();
        if (v.length < 1) { ocultar(); return; }
        timer = setTimeout(function() {
            var url = GuiasCompras.API_URL + '/proveedores?buscar=' + encodeURIComponent(v) + '&limit=20&estado=1&id_empresa=' + (GuiasCompras.sesion ? GuiasCompras.sesion.id_empresa : '');
            fetch(url).then(function(r) { return r.json(); }).then(function(res) {
                posicionar();
                if (!res.ok || !res.data || res.data.length === 0) {
                    dd.innerHTML = '<div style="padding:10px;color:#94a3b8;font-size:13px;text-align:center">Sin resultados</div>';
                    dd.style.display = 'block'; return;
                }
                var h = '';
                res.data.forEach(function(item) {
                    h += '<div class="prov-ubigeo-dd-item prov-autocomplete-item" style="cursor:pointer" data-id="' + item.id_proveedor + '" data-razon="' + (item.razon_social || '').replace(/"/g, '&quot;') + '">' + item.razon_social + ' - ' + item.num_documento + '</div>';
                });
                dd.innerHTML = h;
                dd.style.display = 'block';
                dd.querySelectorAll('.prov-autocomplete-item').forEach(function(el) {
                    el.addEventListener('click', function() {
                        input.value = this.dataset.razon;
                        if (hiddenId) hiddenId.value = this.dataset.id;
                        ocultar();
                        GuiasCompras.cargarOCDisponibles();
                    });
                });
            });
        }, 300);
    });
    document.addEventListener('click', function(e) {
        if (!e.target.closest('#gcFormProveedor') && !dd.contains(e.target)) ocultar();
    });
    input.addEventListener('blur', function() {
        setTimeout(ocultar, 200);
    });
};

GuiasCompras.cargarOCDisponibles = function() {
    var idProv = document.getElementById('gcFormIdProveedor');
    var sel = document.getElementById('gcFormOC');
    if (!sel) return;
    if (!idProv || !idProv.value) { sel.innerHTML = '<option value="">Seleccione un proveedor primero</option>'; return; }
    sel.innerHTML = '<option value="">Cargando...</option>';
    var ejercicio = new Date().getFullYear();
    fetch(GuiasCompras.API_URL + '/guias-remision/oc-disponibles/' + (GuiasCompras.sesion ? GuiasCompras.sesion.id_empresa : '') + '?id_proveedor=' + idProv.value + '&ejercicio=' + ejercicio)
        .then(function(r) { return r.json(); })
        .then(function(res) {
            sel.innerHTML = '<option value="">Seleccione una OC...</option>';
            if (res.ok && res.data) {
                res.data.forEach(function(oc) {
                    var val = oc.ejercicio + '|' + oc.num_oc;
                    var fOC = '';
                    if (oc.fecha_oc) {
                        var d = new Date(oc.fecha_oc);
                        if (!isNaN(d.getTime())) fOC = ('0' + d.getDate()).slice(-2) + '/' + ('0' + (d.getMonth() + 1)).slice(-2) + '/' + d.getFullYear();
                    }
                    sel.innerHTML += '<option value="' + val + '">' + oc.ejercicio + '-' + oc.num_oc + ' - ' + (oc.proveedor_razon_social || '') + ' (' + fOC + ')</option>';
                });
            }
            if (sel.options.length === 1) sel.innerHTML = '<option value="">Sin OC pendientes</option>';
        })
        .catch(function() { sel.innerHTML = '<option value="">Error al cargar OC</option>'; });
};

GuiasCompras._fechaHoraStr = function() {
    var a = new Date();
    return a.toLocaleDateString('es-PE', { day: '2-digit', month: '2-digit', year: 'numeric' }) + ' ' + a.toLocaleTimeString('es-PE', { hour: '2-digit', minute: '2-digit' });
};

GuiasCompras._imprimirSrcdoc = function(html, titulo) {
    var fullHtml = '<!DOCTYPE html><html><head><meta charset="UTF-8"><title>' + (titulo || 'Reporte') + '</title>' +
        '<link rel="preconnect" href="https://fonts.googleapis.com"><link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">' +
        '<style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:"Plus Jakarta Sans",sans-serif;padding:30px 40px;color:#1E293B}.prov-print-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:16px;padding-bottom:12px;border-bottom:2px solid #1A4480}.prov-print-titulo{font-size:1.2rem;font-weight:800;color:#1A4480;text-transform:uppercase;letter-spacing:0.5px}.prov-print-filtros{font-size:0.72rem;color:#475569;background:#F1F5F9;padding:5px 10px;border-radius:6px;margin-bottom:14px}table{width:100%;border-collapse:collapse;font-size:0.72rem}thead th{background:#1A4480;color:#FFF;padding:7px 8px;text-align:left;font-weight:700;text-transform:uppercase;font-size:0.6rem;letter-spacing:0.5px;border-bottom:2px solid #0F2847}table tbody td{padding:5px 8px;border-bottom:1px solid #E2E8F0;color:#334155}tbody tr:nth-child(even){background:#F8FAFC}.prov-print-total{font-size:0.75rem;color:#1A4480;font-weight:600;margin-top:12px}.prov-print-fecha{font-size:0.65rem;color:#64748B;text-align:right;margin-bottom:4px}.prov-print-footer{text-align:center;font-size:0.65rem;color:#94A3B8;margin-top:20px;border-top:1px solid #E2E8F0;padding-top:8px}@page{margin:12mm}' +
        '<' + 'script' + '>window.onload=function(){setTimeout(function(){window.print()},800)};<' + '/' + 'script' + '>' +
        '</style></head><body>' + html + '<div class="prov-print-footer">NexusERP</div></body></html>';
    var oldIframe = document.getElementById('gc-print-frame');
    if (oldIframe) document.body.removeChild(oldIframe);
    var iframe = document.createElement('iframe');
    iframe.id = 'gc-print-frame';
    iframe.style.cssText = 'position:absolute;width:1px;height:1px;opacity:0.01;top:-9999px;left:-9999px';
    iframe.srcdoc = fullHtml;
    document.body.appendChild(iframe);
    iframe.onload = function() {
        setTimeout(function() {
            try { iframe.contentWindow.print(); } catch(e) {}
        }, 1500);
    };
};

var _gcCargarTabla = GuiasCompras.cargarTabla;
GuiasCompras.cargarTabla = function() {
    var self = this;
    return _gcCargarTabla.call(this).then(function() {
        var wrap = document.getElementById(self.elementId + 'TablaWrap');
        if (!wrap || !self.currentData) return;
        var rows = wrap.querySelectorAll('table tbody tr');
        rows.forEach(function(tr, idx) {
            var rowData = self.currentData[idx];
            if (!rowData) return;
            var badges = { P: 'prov-badge-pendiente', A: 'prov-badge-activo', N: 'prov-badge-anulado' };
            var tds = tr.querySelectorAll('td');
            var colIdx = self.columns.findIndex(function(c) { return c.field === 'estado'; });
            if (colIdx >= 0 && tds[colIdx] && badges[rowData.estado]) {
                tds[colIdx].innerHTML = '<span class="prov-badge ' + badges[rowData.estado] + '">' + tds[colIdx].textContent.trim() + '</span>';
            }
            var acc = tr.querySelector('.prov-acciones');
            if (!acc) return;
            var est = rowData.estado;
            var idGuia = rowData.id_guia;
            if (est === 'P') {
                acc.insertAdjacentHTML('beforeend', '<button class="prov-btn-accion gc-btn-estado" title="Aprobar" data-id="' + idGuia + '" data-estado="A"><i class="fas fa-check" style="color:#10b981"></i></button>');
                acc.insertAdjacentHTML('beforeend', '<button class="prov-btn-accion gc-btn-estado" title="Anular" data-id="' + idGuia + '" data-estado="N"><i class="fas fa-ban" style="color:#ef4444"></i></button>');
            }
        });
        wrap.querySelectorAll('.gc-btn-estado').forEach(function(btn) {
            btn.addEventListener('click', function(e) {
                e.stopPropagation();
                self.cambiarEstado(this.dataset.id, this.dataset.estado);
            });
        });
        var ocColIdx = self.columns.findIndex(function(c) { return c.field === 'num_ocs'; });
        if (ocColIdx >= 0) {
            var ctxMenu = document.getElementById('gcCtxMenu');
            if (!ctxMenu) {
                ctxMenu = document.createElement('div');
                ctxMenu.id = 'gcCtxMenu';
                ctxMenu.style.cssText = 'position:fixed;z-index:99999;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px rgba(0,0,0,0.12);padding:4px 0;display:none;min-width:180px';
                document.body.appendChild(ctxMenu);
                document.addEventListener('click', function(e) { if (!ctxMenu.contains(e.target)) ctxMenu.style.display = 'none'; });
                document.addEventListener('contextmenu', function(e) { if (!ctxMenu.contains(e.target)) ctxMenu.style.display = 'none'; });
            }
            rows.forEach(function(tr) {
                var td = tr.querySelectorAll('td')[ocColIdx];
                if (!td) return;
                td.style.cursor = 'context-menu';
                td.addEventListener('contextmenu', function(e) {
                    e.preventDefault();
                    e.stopPropagation();
                    var ocs = (this.textContent || '').trim();
                    if (!ocs || ocs === '-') return;
                    var list = ocs.split(',').map(function(s) { return s.trim(); }).filter(Boolean);
                    var html = '';
                    list.forEach(function(oc) {
                        html += '<div class="gc-ctx-item" data-oc="' + oc + '" data-action="ver" style="padding:8px 14px;cursor:pointer;font-size:0.78rem;color:#1e293b;display:flex;align-items:center;gap:8px"><i class="fas fa-eye" style="color:#1A4480;width:16px;text-align:center"></i> Ver OC ' + oc + '</div>';
                        html += '<div class="gc-ctx-item" data-oc="' + oc + '" data-action="imprimir" style="padding:8px 14px;cursor:pointer;font-size:0.78rem;color:#1e293b;display:flex;align-items:center;gap:8px"><i class="fas fa-print" style="color:#64748b;width:16px;text-align:center"></i> Imprimir OC ' + oc + '</div>';
                        html += '<div class="gc-ctx-divider" style="height:1px;background:#e2e8f0;margin:2px 0"></div>';
                    });
                    ctxMenu.innerHTML = html;
                    ctxMenu.style.left = e.clientX + 'px';
                    ctxMenu.style.top = e.clientY + 'px';
                    ctxMenu.style.display = 'block';
                    requestAnimationFrame(function() {
                        var r = ctxMenu.getBoundingClientRect();
                        if (r.right > window.innerWidth) ctxMenu.style.left = Math.max(0, e.clientX - r.width) + 'px';
                        if (r.bottom > window.innerHeight) ctxMenu.style.top = Math.max(0, e.clientY - r.height) + 'px';
                    });
                    ctxMenu.querySelectorAll('.gc-ctx-item').forEach(function(item) {
                        item.addEventListener('click', function(ev) {
                            ev.stopPropagation();
                            ctxMenu.style.display = 'none';
                            var oc = this.dataset.oc;
                            var action = this.dataset.action;
                            var parts = oc.split('-');
                            var ejercicio = parts.length > 1 ? parseInt(parts[0]) : new Date().getFullYear();
                            var numOc = parts.length > 1 ? parts[1] : oc;
                            if (action === 'ver') GuiasCompras._verOC(numOc, ejercicio);
                            else if (action === 'imprimir') GuiasCompras._imprimirOC(numOc, ejercicio);
                        });
                        item.addEventListener('mouseenter', function() { this.style.background = '#f1f5f9'; });
                        item.addEventListener('mouseleave', function() { this.style.background = ''; });
                    });
                    var lastDiv = ctxMenu.querySelector('.gc-ctx-divider:last-child');
                    if (lastDiv) lastDiv.remove();
                });
            });
        }
    });
};

var _gcMostrarVista = GuiasCompras.mostrarVista;
GuiasCompras.mostrarVista = function() {
    var self = this;

    var _origCargar = this.cargarTabla;
    var skipFirst = true;
    this.cargarTabla = function() {
        if (skipFirst) { skipFirst = false; return Promise.resolve(); }
        return _origCargar.apply(this, arguments);
    };
    _gcMostrarVista.call(this);
    this.cargarTabla = _origCargar;

    var h2 = document.querySelector('#' + this.elementId + ' .prov-header-titulo h2');
    if (h2) h2.style.display = 'none';
    var pTitle = document.querySelector('#' + this.elementId + ' .prov-header-titulo p');
    if (pTitle && this.sesion && this.sesion.empresa_razon) pTitle.textContent = this.sesion.empresa_razon;

    var wrap = document.getElementById(this.elementId + 'TablaWrap');
    if (!wrap) return;

    var oldBar = document.getElementById('gcFechaBar');
    if (oldBar) oldBar.remove();

    var hoy = new Date();
    var fmtHoy = hoy.toLocaleDateString('en-CA');
    var fmtMes = new Date(hoy.getFullYear(), hoy.getMonth(), 1).toLocaleDateString('en-CA');

    var bar = document.createElement('div');
    bar.id = 'gcFechaBar';
    bar.style.cssText = 'display:flex;align-items:center;gap:10px;padding:10px 20px;background:#f8fafc;border-bottom:1px solid #e2e8f0;font-size:0.82rem';
    bar.innerHTML =
        '<i class="fas fa-calendar-alt" style="color:#1A4480;font-size:0.9rem"></i>' +
        '<span style="color:#475569;font-weight:600">Desde:</span>' +
        '<input type="date" id="gcFechaDesde" class="prov-input" value="' + fmtMes + '" style="width:150px;padding:5px 8px;font-size:0.8rem">' +
        '<span style="color:#475569;font-weight:600">Hasta:</span>' +
        '<input type="date" id="gcFechaHasta" class="prov-input" value="' + fmtHoy + '" style="width:150px;padding:5px 8px;font-size:0.8rem">' +
        '<button class="btn-prov btn-prov-primario" id="gcBtnLimpiarFecha" style="padding:5px 14px;font-size:0.78rem">Limpiar</button>';

    wrap.parentNode.insertBefore(bar, wrap);

    function recargar() { self.paginaActual = 1; self.cargarTabla(); }
    document.getElementById('gcFechaDesde').addEventListener('change', recargar);
    document.getElementById('gcFechaHasta').addEventListener('change', recargar);
    document.getElementById('gcBtnLimpiarFecha').addEventListener('click', function() {
        document.getElementById('gcFechaDesde').value = fmtMes;
        document.getElementById('gcFechaHasta').value = fmtHoy;
        recargar();
    });

    self.cargarTabla();
};

GuiasCompras.obtenerParamsExtra = function() {
    var desde = document.getElementById('gcFechaDesde');
    var hasta = document.getElementById('gcFechaHasta');
    var s = '&tpo_gui=I';
    if (desde && desde.value) s += '&fecha_desde=' + encodeURIComponent(desde.value);
    if (hasta && hasta.value) s += '&fecha_hasta=' + encodeURIComponent(hasta.value);
    if (this.sesion && this.sesion.id_sucursal) s += '&id_sucursal=' + this.sesion.id_sucursal;
    return s;
};

GuiasCompras._verOC = async function(numOc, ejercicio) {
    try {
        var empId = GuiasCompras.sesion ? GuiasCompras.sesion.id_empresa : '';
        var res = await fetch(GuiasCompras.API_URL + '/ordenes-compra/' + numOc + '?id_empresa=' + empId + '&ejercicio=' + ejercicio);
        var data = await res.json();
        if (!data.ok) { Mensaje.error({ titulo: 'Error', texto: data.mensaje || 'OC no encontrada' }); return; }
        var row = data.data;
        var estados = { P: 'Pendiente', A: 'Aprobado', C: 'Cerrado', N: 'Anulado' };
        var fmtF = function(iso) { if (!iso) return '-'; var d = new Date(iso); return isNaN(d.getTime()) ? '-' : d.toLocaleDateString('es-PE'); };

        var guiasMap = {};
        if (row.guias_atencion) {
            row.guias_atencion.forEach(function(g) {
                if (!guiasMap[g.id_articulo]) guiasMap[g.id_articulo] = [];
                guiasMap[g.id_articulo].push(g);
            });
        }

        var html = '<div class="ped-detalle-view">';
        html += '<div class="ped-section"><div class="ped-section-title"><i class="fas fa-file-invoice"></i> Orden de Compra<button class="ped-detalle-print-btn" id="gcOcViewPrintBtn" title="Imprimir"><i class="fas fa-print"></i></button></div>';
        html += '<div class="ped-detalle-grid oc-detalle-grid">';
        html += '<div class="ped-detalle-row"><span class="ped-detalle-label">N° OC:</span><span class="ped-detalle-valor">' + ((row.ejercicio || '') ? row.ejercicio + '-' + row.num_oc : (row.num_oc || '-')) + '</span></div>';
        html += '<div class="ped-detalle-row"><span class="ped-detalle-label">Fecha:</span><span class="ped-detalle-valor">' + fmtF(row.fecha_oc) + '</span></div>';
        html += '<div class="ped-detalle-row"><span class="ped-detalle-label">Proveedor:</span><span class="ped-detalle-valor">' + (row.proveedor_razon_social || '-') + '</span></div>';
        html += '<div class="ped-detalle-row"><span class="ped-detalle-label">Tipo:</span><span class="ped-detalle-valor">' + (row.tipo === 'M' ? 'Materiales' : 'Gastos') + '</span></div>';
        html += '<div class="ped-detalle-row"><span class="ped-detalle-label">Moneda:</span><span class="ped-detalle-valor">' + (row.moneda === 'ME' ? 'Dolares' : 'Soles') + '</span></div>';
        html += '<div class="ped-detalle-row"><span class="ped-detalle-label">Estado:</span><span class="ped-detalle-valor">' + (estados[row.estado] || row.estado) + '</span></div>';
        html += '</div></div>';
        html += '<div class="ped-section"><div class="ped-section-title"><i class="fas fa-list"></i> Detalle</div>';
        html += '<table class="ped-detalle-table"><thead><tr><th>Codigo</th><th>Articulo</th><th>Und</th><th style="text-align:right">Cant.</th><th style="text-align:right">Atendido</th><th style="text-align:right">Pendiente</th><th style="text-align:right">Precio</th><th style="text-align:right">Total</th></tr></thead><tbody>';
        if (row.detalle && row.detalle.length > 0) {
            row.detalle.forEach(function(d) {
                var cant = parseFloat(d.cantidad) || 0;
                var atendido = parseFloat(d.cantidad_atendida) || 0;
                var pendiente = cant - atendido;
                var giaLines = guiasMap[d.id_articulo] || [];
                var giaText = giaLines.map(function(g) { return g.cod_guia + ': ' + (parseFloat(g.cantidad_guia) || 0).toFixed(2); }).join(', ');
                html += '<tr>';
                html += '<td>' + (d.cod_articulo || '') + '</td>';
                html += '<td>' + (d.nombre || '') + '</td>';
                html += '<td>' + (d.cod_unidad || '') + '</td>';
                html += '<td style="text-align:right">' + cant.toFixed(3) + '</td>';
                html += '<td style="text-align:right;color:#059669;font-weight:600">' + atendido.toFixed(3) + '</td>';
                html += '<td style="text-align:right;color:' + (pendiente > 0 ? '#dc2626' : '#059669') + '">' + pendiente.toFixed(3) + '</td>';
                html += '<td style="text-align:right">' + (parseFloat(d.precio) || 0).toFixed(3) + '</td>';
                html += '<td style="text-align:right">' + (parseFloat(d.total) || 0).toFixed(2) + '</td>';
                html += '</tr>';
                if (giaText) {
                    html += '<tr style="background:#f0fdf4"><td colspan="8" style="font-size:0.75rem;color:#059669;padding:2px 10px"><i class="fas fa-truck-loading" style="margin-right:4px"></i>Atendido por: ' + giaText + '</td></tr>';
                }
            });
        } else {
            html += '<tr><td colspan="8" style="text-align:center;color:#94a3b8">Sin detalle</td></tr>';
        }
        html += '</tbody></table></div>';
        html += '</div>';
        Modal.abrir({ titulo: 'Detalle OC ' + ((row.ejercicio || '') ? row.ejercicio + '-' + row.num_oc : row.num_oc), ancho: '850px', contenido: html, botones: [{ texto: 'Cerrar', tipo: 'secundario', accion: function() { Modal.cerrar(); } }], onAbierto: function() { var btn = document.getElementById('gcOcViewPrintBtn'); if (btn) btn.onclick = function() { GuiasCompras._imprimirOC(numOc, ejercicio); }; } });
    } catch (error) {
        Mensaje.error({ titulo: 'Error', texto: 'Error al cargar detalle de OC' });
    }
};

GuiasCompras._imprimirOC = function(numOc, ejercicio) {
    var empId = GuiasCompras.sesion ? GuiasCompras.sesion.id_empresa : '';
    fetch(GuiasCompras.API_URL + '/ordenes-compra/' + numOc + '?id_empresa=' + empId + '&ejercicio=' + ejercicio)
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (!res.ok || !res.data) { Mensaje.error({ titulo: 'Error', texto: 'OC no encontrada' }); return; }
            var row = res.data;
            var empresa = GuiasCompras.sesion ? GuiasCompras.sesion.empresa_razon || '' : '';
            var estados = { P: 'Pendiente', A: 'Aprobado', C: 'Cerrado', N: 'Anulado' };
            var ph = GuiasCompras._fechaHoraStr();

            var guiasMap = {};
            if (row.guias_atencion) {
                row.guias_atencion.forEach(function(g) {
                    if (!guiasMap[g.id_articulo]) guiasMap[g.id_articulo] = [];
                    guiasMap[g.id_articulo].push(g);
                });
            }

            var filas = '';
            if (row.detalle) {
                row.detalle.forEach(function(d) {
                    var cant = parseFloat(d.cantidad) || 0;
                    var atendido = parseFloat(d.cantidad_atendida) || 0;
                    var pendiente = cant - atendido;
                    var giaLines = guiasMap[d.id_articulo] || [];
                    var giaText = giaLines.map(function(g) { return g.cod_guia + ': ' + (parseFloat(g.cantidad_guia) || 0).toFixed(2); }).join(', ');
                    filas += '<tr><td>' + (d.cod_articulo || '') + '</td><td>' + (d.nombre || '') + '</td><td>' + (d.cod_unidad || '') + '</td><td style="text-align:right">' + cant.toFixed(3) + '</td><td style="text-align:right">' + atendido.toFixed(3) + '</td><td style="text-align:right">' + pendiente.toFixed(3) + '</td><td style="text-align:right">' + (parseFloat(d.precio) || 0).toFixed(3) + '</td><td style="text-align:right">' + (parseFloat(d.total) || 0).toFixed(2) + '</td></tr>';
                    if (giaText) {
                        filas += '<tr style="background:#f0fdf4"><td colspan="8" style="font-size:0.65rem;color:#059669;padding:2px 8px">Atendido por: ' + giaText + '</td></tr>';
                    }
                });
            }
            var numOcDisp = (row.ejercicio || '') ? row.ejercicio + '-' + row.num_oc : (row.num_oc || '');
            var tituloHtml = '<div class="prov-print-header"><div><div class="prov-print-titulo">Orden de Compra</div>' + (empresa ? '<div style="font-size:0.8rem;color:#1A4480;font-weight:600;margin-top:4px">' + empresa + '</div>' : '') + '</div><div class="prov-print-fecha">' + ph + '</div></div>';
            var infoHtml = '<div style="margin:12px 0;font-size:0.72rem;display:grid;grid-template-columns:auto 1fr;gap:2px 12px"><strong style="color:#475569;white-space:nowrap">N°:</strong><span>' + numOcDisp + '</span><strong style="color:#475569;white-space:nowrap">Proveedor:</strong><span>' + (row.proveedor_razon_social || '') + '</span><strong style="color:#475569;white-space:nowrap">Fecha:</strong><span>' + (row.fecha_oc ? new Date(row.fecha_oc).toLocaleDateString('es-PE') : '') + '</span><strong style="color:#475569;white-space:nowrap">Tipo:</strong><span>' + (row.tipo === 'M' ? 'Materiales' : 'Gastos') + '</span><strong style="color:#475569;white-space:nowrap">Moneda:</strong><span>' + (row.moneda === 'ME' ? 'Dolares' : 'Soles') + '</span><strong style="color:#475569;white-space:nowrap">Estado:</strong><span>' + (estados[row.estado] || row.estado) + '</span></div>';
            var tablaHtml = '<div style="border-radius:8px;overflow:hidden"><table><thead><tr style="clip-path:inset(0 round 6px 6px 0 0)"><th>Codigo</th><th>Articulo</th><th>Und</th><th style="text-align:right">Cant.</th><th style="text-align:right">Atendido</th><th style="text-align:right">Pendiente</th><th style="text-align:right">Precio</th><th style="text-align:right">Total</th></tr></thead><tbody>' + filas + '</tbody></table></div>';
            var totalsHtml = '<div style="display:flex;justify-content:flex-end;gap:16px;padding:8px 0;margin-top:6px">' +
                '<div style="text-align:center"><div style="font-size:0.6rem;color:#64748B;margin-bottom:2px;font-weight:500">Subtotal</div><div style="border:1px solid #CBD5E1;border-radius:6px;padding:5px 12px;background:#F8FAFC;font-size:0.75rem;font-weight:600;color:#334155;min-width:110px;text-align:right">' + (parseFloat(row.subtotal) || 0).toLocaleString('es-PE', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + '</div></div>' +
                '<div style="text-align:center"><div style="font-size:0.6rem;color:#64748B;margin-bottom:2px;font-weight:500">IGV</div><div style="border:1px solid #CBD5E1;border-radius:6px;padding:5px 12px;background:#F8FAFC;font-size:0.75rem;font-weight:600;color:#334155;min-width:90px;text-align:right">' + (parseFloat(row.igv) || 0).toLocaleString('es-PE', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + '</div></div>' +
                '<div style="text-align:center"><div style="font-size:0.6rem;color:#64748B;margin-bottom:2px;font-weight:500">Total</div><div style="border:1px solid #1A4480;border-radius:6px;padding:5px 12px;background:#EEF2FF;font-size:0.75rem;font-weight:700;color:#1A4480;min-width:110px;text-align:right">' + (parseFloat(row.total) || 0).toLocaleString('es-PE', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + '</div></div>' +
                '</div>';
            GuiasCompras._imprimirSrcdoc(tituloHtml + infoHtml + tablaHtml + totalsHtml, 'OC ' + numOcDisp);
        })
        .catch(function() { Mensaje.error({ titulo: 'Error', texto: 'Error al obtener datos para imprimir' }); });
};

GuiasCompras.iniciarAutocompleteArticulo = function() {
    var input = document.getElementById('gcAddArticulo');
    if (!input || input.dataset._autoArtOk) return;
    input.dataset._autoArtOk = '1';
    var hiddenId = document.getElementById('gcAddIdArticulo');
    var hiddenCod = document.getElementById('gcAddCodArticulo');
    var hiddenUni = document.getElementById('gcAddCodUnidad');
    var dd = document.createElement('div');
    dd.style.cssText = 'position:fixed;z-index:9999;background:#fff;border:1px solid #e2e8f0;border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,0.1);max-height:220px;overflow-y:auto;display:none';
    document.body.appendChild(dd);
    var timer;
    function ocultar() { dd.style.display = 'none'; dd.innerHTML = ''; }
    function posicionar() {
        var r = input.getBoundingClientRect();
        dd.style.top = r.bottom + 'px';
        dd.style.left = r.left + 'px';
        dd.style.width = Math.max(r.width, 420) + 'px';
    }
    input.addEventListener('input', function() {
        clearTimeout(timer);
        var v = this.value.trim();
        if (v.length < 1) { ocultar(); return; }
        timer = setTimeout(function() {
            var url = GuiasCompras.API_URL + '/articulos?buscar=' + encodeURIComponent(v) + '&limit=20&estado=1&id_empresa=' + (GuiasCompras.sesion ? GuiasCompras.sesion.id_empresa : '');
            fetch(url).then(function(r) { return r.json(); }).then(function(res) {
                posicionar();
                if (!res.ok || !res.data || res.data.length === 0) {
                    dd.innerHTML = '<div style="padding:10px;color:#94a3b8;font-size:13px;text-align:center">Sin resultados</div>';
                    dd.style.display = 'block'; return;
                }
                var h = '';
                res.data.forEach(function(item) {
                    h += '<div class="prov-ubigeo-dd-item prov-autocomplete-item" style="cursor:pointer" data-id="' + item.id_articulo + '" data-cod="' + item.cod_articulo + '" data-unidad="' + (item.cod_unidad || '') + '" data-nombre="' + (item.nombre || '').replace(/"/g, '&quot;') + '">' + item.cod_articulo + ' - ' + item.nombre + '</div>';
                });
                dd.innerHTML = h;
                dd.style.display = 'block';
                dd.querySelectorAll('.prov-autocomplete-item').forEach(function(el) {
                    el.addEventListener('click', function() {
                        input.value = this.dataset.nombre;
                        if (hiddenId) hiddenId.value = this.dataset.id;
                        if (hiddenCod) hiddenCod.value = this.dataset.cod;
                        if (hiddenUni) hiddenUni.value = this.dataset.unidad;
                        setTimeout(function() { document.getElementById('gcAddCantidad').focus(); }, 100);
                        ocultar();
                    });
                });
            });
        }, 300);
    });
    document.addEventListener('click', function(e) {
        if (!e.target.closest('#gcAddArticulo') && !dd.contains(e.target)) ocultar();
    });
    input.addEventListener('blur', function() {
        setTimeout(ocultar, 200);
    });
};

GuiasCompras.agregarItemDesdeForm = function() {
    var idArt = document.getElementById('gcAddIdArticulo');
    var codArt = document.getElementById('gcAddCodArticulo');
    var nombre = document.getElementById('gcAddArticulo');
    var cantidad = document.getElementById('gcAddCantidad');
    var costo = document.getElementById('gcAddCosto');
    var peso = document.getElementById('gcAddPeso');
    var unidades = document.getElementById('gcAddUnidades');
    var unidad = document.getElementById('gcAddCodUnidad');

    if (!idArt || !idArt.value) { Mensaje.error({ titulo: 'Validación', texto: 'Seleccione un artículo' }); return; }
    var cant = parseFloat(cantidad ? cantidad.value : 0) || 0;
    if (cant <= 0) { Mensaje.error({ titulo: 'Validación', texto: 'Ingrese cantidad mayor a 0' }); return; }

    var costoVal = parseFloat(costo ? costo.value : 0) || 0;
    GuiasCompras.detalleItems.push({
        id_articulo: parseInt(idArt.value),
        cod_articulo: codArt ? codArt.value : '',
        nombre: nombre ? nombre.value : '',
        cod_unidad: unidad ? unidad.value : '',
        cantidad: cant,
        costo_unitario: costoVal,
        peso: parseFloat(peso ? peso.value : 0) || 0,
        unidades: Math.ceil(cant),
        total: cant * costoVal
    });

    GuiasCompras.renderDetalle();
    GuiasCompras.calcularTotales();

    if (nombre) nombre.value = '';
    if (idArt) idArt.value = '';
    if (codArt) codArt.value = '';
    if (unidad) unidad.value = '';
    if (cantidad) cantidad.value = '';
    if (costo) costo.value = '';
    if (peso) peso.value = '';
    if (unidades) unidades.value = '';
    if (nombre) nombre.focus();
};

GuiasCompras.cargarMotivos = function(valorSeleccionado) {
    var sel = document.getElementById('gcFormMotivo');
    if (!sel) return;
    if (sel.dataset._cargado) {
        if (arguments.length && valorSeleccionado !== undefined) sel.value = valorSeleccionado;
        return;
    }
    fetch(GuiasCompras.API_URL + '/motivos-guia?limit=100&estado=1&id_empresa=' + (GuiasCompras.sesion ? GuiasCompras.sesion.id_empresa : ''))
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (res.ok && res.data) {
                sel.innerHTML = '<option value="">Seleccione...</option>';
                res.data.forEach(function(item) { sel.innerHTML += '<option value="' + item.id_motivo + '">' + item.nombre + '</option>'; });
                sel.dataset._cargado = '1';
                if (valorSeleccionado !== undefined) sel.value = valorSeleccionado;
            }
        });
};

GuiasCompras.cargarDesdeOC = function() {
    var val = document.getElementById('gcFormOC').value;
    if (!val) return;
    var parts = val.split('|');
    var ejercicio = parseInt(parts[0]);
    var numOc = parts[1];
    var empId = GuiasCompras.sesion ? GuiasCompras.sesion.id_empresa : '';
    fetch(GuiasCompras.API_URL + '/ordenes-compra/' + numOc + '?id_empresa=' + empId + '&ejercicio=' + ejercicio)
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (!res.ok || !res.data) { Mensaje.error({ titulo: 'Error', texto: 'Error al cargar OC' }); return; }
            var oc = res.data;
            if (oc.detalle) {
                oc.detalle.forEach(function(d) {
                    var saldo = parseFloat(d.cantidad) - parseFloat(d.cantidad_atendida || 0);
                    if (saldo > 0) {
                        var existente = GuiasCompras.detalleItems.find(function(item) {
                            return item.id_articulo == d.id_articulo && item.num_oc == numOc && item.ejercicio == ejercicio;
                        });
                        if (!existente) {
                            GuiasCompras.detalleItems.push({
                                id_articulo: d.id_articulo,
                                cod_articulo: d.cod_articulo || '',
                                nombre: d.nombre || '',
                                cod_unidad: d.cod_unidad || '',
                                cantidad: saldo,
                                costo_unitario: parseFloat(d.precio) || 0,
                                peso: 0,
                                unidades: 0,
                                total: saldo * (parseFloat(d.precio) || 0),
                                num_oc: numOc,
                                ejercicio: ejercicio
                            });
                        }
                    }
                });
            }
            document.getElementById('gcFormProveedor').value = oc.proveedor_razon_social || '';
            document.getElementById('gcFormIdProveedor').value = oc.id_proveedor || '';
            document.getElementById('gcFormOC').value = '';
            GuiasCompras.renderDetalle();
            GuiasCompras.calcularTotales();
        })
        .catch(function() { Mensaje.error({ titulo: 'Error', texto: 'Error al consultar OC' }); });
};

GuiasCompras.renderFormulario = function(data) {
    GuiasCompras.detalleItems = [];
    var html = '';
    html += '<div class="gc-section"><div class="gc-section-title"><i class="fas fa-file-invoice"></i> Cabecera</div>';
    html += '<div class="gc-grid-4">';
    html += '<div class="prov-field"><label>N° Guía</label><input type="text" id="gcFormNum" class="prov-input" readonly style="background:#f3f4f6;color:#6b7280"></div>';
    html += '<div class="prov-field"><label>Fecha <span class="req">*</span></label><input type="date" id="gcFormFecha" class="prov-input" required></div>';
    html += '<div class="prov-field"><label>Serie</label><input type="text" id="gcFormSerie" class="prov-input" maxlength="4" placeholder="Ej: G001"></div>';
    html += '<div class="prov-field"><label>Número</label><input type="text" id="gcFormNumero" class="prov-input" maxlength="10" placeholder="Ej: 000001"></div>';
    html += '<div class="prov-field oc-field-full"><label>Proveedor <span class="req">*</span></label><input type="text" id="gcFormProveedor" class="prov-input" autocomplete="off" placeholder="Escriba nombre o RUC..."><input type="hidden" id="gcFormIdProveedor"></div>';
    html += '<div class="prov-field"><label>Motivo Traslado</label><select id="gcFormMotivo" class="prov-input"><option value="">Seleccione...</option></select></div>';
    html += '<div class="prov-field"><label>OC Referencia</label><select id="gcFormOC" class="prov-input"><option value="">Seleccione un proveedor primero</option></select></div>';
    html += '<div class="prov-field gc-field-span-3"><label>Observaciones</label><input type="text" id="gcFormObs" class="prov-input" maxlength="500" placeholder="Opcional"></div>';
    html += '</div></div>';

    html += '<div class="gc-section gc-section-detalle"><div class="gc-section-title"><i class="fas fa-list"></i> Detalle <span id="gcDetCount" class="gc-count">(0 items)</span><button class="ped-detalle-print-btn" id="gcBtnPrintDetalle" title="Imprimir"><i class="fas fa-print"></i></button></div>';
    html += '<div class="gc-detalle-table-wrap">';
    html += '<table class="gc-detalle-table"><thead><tr>' +
        '<th style="width:60px">Código</th><th>Artículo</th><th style="width:40px">Und</th><th style="width:90px">Cantidad</th><th style="width:110px">Costo Unit.</th><th style="width:80px">Peso</th><th style="width:60px">Unid.</th><th style="width:35px"></th>' +
        '</tr></thead><tbody id="gcDetalleBody"></tbody></table>';
    html += '</div>';
    html += '<div class="gc-detalle-toolbar">';
    html += '<div class="prov-field gc-field-art"><label>Artículo</label><input type="text" id="gcAddArticulo" class="prov-input" placeholder="Buscar artículo..." autocomplete="off"><input type="hidden" id="gcAddIdArticulo"><input type="hidden" id="gcAddCodArticulo"><input type="hidden" id="gcAddCodUnidad"></div>';
    html += '<div class="prov-field gc-field-qty"><label>Cantidad</label><input type="number" id="gcAddCantidad" class="prov-input" step="0.001" min="0" placeholder="0.00" style="text-align:right"></div>';
    html += '<div class="prov-field gc-field-costo"><label>Costo Unit.</label><input type="number" id="gcAddCosto" class="prov-input" step="0.0001" min="0" placeholder=".0000" style="text-align:right"></div>';
    html += '<div class="prov-field gc-field-peso"><label>Peso</label><input type="number" id="gcAddPeso" class="prov-input" step="0.001" min="0" placeholder="0.00" style="text-align:right"></div>';
    html += '<button class="btn-prov btn-prov-primario gc-btn-add-item" id="gcBtnAddItem"><i class="fas fa-plus"></i> Agregar</button>';
    html += '</div>';
    html += '</div>';

    return html;
};

GuiasCompras.abrirModal = function(id) {
    var self = this;
    var titulo = id ? 'Editar Guía de Ingreso' : 'Nueva Guía de Ingreso';
    var esNuevo = !id;

    var contenido = '<div class="gc-modal-form" id="' + this.elementId + 'Form">';
    contenido += '<input type="hidden" id="' + this.elementId + 'FormId" value="' + (id || '') + '">';
    contenido += this.renderFormulario(null);
    contenido += '</div>';

    Modal.abrir({
        titulo: titulo,
        ancho: '1100px',
        alto: '95vh',
        contenido: contenido,
        botones: [
            { texto: 'Cancelar', tipo: 'secundario', accion: function() { Modal.cerrar(); } },
            { texto: 'Guardar', tipo: 'primario', accion: function() { self.onGuardar(); } }
        ]
    });

    if (esNuevo) {
        this.onCargarFormulario(null);
    } else {
        this.cargarDatos(id);
    }
};

GuiasCompras.cargarDatos = function(id) {
    var self = this;
    fetch(this.API_URL + this.endpoint + '/' + id + '?id_empresa=' + (this.sesion ? this.sesion.id_empresa : ''))
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (res.ok) {
                self.onCargarFormulario(res.data);
            } else {
                Mensaje.error({ titulo: 'Error', texto: res.mensaje });
            }
        })
        .catch(function() {
            Mensaje.error({ titulo: 'Error', texto: 'Error al cargar datos' });
        });
};

GuiasCompras.onGuardar = function() {
    var self = this;
    if (!self.sesion) self.cargarSesion();
    if (!self.sesion) {
        var _s = localStorage.getItem('erp_session') || sessionStorage.getItem('erp_session');
        if (_s) { try { self.sesion = JSON.parse(_s); } catch(e) {} }
    }
    var id = document.getElementById(GuiasCompras.elementId + 'FormId').value;
    var fecha = document.getElementById('gcFormFecha').value;
    var idProv = document.getElementById('gcFormIdProveedor').value;
    var serie = document.getElementById('gcFormSerie').value;
    var numero = document.getElementById('gcFormNumero').value;
    var motivo = document.getElementById('gcFormMotivo').value;
    var ocVal = document.getElementById('gcFormOC').value;
    var ocParts = ocVal ? ocVal.split('|') : [];
    var numOc = ocParts.length > 1 ? ocParts[1] : ocVal;
    var ocEjercicio = ocParts.length > 1 ? parseInt(ocParts[0]) : null;
    if (!numOc && GuiasCompras.detalleItems.length > 0) {
        var firstOc = GuiasCompras.detalleItems.find(function(it) { return it.num_oc; });
        if (firstOc) { numOc = firstOc.num_oc; ocEjercicio = firstOc.ejercicio; }
    }
    var moneda = 'MN';
    var tipoCambio = null;
    var obs = document.getElementById('gcFormObs').value;

    if (!fecha) { Mensaje.error({ titulo: 'Validación', texto: 'La fecha es requerida' }); return; }
    if (!idProv) { Mensaje.error({ titulo: 'Validación', texto: 'Seleccione un proveedor' }); return; }
    if (!serie) { Mensaje.error({ titulo: 'Validación', texto: 'La serie es requerida' }); return; }
    if (!numero) { Mensaje.error({ titulo: 'Validación', texto: 'El número es requerido' }); return; }
    if (GuiasCompras.detalleItems.length === 0) { Mensaje.error({ titulo: 'Validación', texto: 'Debe agregar al menos un artículo' }); return; }
    if (!GuiasCompras.sesion || !GuiasCompras.sesion.id_empresa) { Mensaje.error({ titulo: 'Validación', texto: 'Empresa requerida. Inicie sesión nuevamente.' }); return; }

    var body = {
        id_empresa: GuiasCompras.sesion ? GuiasCompras.sesion.id_empresa : null,
        id_sucursal: GuiasCompras.sesion ? (GuiasCompras.sesion.id_sucursal || null) : null,
        tpo_gui: 'I',
        fecha_guia: fecha,
        id_proveedor: parseInt(idProv),
        serie: serie || null,
        numero: numero || null,
        id_motivo: motivo ? parseInt(motivo) : null,
        num_oc: numOc || null,
        oc_ejercicio: ocEjercicio,
        moneda: 'MN',
        tipo_cambio: null,
        subtotal: 0,
        igv: 0,
        total: 0,
        observaciones: obs || null,
        estado: 'P',
        usuario_crea: GuiasCompras.sesion ? GuiasCompras.sesion.id_usuario : null,
        detalle: GuiasCompras.detalleItems.map(function(item) {
            return {
                id_articulo: item.id_articulo,
                cantidad: parseFloat(item.cantidad) || 0,
                costo_unitario: parseFloat(item.costo_unitario) || 0,
                total: parseFloat(item.total) || 0,
                peso: parseFloat(item.peso) || 0,
                unidades: parseInt(item.unidades) || 0,
                num_oc: item.num_oc || null,
                ejercicio: item.ejercicio || null
            };
        })
    };

    var metodo = id ? 'PUT' : 'POST';
    var url = GuiasCompras.API_URL + GuiasCompras.endpoint + (id ? '/' + id + '?id_empresa=' + (GuiasCompras.sesion ? GuiasCompras.sesion.id_empresa : '') : '');

    fetch(url, {
        method: metodo,
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(body)
    })
    .then(function(r) { return r.json(); })
    .then(function(res) {
        if (res.ok) {
            if (!id && GuiasCompras._idCorrelativo) {
                fetch(GuiasCompras.API_URL + '/correlativos-documentos/incrementar/' + GuiasCompras._idCorrelativo, { method: 'POST' });
                GuiasCompras._idCorrelativo = null;
            }
            Mensaje.exito({ titulo: 'Guardado', texto: res.mensaje });
            Modal.cerrar();
            GuiasCompras.paginaActual = 1;
            GuiasCompras.cargarTabla();
        } else {
            Mensaje.error({ titulo: 'Error', texto: res.mensaje });
        }
    })
    .catch(function() {
        Mensaje.error({ titulo: 'Error', texto: 'Error al guardar' });
    });
};

GuiasCompras.onCargarFormulario = function(data) {
    if (!data) {
        var hoy = new Date().toLocaleDateString('en-CA');
        document.getElementById('gcFormFecha').value = hoy;
        document.getElementById('gcFormNum').value = 'Auto-generado';
        GuiasCompras.iniciarAutocompleteProveedor();
        GuiasCompras.iniciarAutocompleteArticulo();
        GuiasCompras.cargarMotivos();
        GuiasCompras.porcentajeIgv = 18;

        if (GuiasCompras.sesion) {
            fetch(GuiasCompras.API_URL + '/configuracion/igv/' + GuiasCompras.sesion.id_empresa)
                .then(function(r) { return r.json(); })
                .then(function(res) {
                    if (res.ok) GuiasCompras.porcentajeIgv = parseFloat(res.data.porcentaje) || 18;
                    GuiasCompras.calcularTotales();
                });
            var idTipoDocGuia = 8;
            fetch(GuiasCompras.API_URL + '/correlativos-documentos/asignado/' + GuiasCompras.sesion.id_usuario + '/' + idTipoDocGuia + '?id_empresa=' + GuiasCompras.sesion.id_empresa)
                .then(function(r) { return r.json(); })
                .then(function(res) {
                    if (res.ok && res.data) {
                        document.getElementById('gcFormSerie').value = res.data.serie || '';
                        document.getElementById('gcFormNumero').value = res.data.numero_actual || '';
                        GuiasCompras._idCorrelativo = res.data.id_correlativo;
                    }
                });
        }
        GuiasCompras.calcularTotales();

        document.getElementById('gcBtnAddItem').addEventListener('click', function() { GuiasCompras.agregarItemDesdeForm(); });
        document.getElementById('gcAddCosto').addEventListener('keydown', function(e) {
            if (e.key === 'Enter') { e.preventDefault(); GuiasCompras.agregarItemDesdeForm(); }
        });
        document.getElementById('gcFormOC').addEventListener('change', function() { GuiasCompras.cargarDesdeOC(); });
        var printBtn = document.getElementById('gcBtnPrintDetalle');
        if (printBtn) printBtn.addEventListener('click', function() { GuiasCompras.imprimirDetalle(); });
    } else {
        document.getElementById('gcFormNum').value = data.cod_guia || '';
        document.getElementById('gcFormFecha').value = data.fecha_guia ? data.fecha_guia.substring(0, 10) : '';
        document.getElementById('gcFormSerie').value = data.serie || '';
        document.getElementById('gcFormNumero').value = data.numero || '';
        document.getElementById('gcFormProveedor').value = data.proveedor_razon_social || '';
        document.getElementById('gcFormIdProveedor').value = data.id_proveedor || '';
        document.getElementById('gcFormObs').value = data.observaciones || '';

        GuiasCompras.iniciarAutocompleteProveedor();
        GuiasCompras.iniciarAutocompleteArticulo();
        GuiasCompras.cargarMotivos(data.id_motivo);

        if (data.detalle) {
            GuiasCompras.detalleItems = data.detalle.map(function(d) {
                return {
                    id_articulo: d.id_articulo,
                    cod_articulo: d.cod_articulo || '',
                    nombre: d.nombre || '',
                    cod_unidad: d.cod_unidad || '',
                    cantidad: parseFloat(d.cantidad) || 0,
                    costo_unitario: parseFloat(d.costo_unitario) || 0,
                    peso: parseFloat(d.peso) || 0,
                    unidades: parseInt(d.unidades) || 0,
                    total: parseFloat(d.total) || 0,
                    num_oc: d.num_oc || null,
                    ejercicio: d.ejercicio || null
                };
            });
            GuiasCompras.renderDetalle();
            GuiasCompras.calcularTotales();
        }

        var selOC = document.getElementById('gcFormOC');
        if (selOC && data.num_oc) {
            var ocEj = data.oc_ejercicio || new Date().getFullYear();
            var ocVal = ocEj + '|' + data.num_oc;
            selOC.innerHTML = '<option value="' + ocVal + '">' + ocEj + '-' + data.num_oc + '</option>';
            selOC.value = ocVal;
        }

        document.getElementById('gcBtnAddItem').addEventListener('click', function() { GuiasCompras.agregarItemDesdeForm(); });
        document.getElementById('gcAddCosto').addEventListener('keydown', function(e) {
            if (e.key === 'Enter') { e.preventDefault(); GuiasCompras.agregarItemDesdeForm(); }
        });
        document.getElementById('gcFormOC').addEventListener('change', function() { GuiasCompras.cargarDesdeOC(); });
        var printBtn2 = document.getElementById('gcBtnPrintDetalle');
        if (printBtn2) printBtn2.addEventListener('click', function() { GuiasCompras.imprimirDetalle(); });
    }
};

GuiasCompras.verDetalle = async function(idGuia) {
    var self = this;
    if (!self.sesion) self.cargarSesion();
    try {
        var res = await fetch(self.API_URL + self.endpoint + '/' + idGuia + '?id_empresa=' + (self.sesion ? self.sesion.id_empresa : ''));
        var data = await res.json();
        if (!data.ok) { Mensaje.error({ titulo: 'Error', texto: data.mensaje || 'No se pudo cargar la guía' }); return; }
        var row = data.data;
        var fmtFecha = function(iso) {
            if (!iso) return '-';
            var d = new Date(iso);
            if (isNaN(d.getTime())) return iso;
            return d.toLocaleDateString('es-PE');
        };
        var estados = { P: 'Pendiente', A: 'Aprobado', N: 'Anulado' };
        var detHtml = '<table class="gc-detalle-table"><thead><tr><th>Código</th><th>Artículo</th><th>Und</th><th style="text-align:right">Cantidad</th><th style="text-align:right">Costo Unit.</th></tr></thead><tbody>';
        if (row.detalle) {
            row.detalle.forEach(function(d) {
                detHtml += '<tr><td>' + (d.cod_articulo || '') + '</td><td>' + (d.nombre || '') + '</td><td>' + (d.cod_unidad || '') + '</td><td style="text-align:right">' + (parseFloat(d.cantidad) || 0).toFixed(3) + '</td><td style="text-align:right">' + (parseFloat(d.costo_unitario) || 0).toFixed(4) + '</td></tr>';
            });
        }
        detHtml += '</tbody></table>';

        var html = '<div class="gc-detalle-view">';
        html += '<div class="gc-section"><div class="gc-section-title"><i class="fas fa-file-invoice"></i> Guía de Ingreso<button class="ped-detalle-print-btn" id="gcViewPrintBtn" title="Imprimir"><i class="fas fa-print"></i></button></div>';
        html += '<div class="gc-detalle-grid">';
        html += '<div class="gc-detalle-row"><span class="gc-detalle-label">N° Guía:</span><span class="gc-detalle-valor">' + (row.cod_guia || '') + '</span></div>';
        html += '<div class="gc-detalle-row"><span class="gc-detalle-label">Fecha:</span><span class="gc-detalle-valor">' + fmtFecha(row.fecha_guia) + '</span></div>';
        html += '<div class="gc-detalle-row"><span class="gc-detalle-label">Serie / Número:</span><span class="gc-detalle-valor">' + (row.serie || '-') + ' - ' + (row.numero || '-') + '</span></div>';
        html += '<div class="gc-detalle-row"><span class="gc-detalle-label">Estado:</span><span class="gc-detalle-valor"><span class="prov-badge prov-badge-' + (row.estado === 'A' ? 'activo' : row.estado === 'N' ? 'anulado' : 'pendiente') + '">' + (estados[row.estado] || row.estado) + '</span></span></div>';
        html += '<div class="gc-detalle-row"><span class="gc-detalle-label">Proveedor:</span><span class="gc-detalle-valor">' + (row.proveedor_razon_social || '-') + '</span></div>';
        html += '<div class="gc-detalle-row"><span class="gc-detalle-label">Motivo:</span><span class="gc-detalle-valor">' + (row.motivo_nombre || '-').toUpperCase() + '</span></div>';
        html += '<div class="gc-detalle-row"><span class="gc-detalle-label">OC Relacionada:</span><span class="gc-detalle-valor">' + (row.num_ocs || '-') + '</span></div>';
        if (row.observaciones) {
            html += '<div class="gc-detalle-row"><span class="gc-detalle-label">Observaciones:</span><span class="gc-detalle-valor">' + row.observaciones + '</span></div>';
        }
        html += '</div></div>';
        html += '<div class="gc-section"><div class="gc-section-title"><i class="fas fa-list"></i> Detalle</div>';
        html += '<div class="gc-detalle-table-wrap" style="max-height:300px;overflow-y:auto">' + detHtml + '</div>';
        html += '</div></div>';

        var botones = [];
        if (row.estado === 'P') {
            botones.push({ texto: 'Aprobar', tipo: 'primario', accion: function() { Modal.cerrar(); self.cambiarEstado(idGuia, 'A'); } });
            botones.push({ texto: 'Anular', tipo: 'secundario', accion: function() { Modal.cerrar(); self.cambiarEstado(idGuia, 'N'); } });
        }
        botones.push({ texto: 'Cerrar', tipo: 'secundario', accion: function() { Modal.cerrar(); } });

        Modal.abrir({ titulo: 'Detalle de Guía', ancho: '780px', contenido: html, botones: botones });

        var printBtn = document.getElementById('gcViewPrintBtn');
        if (printBtn) {
            printBtn.onclick = function() { self.imprimirDetalleVer(idGuia); };
        }
    } catch (error) {
        Mensaje.error({ titulo: 'Error', texto: 'Error al cargar detalle' });
    }
};

GuiasCompras.imprimirDetalleVer = async function(idGuia) {
    var self = this;
    if (!self.sesion) self.cargarSesion();
    if (!self.sesion) {
        var _s = localStorage.getItem('erp_session') || sessionStorage.getItem('erp_session');
        if (_s) { try { self.sesion = JSON.parse(_s); } catch(e) {} }
    }
    try {
        var res = await fetch(self.API_URL + self.endpoint + '/' + idGuia + '?id_empresa=' + (self.sesion ? self.sesion.id_empresa : ''));
        var data = await res.json();
        if (!data.ok) return;
        var row = data.data;
        var fmtFecha = function(iso) {
            if (!iso) return '';
            var d = new Date(iso);
            return ('0' + d.getDate()).slice(-2) + '/' + ('0' + (d.getMonth() + 1)).slice(-2) + '/' + d.getFullYear();
        };
        var estados = { P: 'Pendiente', A: 'Aprobado', N: 'Anulado' };
        var detHtml = '<div style="border-radius:8px;overflow:hidden"><table><thead><tr style="clip-path:inset(0 round 6px 6px 0 0)"><th>Código</th><th>Artículo</th><th>Und</th><th style="text-align:right">Cantidad</th><th style="text-align:right">Costo Unit.</th></tr></thead><tbody>';
        if (row.detalle) {
            row.detalle.forEach(function(d) {
                detHtml += '<tr><td>' + (d.cod_articulo || '') + '</td><td>' + (d.nombre || '') + '</td><td>' + (d.cod_unidad || '') + '</td><td style="text-align:right">' + (parseFloat(d.cantidad) || 0).toFixed(3) + '</td><td style="text-align:right">' + (parseFloat(d.costo_unitario) || 0).toFixed(4) + '</td></tr>';
            });
        }
        detHtml += '</tbody></table></div>';
        var empresa = self.sesion?.empresa_razon || '';
        var ph = self._fechaHoraStr();
        var html = '<div style="display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:16px;border-bottom:2px solid #1A4480;padding-bottom:10px">';
        html += '<div><div style="font-size:1.1rem;font-weight:700;color:#1A4480">Guía de Ingreso</div>';
        if (empresa) html += '<div style="font-size:0.8rem;color:#1A4480;font-weight:600;margin-top:4px">' + empresa + '</div>';
        html += '</div><div style="text-align:right;font-size:0.75rem;color:#475569">' + ph + '</div></div>';
        html += '<table style="width:100%;font-size:0.75rem;margin-bottom:12px;border-collapse:collapse">';
        html += '<tr><td style="padding:2px 8px;font-weight:600;color:#475569;white-space:nowrap;width:1%">N° Guía:</td><td style="padding:2px 8px">' + (row.cod_guia || '') + '</td>';
        html += '<td style="padding:2px 8px;font-weight:600;color:#475569;white-space:nowrap;width:1%">Fecha:</td><td style="padding:2px 8px">' + fmtFecha(row.fecha_guia) + '</td></tr>';
        html += '<tr><td style="padding:2px 8px;font-weight:600;color:#475569;white-space:nowrap">Serie/Número:</td><td style="padding:2px 8px">' + (row.serie || '-') + ' - ' + (row.numero || '-') + '</td>';
        html += '<td style="padding:2px 8px;font-weight:600;color:#475569;white-space:nowrap">Estado:</td><td style="padding:2px 8px">' + (estados[row.estado] || row.estado) + '</td></tr>';
        html += '<tr><td style="padding:2px 8px;font-weight:600;color:#475569;white-space:nowrap">Proveedor:</td><td style="padding:2px 8px" colspan="3">' + (row.proveedor_razon_social || '') + '</td></tr>';
        html += '<tr><td style="padding:2px 8px;font-weight:600;color:#475569;white-space:nowrap">Motivo:</td><td style="padding:2px 8px">' + (row.motivo_nombre || '-').toUpperCase() + '</td>';
        html += '</table>';
        html += '</div>';
        html += detHtml;
        self._imprimirSrcdoc(html, 'Guía ' + (row.cod_guia || ''));
    } catch (error) {
        console.error('[GUIAS] Error imprimirDetalleVer:', error);
        Mensaje.error({ titulo: 'Error', texto: 'Error al generar impresión: ' + (error.message || '') });
    }
};

GuiasCompras.imprimirDetalle = function() {
    var self = this;
    var detHtml = '<div style="border-radius:8px;overflow:hidden"><table><thead><tr style="clip-path:inset(0 round 6px 6px 0 0)"><th>Código</th><th>Artículo</th><th>Und</th><th style="text-align:right">Cantidad</th><th style="text-align:right">Costo Unit.</th></tr></thead><tbody>';
    self.detalleItems.forEach(function(d) {
        detHtml += '<tr><td>' + (d.cod_articulo || '') + '</td><td>' + (d.nombre || '') + '</td><td>' + (d.cod_unidad || '') + '</td><td style="text-align:right">' + (parseFloat(d.cantidad) || 0).toFixed(3) + '</td><td style="text-align:right">' + (parseFloat(d.costo_unitario) || 0).toFixed(4) + '</td></tr>';
    });
    detHtml += '</tbody></table></div>';
    var empresa = self.sesion?.empresa_razon || '';
    var ph = self._fechaHoraStr();
    var fecha = document.getElementById('gcFormFecha')?.value || '';
    if (fecha) { var fd = new Date(fecha + 'T12:00:00'); fecha = ('0' + fd.getDate()).slice(-2) + '/' + ('0' + (fd.getMonth() + 1)).slice(-2) + '/' + fd.getFullYear(); }
    var serie = document.getElementById('gcFormSerie')?.value || '';
    var numero = document.getElementById('gcFormNumero')?.value || '';
    var proveedor = document.getElementById('gcFormProveedor')?.value || '';
    var motivo = document.getElementById('gcFormMotivo')?.selectedOptions?.[0]?.text || '';
    var obs = document.getElementById('gcFormObs')?.value || '';
    var ocs = document.getElementById('gcFormOC')?.selectedOptions?.[0]?.text || '';

    var html = '<div style="display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:16px;border-bottom:2px solid #1A4480;padding-bottom:10px">';
    html += '<div><div style="font-size:1.1rem;font-weight:700;color:#1A4480">Guía de Ingreso (Borrador)</div>';
    if (empresa) html += '<div style="font-size:0.8rem;color:#1A4480;font-weight:600;margin-top:4px">' + empresa + '</div>';
    html += '</div><div style="text-align:right;font-size:0.75rem;color:#475569">' + ph + '</div></div>';
    html += '<table style="width:100%;font-size:0.75rem;margin-bottom:12px;border-collapse:collapse">';
    html += '<tr><td style="padding:2px 8px;font-weight:600;color:#475569;white-space:nowrap;width:1%">N° Guía:</td><td style="padding:2px 8px">' + (serie && numero ? serie + '-' + numero : '-') + '</td>';
    html += '<td style="padding:2px 8px;font-weight:600;color:#475569;white-space:nowrap;width:1%">Fecha:</td><td style="padding:2px 8px">' + fecha + '</td></tr>';
    html += '<tr><td style="padding:2px 8px;font-weight:600;color:#475569;white-space:nowrap">Proveedor:</td><td style="padding:2px 8px" colspan="3">' + proveedor + '</td></tr>';
    html += '<tr><td style="padding:2px 8px;font-weight:600;color:#475569;white-space:nowrap">Motivo:</td><td style="padding:2px 8px">' + motivo.toUpperCase() + '</td>';
    if (ocs) html += '<td style="padding:2px 8px;font-weight:600;color:#475569;white-space:nowrap">O/C:</td><td style="padding:2px 8px">' + ocs + '</td></tr>';
    if (obs) html += '<tr><td style="padding:2px 8px;font-weight:600;color:#475569;white-space:nowrap">Observaciones:</td><td style="padding:2px 8px" colspan="3">' + obs + '</td></tr>';
    html += '</table>';
    html += detHtml;
    self._imprimirSrcdoc(html, 'Guía de Ingreso');
};

GuiasCompras.cambiarEstado = function(id, nuevoEstado) {
    var estados = { A: 'aprobar', N: 'anular' };
    var texto = estados[nuevoEstado] || 'cambiar estado';
    Mensaje.confirmacion({
        titulo: (nuevoEstado === 'A' ? 'Aprobar' : 'Anular') + ' Guía',
        texto: '¿Está seguro de ' + texto + ' esta guía?',
        onAceptar: function() {
            fetch(GuiasCompras.API_URL + '/guias-remision/' + id + '/estado', {
                method: 'PATCH',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ estado: nuevoEstado })
            })
            .then(function(r) { return r.json(); })
            .then(function(res) {
                if (res.ok) {
                    Mensaje.exito({ titulo: 'Estado', texto: res.mensaje });
                    GuiasCompras.cargarTabla();
                } else {
                    Mensaje.error({ titulo: 'Error', texto: res.mensaje });
                }
            });
        }
    });
};

GuiasCompras.imprimir = async function() {
    var datos = await this.obtenerTodosDatos();
    if (!datos || datos.length === 0) { Mensaje.error({ titulo: 'Imprimir', texto: 'No hay datos para imprimir' }); return; }
    var filtros = [];
    if (Object.keys(this.filtrosColumna).length > 0) {
        for (var k in this.filtrosColumna) {
            filtros.push(k + ': ' + this.filtrosColumna[k]);
        }
    }
    var buscarVal = document.getElementById(this.elementId + 'Buscar');
    if (buscarVal && buscarVal.value.trim()) filtros.push('Búsqueda: ' + buscarVal.value.trim());

    function fmtFecha(iso) {
        if (!iso) return '';
        var d = new Date(iso);
        if (isNaN(d.getTime())) return iso;
        return ('0' + d.getDate()).slice(-2) + '/' + ('0' + (d.getMonth() + 1)).slice(-2) + '/' + d.getFullYear();
    }

    var ahora = new Date();
    var fechaHora = ahora.toLocaleDateString('es-PE', { day: '2-digit', month: '2-digit', year: 'numeric' }) + ' ' + ahora.toLocaleTimeString('es-PE', { hour: '2-digit', minute: '2-digit' });

    var filasHtml = '';
    datos.forEach(function(row) {
        filasHtml += '<tr>';
        GuiasCompras.columns.forEach(function(col, ci) {
            var val = row[col.field];
            if (col.render) val = col.render(row, val);
            else val = (val !== null && val !== undefined) ? String(val) : '-';
            filasHtml += '<td>' + val + '</td>';
        }, GuiasCompras);
        filasHtml += '</tr>';
    });

    var cabecerasHtml = GuiasCompras.columns.map(function(c) { return '<th>' + c.label + '</th>'; }).join('');
    var tablaHtml = '<div style="border-radius:8px;overflow:hidden"><table><thead><tr style="clip-path:inset(0 round 6px 6px 0 0)">' + cabecerasHtml + '</tr></thead><tbody>' + filasHtml + '</tbody></table></div>';

    var di = await TablaGenerica._obtenerDatosImpresion();
    var ph = this._fechaHoraStr();
    var printHtml = '<div class="prov-print-header"><div>' + di.logoHtml + '<div style="display:inline-block;vertical-align:middle"><div class="prov-print-titulo">Guías de Ingreso (Compras)</div>' + (di.empresa ? '<div style="font-size:0.8rem;color:#1A4480;font-weight:600;margin-top:4px">' + di.empresa + '</div>' : '') + (di.sucursal ? '<div style="font-size:0.7rem;color:#64748B;margin-top:1px">' + di.sucursal + '</div>' : '') + '</div></div><div class="prov-print-fecha">' + ph + '</div></div>';
    if (filtros.length > 0) printHtml += '<div class="prov-print-filtros">Filtros: ' + filtros.join(' | ') + '</div>';
    printHtml += tablaHtml + '<div class="prov-print-total">Total: ' + datos.length + ' registro(s)</div>';
    this._imprimirSrcdoc(printHtml, 'Guías de Ingreso');
};

GuiasCompras.init({
    title: 'Guías de Ingreso',
    icon: 'fa-truck-loading',
    idSingular: 'Guía Ingreso',
    idField: 'id_guia',
    endpoint: '/guias-remision',
    sortDefault: 'fecha_guia',
    limite: 50,
    searchPlaceholder: 'Buscar por N° Guía o proveedor...',
    filtroEstado: false,
    showEstado: false,
    showAcciones: true,
    exportFileName: 'GuiasIngreso',
    elementId: 'pageGuiasRemision',
    menuPage: 'GuiasRemision',
    renderFormulario: GuiasCompras.renderFormulario,
    onCargarFormulario: GuiasCompras.onCargarFormulario,
    onGuardar: GuiasCompras.onGuardar,
    columnFilters: {},
    columns: [
        { field: 'serie', label: 'Serie', sortable: true, filterable: true, width: '6%',
            render: function(row) { return row.serie || '-'; }
        },
        { field: 'numero', label: 'Número', sortable: true, filterable: true, width: '8%',
            render: function(row) { return row.numero || '-'; }
        },
        { field: 'num_ocs', label: 'O.C.', sortable: true, filterable: true, width: '10%',
            render: function(row) { return row.num_ocs || '-'; }
        },
        { field: 'fecha_guia', label: 'Fecha', sortable: true, filterable: false, width: '9%',
            render: function(row) {
                if (!row.fecha_guia) return '';
                var d = new Date(row.fecha_guia);
                if (isNaN(d.getTime())) return row.fecha_guia;
                return ('0' + d.getDate()).slice(-2) + '/' + ('0' + (d.getMonth() + 1)).slice(-2) + '/' + d.getFullYear();
            }
        },
        { field: 'proveedor_razon_social', label: 'Proveedor', sortable: true, filterable: true, width: '30%' },
        { field: 'motivo_nombre', label: 'Motivo', sortable: true, filterable: true, width: '12%',
            render: function(row) { return (row.motivo_nombre || '-').toUpperCase(); }
        },
        { field: 'estado', label: 'Estado', sortable: true, filterable: true, width: '8%',
            render: function(row) {
                var estados = { P: 'Pendiente', A: 'Aprobado', N: 'Anulado' };
                return estados[row.estado] || row.estado;
            }
        }
    ],
    onEliminar: function(idGuia) {
        Mensaje.confirmacion({
            titulo: 'Eliminar Guía',
            texto: '¿Está seguro de eliminar esta guía?',
            onAceptar: function() {
                fetch(GuiasCompras.API_URL + GuiasCompras.endpoint + '/' + idGuia + '?id_empresa=' + (GuiasCompras.sesion ? GuiasCompras.sesion.id_empresa : ''), { method: 'DELETE' })
                    .then(function(r) { return r.json(); })
                    .then(function(res) {
                        if (res.ok) {
                            Mensaje.exito({ titulo: 'Eliminado', texto: res.mensaje });
                            GuiasCompras.paginaActual = 1;
                            GuiasCompras.cargarTabla();
                        } else {
                            Mensaje.error({ titulo: 'Error', texto: res.mensaje });
                        }
                    })
                    .catch(function() { Mensaje.error({ titulo: 'Error', texto: 'Error al eliminar' }); });
            }
        });
    }
});
