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:
75
backend/scripts/create_sample_product.sql
Normal file
75
backend/scripts/create_sample_product.sql
Normal 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 $$;
|
||||
34
backend/scripts/generate_password_hash.js
Normal file
34
backend/scripts/generate_password_hash.js
Normal 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;
|
||||
`);
|
||||
});
|
||||
Reference in New Issue
Block a user