-- use lector;

-- insert into categorias(nombre) values('categoria A');
-- insert into categorias(nombre) values('categoria B');
-- insert into categorias(nombre) values('categoria C');

Procedimientos:
add_detallecompra_temp()
add_detalleventa_temp()
del_detallecompra_temp()
del_detalleventa_temp()
procesar_compra()

Tablas:
compra
descripcion
detallecompra
detallecompra_temp
detalleventa
detalleventa_temp
empleado
existencia
kardex
marca
medida
precio
presentacion
producto
proveedor
rol
sucursal
venta

tablas que me interesan:
compra
venta
producto

producto_dependencias = [
    descripcion,
    #detalle_compra,
    #detalle_compra_tmp,
]

parametros a enviar en la peticion a la api infile:
parametros_producto = [
    -- (campo, tabla)
    (cantidad, detallecompra_temp),
    (nombre, producto),
    (precio unitario, precio)
    (total, "se puede calcular con: cantidad * precio" )
    (monto gravable, "calculado")
    (monto impuesto (total - monto gravable), "calculado")
]

parametros_general = [
    (nit, venta)
    (gran total, venta)
]

SQL_GENERAL = "SELECT pre.idprecio, d.sku, CONCAT(p.nombre, ' ', p.detalle,' ',mar.nombre) AS producto,
CONCAT( pr.nombre, ' ',pr.detalle,' ',pr.tamanio) AS descripcion, m.nombre, pre.precio, 
CONCAT(s.numero,' ',s.nombre,' ',s.direccion) AS sucur FROM precio pre
INNER JOIN descripcion d ON pre.descripcion_sku = d.sku
INNER JOIN producto p ON d.producto_idproducto = p.idproducto INNER JOIN marca mar 
ON mar.idmarca = p.marca_idmarca INNER JOIN presentacion pr ON 
pr.idpresentacion = p.presentacion_idpresentacion INNER JOIN medida m ON m.idmedida = d.medida_idmedida
INNER JOIN sucursal s ON pre.sucursal_idsucursal = s.idsucursal"

1. Obtener la informacion de un producto por su codigo de barra:
SELECT d.sku, CONCAT(p.nombre, ' ', p.detalle,' ',mar.nombre, ' ', m.nombre) AS nombre, pre.precio FROM precio pre INNER JOIN descripcion d ON pre.descripcion_sku = d.sku INNER JOIN producto p ON d.producto_idproducto = p.idproducto INNER JOIN marca mar  ON mar.idmarca = p.marca_idmarca INNER JOIN presentacion pr ON  pr.idpresentacion = p.presentacion_idpresentacion INNER JOIN medida m ON m.idmedida = d.medida_idmedida WHERE d.sku = 101;

2. Crear el codigo de insersion de una venta (revisar si existe algun procedimiento almacenado para ello):
INSERT INTO venta(sucursal_idsucursal, nitcliente) VALUES(1, '1928374');

3. Crear el codigo de insersion de un detalle venta:
INSERT INTO detalleventa(cantidad, descripcion_sku, venta_idventa) VALUES(3, 101, 1);

4. Crear la consulta para obtener todos los productos de la venta
-- $venta = venta::get(idventa);
$venta = "SELECT * FROM venta WHERE idventa = 1";

items_all = 
SELECT DISTINCT d.sku, CONCAT(p.nombre, ' ', p.detalle, ' ', mar.nombre, ' ', m.nombre) AS nombre, pre.precio, 
s.numero, s.nombre, s.direccion, e.existencia FROM precio pre
INNER JOIN descripcion d ON pre.descripcion_sku = d.sku
INNER JOIN producto p ON d.producto_idproducto = p.idproducto
INNER JOIN existencia e ON p.idproducto = e.producto_idproducto
INNER JOIN marca mar ON mar.idmarca = p.marca_idmarca
INNER JOIN presentacion pr ON pr.idpresentacion = p.presentacion_idpresentacion
INNER JOIN medida m ON m.idmedida = d.medida_idmedida
INNER JOIN sucursal s ON pre.sucursal_idsucursal = s.idsucursal;

