var SaldosIniciales = {
    API_URL: '',
    sesion: null,
    _detalleItems: [],
    _editing: false,
    _currentNumSaldo: null,
    _allData: [],

    init: function() {
        this.API_URL = (window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1')
            ? 'http://localhost:3000/api'
            : 'https://api.sabha.pe/api';
        this.cargarSesion();
        this.mostrarVista();
    },

    cargarSesion: function() {
        var s = localStorage.getItem('erp_session') || sessionStorage.getItem('erp_session');
        if (s) { try { this.sesion = JSON.parse(s); } catch(e) {} }
    },

    mostrarVista: function() {
        var self = this;
        var page = document.getElementById('pageSaldosIniciales');
        if (!page) return;
        self.cargarSesion();
        self._detalleItems = [];
        self._editing = false;
        self._currentNumSaldo = null;

        var anhoActual = new Date().getFullYear();

        page.innerHTML = `
            <div class="sdi-container">
                <div class="sdi-header">
                    <h2><i class="fas fa-boxes-stacked" style="color:#1A4480;margin-right:8px"></i>Saldos Iniciales de Inventario</h2>
                    <div style="display:flex;gap:6px;align-items:center">
                        <button id="sdiBtnImprimir" class="btn-prov btn-prov-icono" title="Imprimir"><i class="fas fa-print"></i></button>
                        <div class="prov-export-wrap">
                            <button id="sdiBtnExportar" class="btn-prov btn-prov-icono" title="Exportar"><i class="fas fa-download"></i></button>
                            <div class="prov-export-dd" id="sdiExportDD">
                                <button class="prov-export-dd-item" onclick="SaldosIniciales.exportarExcel()"><i class="fas fa-file-excel"></i> Excel</button>
                                <button class="prov-export-dd-item" onclick="SaldosIniciales.exportarCSV()"><i class="fas fa-file-csv"></i> CSV</button>
                                <button class="prov-export-dd-item" onclick="SaldosIniciales.exportarPDF()"><i class="fas fa-file-pdf"></i> PDF</button>
                                <button class="prov-export-dd-item" onclick="SaldosIniciales.exportarTXT()"><i class="fas fa-file-lines"></i> TXT</button>
                            </div>
                        </div>
                        <button id="btnNuevoSaldo" class="sdi-btn-primary" style="margin-left:6px"><i class="fas fa-plus" style="margin-right:6px"></i>Nuevo</button>
                    </div>
                </div>

                    <div id="sdiLista">
                    <div class="sdi-filtros">
                        <input type="text" id="sdiBuscar" placeholder="Buscar documento..." style="flex:1;padding:7px 12px;font-size:0.82rem;border:1px solid #CBD5E1;border-radius:6px;text-transform:uppercase">
                        <select id="sdiFiltroEstado" style="padding:7px 12px;font-size:0.82rem;border:1px solid #CBD5E1;border-radius:6px;background:#fff">
                            <option value="">Todos</option>
                            <option value="P">Pendiente</option>
                            <option value="A">Aprobado</option>
                            <option value="N">Anulado</option>
                        </select>
                        <button id="sdiBtnBuscar" class="sdi-btn-secondary"><i class="fas fa-search"></i></button>
                    </div>
                    <div id="sdiTablaWrap" class="sdi-tabla-wrap">
                        <table class="sdi-tabla">
                            <thead>
                                <tr>
                                    <th style="width:70px">Ejercicio</th>
                                    <th style="width:120px">N° Documento</th>
                                    <th style="width:100px">Fecha</th>
                                    <th>Observaciones</th>
                                    <th style="width:80px;text-align:right">Líneas</th>
                                    <th style="width:110px;text-align:right">Costo Total</th>
                                    <th style="width:90px;text-align:center">Estado</th>
                                    <th style="width:120px;text-align:center">Acciones</th>
                                </tr>
                            </thead>
                            <tbody id="sdiTablaBody">
                                <tr><td colspan="8" style="text-align:center;padding:24px;color:#94a3b8"><i class="fas fa-spinner fa-spin"></i> Cargando...</td></tr>
                            </tbody>
                        </table>
                    </div>
                    <div id="sdiPaginacion" class="sdi-paginacion"></div>
                </div>

                <div id="sdiFormulario" style="display:none">
                    <div class="sdi-form-header">
                        <h3 id="sdiFormTitulo"><i class="fas fa-boxes-stacked" style="color:#1A4480;margin-right:8px"></i>Nuevo Saldo Inicial</h3>
                        <div style="display:flex;gap:6px;align-items:center">
                            <button id="sdiBtnImprimirDetalle" class="btn-prov btn-prov-icono" title="Imprimir documento"><i class="fas fa-print"></i></button>
                            <div class="prov-export-wrap">
                                <button id="sdiBtnExportarDetalle" class="btn-prov btn-prov-icono" title="Exportar"><i class="fas fa-download"></i></button>
                                <div class="prov-export-dd" id="sdiExportDetDD">
                                    <button class="prov-export-dd-item" onclick="SaldosIniciales.exportarExcelDetalle()"><i class="fas fa-file-excel"></i> Excel</button>
                                    <button class="prov-export-dd-item" onclick="SaldosIniciales.exportarCSVDetalle()"><i class="fas fa-file-csv"></i> CSV</button>
                                    <button class="prov-export-dd-item" onclick="SaldosIniciales.exportarPDFDetalle()"><i class="fas fa-file-pdf"></i> PDF</button>
                                    <button class="prov-export-dd-item" onclick="SaldosIniciales.exportarTXTDetalle()"><i class="fas fa-file-lines"></i> TXT</button>
                                </div>
                            </div>
                            <button id="sdiBtnVolver" class="sdi-btn-secondary" style="margin-left:6px"><i class="fas fa-arrow-left" style="margin-right:4px"></i>Volver</button>
                        </div>
                    </div>

                    <div class="sdi-form-cab">
                        <div class="sdi-form-row">
                            <div class="sdi-form-group">
                                <label>N° Documento</label>
                                <input type="text" id="sdiNumDoc" readonly style="background:#f1f5f9;cursor:not-allowed">
                            </div>
                            <div class="sdi-form-group">
                                <label>Ejercicio</label>
                                <input type="number" id="sdiEjercicio" value="${anhoActual}" min="2000" max="2099">
                            </div>
                            <div class="sdi-form-group">
                                <label>Fecha Apertura <span style="color:#dc2626">*</span></label>
                                <input type="date" id="sdiFecha">
                            </div>
                            <div class="sdi-form-group" style="grid-column:span 2">
                                <label>Observaciones</label>
                                <input type="text" id="sdiObservaciones" placeholder="Notas del documento...">
                            </div>
                        </div>
                    </div>

                    <div class="sdi-form-detalle">
                        <div class="sdi-detalle-header">
                            <h4><i class="fas fa-list" style="margin-right:6px"></i>Detalle de Artículos</h4>
                            <button id="sdiBtnAgregar" class="sdi-btn-primary" style="padding:6px 14px;font-size:0.78rem"><i class="fas fa-plus" style="margin-right:4px"></i>Agregar</button>
                        </div>
                        <div class="sdi-detalle-table-wrap">
                            <table class="sdi-tabla sdi-detalle-tabla">
                                <thead>
                                    <tr>
                                        <th style="width:40px">#</th>
                                        <th style="width:200px">Artículo</th>
                                        <th style="width:140px">Almacén</th>
                                        <th style="width:90px;text-align:right">Cantidad</th>
                                        <th style="width:100px;text-align:right">Costo Unit.</th>
                                        <th style="width:110px;text-align:right">Costo Total</th>
                                        <th style="width:80px">Lote</th>
                                        <th style="width:100px">Vencimiento</th>
                                        <th style="width:50px"></th>
                                    </tr>
                                </thead>
                                <tbody id="sdiDetalleBody">
                                    <tr id="sdiDetalleVacio"><td colspan="9" style="text-align:center;padding:20px;color:#94a3b8">No hay artículos agregados</td></tr>
                                </tbody>
                            </table>
                        </div>
                        <div class="sdi-detalle-totales">
                            <span>Total Líneas: <strong id="sdiTotalLineas">0</strong></span>
                            <span>Costo Total: <strong id="sdiCostoTotal">S/ 0.00</strong></span>
                        </div>
                    </div>

                    <div class="sdi-form-acciones">
                        <button id="sdiBtnGuardarBorrador" class="sdi-btn-primary"><i class="fas fa-save" style="margin-right:4px"></i>Guardar Borrador</button>
                        <button id="sdiBtnAprobar" class="sdi-btn-success" style="display:none"><i class="fas fa-check-circle" style="margin-right:4px"></i>Aprobar</button>
                        <button id="sdiBtnAnular" class="sdi-btn-danger" style="display:none" title="Revierte el stock y costos actualizados por este documento"><i class="fas fa-ban" style="margin-right:4px"></i>Anular (Revertir Stock)</button>
                        <button id="sdiBtnEliminar" class="sdi-btn-danger" style="display:none"><i class="fas fa-trash" style="margin-right:4px"></i>Eliminar</button>
                    </div>
                </div>
            </div>`;

        self.cargarLista();
        self._bindEvents();
    },

    _bindEvents: function() {
        var self = this;
        document.getElementById('btnNuevoSaldo').addEventListener('click', function() { self.abrirFormulario(); });
        document.getElementById('sdiBtnVolver').addEventListener('click', function() { self.mostrarVista(); });
        document.getElementById('sdiBtnImprimirDetalle').addEventListener('click', function() { self.imprimirDetalle(); });
        document.getElementById('sdiBtnExportarDetalle').addEventListener('click', function(e) {
            e.stopPropagation();
            document.getElementById('sdiExportDetDD').classList.toggle('visible');
        });
        document.addEventListener('click', function(e) {
            if (!e.target.closest('.prov-export-wrap')) {
                document.querySelectorAll('.prov-export-dd').forEach(function(dd) { dd.classList.remove('visible'); });
            }
        });
        document.getElementById('sdiBtnBuscar').addEventListener('click', function() { self.cargarLista(1); });
        document.getElementById('sdiBuscar').addEventListener('keydown', function(e) { if (e.key === 'Enter') self.cargarLista(1); });
        document.getElementById('sdiFiltroEstado').addEventListener('change', function() { self.cargarLista(1); });
        document.getElementById('sdiBtnAgregar').addEventListener('click', function() { self.agregarLinea(); });
        document.getElementById('sdiBtnGuardarBorrador').addEventListener('click', function() { self.guardar('P'); });
        document.getElementById('sdiBtnAprobar').addEventListener('click', function() { self.aprobar(); });
        document.getElementById('sdiBtnAnular').addEventListener('click', function() { self.anular(); });
        document.getElementById('sdiBtnEliminar').addEventListener('click', function() { self.eliminar(); });
        document.getElementById('sdiBtnImprimir').addEventListener('click', function() { self.imprimir(); });
        document.getElementById('sdiBtnExportar').addEventListener('click', function(e) {
            e.stopPropagation();
            document.getElementById('sdiExportDD').classList.toggle('visible');
        });
        document.addEventListener('click', function(e) {
            if (!e.target.closest('.prov-export-wrap')) {
                var dd = document.getElementById('sdiExportDD');
                if (dd) dd.classList.remove('visible');
            }
        });
    },

    cargarLista: function(page) {
        var self = this;
        page = page || 1;
        var buscar = document.getElementById('sdiBuscar').value;
        var estado = document.getElementById('sdiFiltroEstado').value;
        var tbody = document.getElementById('sdiTablaBody');

        var url = self.API_URL + '/saldos-iniciales?id_empresa=' + self.sesion.id_empresa + '&page=' + page + '&limit=20';
        if (self.sesion && self.sesion.id_sucursal) url += '&id_sucursal=' + self.sesion.id_sucursal;
        if (buscar) url += '&buscar=' + encodeURIComponent(buscar);
        if (estado) url += '&estado=' + estado;

        fetch(url)
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (!res.ok || !res.data || res.data.length === 0) {
                tbody.innerHTML = '<tr><td colspan="8" style="text-align:center;padding:24px;color:#94a3b8"><i class="fas fa-inbox" style="font-size:1.3rem;display:block;margin-bottom:6px"></i>No hay documentos</td></tr>';
                document.getElementById('sdiPaginacion').innerHTML = '';
                return;
            }
            var html = '';
            res.data.forEach(function(row) {
                var estadoLabel = row.estado === 'P' ? 'Pendiente' : row.estado === 'A' ? 'Aprobado' : 'Anulado';
                var estadoClass = row.estado === 'P' ? 'badge-warning' : row.estado === 'A' ? 'badge-success' : 'badge-danger';
                var fecha = row.fecha_apertura || row.fecha_saldo;
                var fechaStr = self._fmtDate(fecha);
                var costo = parseFloat(row.total_costo) || 0;
                var esPendiente = row.estado === 'P';

                html += '<tr>';
                html += '<td>' + row.ejercicio + '</td>';
                html += '<td style="font-weight:600">' + row.cod_saldo + '</td>';
                html += '<td>' + fechaStr + '</td>';
                html += '<td style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">' + (row.observaciones || '-') + '</td>';
                html += '<td style="text-align:right">' + row.total_lineas + '</td>';
                html += '<td style="text-align:right;font-weight:600">S/ ' + costo.toFixed(2) + '</td>';
                html += '<td style="text-align:center"><span class="badge ' + estadoClass + '">' + estadoLabel + '</span></td>';
                html += '<td style="text-align:center"><div style="display:inline-flex;gap:6px;align-items:center;justify-content:center">';
                html += '<button onclick="SaldosIniciales.verDetalle(\'' + row.cod_saldo + '\')" title="Ver" class="sdi-action-btn" style="color:#1A4480"><i class="fas fa-eye"></i></button>';
                html += '<button onclick="SaldosIniciales.editar(\'' + row.cod_saldo + '\')" title="Editar" class="sdi-action-btn" style="color:#F59E0B;' + (esPendiente ? '' : 'visibility:hidden') + '"><i class="fas fa-edit"></i></button>';
                html += '</div></td>';
                html += '</tr>';
            });
            tbody.innerHTML = html;
            self._allData = res.data;
            self._renderPaginacion(res.totalPaginas, page);
        })
        .catch(function() {
            tbody.innerHTML = '<tr><td colspan="8" style="text-align:center;padding:16px;color:#dc2626">Error al cargar</td></tr>';
        });
    },

    _renderPaginacion: function(totalPaginas, paginaActual) {
        var self = this;
        var container = document.getElementById('sdiPaginacion');
        if (totalPaginas <= 1) { container.innerHTML = ''; return; }
        var html = '';
        if (paginaActual > 1) html += '<button onclick="SaldosIniciales.cargarLista(' + (paginaActual - 1) + ')" class="sdi-page-btn">&laquo;</button>';
        for (var i = 1; i <= totalPaginas; i++) {
            if (i === paginaActual) html += '<button class="sdi-page-btn active">' + i + '</button>';
            else if (Math.abs(i - paginaActual) <= 2 || i === 1 || i === totalPaginas) html += '<button onclick="SaldosIniciales.cargarLista(' + i + ')" class="sdi-page-btn">' + i + '</button>';
            else if (Math.abs(i - paginaActual) === 3) html += '<span style="padding:0 4px;color:#94a3b8">...</span>';
        }
        if (paginaActual < totalPaginas) html += '<button onclick="SaldosIniciales.cargarLista(' + (paginaActual + 1) + ')" class="sdi-page-btn">&raquo;</button>';
        container.innerHTML = html;
    },

    abrirFormulario: function(numSaldo) {
        var self = this;
        self._detalleItems = [];
        self._editing = false;
        self._editable = true;
        self._currentNumSaldo = null;

        document.getElementById('sdiLista').style.display = 'none';
        document.getElementById('sdiFormulario').style.display = 'flex';
        document.getElementById('sdiFormTitulo').innerHTML = '<i class="fas fa-boxes-stacked" style="color:#1A4480;margin-right:8px"></i>Nuevo Saldo Inicial';
        document.getElementById('sdiBtnGuardarBorrador').style.display = '';
        document.getElementById('sdiBtnAprobar').style.display = 'none';
        document.getElementById('sdiBtnAnular').style.display = 'none';
        document.getElementById('sdiBtnEliminar').style.display = 'none';

        document.getElementById('sdiEjercicio').value = new Date().getFullYear();
        document.getElementById('sdiFecha').value = new Date().toISOString().split('T')[0];
        document.getElementById('sdiObservaciones').value = '';

        fetch(self.API_URL + '/saldos-iniciales/correlativo?id_empresa=' + self.sesion.id_empresa + '&ejercicio=' + document.getElementById('sdiEjercicio').value)
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (res.ok) document.getElementById('sdiNumDoc').value = res.data.cod_saldo;
        });

        self._renderDetalle();
    },

    editar: function(numSaldo) {
        var self = this;
        self.cargarSesion();

        fetch(self.API_URL + '/saldos-iniciales/' + encodeURIComponent(numSaldo) + '?id_empresa=' + self.sesion.id_empresa)
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (!res.ok) { Mensaje.error({ titulo: 'Error', texto: res.mensaje }); return; }

            var cab = res.data;
            self._editing = true;
            self._editable = cab.estado === 'P';
            self._currentNumSaldo = numSaldo;
            self._detalleItems = [];

            document.getElementById('sdiLista').style.display = 'none';
            document.getElementById('sdiFormulario').style.display = 'flex';
            document.getElementById('sdiFormTitulo').innerHTML = '<i class="fas fa-boxes-stacked" style="color:#1A4480;margin-right:8px"></i>Editar Saldo Inicial';
            document.getElementById('sdiNumDoc').value = cab.cod_saldo;
            document.getElementById('sdiEjercicio').value = cab.ejercicio;
            var fechaCab = cab.fecha_apertura || cab.fecha_saldo;
            document.getElementById('sdiFecha').value = fechaCab ? fechaCab.split('T')[0] : '';
            document.getElementById('sdiObservaciones').value = cab.observaciones || '';

            if (cab.detalle && cab.detalle.length > 0) {
                cab.detalle.forEach(function(d) {
                    self._detalleItems.push({
                        id_articulo: d.id_articulo,
                        articulo_nombre: d.articulo_nombre || d.cod_articulo,
                        id_almacen: d.id_almacen,
                        almacen_nombre: d.almacen_nombre || (d.id_almacen == 1 ? 'Almacén General' : 'Almacén ' + d.id_almacen),
                        cantidad: parseFloat(d.cantidad),
                        costo_unitario: parseFloat(d.costo_unitario),
                        costo_total: parseFloat(d.costo_total),
                        lote: d.lote || '',
                        fecha_vencimiento: d.fecha_vencimiento ? d.fecha_vencimiento.split('T')[0] : ''
                    });
                });
            }

            var esPendiente = cab.estado === 'P';
            document.getElementById('sdiBtnGuardarBorrador').style.display = esPendiente ? '' : 'none';
            document.getElementById('sdiBtnEliminar').style.display = esPendiente ? '' : 'none';
            document.getElementById('sdiBtnAprobar').style.display = esPendiente ? '' : 'none';
            document.getElementById('sdiBtnAnular').style.display = cab.estado === 'A' ? '' : 'none';
            document.getElementById('sdiBtnAgregar').style.display = esPendiente ? '' : 'none';

            self._renderDetalle();
        })
        .catch(function() { Mensaje.error({ titulo: 'Error', texto: 'Error de conexión' }); });
    },

    verDetalle: function(numSaldo) {
        this.editar(numSaldo);
    },

    agregarLinea: function() {
        var self = this;
        self._detalleItems.push({
            id_articulo: null,
            articulo_nombre: '',
            id_almacen: 1,
            almacen_nombre: 'Almacén General',
            cantidad: 0,
            costo_unitario: 0,
            costo_total: 0,
            lote: '',
            fecha_vencimiento: ''
        });
        self._renderDetalle();
    },

    _renderDetalle: function() {
        var self = this;
        var tbody = document.getElementById('sdiDetalleBody');
        if (!tbody) return;

        if (self._detalleItems.length === 0) {
            tbody.innerHTML = '<tr id="sdiDetalleVacio"><td colspan="9" style="text-align:center;padding:20px;color:#94a3b8">No hay artículos agregados</td></tr>';
            document.getElementById('sdiTotalLineas').textContent = '0';
            document.getElementById('sdiCostoTotal').textContent = 'S/ 0.00';
            return;
        }

        var readonly = self._editable ? '' : ' readonly';
        var disabled = self._editable ? '' : ' disabled';
        var html = '';
        var totalGeneral = 0;
        self._detalleItems.forEach(function(item, idx) {
            var costoTotal = (item.cantidad || 0) * (item.costo_unitario || 0);
            totalGeneral += costoTotal;

            html += '<tr class="sdi-detalle-row">';
            html += '<td style="text-align:center;color:#94a3b8">' + (idx + 1) + '</td>';
            html += '<td><div class="sdi-articulo-wrap" data-idx="' + idx + '">';
            html += '<input type="text" class="sdi-input-articulo" value="' + (item.articulo_nombre || '') + '" placeholder="Buscar artículo..." data-idx="' + idx + '"' + readonly + '>';
            html += '<div class="sdi-autocomplete-dd" id="sdiAcArt_' + idx + '" style="display:none"></div>';
            html += '</div></td>';
            html += '<td><select class="sdi-select-almacen" data-idx="' + idx + '"' + disabled + '>';
            html += '<option value="">Seleccionar...</option>';
            html += '<option value="1"' + (item.id_almacen == 1 ? ' selected' : '') + '>Almacén General</option>';
            html += '</select></td>';
            html += '<td><input type="number" class="sdi-input-cantidad" data-idx="' + idx + '" value="' + (item.cantidad || '') + '" min="0" step="0.01" style="text-align:right"' + readonly + '></td>';
            html += '<td><input type="number" class="sdi-input-costo" data-idx="' + idx + '" value="' + (item.costo_unitario || '') + '" min="0" step="0.01" style="text-align:right"' + readonly + '></td>';
            html += '<td style="text-align:right;font-weight:600;padding-right:12px">' + costoTotal.toFixed(2) + '</td>';
            html += '<td><input type="text" class="sdi-input-lote" data-idx="' + idx + '" value="' + (item.lote || '') + '" style="width:70px"' + readonly + '></td>';
            html += '<td><input type="date" class="sdi-input-vencimiento" data-idx="' + idx + '" value="' + (item.fecha_vencimiento || '') + '"' + readonly + '></td>';
            html += '<td style="text-align:center">' + (self._editable ? '<button onclick="SaldosIniciales.eliminarLinea(' + idx + ')" class="sdi-action-btn" style="color:#dc2626" title="Eliminar"><i class="fas fa-trash"></i></button>' : '') + '</td>';
            html += '</tr>';
        });
        tbody.innerHTML = html;

        document.getElementById('sdiTotalLineas').textContent = self._detalleItems.length;
        document.getElementById('sdiCostoTotal').textContent = 'S/ ' + totalGeneral.toFixed(2);

        self._bindDetalleEvents();
    },

    _bindDetalleEvents: function() {
        var self = this;
        var tbody = document.getElementById('sdiDetalleBody');

        tbody.querySelectorAll('.sdi-select-almacen').forEach(function(sel) {
            sel.addEventListener('change', function() {
                var idx = parseInt(this.getAttribute('data-idx'));
                var val = parseInt(this.value) || null;
                self._detalleItems[idx].id_almacen = val;
                self._detalleItems[idx].almacen_nombre = val === 1 ? 'Almacén General' : '';
            });
        });

        tbody.querySelectorAll('.sdi-input-cantidad').forEach(function(input) {
            input.addEventListener('change', function() {
                var idx = parseInt(this.getAttribute('data-idx'));
                self._detalleItems[idx].cantidad = parseFloat(this.value) || 0;
                self._recalcularTotales();
            });
        });

        tbody.querySelectorAll('.sdi-input-costo').forEach(function(input) {
            input.addEventListener('change', function() {
                var idx = parseInt(this.getAttribute('data-idx'));
                self._detalleItems[idx].costo_unitario = parseFloat(this.value) || 0;
                self._recalcularTotales();
            });
        });

        tbody.querySelectorAll('.sdi-input-lote').forEach(function(input) {
            input.addEventListener('change', function() {
                var idx = parseInt(this.getAttribute('data-idx'));
                self._detalleItems[idx].lote = this.value;
            });
        });

        tbody.querySelectorAll('.sdi-input-vencimiento').forEach(function(input) {
            input.addEventListener('change', function() {
                var idx = parseInt(this.getAttribute('data-idx'));
                self._detalleItems[idx].fecha_vencimiento = this.value;
            });
        });

        tbody.querySelectorAll('.sdi-input-articulo').forEach(function(input) {
            input.addEventListener('input', function() {
                var idx = parseInt(this.getAttribute('data-idx'));
                self._buscarArticulo(idx, this.value);
            });
            input.addEventListener('focus', function() {
                var idx = parseInt(this.getAttribute('data-idx'));
                if (this.value.length >= 2) self._buscarArticulo(idx, this.value);
            });
        });

        document.addEventListener('click', function(e) {
            if (!e.target.closest('.sdi-articulo-wrap') && !e.target.closest('.sdi-autocomplete-dd')) {
                document.querySelectorAll('.sdi-autocomplete-dd').forEach(function(dd) { dd.style.display = 'none'; });
            }
        });
    },

    _buscarArticulo: function(idx, query) {
        var self = this;
        var input = document.querySelector('.sdi-input-articulo[data-idx="' + idx + '"]');
        var dd = document.getElementById('sdiAcArt_' + idx);
        if (!dd || !input) return;
        if (!query || query.length < 1) { dd.style.display = 'none'; return; }

        fetch(self.API_URL + '/articulos?buscar=' + encodeURIComponent(query) + '&limit=15&estado=1&id_empresa=' + self.sesion.id_empresa)
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (!res.ok || !res.data || res.data.length === 0) { dd.innerHTML = '<div style="padding:8px;color:#94a3b8;font-size:0.72rem;text-align:center">Sin resultados</div>'; dd.style.display = 'block'; return; }
            var html = '';
            res.data.forEach(function(art) {
                html += '<div class="sdi-ac-item" data-id="' + art.id_articulo + '" data-nombre="' + (art.nombre || '').replace(/"/g, '&quot;') + '" data-cod="' + (art.cod_articulo || '') + '">' + (art.cod_articulo || '') + ' - ' + (art.nombre || '') + '</div>';
            });
            dd.innerHTML = html;

            var r = input.getBoundingClientRect();
            dd.style.position = 'fixed';
            dd.style.top = (r.bottom + 1) + 'px';
            dd.style.left = r.left + 'px';
            dd.style.width = Math.max(r.width, 300) + 'px';
            dd.style.zIndex = '9999';
            dd.style.display = 'block';

            dd.querySelectorAll('.sdi-ac-item').forEach(function(item) {
                item.addEventListener('click', function() {
                    self._detalleItems[idx].id_articulo = parseInt(this.getAttribute('data-id'));
                    self._detalleItems[idx].articulo_nombre = this.getAttribute('data-nombre');
                    input.value = this.getAttribute('data-nombre');
                    dd.style.display = 'none';
                    var cantRow = document.querySelector('.sdi-input-cantidad[data-idx="' + idx + '"]');
                    if (cantRow) { cantRow.focus(); cantRow.select(); }
                });
            });
        })
        .catch(function() { dd.style.display = 'none'; });
    },

    _recalcularTotales: function() {
        var self = this;
        var tbody = document.getElementById('sdiDetalleBody');
        var totalGeneral = 0;

        self._detalleItems.forEach(function(item, idx) {
            var costoTotal = (item.cantidad || 0) * (item.costo_unitario || 0);
            item.costo_total = costoTotal;
            totalGeneral += costoTotal;
            var celda = tbody.rows[idx] ? tbody.rows[idx].cells[5] : null;
            if (celda) celda.textContent = costoTotal.toFixed(2);
        });

        document.getElementById('sdiCostoTotal').textContent = 'S/ ' + totalGeneral.toFixed(2);
    },

    eliminarLinea: function(idx) {
        var self = this;
        self._detalleItems.splice(idx, 1);
        self._renderDetalle();
    },

    guardar: function(estado) {
        var self = this;
        self.cargarSesion();

        var numSaldo = document.getElementById('sdiNumDoc').value;
        var ejercicio = parseInt(document.getElementById('sdiEjercicio').value);
        var fechaApertura = document.getElementById('sdiFecha').value;
        var observaciones = document.getElementById('sdiObservaciones').value;

        if (!fechaApertura) { Mensaje.error({ titulo: 'Validación', texto: 'Seleccione la fecha de apertura' }); return; }
        if (self._detalleItems.length === 0) { Mensaje.error({ titulo: 'Validación', texto: 'Debe agregar al menos un artículo' }); return; }

        for (var i = 0; i < self._detalleItems.length; i++) {
            var det = self._detalleItems[i];
            if (!det.id_articulo) { Mensaje.error({ titulo: 'Validación', texto: 'Línea ' + (i + 1) + ': Seleccione un artículo' }); return; }
            if (!det.id_almacen) { Mensaje.error({ titulo: 'Validación', texto: 'Línea ' + (i + 1) + ':Seleccione un almacén' }); return; }
            if (!det.cantidad || det.cantidad <= 0) { Mensaje.error({ titulo: 'Validación', texto: 'Línea ' + (i + 1) + ': La cantidad debe ser mayor a 0' }); return; }
            if (!det.costo_unitario || det.costo_unitario <= 0) { Mensaje.error({ titulo: 'Validación', texto: 'Línea ' + (i + 1) + ': El costo unitario debe ser mayor a 0' }); return; }
        }

        var body = {
            id_empresa: self.sesion.id_empresa,
            id_sucursal: self.sesion.id_sucursal || null,
            ejercicio: ejercicio,
            cod_saldo: numSaldo,
            fecha_apertura: fechaApertura,
            observaciones: observaciones,
            usuario_creacion: self.sesion.usuario || 'SISTEMA',
            detalle: self._detalleItems.map(function(d) {
                return {
                    id_articulo: d.id_articulo,
                    id_almacen: d.id_almacen,
                    cantidad: d.cantidad,
                    costo_unitario: d.costo_unitario,
                    lote: d.lote,
                    fecha_vencimiento: d.fecha_vencimiento
                };
            })
        };

        var url = self.API_URL + '/saldos-iniciales';
        var method = 'POST';
        if (self._editing) {
            url = self.API_URL + '/saldos-iniciales/' + encodeURIComponent(self._currentNumSaldo) + '?id_empresa=' + self.sesion.id_empresa;
            method = 'PUT';
        }

        fetch(url, {
            method: method,
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(body)
        })
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (res.ok) {
                Mensaje.exito({ titulo: 'Guardado', texto: res.mensaje });
                self.mostrarVista();
            } else {
                Mensaje.error({ titulo: 'Error', texto: res.mensaje });
            }
        })
        .catch(function() { Mensaje.error({ titulo: 'Error', texto: 'Error de conexión' }); });
    },

    aprobar: function() {
        var self = this;
        self.cargarSesion();
        var numSaldo = self._currentNumSaldo || document.getElementById('sdiNumDoc').value;

        Mensaje.confirmacion({
            titulo: 'Aprobar Saldo Inicial',
            texto: 'Al aprobar, se actualizará el stock y costos de los artículos.<br><br>¿Continuar?',
            onAceptar: function() {
                fetch(self.API_URL + '/saldos-iniciales/' + encodeURIComponent(numSaldo) + '/aprobar', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ id_empresa: self.sesion.id_empresa, id_sucursal: self.sesion.id_sucursal || null, ejercicio: parseInt(document.getElementById('sdiEjercicio').value), usuario_aprobacion: self.sesion.usuario || 'SISTEMA' })
                })
                .then(function(r) { return r.json(); })
                .then(function(res) {
                    if (res.ok) {
                        Mensaje.exito({ titulo: 'Aprobado', texto: res.mensaje });
                        self.mostrarVista();
                    } else {
                        Mensaje.error({ titulo: 'Error', texto: res.mensaje });
                    }
                })
                .catch(function() { Mensaje.error({ titulo: 'Error', texto: 'Error de conexión' }); });
            }
        });
    },

    anular: function() {
        var self = this;
        self.cargarSesion();
        var numSaldo = self._currentNumSaldo || document.getElementById('sdiNumDoc').value;

        Mensaje.confirmacion({
            titulo: 'Anular Saldo Inicial',
            texto: 'Al anular, se revertirá el stock de los artículos.<br><br>¿Continuar?',
            onAceptar: function() {
                fetch(self.API_URL + '/saldos-iniciales/' + encodeURIComponent(numSaldo) + '/anular', {
                    method: 'POST',
                    headers: { 'Content-Type': 'application/json' },
                    body: JSON.stringify({ id_empresa: self.sesion.id_empresa, id_sucursal: self.sesion.id_sucursal || null, ejercicio: parseInt(document.getElementById('sdiEjercicio').value) })
                })
                .then(function(r) { return r.json(); })
                .then(function(res) {
                    if (res.ok) {
                        Mensaje.exito({ titulo: 'Anulado', texto: res.mensaje });
                        self.mostrarVista();
                    } else {
                        Mensaje.error({ titulo: 'Error', texto: res.mensaje });
                    }
                })
                .catch(function() { Mensaje.error({ titulo: 'Error', texto: 'Error de conexión' }); });
            }
        });
    },

    eliminar: function() {
        var self = this;
        self.cargarSesion();
        var numSaldo = self._currentNumSaldo || document.getElementById('sdiNumDoc').value;

        Mensaje.confirmacion({
            titulo: 'Eliminar Saldo Inicial',
            texto: '¿Está seguro de eliminar el documento <strong>' + numSaldo + '</strong>?<br><br>Esta acción no se puede deshacer.',
            onAceptar: function() {
                fetch(self.API_URL + '/saldos-iniciales/' + encodeURIComponent(numSaldo) + '?id_empresa=' + self.sesion.id_empresa + '&ejercicio=' + document.getElementById('sdiEjercicio').value, {
                    method: 'DELETE'
                })
                .then(function(r) { return r.json(); })
                .then(function(res) {
                    if (res.ok) {
                        Mensaje.exito({ titulo: 'Eliminado', texto: res.mensaje });
                        self.mostrarVista();
                    } else {
                        Mensaje.error({ titulo: 'Error', texto: res.mensaje });
                    }
                })
                .catch(function() { Mensaje.error({ titulo: 'Error', texto: 'Error de conexión' }); });
            }
        });
    },

    imprimir: function() {
        var self = this;
        var empresa = '';
        try { var s = JSON.parse(localStorage.getItem('erp_session') || sessionStorage.getItem('erp_session')); empresa = s.empresa_razon || ''; } catch(e) {}
        var ahora = new Date();
        var fechaStr = self._fmtDate(ahora) + ' ' + ahora.toLocaleTimeString('es-PE');

        var html = '<!DOCTYPE html><html><head><style>';
        html += 'body{font-family:Arial,sans-serif;font-size:11px;margin:20px}';
        html += '.hdr{text-align:center;margin-bottom:16px}';
        html += '.hdr h2{margin:0 0 4px;font-size:15px}';
        html += '.hdr p{margin:2px 0;color:#555;font-size:11px}';
        html += 'table{width:100%;border-collapse:collapse;margin-top:10px}';
        html += 'th{background:#1A4480;color:#fff;padding:6px 8px;font-size:10px;text-align:left;border:1px solid #0f3366}';
        html += 'td{padding:4px 8px;border:1px solid #ddd;font-size:10px}';
        html += 'tr:nth-child(even){background:#f8fafc}';
        html += '.right{text-align:right}.bold{font-weight:700}';
        html += '.ftr{margin-top:12px;font-size:10px;color:#888;text-align:center;border-top:1px solid #ddd;padding-top:6px}';
        html += '</style></head><body>';
        html += '<div class="hdr"><h2>Saldos Iniciales de Inventario</h2>';
        html += '<p>' + empresa + '</p>';
        html += '<p style="text-align:right">' + fechaStr + '</p></div>';
        html += '<div style="border-radius:8px;overflow:hidden"><table><thead><tr style="clip-path:inset(0 round 6px 6px 0 0)">';
        html += '<th>Ejercicio</th><th>N° Documento</th><th>Fecha</th><th>Observaciones</th><th class="right">Líneas</th><th class="right">Costo Total</th><th>Estado</th>';
        html += '</tr></thead><tbody>';

        var documentos = self._allData || [];
        documentos.forEach(function(row) {
            var estadoLabel = row.estado === 'P' ? 'Pendiente' : row.estado === 'A' ? 'Aprobado' : 'Anulado';
            var fechaVal = row.fecha_apertura || row.fecha_saldo;
            var fecha = self._fmtDate(fechaVal);
            var costo = parseFloat(row.total_costo) || 0;
            html += '<tr>';
            html += '<td>' + row.ejercicio + '</td>';
            html += '<td class="bold">' + row.cod_saldo + '</td>';
            html += '<td>' + fecha + '</td>';
            html += '<td>' + (row.observaciones || '-') + '</td>';
            html += '<td class="right">' + row.total_lineas + '</td>';
            html += '<td class="right bold">S/ ' + costo.toFixed(2) + '</td>';
            html += '<td>' + estadoLabel + '</td>';
            html += '</tr>';
        });
        html += '</tbody></table></div>';
        html += '<div class="ftr">Impreso: ' + fechaStr + '</div>';
        html += '</body></html>';

        var iframe = document.createElement('iframe');
        iframe.style.cssText = 'position:fixed;top:-9999px;width:1px;height:1px';
        document.body.appendChild(iframe);
        var win = iframe.contentWindow;
        win.document.open();
        win.document.write(html);
        win.document.close();
        setTimeout(function() { win.print(); }, 300);
        setTimeout(function() { document.body.removeChild(iframe); }, 1500);
    },

    _fmtDate: function(val) {
        if (!val) return '-';
        var d = new Date(val);
        return ('0' + d.getDate()).slice(-2) + '/' + ('0' + (d.getMonth() + 1)).slice(-2) + '/' + d.getFullYear();
    },

    _cargarTodosParaExport: function(callback) {
        var self = this;
        fetch(self.API_URL + '/saldos-iniciales?id_empresa=' + self.sesion.id_empresa + '&page=1&limit=500')
        .then(function(r) { return r.json(); })
        .then(function(res) {
            if (res.ok && res.data) callback(res.data);
            else callback([]);
        })
        .catch(function() { callback([]); });
    },

    exportarExcel: function() {
        var self = this;
        self._cargarTodosParaExport(function(data) {
            if (!data || data.length === 0) { Mensaje.error({ titulo: 'Excel', texto: 'No hay datos para exportar' }); return; }
            if (typeof ExcelJS === 'undefined') {
                var s = document.createElement('script');
                s.src = 'https://cdn.jsdelivr.net/npm/exceljs@4.4.0/dist/exceljs.min.js';
                s.onload = function() { self._generarExcel(data); };
                document.head.appendChild(s);
            } else {
                self._generarExcel(data);
            }
        });
    },

    _generarExcel: function(data) {
        var wb = new ExcelJS.Workbook();
        var ws = wb.addWorksheet('Saldos Iniciales');
        ws.columns = [
            { header: 'Ejercicio', key: 'ejercicio', width: 10 },
            { header: 'N° Documento', key: 'num', width: 18 },
            { header: 'Fecha', key: 'fecha', width: 12 },
            { header: 'Observaciones', key: 'obs', width: 30 },
            { header: 'Líneas', key: 'lineas', width: 8 },
            { header: 'Costo Total', key: 'costo', width: 14 },
            { header: 'Estado', key: 'estado', width: 12 }
        ];
        ws.getRow(1).font = { bold: true, color: { argb: 'FFFFFFFF' } };
        ws.getRow(1).fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FF1A4480' } };
        ws.getRow(1).alignment = { horizontal: 'center' };

        data.forEach(function(row) {
            var estadoLabel = row.estado === 'P' ? 'Pendiente' : row.estado === 'A' ? 'Aprobado' : 'Anulado';
            var fecha = self._fmtDate(row.fecha_apertura || row.fecha_saldo);
            ws.addRow({ ejercicio: row.ejercicio, num: row.cod_saldo, fecha: fecha, obs: row.observaciones || '', lineas: row.total_lineas, costo: parseFloat(row.total_costo) || 0, estado: estadoLabel });
        });

        wb.xlsx.writeBuffer().then(function(buf) {
            var blob = new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
            var url = URL.createObjectURL(blob);
            var a = document.createElement('a');
            a.href = url;
            a.download = 'saldos_iniciales_' + new Date().toISOString().slice(0, 10) + '.xlsx';
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
            URL.revokeObjectURL(url);
        });
    },

    exportarCSV: function() {
        var self = this;
        document.getElementById('sdiExportDD').classList.remove('visible');
        self._cargarTodosParaExport(function(data) {
            if (!data || data.length === 0) { Mensaje.error({ titulo: 'CSV', texto: 'No hay datos para exportar' }); return; }

            var bom = '\uFEFF';
            var rows = [];
            rows.push(['Ejercicio', 'N° Documento', 'Fecha', 'Observaciones', 'Líneas', 'Costo Total', 'Estado'].join(';'));

            data.forEach(function(row) {
                var estadoLabel = row.estado === 'P' ? 'Pendiente' : row.estado === 'A' ? 'Aprobado' : 'Anulado';
                var fecha = self._fmtDate(row.fecha_apertura || row.fecha_saldo);
                rows.push([row.ejercicio, row.cod_saldo, fecha, '"' + (row.observaciones || '').replace(/"/g, '""') + '"', row.total_lineas, (parseFloat(row.total_costo) || 0).toFixed(2).replace('.', ','), estadoLabel].join(';'));
            });

            var blob = new Blob([bom + rows.join('\n')], { type: 'text/csv;charset=utf-8' });
            var url = URL.createObjectURL(blob);
            var a = document.createElement('a');
            a.href = url;
            a.download = 'saldos_iniciales_' + new Date().toISOString().slice(0, 10) + '.csv';
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
            URL.revokeObjectURL(url);
        });
    },

    exportarPDF: function() {
        var self = this;
        document.getElementById('sdiExportDD').classList.remove('visible');
        self.imprimir();
    },

    exportarTXT: function() {
        var self = this;
        document.getElementById('sdiExportDD').classList.remove('visible');
        self._cargarTodosParaExport(function(data) {
            if (!data || data.length === 0) { Mensaje.error({ titulo: 'TXT', texto: 'No hay datos para exportar' }); return; }

            var rows = [];
            rows.push(['Ejercicio', 'N° Documento', 'Fecha', 'Observaciones', 'Líneas', 'Costo Total', 'Estado'].join('\t'));

            data.forEach(function(row) {
                var estadoLabel = row.estado === 'P' ? 'Pendiente' : row.estado === 'A' ? 'Aprobado' : 'Anulado';
                var fecha = self._fmtDate(row.fecha_apertura || row.fecha_saldo);
                rows.push([row.ejercicio, row.cod_saldo, fecha, row.observaciones || '', row.total_lineas, (parseFloat(row.total_costo) || 0).toFixed(2), estadoLabel].join('\t'));
            });

            var blob = new Blob([rows.join('\n')], { type: 'text/plain;charset=utf-8' });
            var url = URL.createObjectURL(blob);
            var a = document.createElement('a');
            a.href = url;
            a.download = 'saldos_iniciales_' + new Date().toISOString().slice(0, 10) + '.txt';
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
            URL.revokeObjectURL(url);
        });
    },

    imprimirDetalle: function() {
        var self = this;
        var empresa = '';
        try { var s = JSON.parse(localStorage.getItem('erp_session') || sessionStorage.getItem('erp_session')); empresa = s.empresa_razon || ''; } catch(e) {}
        var ahora = new Date();
        var fechaStr = self._fmtDate(ahora) + ' ' + ahora.toLocaleTimeString('es-PE');
        var numDoc = document.getElementById('sdiNumDoc').value;
        var ejercicio = document.getElementById('sdiEjercicio').value;
        var fecha = document.getElementById('sdiFecha').value;
        var obs = document.getElementById('sdiObservaciones').value;

        var html = '<!DOCTYPE html><html><head><style>';
        html += 'body{font-family:Arial,sans-serif;font-size:11px;margin:20px;counter-reset:page}';
        html += '.hdr{text-align:center;margin-bottom:16px}';
        html += '.hdr h2{margin:0 0 4px;font-size:15px}';
        html += '.hdr p{margin:2px 0;color:#555;font-size:11px}';
        html += '.inf{text-align:left;margin-bottom:12px;font-size:11px}';
        html += '.inf span{margin-right:24px}';
        html += '.inf strong{color:#1e293b}';
        html += 'table{width:100%;border-collapse:collapse;margin-top:10px}';
        html += 'th{background:#1A4480;color:#fff;padding:6px 8px;font-size:10px;text-align:left;border:1px solid #0f3366}';
        html += 'td{padding:4px 8px;border:1px solid #ddd;font-size:10px}';
        html += 'tr:nth-child(even){background:#f8fafc}';
        html += '.right{text-align:right}.bold{font-weight:700}';
        html += '.ftr{margin-top:12px;font-size:10px;color:#888;text-align:center;border-top:1px solid #ddd;padding-top:6px}';
        html += '@media print{@page{@bottom-center{content:"Página " counter(page)}}}';
        html += '</style></head><body>';
        html += '<div class="hdr"><h2>Saldo Inicial de Inventario</h2>';
        html += '<p>' + empresa + '</p>';
        html += '<p style="text-align:right">' + fechaStr + '</p></div>';
        html += '<div class="inf">';
        html += '<span><strong>N° Documento:</strong> ' + numDoc + '</span>';
        html += '<span><strong>Ejercicio:</strong> ' + ejercicio + '</span>';
        html += '<span><strong>Fecha:</strong> ' + fecha + '</span>';
        if (obs) html += '<span><strong>Observaciones:</strong> ' + obs + '</span>';
        html += '</div>';
        html += '<div style="border-radius:8px;overflow:hidden"><table><thead><tr style="clip-path:inset(0 round 6px 6px 0 0)">';
        html += '<th>#</th><th>Artículo</th><th>Almacén</th><th class="right">Cantidad</th><th class="right">Costo Unit.</th><th class="right">Costo Total</th><th>Lote</th><th>Vencimiento</th>';
        html += '</tr></thead><tbody>';

        var totalGeneral = 0;
        self._detalleItems.forEach(function(item, idx) {
            var costoTotal = (item.cantidad || 0) * (item.costo_unitario || 0);
            totalGeneral += costoTotal;
            html += '<tr>';
            html += '<td>' + (idx + 1) + '</td>';
            html += '<td>' + (item.articulo_nombre || '') + '</td>';
            html += '<td>' + (item.almacen_nombre || '') + '</td>';
            html += '<td class="right">' + (item.cantidad || 0).toFixed(2) + '</td>';
            html += '<td class="right bold">S/ ' + (item.costo_unitario || 0).toFixed(2) + '</td>';
            html += '<td class="right bold">S/ ' + costoTotal.toFixed(2) + '</td>';
            html += '<td>' + (item.lote || '') + '</td>';
            html += '<td>' + (item.fecha_vencimiento || '') + '</td>';
            html += '</tr>';
        });
        html += '</tbody></table></div>';
        html += '<div class="ftr">Total: S/ ' + totalGeneral.toFixed(2) + ' | Impreso: ' + fechaStr + '</div>';
        html += '</body></html>';

        var iframe = document.createElement('iframe');
        iframe.style.cssText = 'position:fixed;top:-9999px;width:1px;height:1px';
        document.body.appendChild(iframe);
        var win = iframe.contentWindow;
        win.document.open();
        win.document.write(html);
        win.document.close();
        setTimeout(function() { win.print(); }, 300);
        setTimeout(function() { document.body.removeChild(iframe); }, 1500);
    },

    exportarExcelDetalle: function() {
        var self = this;
        if (typeof ExcelJS === 'undefined') {
            var s = document.createElement('script');
            s.src = 'https://cdn.jsdelivr.net/npm/exceljs@4.4.0/dist/exceljs.min.js';
            s.onload = function() { self._generarExcelDetalle(); };
            document.head.appendChild(s);
        } else {
            self._generarExcelDetalle();
        }
    },

    _generarExcelDetalle: function() {
        var self = this;
        var numDoc = document.getElementById('sdiNumDoc').value;
        var wb = new ExcelJS.Workbook();
        var ws = wb.addWorksheet('Saldo Inicial');
        ws.columns = [
            { header: '#', key: 'num', width: 5 },
            { header: 'Artículo', key: 'articulo', width: 35 },
            { header: 'Almacén', key: 'almacen', width: 18 },
            { header: 'Cantidad', key: 'cantidad', width: 12 },
            { header: 'Costo Unit.', key: 'costo', width: 14 },
            { header: 'Costo Total', key: 'total', width: 14 },
            { header: 'Lote', key: 'lote', width: 12 },
            { header: 'Vencimiento', key: 'venc', width: 14 }
        ];
        ws.getRow(1).font = { bold: true, color: { argb: 'FFFFFFFF' } };
        ws.getRow(1).fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FF1A4480' } };
        ws.getRow(1).alignment = { horizontal: 'center' };

        self._detalleItems.forEach(function(item, idx) {
            var costoTotal = (item.cantidad || 0) * (item.costo_unitario || 0);
            ws.addRow({ num: idx + 1, articulo: item.articulo_nombre || '', almacen: item.almacen_nombre || '', cantidad: item.cantidad || 0, costo: item.costo_unitario || 0, total: costoTotal, lote: item.lote || '', venc: item.fecha_vencimiento || '' });
        });

        wb.xlsx.writeBuffer().then(function(buf) {
            var blob = new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
            var url = URL.createObjectURL(blob);
            var a = document.createElement('a');
            a.href = url;
            a.download = 'saldo_inicial_' + numDoc + '_' + new Date().toISOString().slice(0, 10) + '.xlsx';
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
            URL.revokeObjectURL(url);
        });
    },

    exportarCSVDetalle: function() {
        var self = this;
        document.getElementById('sdiExportDetDD').classList.remove('visible');
        var numDoc = document.getElementById('sdiNumDoc').value;
        var bom = '\uFEFF';
        var rows = [];
        rows.push(['#', 'Artículo', 'Almacén', 'Cantidad', 'Costo Unit.', 'Costo Total', 'Lote', 'Vencimiento'].join(';'));
        self._detalleItems.forEach(function(item, idx) {
            var costoTotal = (item.cantidad || 0) * (item.costo_unitario || 0);
            rows.push([(idx + 1), '"' + (item.articulo_nombre || '').replace(/"/g, '""') + '"', '"' + (item.almacen_nombre || '').replace(/"/g, '""') + '"', (item.cantidad || 0).toFixed(2).replace('.', ','), (item.costo_unitario || 0).toFixed(2).replace('.', ','), costoTotal.toFixed(2).replace('.', ','), item.lote || '', item.fecha_vencimiento || ''].join(';'));
        });
        var blob = new Blob([bom + rows.join('\n')], { type: 'text/csv;charset=utf-8' });
        var url = URL.createObjectURL(blob);
        var a = document.createElement('a');
        a.href = url;
        a.download = 'saldo_inicial_' + numDoc + '_' + new Date().toISOString().slice(0, 10) + '.csv';
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
        URL.revokeObjectURL(url);
    },

    exportarPDFDetalle: function() {
        var self = this;
        document.getElementById('sdiExportDetDD').classList.remove('visible');
        self.imprimirDetalle();
    },

    exportarTXTDetalle: function() {
        var self = this;
        document.getElementById('sdiExportDetDD').classList.remove('visible');
        var numDoc = document.getElementById('sdiNumDoc').value;
        var rows = [];
        rows.push(['#', 'Artículo', 'Almacén', 'Cantidad', 'Costo Unit.', 'Costo Total', 'Lote', 'Vencimiento'].join('\t'));
        self._detalleItems.forEach(function(item, idx) {
            var costoTotal = (item.cantidad || 0) * (item.costo_unitario || 0);
            rows.push([(idx + 1), item.articulo_nombre || '', item.almacen_nombre || '', (item.cantidad || 0).toFixed(2), (item.costo_unitario || 0).toFixed(2), costoTotal.toFixed(2), item.lote || '', item.fecha_vencimiento || ''].join('\t'));
        });
        var blob = new Blob([rows.join('\n')], { type: 'text/plain;charset=utf-8' });
        var url = URL.createObjectURL(blob);
        var a = document.createElement('a');
        a.href = url;
        a.download = 'saldo_inicial_' + numDoc + '_' + new Date().toISOString().slice(0, 10) + '.txt';
        document.body.appendChild(a);
        a.click();
        document.body.removeChild(a);
        URL.revokeObjectURL(url);
    },

    enlazarMenu: function() {
        var self = this;
        var links = document.querySelectorAll('.nav-link[data-page="SaldosIniciales"]');
        links.forEach(function(link) {
            link.addEventListener('click', function(e) {
                e.preventDefault();
                self.init();
            });
        });
    }
};

SaldosIniciales.enlazarMenu();
