-- Creación de la base de datos
CREATE DATABASE SistemaVentasRopa;
USE SistemaVentasRopa;

-- Tabla Cliente
CREATE TABLE Cliente (
    id_cliente INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    telefono VARCHAR(15),
    direccion TEXT
);

-- Tabla Producto
CREATE TABLE Producto (
    id_producto INT AUTO_INCREMENT PRIMARY KEY,
    nombre_producto VARCHAR(100) NOT NULL,
    descripcion TEXT,
    precio DECIMAL(10, 2) NOT NULL,
    stock INT NOT NULL
);

-- Tabla Proveedor
CREATE TABLE Proveedor (
    id_proveedor INT AUTO_INCREMENT PRIMARY KEY,
    nombre_proveedor VARCHAR(100) NOT NULL,
    contacto VARCHAR(100),
    telefono VARCHAR(15),
    email VARCHAR(100)
);

-- Tabla Orden
CREATE TABLE Orden (
    id_orden INT AUTO_INCREMENT PRIMARY KEY,
    id_cliente INT NOT NULL,
    fecha_orden DATE NOT NULL,
    total DECIMAL(10, 2) NOT NULL,
    FOREIGN KEY (id_cliente) REFERENCES Cliente(id_cliente)
);

-- Tabla Detalle_Orden
CREATE TABLE Detalle_Orden (
    id_detalle INT AUTO_INCREMENT PRIMARY KEY,
    id_orden INT NOT NULL,
    id_producto INT NOT NULL,
    cantidad INT NOT NULL,
    subtotal DECIMAL(10, 2) NOT NULL,
    FOREIGN KEY (id_orden) REFERENCES Orden(id_orden),
    FOREIGN KEY (id_producto) REFERENCES Producto(id_producto)
);

-- Tabla Inventario
CREATE TABLE Inventario (
    id_inventario INT AUTO_INCREMENT PRIMARY KEY,
    id_producto INT NOT NULL,
    cantidad INT NOT NULL,
    FOREIGN KEY (id_producto) REFERENCES Producto(id_producto)
);

-- Script de inserción de datos
INSERT INTO Cliente (id_cliente, nombre, email) VALUES (1, 'Juan Perez', 'juan.perez@gmail.com');
INSERT INTO Producto (id_producto, nombre, precio) VALUES (1, 'Camisa', 25.00);
INSERT INTO Orden (id_orden, id_cliente, fecha) VALUES (1, 1, '2024-12-20');
INSERT INTO Detalle_Orden (id_detalle, id_orden, id_producto, cantidad) VALUES (1, 1, 1, 2);
INSERT INTO Proveedor (id_proveedor, nombre, contacto) VALUES (1, 'Proveedor1', 'contacto@proveedor1.com');
INSERT INTO Inventario (id_producto, stock) VALUES (1, 100);

-- Script de creación de Vistas
CREATE VIEW Ventas_por_Cliente AS
SELECT c.nombre AS Cliente, SUM(d.cantidad * p.precio) AS Total_Ventas
FROM Cliente c
JOIN Orden o ON c.id_cliente = o.id_cliente
JOIN Detalle_Orden d ON o.id_orden = d.id_orden
JOIN Producto p ON d.id_producto = p.id_producto
GROUP BY c.nombre;

CREATE VIEW Inventario_Disponible AS
SELECT p.nombre AS Producto, i.stock AS Stock_Disponible
FROM Producto p
JOIN Inventario i ON p.id_producto = i.id_producto;

-- Script de creación de Funciones
CREATE FUNCTION Calcular_Descuento(monto DECIMAL(10,2), porcentaje DECIMAL(5,2)) RETURNS DECIMAL(10,2)
BEGIN
    RETURN monto - (monto * porcentaje / 100);
END;

CREATE FUNCTION Obtener_Stock_Producto(id INT) RETURNS INT
BEGIN
    DECLARE stock INT;
    SELECT i.stock INTO stock FROM Inventario i WHERE i.id_producto = id;
    RETURN stock;
END;

-- Script de creación de Stored Procedures
CREATE PROCEDURE Registrar_Orden (
    IN id_cliente INT, IN fecha DATE, IN productos JSON
)
BEGIN
    DECLARE id_orden INT;
    INSERT INTO Orden (id_cliente, fecha) VALUES (id_cliente, fecha);
    SET id_orden = LAST_INSERT_ID();
    INSERT INTO Detalle_Orden (id_orden, id_producto, cantidad)
    SELECT id_orden, JSON_UNQUOTE(JSON_EXTRACT(producto, '$.id_producto')),
           JSON_UNQUOTE(JSON_EXTRACT(producto, '$.cantidad'))
    FROM JSON_TABLE(productos, '$[*]' COLUMNS (producto JSON PATH '$'));
END;

CREATE PROCEDURE Actualizar_Stock (
    IN id_producto INT, IN cantidad INT
)
BEGIN
    UPDATE Inventario SET stock = stock - cantidad WHERE id_producto = id_producto;
END;

-- Script de creación de Triggers
CREATE TRIGGER Actualizar_Inventario_After_Orden
AFTER INSERT ON Detalle_Orden
FOR EACH ROW
BEGIN
    UPDATE Inventario
    SET stock = stock - NEW.cantidad
    WHERE id_producto = NEW.id_producto;
END;

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: