Dashboard de Inventario
Modo Local (Demo)
Total Productos
0
Valor Inventario
Q. 0.00
Compras del Mes
Q. 0.00
Ventas / Salidas
Q. 0.00
Alertas Stock
0
Alertas de Stock Mínimo o Agotado
Top 5 Productos de Mayor Rotación
Basado en volumen total de salidas/ventas acumuladas
Comparativa Entradas vs Salidas
Resumen de unidades movilizadas en el periodo
| Imagen | SKU / Código | Producto | Categoría | P. Compra | P. Venta | Stock / Mínimo | Estado | Acciones |
|---|
| ID | Empresa | Contacto | Teléfono | Dirección | Estado | Acciones |
|---|
| ID Cliente | Razón Social / Nombre | Identificación / NIT | Teléfono | Dirección | Total Comprado | Acciones |
|---|
Órdenes de Compra y Entrada de Almacén
| ID Compra | Fecha | Proveedor | SKU / Producto | Cantidad | P. Unitario | Total | Estado | Acciones |
|---|
Registro de Ventas y Salidas de Mercancía
| ID Venta | Fecha | Cliente | SKU / Producto | Cantidad | P. Unitario | Total | Acciones |
|---|
Auditoría de Movimientos de Inventario
Kardex detallado de todas las entradas y salidas registradas.
| ID Mov | Fecha / Hora | Tipo | SKU / Producto | Cantidad | Entidad (Cliente/Prov) | Notas / Usuario | Acciones |
|---|
Reporte de Inventario (CSV/Excel)
Descarga la lista completa de productos, precios y niveles de stock en formato tabular listo para análisis.
Informe de Productos en Alerta (PDF)
Genera un documento PDF formal con los productos que requieren reposición urgente para envío a compras.
Historial de Kardex / Movimientos
Exporta la totalidad de entradas y salidas ordenadas por fecha para auditorías de almacén.
Seguridad del Sistema
Administra la contraseña de acceso y protección de rutas sensibles.
Conexión con Google Sheets
Introduce la URL completa desplegada de tu Google Apps Script o simplemente el ID de implementación.
Código de Google Apps Script (Code.gs)
// === GOOGLE APPS SCRIPT (Code.gs) ===
// Pestañas requeridas en Google Sheets: Productos, Proveedores, Clientes, Compras, Movimientos
function doGet(e) {
// Evita error 'parameter of undefined' al ejecutar manualmente desde el editor de Apps Script
e = e || { parameter: {} };
var action = e.parameter ? e.parameter.action : '';
var ss = SpreadsheetApp.getActiveSpreadsheet();
if (action === 'getData') {
var data = {
productos: getSheetData(ss, 'Productos'),
proveedores: getSheetData(ss, 'Proveedores'),
clientes: getSheetData(ss, 'Clientes'),
compras: getSheetData(ss, 'Compras'),
movimientos: getSheetData(ss, 'Movimientos')
};
return responseJSON({ status: 'success', data: data });
}
return responseJSON({ status: 'success', message: 'Google Apps Script activo y listo para recibir peticiones.' });
}
function doPost(e) {
try {
e = e || { postData: { contents: '{}' } };
var contents = JSON.parse(e.postData.contents || '{}');
var action = contents.action;
var ss = SpreadsheetApp.getActiveSpreadsheet();
if (action === 'syncAll') {
saveSheetData(ss, 'Productos', contents.data.productos);
saveSheetData(ss, 'Proveedores', contents.data.proveedores);
saveSheetData(ss, 'Clientes', contents.data.clientes);
saveSheetData(ss, 'Compras', contents.data.compras);
saveSheetData(ss, 'Movimientos', contents.data.movimientos);
return responseJSON({ status: 'success', message: 'Datos guardados correctamente' });
}
} catch (err) {
return responseJSON({ status: 'error', message: err.toString() });
}
}
function getSheetData(ss, sheetName) {
var sheet = ss.getSheetByName(sheetName);
if (!sheet) return [];
var values = sheet.getDataRange().getValues();
if (values.length <= 1) return [];
var headers = values[0];
var result = [];
for (var i = 1; i < values.length; i++) {
var row = values[i];
var obj = {};
for (var j = 0; j < headers.length; j++) {
obj[headers[j]] = row[j];
}
result.push(obj);
}
return result;
}
function saveSheetData(ss, sheetName, dataArray) {
var sheet = ss.getSheetByName(sheetName);
if (!sheet) { sheet = ss.insertSheet(sheetName); }
sheet.clear();
if (!dataArray || dataArray.length === 0) return;
var headers = Object.keys(dataArray[0]);
var rows = [headers];
dataArray.forEach(function(item) {
var row = [];
headers.forEach(function(h) {
row.push(item[h] !== undefined ? item[h] : '');
});
rows.push(row);
});
sheet.getRange(1, 1, rows.length, headers.length).setValues(rows);
}
function responseJSON(obj) {
return ContentService.createTextOutput(JSON.stringify(obj)).setMimeType(ContentService.MimeType.JSON);
}
Guía Rápida de Configuración (5 Minutos)
- Crea un nuevo libro en Google Sheets y nómbralo "Control de Inventarios".
- Crea 5 pestañas con los nombres exactos:
Productos,Proveedores,Clientes,ComprasyMovimientos. - En el menú superior de Google Sheets, ve a Extensiones > Apps Script.
- Pega el código de arriba en el editor de Google Apps Script y guarda el archivo.
- Haz clic en Implementar > Nueva implementación. Selecciona el tipo "Aplicación Web".
- En "Quién tiene acceso", selecciona "Cualquier persona" (Anyone). Oprime Implementar y copia la URL generada en el campo superior de esta vista.