$items_venta = 
SELECT DISTINCT d.sku AS codigo, dv.cantidad, CONCAT(p.nombre, ' ', p.detalle,' ',mar.nombre, ' ', m.nombre) AS nombre, pre.precio, s.numero, s.nombre, s.direccion
FROM detalleventa dv
INNER JOIN venta v ON dv.venta_idventa = v.idventa
INNER JOIN descripcion d ON dv.descripcion_sku = d.sku
INNER JOIN producto p ON d.producto_idproducto = p.idproducto
INNER JOIN precio pre ON dv.descripcion_sku = pre.descripcion_sku
INNER JOIN marca mar ON p.marca_idmarca = mar.idmarca
INNER JOIN presentacion pr ON p.presentacion_idpresentacion = pr.idpresentacion
INNER JOIN medida m ON d.medida_idmedida = m.idmedida
INNER JOIN sucursal s ON v.sucursal_idsucursal = s.idsucursal
WHERE v.idventa = 1;

Obtener sucursal en base al sku:
SELECT d.sku as codigo, s.numero FROM descripcion d
INNER JOIN precio p ON p.descripcion_sku = d.sku
INNER JOIN sucursal s ON s.idsucursal = p.sucursal_idsucursal
WHERE d.sku = 101;

Total por venta:
SELECT dv.cantidad, pre.precio, (dv.cantidad * pre.precio) AS total
FROM venta v
INNER JOIN detalleventa dv ON dv.venta_idventa = v.idventa
INNER JOIN descripcion d ON d.sku = dv.descripcion_sku
-- INNER JOIN producto p ON p.idproducto = d.producto_idproducto
-- INNER JOIN marca mar ON mar.idmarca = p.marca_idmarca
-- INNER JOIN presentacion pr ON pr.idpresentacion = p.presentacion_idpresentacion
-- INNER JOIN medida m ON m.idmedida = d.medida_idmedida
INNER JOIN precio pre ON pre.descripcion_sku = d.sku
-- INNER JOIN sucursal s ON s.idsucursal = v.sucursal_idsucursal
WHERE v.idventa = 43;

SELECT 
FROM detalleventa dv
INNER JOIN descripcion d ON d.sku = dv.descripcion_sku
INNER JOIN venta v ON v.idventa = dv.venta_idventa
INNER JOIN producto p ON p.sku
WHERE v.idventa = 1;



obtener productos de una venta:
SELECT DISTINCT d.sku AS codigo, dv.cantidad, CONCAT(p.nombre, ' ', p.detalle,' ',mar.nombre, ' ', m.nombre) AS nombre, pre.precio, s.numero, s.nombre, s.direccion
FROM detalleventa dv
INNER JOIN venta v ON dv.venta_idventa = v.idventa
INNER JOIN descripcion d ON dv.descripcion_sku = d.sku
INNER JOIN producto p ON d.producto_idproducto = p.idproducto
INNER JOIN precio pre ON dv.descripcion_sku = pre.descripcion_sku
INNER JOIN marca mar ON p.marca_idmarca = mar.idmarca
INNER JOIN presentacion pr ON p.presentacion_idpresentacion = pr.idpresentacion
INNER JOIN medida m ON d.medida_idmedida = m.idmedida
INNER JOIN sucursal s ON v.sucursal_idsucursal = s.idsucursal
WHERE v.idventa = 1;


-- EN INFILE_CREATE:

-- SQL
SELECT DISTINCT d.sku, dv.cantidad, CONCAT(p.nombre, ' ', p.detalle,' ',mar.nombre, ' ', m.nombre) AS nombre, pre.precio as precio_venta, dv.cantidad * pre.precio AS total 
FROM detalleventa dv
INNER JOIN venta v ON dv.venta_idventa = v.idventa
INNER JOIN descripcion d ON dv.descripcion_sku = d.sku
INNER JOIN producto p ON d.producto_idproducto = p.idproducto
INNER JOIN precio pre ON dv.descripcion_sku = pre.descripcion_sku
INNER JOIN marca mar ON p.marca_idmarca = mar.idmarca
INNER JOIN presentacion pr ON p.presentacion_idpresentacion = pr.idpresentacion
INNER JOIN medida m ON d.medida_idmedida = m.idmedida
INNER JOIN sucursal s ON v.sucursal_idsucursal = s.idsucursal
WHERE v.idventa = $venta[idventa];

