Initial commit: Estructura backend y frontend con estándar VPS

- Backend migrado a estructura VPS (src/ subfolder)
- Frontend con estructura Vite + React 19 + Tailwind
- Configuración PostgreSQL con Pool
- API service con interceptores JWT
- Ambos servidores funcionando (backend:3001, frontend:5173)
This commit is contained in:
2025-12-09 00:35:46 -03:00
commit 2a88b4a71b
106 changed files with 22508 additions and 0 deletions

View File

@@ -0,0 +1,75 @@
-- Agregar campo codigo si no existe
ALTER TABLE categories
ADD COLUMN IF NOT EXISTS codigo VARCHAR(10);
-- Crear categoría de ejemplo si no existe
INSERT INTO categories (nombre, slug, descripcion, codigo, orden)
VALUES ('Electrónica', 'electronica', 'Productos electrónicos y tecnología', 'ELEC', 1)
ON CONFLICT (slug) DO NOTHING;
-- Obtener el ID de la categoría
DO $$
DECLARE
cat_id INTEGER;
prod_id INTEGER;
BEGIN
-- Buscar categoría
SELECT id INTO cat_id FROM categories WHERE slug = 'electronica';
-- Crear producto de ejemplo
INSERT INTO products (
sku,
nombre,
descripcion,
category_id,
precio_base,
peso_gramos,
alto_cm,
ancho_cm,
largo_cm,
is_active
)
VALUES (
'ELEC-001',
'Mouse Inalámbrico Logitech M185',
'Mouse inalámbrico con sensor óptico de alta precisión, batería de larga duración (hasta 12 meses), receptor nano USB. Color negro.',
cat_id,
12990,
85,
3.8,
6.2,
10.5,
true
)
ON CONFLICT (sku) DO UPDATE
SET nombre = EXCLUDED.nombre,
descripcion = EXCLUDED.descripcion,
precio_base = EXCLUDED.precio_base
RETURNING id INTO prod_id;
-- Crear inventario inicial
INSERT INTO inventory (product_id, stock_actual, stock_minimo)
VALUES (prod_id, 25, 5)
ON CONFLICT (product_id) DO UPDATE
SET stock_actual = 25;
-- Registrar movimiento de inventario
INSERT INTO inventory_movements (
product_id,
tipo,
cantidad,
cantidad_anterior,
cantidad_nueva,
notas
)
VALUES (
prod_id,
'entrada',
25,
0,
25,
'Stock inicial de ejemplo'
);
RAISE NOTICE 'Producto creado exitosamente: ELEC-001 con 25 unidades en stock';
END $$;

View File

@@ -0,0 +1,34 @@
// Script para generar hash de contraseña
// Uso: node generate_password_hash.js <password>
const bcrypt = require('bcryptjs');
const password = process.argv[2] || 'admin123';
const saltRounds = 10;
bcrypt.hash(password, saltRounds, (err, hash) => {
if (err) {
console.error('Error generando hash:', err);
process.exit(1);
}
console.log('\nContraseña:', password);
console.log('Hash bcrypt:', hash);
console.log('\nSQL para insertar usuario:');
console.log(`
INSERT INTO users (email, password_hash, nombre, apellido, telefono, role, is_active, email_verificado)
VALUES (
'admin@ofertaweb.cl',
'${hash}',
'Administrador',
'Sistema',
'+56912345678',
'admin',
true,
true
)
ON CONFLICT (email) DO UPDATE SET
password_hash = EXCLUDED.password_hash,
role = EXCLUDED.role,
is_active = EXCLUDED.is_active;
`);
});