-- SQL TOTAL :(
SELECT DISTINCT d.sku, dv.cantidad, CONCAT(p.nombre, ' ', p.detalle,' ',mar.nombre, ' ', m.nombre) AS nombre, pre.precio as precio_venta, dv.cantidad * pre.precio AS total 
FROM detalleventa dv
INNER JOIN venta v ON dv.venta_idventa = v.idventa
INNER JOIN descripcion d ON dv.descripcion_sku = d.sku
INNER JOIN producto p ON d.producto_idproducto = p.idproducto
INNER JOIN precio pre ON dv.descripcion_sku = pre.descripcion_sku
INNER JOIN marca mar ON p.marca_idmarca = mar.idmarca
INNER JOIN presentacion pr ON p.presentacion_idpresentacion = pr.idpresentacion
INNER JOIN medida m ON d.medida_idmedida = m.idmedida
INNER JOIN sucursal s ON v.sucursal_idsucursal = s.idsucursal
WHERE v.idventa = 3 GROUP BY total;

obtener id del producto en base al sku:
SELECT p.idproducto
FROM descripcion d
INNER JOIN producto p ON d.producto_idproducto = p.idproducto
WHERE d.sku = ;

triggers:
DELIMITER $$

CREATE TRIGGER venta_descripcion
AFTER INSERT ON detalleventa
FOR EACH ROW
BEGIN

DECLARE idproducto INT;
DECLARE idsucursal INT;
SET idproducto = (SELECT p.idproducto FROM descripcion d INNER JOIN producto p ON d.producto_idproducto = p.idproducto WHERE d.sku = NEW.descripcion_sku);
SET idsucursal = (SELECT sucursal_idsucursal FROM venta WHERE idventa = NEW.venta_idventa);
UPDATE existencia SET existencia = existencia - NEW.cantidad WHERE producto_idproducto = idproducto AND WHERE sucursal_idsucursal = idsucursal;

END $$

DELIMITER ;

-- create procedure update_product_id(in id int)

USE market;

DROP TRIGGER IF EXISTS anulacion_venta;

DELIMITER $$

CREATE TRIGGER anulacion_venta
AFTER UPDATE ON venta
FOR EACH ROW
BEGIN

DECLARE item_detalle_venta INT;
DECLARE item_cantidad INT;
DECLARE item_producto_id INT;
DECLARE FINALIZADO INT DEFAULT 0;

-- DECLARE venta_items CURSOR FOR SELECT iddetalleventa, cantidad, producto_idproducto FROM detalleventa WHERE venta_idventa = NEW.idventa;
DECLARE venta_items CURSOR FOR SELECT SUM(cantidad) AS cantidad, producto_idproducto FROM detalleventa WHERE venta_idventa = OLD.idventa;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET FINALIZADO = 1;

OPEN venta_items;

IF NEW.estado = 'ANULADA' THEN
	FETCH venta_items INTO item_cantidad, item_producto_id;
	UPDATE existencia SET existencia = existencia + item_cantidad WHERE producto_idproducto = item_producto_id AND sucursal_idsucursal = sucursal_idsucursal;
END IF;

END $$

DELIMITER ;


-- productos y sus existencias
select distinct e.producto_idproducto, sku, existencia from descripcion d inner join existencia e on d.producto_idproducto = e.producto_idproducto where e.sucursal_idsucursal = 1 group by e.producto_idproducto;

-- CAMPOS PARA SABER SI EL REGISTRO TIENE FACTURA O RECIBO
ALTER TABLE venta ADD nombre_cliente VARCHAR(45) DEFAULT NULL;
ALTER TABLE venta ADD tiene_recibo BOOLEAN DEFAULT FALSE;
ALTER TABLE venta ADD tiene_factura BOOLEAN DEFAULT FALSE;