-- Kkear agencyHourGetShipped --------------------------------------------------------------- USE `vn`; DROP procedure IF EXISTS `vn`.`agencyHourGetShipped`; DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `agencyHourGetShippedKk`(vLanded DATE, vAddressFk INT, vAgencyFk INT) BEGIN /** * DEPRECATED usar zoneGetShipped * Devuelve las posibles fechas de envío de un ticket * * @param vLanded La fecha de recepcion * @param vAddressFk Id del consignatario * @param vAgencyFk Id de la agencia * @return tmp.agencyHourGetShipped */ DECLARE vDone BOOL; DECLARE vWarehouseFk SMALLINT; DECLARE vCur CURSOR FOR SELECT w.id warehouseFk FROM vn.warehouse w WHERE w.hasAvailable; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; DROP TEMPORARY TABLE IF EXISTS tmp.agencyHourGetShipped; CREATE TEMPORARY TABLE tmp.agencyHourGetShipped ( warehouseFk TINYINT NOT NULL PRIMARY KEY, shipped DATE NOT NULL, landed DATE NOT NULL ) ENGINE = MEMORY; OPEN vCur; l: LOOP SET vDone = FALSE; FETCH vCur INTO vWarehouseFk; IF vDone THEN LEAVE l; END IF; INSERT INTO tmp.agencyHourGetShipped (warehouseFk, shipped, landed) SELECT vWarehouseFk, shipping, vLanded FROM ( SELECT TIMESTAMPADD(DAY, -ah.substractDay, vLanded) shipping, ah.maxHour FROM agencyHour ah LEFT JOIN address a ON a.id = vAddressFk WHERE ah.warehouseFk = vWarehouseFk AND (weekDay = WEEKDAY(vLanded) OR weekDay IS NULL) AND (ah.agencyFk = vAgencyFk OR ah.agencyFk IS NULL) AND (ah.provinceFk = a.provinceFk OR ah.provinceFk IS NULL OR vAddressFk IS NULL) ORDER BY ( (ah.weekDay IS NOT NULL) + (ah.agencyFk IS NOT NULL) + ((ah.provinceFk IS NOT NULL) * 3) ) DESC LIMIT 1 ) t WHERE t.shipping >= CURDATE() AND IF(t.shipping = CURDATE(), t.maxHour > HOUR(NOW()), TRUE); END LOOP; CLOSE vCur; END$$ DELIMITER ; ; -- ticketCalculateClon----------------------------------------------------------------------- USE `vn`; DROP procedure IF EXISTS `ticketCalculateClon`; DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `ticketCalculateClon`(IN vTicketNew INT, vTicketOld INT) BEGIN /* * @vTicketNew id del nuevo ticket clonado * @vTicketOld id ticket original, a partir del qual se clonara el nuevo * Este procedimiento "rebioniza" una linea, eliminando los componentes existentes e insertandolos de nuevo */ DECLARE vShipped DATE; DECLARE vClient INT; DECLARE vWarehouse SMALLINT; DECLARE vAgencyMode INT; DECLARE vAddress INT; DECLARE vLanded DATE; DECLARE vAgency INT; REPLACE INTO orderTicket(orderFk,ticketFk) SELECT orderFk, vTicketNew FROM orderTicket WHERE ticketFk = vTicketOld; SELECT t.clientFk, t.warehouseFk, date(t.shipped), t.addressFk, t.agencyModeFk, t.landed, a.agencyFk INTO vClient, vWarehouse, vShipped, vAddress, vAgencyMode, vLanded, vAgency FROM vn.agencyMode a JOIN vn.ticket t ON t.agencyModeFk = a.id WHERE t.id = vTicketNew; DROP TEMPORARY TABLE IF EXISTS tmp.zoneGetShipped; CALL zoneGetShippedWarehouse(vLanded, vAddress, vAgencyMode); DELETE FROM tmp.zoneGetShipped WHERE warehouseFk <> vWarehouse; CALL buyUltimate(vWarehouse, vShipped); -- rellena la tabla tmp.buyUltimate con la ultima compra DROP TEMPORARY TABLE IF EXISTS tmp.ticketLot; CREATE TEMPORARY TABLE tmp.ticketLot SELECT vWarehouse warehouseFk, NULL available, s.itemFk, bu.buyFk FROM sale s LEFT JOIN tmp.buyUltimate bu ON bu.itemFk = s.itemFk WHERE s.ticketFk = vTicketOld GROUP BY s.itemFk; CALL ticketComponentCalculate(vAddress,vAgencyMode); -- Bionizamos lineas con Preu = 0 DROP TEMPORARY TABLE IF EXISTS tmp.sale; CREATE TEMPORARY TABLE tmp.sale (PRIMARY KEY (saleFk)) ENGINE = MEMORY SELECT s.id saleFk, vWarehouse warehouseFk FROM sale s JOIN ticket t on t.id = s.ticketFk WHERE s.ticketFk = vTicketNew AND s.price = 0; CALL ticketComponentUpdateSale(1); -- Bionizamos lineas con Preu > 0 DROP TEMPORARY TABLE IF EXISTS tmp.sale; CREATE TEMPORARY TABLE tmp.sale (PRIMARY KEY (saleFk)) ENGINE = MEMORY SELECT s.id saleFk, vWarehouse warehouseFk FROM sale s JOIN ticket t on t.id = s.ticketFk WHERE s.ticketFk = vTicketNew AND s.price > 0; CALL ticketComponentUpdateSale(6); IF vLanded IS NULL THEN CALL zoneGetLanded(vShipped, vAddress, vAgency,vWarehouse); UPDATE ticket t JOIN tmp.zoneGetLanded zgl ON t.warehouseFk = zgl.warehouseFk SET t.landed = zgl.landed WHERE t.id = vTicketNew; END IF; -- Log CALL `logAdd`(vTicketNew, 'update', ' ticket' , 'Bioniza Ticket'); -- Limpieza DROP TEMPORARY TABLE IF EXISTS tmp.buyUltimate; DROP TEMPORARY TABLE IF EXISTS tmp.sale; DROP TEMPORARY TABLE IF EXISTS tmp.ticketLot; DROP TEMPORARY TABLE IF EXISTS tmp.zoneGetLanded; END$$ DELIMITER ; -- ------------------------------------------------------------------------------------------ DROP VIEW IF EXISTS `vn`.`agencyWeekDayBonus` ; DROP VIEW IF EXISTS `vn`.`agencyHour` ; ALTER TABLE `vn2008`.`agency_weekday_bonus` RENAME TO `vn2008`.`agency_weekday_bonusKk` ; ALTER TABLE `vn2008`.`preparation_percentage` RENAME TO `vn2008`.`preparation_percentageKk` ; DROP VIEW IF EXISTS `vn`.`preparationPercentage` ; ALTER TABLE `vn2008`.`agency_hour` RENAME TO `vn2008`.`agency_hourKk` ; -- clonWeeklyTickets----------------------------------------------------------------------- USE `vn2008`; DROP procedure IF EXISTS `clonWeeklyTickets`; DELIMITER $$ USE `vn2008`$$ CREATE DEFINER=`root`@`%` PROCEDURE `clonWeeklyTickets`(IN vWeek INT) BEGIN DECLARE done BIT DEFAULT 0; DECLARE vLanding DATE; DECLARE vShipment DATE; DECLARE vWarehouse INT; DECLARE vTicket INT; DECLARE vWeekDay INT; DECLARE vClient INT; DECLARE vEmpresa INT; DECLARE vConsignatario INT; DECLARE vAgencia INT; DECLARE vNewTicket INT; DECLARE vYear INT; DECLARE rsTicket CURSOR FOR SELECT tt.Id_Ticket, weekDay, Id_Cliente, warehouse_id, empresa_id, Id_Consigna, Id_Agencia FROM Tickets_turno tt JOIN Tickets t ON tt.Id_Ticket = t.Id_Ticket; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; SET done = 0; SET vYear = YEAR(CURDATE()) + IF(vWeek < WEEK(CURDATE()),1, 0); OPEN rsTicket; FETCH rsTicket INTO vTicket, vWeekDay, vClient, vWarehouse, vEmpresa, vConsignatario, vAgencia; WHILE NOT done DO SELECT date INTO vShipment FROM time WHERE year = vYear AND week = vWeek AND WEEKDAY(date) = vWeekDay; -- busca si el ticket ya ha sido clonado IF (select count(*) FROM Tickets t JOIN ticket_observation tob ON t.Id_Ticket = tob.Id_Ticket WHERE Id_Consigna = vConsignatario AND Fecha = vShipment AND tob.text LIKE CONCAT('%',vTicket,'%')) = 0 THEN IF (SELECT COUNT(*) FROM Agencias WHERE Id_Agencia = vAgencia AND Agencia LIKE '%turno%') THEN SET vAgencia = NULL; END IF; CALL vn.ticketCreate(vClient, vShipment, vWarehouse, vEmpresa, vConsignatario, vAgencia, NULL, vLanding, vNewTicket); INSERT INTO Movimientos (Id_Ticket, Id_Article, Concepte, Cantidad, Preu, Descuento, CostFixat, PrecioFijado) SELECT vNewTicket, Id_Article, Concepte, Cantidad, Preu, Descuento, CostFixat, PrecioFijado FROM Movimientos WHERE Id_Ticket = vTicket; INSERT INTO Ordenes (orden,datorden,datticket,codvendedor,codcomprador,cantidad,preciomax,preu,id_article,id_cliente,comentario, ok, total,datcompra,ko,id_movimiento) SELECT o.orden,o.datorden,vShipment,o.codvendedor,o.codcomprador,o.cantidad,o.preciomax,o.preu,o.id_article,o.id_cliente,o.comentario, o.ok, o.total,o.datcompra,o.ko,m2.Id_Movimiento FROM Movimientos m JOIN Ordenes o ON o.Id_Movimiento = m.Id_Movimiento JOIN Movimientos m2 ON m.Concepte = m2.Concepte AND m.Cantidad = m2.Cantidad AND m.Id_Article = m2.Id_Article WHERE m.Id_Ticket = vTicket AND m2.Id_Ticket = vNewTicket; INSERT INTO ticket_observation(Id_Ticket,observation_type_id,text) VALUES(vNewTicket,4,CONCAT('turno desde ticket: ',vTicket)) ON DUPLICATE KEY UPDATE text = CONCAT(ticket_observation.text,VALUES(text),' '); INSERT INTO ticket_observation(Id_Ticket,observation_type_id,text) VALUES(vNewTicket,1,'ATENCION: Contiene lineas de TURNO') ON DUPLICATE KEY UPDATE text = CONCAT(ticket_observation.text,VALUES(text),' '); CALL vn.ticketCalculateClon(vNewTicket, vTicket); END IF; FETCH rsTicket INTO vTicket, vWeekDay, vClient, vWarehouse, vEmpresa, vConsignatario, vAgencia; END WHILE; CLOSE rsTicket; END$$ DELIMITER ; -- ticketComponentCalculate----------------------------------------------------------------------- USE `vn`; DROP procedure IF EXISTS `ticketComponentCalculate`; DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `ticketComponentCalculate`( vAddressFk INT, vAgencyModeFk INT) proc: BEGIN /** * Calcula los componentes de un ticket * * @param vAddressFk Id del consignatario * @param vAgencyModeFk Id del modo de agencia * @return tmp.ticketComponent(itemFk, warehouseFk, available, rate2, rate3, minPrice, * packing, grouping, groupingMode, buyFk, typeFk) * @return tmp.ticketComponentPrice (warehouseFk, itemFk, rate, grouping, price) */ DECLARE vClientFk INT; DECLARE vGeneralInflationCoefficient INT DEFAULT 1; DECLARE vMinimumDensityWeight INT DEFAULT 167; DECLARE vBoxFreightItem INT DEFAULT 71; DECLARE vBoxVolume BIGINT; -- DEFAULT 138000; DECLARE vSpecialPriceComponent INT DEFAULT 10; DECLARE vDeliveryComponent INT DEFAULT 15; DECLARE vRecoveryComponent INT DEFAULT 17; DECLARE vSellByPacketComponent INT DEFAULT 22; DECLARE vBuyValueComponent INT DEFAULT 28; DECLARE vMarginComponent INT DEFAULT 29; DECLARE vDiscountLastItemComponent INT DEFAULT 32; DECLARE vExtraBaggedComponent INT DEFAULT 38; DECLARE vManaAutoComponent INT DEFAULT 39; SELECT volume INTO vBoxVolume FROM vn.packaging WHERE id = '94'; SELECT clientFk INTO vClientFK FROM address WHERE id = vAddressFk; SET @rate2 := 0; SET @rate3 := 0; DROP TEMPORARY TABLE IF EXISTS tmp.ticketComponentCalculate; CREATE TEMPORARY TABLE tmp.ticketComponentCalculate (PRIMARY KEY (itemFk, warehouseFk)) ENGINE = MEMORY SELECT tl.itemFk, tl.warehouseFk, tl.available, IF((@rate2 := IFNULL(pf.rate2, b.price2)) < i.minPrice AND i.hasMinPrice, i.minPrice, @rate2) * 1.0 rate2, IF((@rate3 := IFNULL(pf.rate3, b.price3)) < i.minPrice AND i.hasMinPrice, i.minPrice, @rate3) * 1.0 rate3, IFNULL(pf.rate3, 0) AS minPrice, IFNULL(pf.packing, b.packing) packing, IFNULL(pf.`grouping`, b.`grouping`) grouping, ABS(IFNULL(pf.box, b.groupingMode)) groupingMode, tl.buyFk, i.typeFk FROM tmp.ticketLot tl JOIN buy b ON b.id = tl.buyFk JOIN item i ON i.id = tl.itemFk JOIN itemType it ON it.id = i.typeFk LEFT JOIN itemCategory ic ON ic.id = it.categoryFk LEFT JOIN specialPrice sp ON sp.itemFk = i.id AND sp.clientFk = vClientFk LEFT JOIN ( SELECT * FROM ( SELECT pf.itemFk, pf.`grouping`, pf.packing, pf.box, pf.rate2, pf.rate3, aho.warehouseFk FROM priceFixed pf JOIN tmp.zoneGetShipped aho ON pf.warehouseFk = aho.warehouseFk OR pf.warehouseFk = 0 WHERE aho.shipped BETWEEN pf.started AND pf.ended ORDER BY pf.itemFk, pf.warehouseFk DESC ) tpf GROUP BY tpf.itemFk, tpf.warehouseFk ) pf ON pf.itemFk = tl.itemFk AND pf.warehouseFk = tl.warehouseFk WHERE b.buyingValue + b.freightValue + b.packageValue + b.comissionValue > 0.01 AND ic.display <> 0; DROP TEMPORARY TABLE IF EXISTS tmp.ticketComponent; CREATE TEMPORARY TABLE tmp.ticketComponent ( `warehouseFk` INT UNSIGNED NOT NULL, `itemFk` INT NOT NULL, `componentFk` INT UNSIGNED NOT NULL, `cost` DECIMAL(10,4) NOT NULL, INDEX `itemWarehouse` USING BTREE (`itemFk` ASC, `warehouseFk` ASC), UNIQUE INDEX `itemWarehouseComponent` (`itemFk` ASC, `warehouseFk` ASC, `componentFk` ASC)); INSERT INTO tmp.ticketComponent (warehouseFk, itemFk, componentFk, cost) SELECT tcc.warehouseFk, tcc.itemFk, vBuyValueComponent, b.buyingValue + b.freightValue + b.packageValue + b.comissionValue FROM tmp.ticketComponentCalculate tcc JOIN buy b ON b.id = tcc.buyFk; INSERT INTO tmp.ticketComponent (warehouseFk, itemFk, componentFk, cost) SELECT tcc.warehouseFk, tcc.itemFk, vMarginComponent, tcc.rate3 - b.buyingValue - b.freightValue - b.packageValue - b.comissionValue FROM tmp.ticketComponentCalculate tcc JOIN buy b ON b.id = tcc.buyFk; DROP TEMPORARY TABLE IF EXISTS tmp.ticketComponentBase; CREATE TEMPORARY TABLE tmp.ticketComponentBase ENGINE = MEMORY SELECT tc.itemFk, ROUND(SUM(tc.cost), 4) AS base, tc.warehouseFk FROM tmp.ticketComponent tc GROUP BY tc.itemFk, warehouseFk; INSERT INTO tmp.ticketComponent SELECT tcb.warehouseFk, tcb.itemFk, vRecoveryComponent, ROUND(tcb.base * LEAST(cr.recobro, 0.25), 3) FROM tmp.ticketComponentBase tcb JOIN bi.claims_ratio cr ON cr.Id_Cliente = vClientFk WHERE cr.recobro > 0.009; INSERT INTO tmp.ticketComponent SELECT tcb.warehouseFk, tcb.itemFk, vManaAutoComponent, ROUND(base * (0.01 + prices_modifier_rate), 3) as manaAuto FROM tmp.ticketComponentBase tcb JOIN `client` c on c.id = vClientFk JOIN bs.mana_spellers ms ON c.salesPersonFk = ms.Id_Trabajador WHERE ms.prices_modifier_activated HAVING manaAuto <> 0; INSERT INTO tmp.ticketComponent SELECT tcb.warehouseFk, tcb.itemFk, cr.id, GREATEST(IFNULL(ROUND(tcb.base * cr.tax, 4), 0), tcc.minPrice - tcc.rate3) FROM tmp.ticketComponentBase tcb JOIN componentRate cr JOIN tmp.ticketComponentCalculate tcc ON tcc.itemFk = tcb.itemFk AND tcc.warehouseFk = tcb.warehouseFk LEFT JOIN specialPrice sp ON sp.clientFk = vClientFk AND sp.itemFk = tcc.itemFk WHERE cr.id = vDiscountLastItemComponent AND cr.tax <> 0 AND tcc.minPrice < tcc.rate3 AND sp.value IS NULL; INSERT INTO tmp.ticketComponent SELECT tcc.warehouseFk, tcc.itemFk, vSellByPacketComponent, tcc.rate2 - tcc.rate3 FROM tmp.ticketComponentCalculate tcc JOIN buy b ON b.id = tcc.buyFk LEFT JOIN specialPrice sp ON sp.clientFk = vClientFk AND sp.itemFk = tcc.itemFk WHERE sp.value IS NULL; INSERT INTO tmp.ticketComponent SELECT tcc.warehouseFK, tcc.itemFk, vDeliveryComponent, vGeneralInflationCoefficient * ROUND(( i.compression * r.cm3 * IF(am.deliveryMethodFk = 1, (GREATEST(i.density, vMinimumDensityWeight) / vMinimumDensityWeight), 1) * IFNULL((z.price - z.bonus) * 1/*amz.inflation*/, 50)) / vBoxVolume, 4 ) cost FROM tmp.ticketComponentCalculate tcc JOIN item i ON i.id = tcc.itemFk JOIN agencyMode am ON am.id = vAgencyModeFk JOIN `address` a ON a.id = vAddressFk JOIN tmp.zoneGetShipped zgs ON zgs.warehouseFk = tcc.warehouseFk JOIN zone z ON z.id = zgs.id LEFT JOIN bi.rotacion r ON r.warehouse_id = tcc.warehouseFk AND r.Id_Article = tcc.itemFk HAVING cost <> 0; IF (SELECT COUNT(*) FROM vn.addressForPackaging WHERE addressFk = vAddressFk) THEN INSERT INTO tmp.ticketComponent SELECT tcc.warehouseFk, b.itemFk, vExtraBaggedComponent, ap.packagingValue cost FROM tmp.ticketComponentCalculate tcc JOIN vn.addressForPackaging ap WHERE ap.addressFk = vAddressFk; END IF; DROP TEMPORARY TABLE IF EXISTS tmp.ticketComponentCopy; CREATE TEMPORARY TABLE tmp.ticketComponentCopy ENGINE = MEMORY SELECT * FROM tmp.ticketComponent; INSERT INTO tmp.ticketComponent SELECT tcc.warehouseFk, tcc.itemFk, vSpecialPriceComponent, sp.value - SUM(tcc.cost) sumCost FROM tmp.ticketComponentCopy tcc JOIN componentRate cr ON cr.id = tcc.componentFk JOIN specialPrice sp ON sp.clientFk = vClientFK AND sp.itemFk = tcc.itemFk WHERE cr.classRate IS NULL GROUP BY tcc.itemFk, tcc.warehouseFk HAVING ABS(sumCost) > 0.001; DROP TEMPORARY TABLE IF EXISTS tmp.ticketComponentSum; CREATE TEMPORARY TABLE tmp.ticketComponentSum (INDEX (itemFk, warehouseFk)) ENGINE = MEMORY SELECT SUM(cost) sumCost, tc.itemFk, tc.warehouseFk, cr.classRate FROM tmp.ticketComponent tc JOIN componentRate cr ON cr.id = tc.componentFk GROUP BY tc.itemFk, tc.warehouseFk, cr.classRate; DROP TEMPORARY TABLE IF EXISTS tmp.ticketComponentRate; CREATE TEMPORARY TABLE tmp.ticketComponentRate ENGINE = MEMORY SELECT tcc.warehouseFk, tcc.itemFk, 1 rate, IF(tcc.groupingMode = 1, tcc.`grouping`, 1) grouping, CAST(SUM(tcs.sumCost) AS DECIMAL(10,2)) price FROM tmp.ticketComponentCalculate tcc JOIN tmp.ticketComponentSum tcs ON tcs.itemFk = tcc.itemFk AND tcs.warehouseFk = tcc.warehouseFk WHERE IFNULL(tcs.classRate, 1) = 1 AND tcc.groupingMode < 2 AND (tcc.packing > tcc.`grouping` or tcc.groupingMode = 0) GROUP BY tcs.warehouseFk, tcs.itemFk; INSERT INTO tmp.ticketComponentRate (warehouseFk, itemFk, rate, grouping, price) SELECT tcc.warehouseFk, tcc.itemFk, 2 rate, tcc.packing grouping, SUM(tcs.sumCost) price FROM tmp.ticketComponentCalculate tcc JOIN tmp.ticketComponentSum tcs ON tcs.itemFk = tcc.itemFk AND tcs.warehouseFk = tcc.warehouseFk WHERE tcc.available IS NULL OR (IFNULL(tcs.classRate, 2) = 2 AND tcc.packing > 0 AND tcc.available >= tcc.packing) GROUP BY tcs.warehouseFk, tcs.itemFk; INSERT INTO tmp.ticketComponentRate (warehouseFk, itemFk, rate, grouping, price) SELECT tcc.warehouseFk, tcc.itemFk, 3 rate, tcc.available grouping, SUM(tcs.sumCost) price FROM tmp.ticketComponentCalculate tcc JOIN tmp.ticketComponentSum tcs ON tcs.itemFk = tcc.itemFk AND tcs.warehouseFk = tcc.warehouseFk WHERE IFNULL(tcs.classRate, 3) = 3 GROUP BY tcs.warehouseFk, tcs.itemFk; DROP TEMPORARY TABLE IF EXISTS tmp.ticketComponentPrice; CREATE TEMPORARY TABLE tmp.ticketComponentPrice ENGINE = MEMORY SELECT * FROM ( SELECT * FROM tmp.ticketComponentRate ORDER BY price ) t GROUP BY itemFk, warehouseFk, `grouping`; DROP TEMPORARY TABLE tmp.ticketComponentCalculate, tmp.ticketComponentSum, tmp.ticketComponentBase, tmp.ticketComponentRate, tmp.ticketComponentCopy; END$$ DELIMITER ; -- bionic_calc_clon----------------------------------------------------------------------- USE `vn2008`; DROP procedure IF EXISTS `vn2008`.`bionic_calc_clon`; DELIMITER $$ USE `vn2008`$$ CREATE DEFINER=`root`@`%` PROCEDURE `bionic_calc_clonKk`(IN v_ticket BIGINT) BEGIN /* * DEPRECATED vn.ticketCalculateClon * Este procedimiento "rebioniza" una linea, eliminando los componentes existentes e insertandolos de nuevo */ DECLARE v_shipment DATE; DECLARE v_customer INT; DECLARE v_wh SMALLINT; DECLARE v_agencia INT; DECLARE v_consigna INT; DECLARE v_landing DATE; DECLARE v_agency INT; REPLACE order_Tickets(order_id,Id_Ticket) VALUES(48, v_ticket); SELECT t.Id_Cliente , t.warehouse_id, date(t.Fecha), t.Id_Consigna, t.Id_Agencia, t.landing, a.agency_id INTO v_customer, v_wh, v_shipment, v_consigna, v_agencia, v_landing, v_agency FROM vn2008.Agencias a JOIN vn2008.Tickets t ON t.Id_Agencia = a.Id_Agencia WHERE t.Id_Ticket = v_ticket; DROP TEMPORARY TABLE IF EXISTS tmp.agencyHourGetShipped; CREATE TEMPORARY TABLE tmp.agencyHourGetShipped ENGINE = MEMORY SELECT v_wh warehouseFk, v_shipment shipped, v_landing landed; CALL item_last_buy_ (v_wh, v_shipment); -- rellena la tabla t_item_last_buy con la ultima compra DROP TEMPORARY TABLE IF EXISTS tmp.bionic_lot; CREATE TEMPORARY TABLE tmp.bionic_lot SELECT v_wh warehouse_id,NULL available, m.Id_Article item_id,ilb.buy_id FROM Movimientos m LEFT JOIN t_item_last_buy ilb ON ilb.item_id = m.Id_Article WHERE m.Id_Ticket = v_ticket GROUP BY m.Id_Article; CALL bionic_calc_component(v_consigna,v_agencia); -- Bionizamos lineas con Preu = 0 DROP TEMPORARY TABLE IF EXISTS tmp.movement; CREATE TEMPORARY TABLE tmp.movement (PRIMARY KEY (Id_Movimiento)) ENGINE = MEMORY SELECT Id_Movimiento, v_wh warehouse_id FROM Movimientos m JOIN Tickets t on t.Id_Ticket = m.Id_Ticket WHERE m.Id_Ticket = v_ticket AND Preu = 0; CALL bionic_movement_update(1); -- Bionizamos lineas con Preu > 0 DROP TEMPORARY TABLE IF EXISTS tmp.movement; CREATE TEMPORARY TABLE tmp.movement (PRIMARY KEY (Id_Movimiento)) ENGINE = MEMORY SELECT Id_Movimiento, v_wh warehouse_id FROM Movimientos m JOIN Tickets t on t.Id_Ticket = m.Id_Ticket WHERE m.Id_Ticket = v_ticket AND Preu > 0; CALL bionic_movement_update(6); IF v_landing IS NULL THEN CALL travel_tree_shipment(v_shipment, v_consigna, v_agency,v_wh); UPDATE Tickets t JOIN travel_tree_shipment tts ON t.warehouse_id = tts.warehouse_id SET t.landing = tts.landing WHERE Id_Ticket = v_ticket; END IF; -- Log call Ditacio(v_ticket ,'Bioniza Ticket' ,'T' , 20 , 'proc bionic_calc_clon' , NULL); -- Limpieza DROP TEMPORARY TABLE t_item_last_buy; END$$ DELIMITER ; -- bionic_calc_component----------------------------------------------------------------------- USE `vn2008`; DROP procedure IF EXISTS `vn2008`.`bionic_calc_component`; DELIMITER $$ USE `vn2008`$$ CREATE DEFINER=`root`@`%` PROCEDURE `bionic_calc_component`(IN `v_consigna` INT, IN `v_agencia` INT) proc: BEGIN DECLARE v_customer INT; DECLARE COEFICIENTE_DE_INFLACION_GENERAL INT DEFAULT 1.0; DECLARE DENSIDAD_MINIMA_PESO_VOLUMETRICO INT DEFAULT 167; DECLARE VOLUMEN_CAJA_VERDNATURA BIGINT; -- DEFAULT 138000; -- DECLARE vValorEmbolsado DOUBLE DEFAULT 0.04; SELECT Volumen INTO VOLUMEN_CAJA_VERDNATURA FROM Cubos WHERE Id_Cubo = '94'; SELECT Id_Cliente INTO v_customer FROM Consignatarios WHERE Id_Consigna = v_consigna; SET @rate2 := 0; SET @rate3 := 0; DROP TEMPORARY TABLE IF EXISTS t_bionic_temp; CREATE TEMPORARY TABLE t_bionic_temp (PRIMARY KEY (item_id,warehouse_id)) ENGINE = MEMORY SELECT b.item_id, b.warehouse_id,available, IF((@rate2 := IFNULL(pf.rate_2,c.Tarifa2)) < a.PVP AND a.`Min`, a.PVP, @rate2) * 1.0 rate_2, IF((@rate3 := IFNULL(pf.rate_3,c.Tarifa3)) < a.PVP AND a.`Min`, a.PVP, @rate3) * 1.0 rate_3, ifnull(pf.rate_3,0) AS min_price, IFNULL(pf.Packing,c.Packing) packing, IFNULL(pf.`grouping`,c.`grouping`) `grouping`, ABS(IFNULL(pf.caja,c.caja)) box, b.buy_id, a.tipo_id FROM tmp.bionic_lot b JOIN vn2008.Compres c ON b.buy_id = c.Id_Compra JOIN vn2008.Articles a ON b.item_id = a.Id_Article JOIN vn2008.Tipos t ON t.tipo_id = a.tipo_id LEFT JOIN vn2008.reinos r ON r.id = t.reino_id LEFT JOIN vn2008.PreciosEspeciales p ON a.Id_Article = p.Id_Article AND p.Id_Cliente = v_customer LEFT JOIN ( SELECT * FROM ( SELECT p.item_id, p.`grouping`, p.Packing, p.caja, p.rate_2, p.rate_3, zgs.warehouseFk AS warehouse_id FROM vn2008.price_fixed p JOIN tmp.zoneGetShipped zgs ON zgs.warehouseFk = p.warehouse_id OR p.warehouse_id = 0 WHERE zgs.shipped BETWEEN p.date_start AND p.date_end ORDER BY p.item_id, p.warehouse_id DESC ) t GROUP BY item_id, warehouse_id ) pf ON pf.item_id = b.item_id AND pf.warehouse_id = b.warehouse_id -- descartamos articulos con coste menor de 0.01 WHERE Costefijo + Portefijo + Embalajefijo + Comisionfija > 0.01 AND r.display <> 0; -- Creamos la tabla tmp.bionic_component DROP TEMPORARY TABLE IF EXISTS tmp.bionic_component; CREATE TEMPORARY TABLE tmp.bionic_component LIKE template_bionic_component; -- Componentes del precio, valores absolutos INSERT INTO tmp.bionic_component ( warehouse_id, item_id, component_id, cost) SELECT b.warehouse_id, b.item_id, 29, rate_3 - Costefijo - Portefijo - Embalajefijo - Comisionfija FROM t_bionic_temp b JOIN vn2008.Compres c ON b.buy_id = c.Id_Compra; INSERT INTO tmp.bionic_component ( warehouse_id, item_id, component_id, cost) SELECT b.warehouse_id, b.item_id, 28, Costefijo + Portefijo + Embalajefijo + Comisionfija FROM t_bionic_temp b JOIN vn2008.Compres c ON b.buy_id = c.Id_Compra; -- Ahora los valores en funcion de la base DROP TEMPORARY TABLE IF EXISTS t_components_base; CREATE TEMPORARY TABLE t_components_base SELECT bc.item_id, ROUND(SUM(cost), 4) AS base, bc.warehouse_id FROM tmp.bionic_component bc GROUP BY bc.item_id,warehouse_id; -- La ratio se calcula teniendo en cuenta el valor de las reclamaciones y el saldo de greuge INSERT INTO tmp.bionic_component SELECT cb.warehouse_id, item_id, 17, ROUND(base * LEAST(recobro,0.25), 3) FROM t_components_base cb JOIN bi.claims_ratio ON Id_Cliente = v_customer WHERE recobro > 0.009; -- PAK 2016-08-31 Componente de maná automático, en función del maná acumulado por el comercial. INSERT INTO tmp.bionic_component SELECT cb.warehouse_id, item_id, 39, ROUND(base * (0.01 + prices_modifier_rate), 3) as manaAuto FROM t_components_base cb JOIN Clientes c on c.Id_Cliente = v_customer JOIN bs.mana_spellers ms ON c.Id_Trabajador = ms.Id_Trabajador WHERE ms.prices_modifier_activated AND c.Id_Trabajador != 196 -- Ruben Espinosa HAVING manaAuto <> 0 ; /* -- Vendedor variable INSERT INTO tmp.bionic_component SELECT cb.warehouse_id, item_id, Id_Componente, IFNULL(ROUND(base * tax,4), 0) FROM t_components_base cb JOIN bi.tarifa_componentes WHERE tarifa_componentes_series_id = 2 and IFNULL(tax, 0) > 0; */ -- ******* Inicio Bloque para componentes con tarifa_class diferente de NULL -- Descuento por ultimas unidades INSERT INTO tmp.bionic_component SELECT cb.warehouse_id, b.item_id, Id_Componente, GREATEST(IFNULL(ROUND(base * tax,4), 0), b.min_price - b.rate_3) FROM t_components_base cb JOIN bi.tarifa_componentes JOIN t_bionic_temp b ON b.item_id = cb.item_id AND b.warehouse_id = cb.warehouse_id LEFT JOIN PreciosEspeciales pe ON pe.Id_Cliente = v_customer AND pe.Id_Article = b.item_id WHERE Id_Componente = 32 AND tax <> 0 AND b.min_price < b.rate_3 AND PrecioEspecial IS NULL; -- Incremento por paquete suelto INSERT INTO tmp.bionic_component SELECT b.warehouse_id, b.item_id, 22, rate_2 - rate_3 FROM t_bionic_temp b JOIN vn2008.Compres c ON b.buy_id = c.Id_Compra LEFT JOIN PreciosEspeciales pe ON pe.Id_Cliente = v_customer AND pe.Id_Article = b.item_id WHERE PrecioEspecial IS NULL; -- ******* Fin Bloque para componentes con tarifa_class diferente de NULL -- Reparto INSERT INTO tmp.bionic_component SELECT b.warehouse_id , b.item_id , 15 , COEFICIENTE_DE_INFLACION_GENERAL * ROUND( r.cm3 * art.compression * IF(a.Vista = 1, (GREATEST(art.density,DENSIDAD_MINIMA_PESO_VOLUMETRICO) / DENSIDAD_MINIMA_PESO_VOLUMETRICO ) , 1) * IFNULL(az.price * az.inflacion ,50) / VOLUMEN_CAJA_VERDNATURA, 4 ) cost FROM t_bionic_temp b JOIN vn2008.Articles art ON art.Id_Article = b.item_id JOIN vn2008.Agencias a ON a.Id_Agencia = v_agencia JOIN vn2008.Consignatarios c ON c.Id_Consigna = v_consigna JOIN vn2008.Agencias_province ap ON ap.agency_id = a.agency_id AND ap.warehouse_id = b.warehouse_id AND ap.province_id = c.province_id JOIN vn2008.Agencias_zonas az ON az.Id_Agencia = v_agencia AND az.zona = ap.zona AND az.Id_Article = 71 AND az.warehouse_id = b.warehouse_id LEFT JOIN bi.rotacion r ON r.warehouse_id = b.warehouse_id AND r.Id_Article = b.item_id HAVING cost <> 0; -- Reparto bonificado INSERT INTO tmp.bionic_component SELECT b.warehouse_id , b.item_id , 41 , COEFICIENTE_DE_INFLACION_GENERAL * ROUND( r.cm3 * art.compression * IF(a.Vista = 1, (GREATEST(art.density,DENSIDAD_MINIMA_PESO_VOLUMETRICO) / DENSIDAD_MINIMA_PESO_VOLUMETRICO ) , 1) * awb.bonus * az.inflacion / VOLUMEN_CAJA_VERDNATURA, 4 ) cost FROM t_bionic_temp b JOIN vn2008.Articles art ON art.Id_Article = b.item_id JOIN vn2008.Agencias a ON a.Id_Agencia = v_agencia JOIN vn2008.Consignatarios c ON c.Id_Consigna = v_consigna JOIN vn2008.Agencias_province ap ON ap.agency_id = a.agency_id AND ap.warehouse_id = b.warehouse_id AND ap.province_id = c.province_id JOIN vn2008.Agencias_zonas az ON az.Id_Agencia = v_agencia AND az.zona = ap.zona AND az.Id_Article = 71 AND az.warehouse_id = b.warehouse_id JOIN vn2008.agency_weekday_bonus awb ON awb.warehouse_id = az.warehouse_id AND awb.zona = az.zona AND a.agency_id = awb.agency_id LEFT JOIN bi.rotacion r ON r.warehouse_id = b.warehouse_id AND r.Id_Article = b.item_id JOIN tmp.agencyHourGetShipped ah ON ah.warehouseFk = awb.warehouse_id AND weekday(ah.landed) = awb.weekDay HAVING cost <> 0 LIMIT 1; -- PAK 12-05-2015 -- EMBOLSADO IF (SELECT COUNT(*) FROM vn.addressForPackaging WHERE addressFk = v_consigna) THEN -- IF v_consigna IN (13690, 3402, 5661, 4233) THEN INSERT INTO tmp.bionic_component SELECT b.warehouse_id, b.item_id, 38, ap.packagingValue cost FROM t_bionic_temp b JOIN vn.addressForPackaging ap WHERE ap.addressFk = v_consigna; END IF; -- JGF 14-08-2015 -- Modificacion de precio por dia de preparacion del pedido INSERT INTO tmp.bionic_component SELECT cb.warehouse_id, cb.item_id, 14, cb.base * (IFNULL(pe.percentage,pp.percentage)/100) FROM t_components_base cb JOIN tmp.agencyHourGetShipped ah ON ah.warehouseFk = cb.warehouse_id LEFT JOIN vn2008.preparation_percentage pp ON pp.week_day = weekday(ah.shipped) AND cb.warehouse_id = IFNULL(pp.warehouse_id,cb.warehouse_id) LEFT JOIN vn2008.preparation_exception pe ON pe.exception_day = ah.shipped AND cb.warehouse_id = IFNULL(pe.warehouse_id,cb.warehouse_id) WHERE IFNULL(pe.percentage,pp.percentage); -- Creamos la tabla tmp.bionic_component_copy por que mysql no puede reabrir una tabla temporal DROP TEMPORARY TABLE IF EXISTS tmp.bionic_component_copy; CREATE TEMPORARY TABLE tmp.bionic_component_copy SELECT * FROM tmp.bionic_component; -- JGF 19-01-2016 -- Precios especiales INSERT INTO tmp.bionic_component SELECT b.warehouse_id, b.item_id, 10, pe.PrecioEspecial - SUM(cost) sum_cost FROM tmp.bionic_component_copy b JOIN bi.tarifa_componentes t ON b.component_id = t.Id_Componente JOIN PreciosEspeciales pe ON pe.Id_Cliente = v_customer AND pe.Id_Article = b.item_id WHERE t.tarifa_class IS NULL GROUP BY b.item_id, b.warehouse_id HAVING ABS(sum_cost) > 0.001; -- Lotes DROP TEMPORARY TABLE IF EXISTS t_component_sum; CREATE TEMPORARY TABLE t_component_sum (INDEX (item_id, warehouse_id)) ENGINE = MEMORY SELECT SUM(cost) sum_cost, b.item_id, b.warehouse_id, t.tarifa_class FROM tmp.bionic_component b JOIN bi.tarifa_componentes t ON b.component_id = t.Id_Componente GROUP BY b.item_id, b.warehouse_id, t.tarifa_class; -- ***** Inicia Modifica t_bionic_rate las diferentes tarifas -- Tarifa por unidad minima DROP TEMPORARY TABLE IF EXISTS t_bionic_rate; CREATE TEMPORARY TABLE t_bionic_rate ENGINE = MEMORY SELECT b.warehouse_id, item_id, 1 rate, IF(box = 1, `grouping`, 1) `grouping`, SUM(sum_cost) price FROM t_bionic_temp b JOIN t_component_sum cs USING(item_id, warehouse_id) WHERE IFNULL(cs.tarifa_class,1) = 1 AND box < 2 AND (packing > `grouping` or box = 0) GROUP BY warehouse_id, item_id; -- Tarifa por caja INSERT INTO t_bionic_rate (warehouse_id, item_id, rate, `grouping`, price) SELECT b.warehouse_id, item_id, 2 rate, packing `grouping`, SUM(sum_cost) price FROM t_bionic_temp b JOIN t_component_sum cs USING(item_id, warehouse_id) WHERE available IS NULL OR (IFNULL(cs.tarifa_class,2) = 2 AND packing > 0 AND available >= packing) GROUP BY warehouse_id, item_id; -- Tarifa para toda la cantidad disponible INSERT INTO t_bionic_rate (warehouse_id, item_id, rate, `grouping`, price) SELECT b.warehouse_id, item_id, 3 rate, available `grouping`, SUM(sum_cost) price FROM t_bionic_temp b JOIN t_component_sum cs USING(item_id, warehouse_id) WHERE IFNULL(cs.tarifa_class,3) = 3 GROUP BY warehouse_id, item_id; -- ***** Fin Modifica t_bionic_rate las diferentes tarifas DROP TEMPORARY TABLE IF EXISTS tmp.bionic_price; CREATE TEMPORARY TABLE tmp.bionic_price LIKE template_bionic_price; INSERT INTO tmp.bionic_price (warehouse_id, item_id, rate, `grouping`, price) SELECT * FROM ( SELECT * FROM t_bionic_rate ORDER BY price ) t GROUP BY item_id, warehouse_id, `grouping`; DROP TEMPORARY TABLE IF EXISTS tmp.travel_tree; CREATE TEMPORARY TABLE tmp.travel_tree ENGINE = MEMORY SELECT * FROM tmp.agencyHourGetShipped; -- Limpieza DROP TEMPORARY TABLE tmp.agencyHourGetShipped; DROP TEMPORARY TABLE t_bionic_temp; DROP TEMPORARY TABLE t_component_sum; DROP TEMPORARY TABLE t_components_base; DROP TEMPORARY TABLE t_bionic_rate; DROP TEMPORARY TABLE tmp.bionic_component_copy; END$$ DELIMITER ; -- ALTER TABLE `vn2008`.`Tickets`----------------------------------------------------------------------- /* ALTER TABLE `vn2008`.`Tickets` ADD COLUMN `zoneFk` INT(11) NULL DEFAULT NULL AFTER `isDeleted`, ADD INDEX `Tickets_zoneFk_fk_idx` (`zoneFk` ASC); ; ALTER TABLE `vn2008`.`Tickets` ADD CONSTRAINT `Tickets_zoneFk_fk` FOREIGN KEY (`zoneFk`) REFERENCES `vn`.`zone` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE; */ -- ticketCreateWithUser ----------------------------------------------------------------------- USE `vn`; DROP procedure IF EXISTS `ticketCreateWithUser`; DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `ticketCreateWithUser`( vClientId INT ,vShipped DATE ,vWarehouseFk INT ,vCompanyFk INT ,vAddressFk INT ,vAgencyModeFk INT ,vRouteFk INT ,vlanded DATE ,vUserId INT ,OUT vNewTicket INT) BEGIN DECLARE vCount INT; IF vClientId IS NULL THEN CALL util.throw ('CLIENT_NOT_ESPECIFIED'); END IF; IF NOT vAddressFk OR vAddressFk IS NULL THEN SELECT id INTO vAddressFk FROM address WHERE clientFk = vClientId AND isDefaultAddress; END IF; IF NOT vAgencyModeFk OR vAgencyModeFk IS NULL THEN SELECT agencyModeFk INTO vAgencyModeFk FROM address WHERE clientFk = vClientId AND isDefaultAddress; END IF; CALL vn.zoneGetLanded(vShipped, vAddressFk, vAgencyModeFk, vWarehouseFk); SELECT COUNT(*) INTO vCount FROM tmp.zoneGetLanded WHERE landed = vlanded; IF vCount IS NULL OR vCount = 0 THEN CALL util.throw ('NO_ZONE_FOR_THIS_PARAMETERS'); END IF; INSERT INTO vn2008.Tickets ( Id_Cliente, Fecha, Id_Consigna, Id_Agencia, Alias, warehouse_id, Id_Ruta, empresa_id, landing ) SELECT vClientId, vShipped, a.id, IF(vAgencyModeFk, vAgencyModeFk, a.agencyModeFk), a.nickname, vWarehouseFk, IF(vRouteFk,vRouteFk,NULL), vCompanyFk, vlanded FROM address a JOIN agencyMode am ON am.id = a.agencyModeFk WHERE a.id = vAddressFk; SET vNewTicket = LAST_INSERT_ID(); INSERT INTO ticketObservation(ticketFk, observationTypeFk, description) SELECT vNewTicket, ao.observationTypeFk, ao.description FROM addressObservation ao JOIN address a ON a.id = ao.addressFk WHERE a.id = vAddressFk; -- CALL logAddWithUser(vNewTicket, vUserId, 'insert', 'ticket', CONCAT('Ha creado el ticket', ' ', vNewTicket)); INSERT INTO vn.ticketLog SET originFk = vNewTicket, userFk = vUserId, `action` = 'insert', description = CONCAT('Ha creado el ticket:', ' ', vNewTicket); IF (SELECT ct.isCreatedAsServed FROM vn.clientType ct JOIN vn.client c ON c.typeFk = ct.code WHERE c.id = vClientId ) <> FALSE THEN INSERT INTO vncontrol.inter(state_id, Id_Ticket, Id_Trabajador) SELECT id, vNewTicket, getWorker() FROM state WHERE `code` = 'DELIVERED'; END IF; END$$ DELIMITER ; -- hasZone ----------------------------------------------------------------------- USE `vn`; DROP function IF EXISTS `hasZone`; DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` FUNCTION `hasZone`(vLanded DATE, vAddress INT, vAgencyModeFk INT) RETURNS tinyint(1) DETERMINISTIC BEGIN DECLARE vHasZone BOOLEAN DEFAULT FALSE; DECLARE vPostalCode varchar(10); SELECT postalCode INTO vPostalCode FROM address WHERE id = vAddress; SELECT COUNT(*), id zoneFk, isIncluded INTO vHasZone, @trash, @trash FROM ( SELECT z.id, TIMESTAMPADD(DAY,-z.travelingDays, vLanded) shipped, vLanded landed, zi.isIncluded FROM zoneGeo zgSon JOIN zoneGeo zgFather ON zgSon.lft BETWEEN zgFather.lft AND zgFather.rgt JOIN zoneIncluded zi ON zi.geoFk = zgFather.id JOIN zone z ON z.id = zi.zoneFk JOIN zoneCalendar zc ON zc.zoneFk = z.id AND zc.delivered = vLanded AND z.agencyModeFk = vAgencyModeFk AND IF(TIMESTAMPADD(DAY,-z.travelingDays, vLanded) = CURDATE(), hour(now()) < hour(z.`hour`),TRUE) ORDER BY z.id, landed ASC, zgFather.depth DESC) t GROUP BY id HAVING isIncluded > 0 LIMIT 1; RETURN vHasZone; END$$ DELIMITER ; -- zoneGetShippedWarehouse ----------------------------------------------------------------------- USE `vn`; DROP procedure IF EXISTS `zoneGetShippedWarehouse`; DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `zoneGetShippedWarehouse`(vLanded DATE, vAddressFk INT, vAgencyModeFk INT) BEGIN /** * Devuelve la mínima fecha de envío para cada warehouse * * @param vLanded La fecha de recepcion * @param vAddressFk Id del consignatario * @param vAgencyModeFk Id de la agencia * @return tmp.zoneGetShipped */ DECLARE vPostalCode varchar(10); SELECT postalCode INTO vPostalCode FROM address WHERE id = vAddressFk; DROP TEMPORARY TABLE IF EXISTS tmp.zoneGetShipped; CREATE TEMPORARY TABLE tmp.zoneGetShipped ENGINE = MEMORY SELECT * FROM ( SELECT z.id, TIMESTAMPADD(DAY,-z.travelingDays, vLanded) shipped, zi.isIncluded,z.warehouseFk FROM zoneGeo zgSon JOIN zoneGeo zgFather ON zgSon.lft BETWEEN zgFather.lft AND zgFather.rgt JOIN zoneIncluded zi ON zi.geoFk = zgFather.id JOIN zone z ON z.id = zi.zoneFk JOIN zoneCalendar zc ON zc.zoneFk = z.id WHERE zgSon.`name` LIKE vPostalCode AND zc.delivered = vLanded AND z.agencyModeFk = vAgencyModeFk AND IF(TIMESTAMPADD(DAY,-z.travelingDays, vLanded) = CURDATE(), hour(now()) < hour(z.`hour`),TRUE) ORDER BY z.id, shipped ASC, zgFather.depth DESC) t GROUP BY warehouseFk HAVING isIncluded > 0; END$$ DELIMITER ; -- bionic_calc ----------------------------------------------------------------------- USE `vn2008`; DROP procedure IF EXISTS `bionic_calc`; DELIMITER $$ USE `vn2008`$$ CREATE DEFINER=`root`@`%` PROCEDURE `bionic_calc`( vLanded DATE, vAddress INT, vAgency INT) proc: BEGIN -- @DEPRECATED use vn.ticketCalculate DECLARE vAvailableCalc INT; DECLARE vShipped DATE; DECLARE vCustomer INT; DECLARE vWh SMALLINT; DECLARE vDone BOOL; DECLARE cTravelTree CURSOR FOR SELECT warehouseFk, shipped FROM tmp.zoneGetShippedWarehouse; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; DROP TEMPORARY TABLE IF EXISTS tmp.bionic_item, tmp.bionic_component, tmp.bionic_lot, tmp.bionic_price; -- Establece los almacenes y las fechas que van a entrar al disponible SELECT Id_Cliente INTO vCustomer FROM Consignatarios WHERE Id_Consigna = vAddress; CALL vn.zoneGetShippedWarehouse(vLanded, vAddress, vAgency); -- Crea la tabla temporal que almacenará los lotes CREATE TEMPORARY TABLE tmp.bionic_lot LIKE template_bionic_lot; OPEN cTravelTree; l: LOOP SET vDone = FALSE; FETCH cTravelTree INTO vWh, vShipped; IF vDone THEN LEAVE l; END IF; CALL `cache`.available_refresh (vAvailableCalc, FALSE, vWh, vShipped); CALL item_last_buy_ (vWh, vShipped); INSERT INTO tmp.bionic_lot (warehouse_id, item_id, available, buy_id) SELECT vWh, i.item_id, IFNULL(i.available, 0), ilb.buy_id FROM `cache`.available i JOIN tmp.bionic_calc br ON br.item_id = i.item_id LEFT JOIN Articles a ON a.Id_Article = i.item_id LEFT JOIN t_item_last_buy ilb ON ilb.item_id = i.item_id WHERE i.calc_id = vAvailableCalc AND a.Id_Article != 100 AND i.available > 0; DROP TEMPORARY TABLE t_item_last_buy; END LOOP; CLOSE cTravelTree; CALL bionic_calc_component(vAddress, vAgency); CREATE TEMPORARY TABLE tmp.bionic_item ENGINE = MEMORY SELECT b.item_id, SUM(b.available) available, p.name producer, a.Article item, a.Medida size, a.Tallos stems, a.Categoria category, a.Color, a.Foto image, o.Abreviatura origin, bl.min_price price FROM tmp.bionic_lot b JOIN Articles a ON b.item_id = a.Id_Article LEFT JOIN producer p ON p.producer_id = a.producer_id AND p.visible JOIN Origen o ON o.id = a.id_origen JOIN ( SELECT MIN(price) min_price, item_id FROM tmp.bionic_price GROUP BY item_id ) bl ON bl.item_id = b.item_id GROUP BY b.item_id; DROP TEMPORARY TABLE tmp.zoneGetShippedWarehouse; END$$ DELIMITER ; -- bionic_calc_component ----------------------------------------------------------------------- USE `vn2008`; DROP procedure IF EXISTS `bionic_calc_component`; DELIMITER $$ USE `vn2008`$$ CREATE DEFINER=`root`@`%` PROCEDURE `bionic_calc_component`(IN `v_consigna` INT, IN `v_agencia` INT) proc: BEGIN DECLARE v_customer INT; DECLARE COEFICIENTE_DE_INFLACION_GENERAL INT DEFAULT 1.0; DECLARE DENSIDAD_MINIMA_PESO_VOLUMETRICO INT DEFAULT 167; DECLARE VOLUMEN_CAJA_VERDNATURA BIGINT; -- DEFAULT 138000; -- DECLARE vValorEmbolsado DOUBLE DEFAULT 0.04; SELECT Volumen INTO VOLUMEN_CAJA_VERDNATURA FROM Cubos WHERE Id_Cubo = '94'; SELECT Id_Cliente INTO v_customer FROM Consignatarios WHERE Id_Consigna = v_consigna; SET @rate2 := 0; SET @rate3 := 0; DROP TEMPORARY TABLE IF EXISTS t_bionic_temp; CREATE TEMPORARY TABLE t_bionic_temp (PRIMARY KEY (item_id,warehouse_id)) ENGINE = MEMORY SELECT b.item_id, b.warehouse_id,available, IF((@rate2 := IFNULL(pf.rate_2,c.Tarifa2)) < a.PVP AND a.`Min`, a.PVP, @rate2) * 1.0 rate_2, IF((@rate3 := IFNULL(pf.rate_3,c.Tarifa3)) < a.PVP AND a.`Min`, a.PVP, @rate3) * 1.0 rate_3, ifnull(pf.rate_3,0) AS min_price, IFNULL(pf.Packing,c.Packing) packing, IFNULL(pf.`grouping`,c.`grouping`) `grouping`, ABS(IFNULL(pf.caja,c.caja)) box, b.buy_id, a.tipo_id FROM tmp.bionic_lot b JOIN vn2008.Compres c ON b.buy_id = c.Id_Compra JOIN vn2008.Articles a ON b.item_id = a.Id_Article JOIN vn2008.Tipos t ON t.tipo_id = a.tipo_id LEFT JOIN vn2008.reinos r ON r.id = t.reino_id LEFT JOIN vn2008.PreciosEspeciales p ON a.Id_Article = p.Id_Article AND p.Id_Cliente = v_customer LEFT JOIN ( SELECT * FROM ( SELECT p.item_id, p.`grouping`, p.Packing, p.caja, p.rate_2, p.rate_3, zgs.warehouseFk AS warehouse_id FROM vn2008.price_fixed p JOIN tmp.zoneGetShipped zgs ON zgs.warehouseFk = p.warehouse_id OR p.warehouse_id = 0 WHERE zgs.shipped BETWEEN p.date_start AND p.date_end ORDER BY p.item_id, p.warehouse_id DESC ) t GROUP BY item_id, warehouse_id ) pf ON pf.item_id = b.item_id AND pf.warehouse_id = b.warehouse_id -- descartamos articulos con coste menor de 0.01 WHERE Costefijo + Portefijo + Embalajefijo + Comisionfija > 0.01 AND r.display <> 0; -- Creamos la tabla tmp.bionic_component DROP TEMPORARY TABLE IF EXISTS tmp.bionic_component; CREATE TEMPORARY TABLE tmp.bionic_component LIKE template_bionic_component; -- Componentes del precio, valores absolutos INSERT INTO tmp.bionic_component ( warehouse_id, item_id, component_id, cost) SELECT b.warehouse_id, b.item_id, 29, rate_3 - Costefijo - Portefijo - Embalajefijo - Comisionfija FROM t_bionic_temp b JOIN vn2008.Compres c ON b.buy_id = c.Id_Compra; INSERT INTO tmp.bionic_component ( warehouse_id, item_id, component_id, cost) SELECT b.warehouse_id, b.item_id, 28, Costefijo + Portefijo + Embalajefijo + Comisionfija FROM t_bionic_temp b JOIN vn2008.Compres c ON b.buy_id = c.Id_Compra; -- Ahora los valores en funcion de la base DROP TEMPORARY TABLE IF EXISTS t_components_base; CREATE TEMPORARY TABLE t_components_base SELECT bc.item_id, ROUND(SUM(cost), 4) AS base, bc.warehouse_id FROM tmp.bionic_component bc GROUP BY bc.item_id,warehouse_id; -- La ratio se calcula teniendo en cuenta el valor de las reclamaciones y el saldo de greuge INSERT INTO tmp.bionic_component SELECT cb.warehouse_id, item_id, 17, ROUND(base * LEAST(recobro,0.25), 3) FROM t_components_base cb JOIN bi.claims_ratio ON Id_Cliente = v_customer WHERE recobro > 0.009; -- PAK 2016-08-31 Componente de maná automático, en función del maná acumulado por el comercial. INSERT INTO tmp.bionic_component SELECT cb.warehouse_id, item_id, 39, ROUND(base * (0.01 + prices_modifier_rate), 3) as manaAuto FROM t_components_base cb JOIN Clientes c on c.Id_Cliente = v_customer JOIN bs.mana_spellers ms ON c.Id_Trabajador = ms.Id_Trabajador WHERE ms.prices_modifier_activated AND c.Id_Trabajador != 196 -- Ruben Espinosa HAVING manaAuto <> 0 ; /* -- Vendedor variable INSERT INTO tmp.bionic_component SELECT cb.warehouse_id, item_id, Id_Componente, IFNULL(ROUND(base * tax,4), 0) FROM t_components_base cb JOIN bi.tarifa_componentes WHERE tarifa_componentes_series_id = 2 and IFNULL(tax, 0) > 0; */ -- ******* Inicio Bloque para componentes con tarifa_class diferente de NULL -- Descuento por ultimas unidades INSERT INTO tmp.bionic_component SELECT cb.warehouse_id, b.item_id, Id_Componente, GREATEST(IFNULL(ROUND(base * tax,4), 0), b.min_price - b.rate_3) FROM t_components_base cb JOIN bi.tarifa_componentes JOIN t_bionic_temp b ON b.item_id = cb.item_id AND b.warehouse_id = cb.warehouse_id LEFT JOIN PreciosEspeciales pe ON pe.Id_Cliente = v_customer AND pe.Id_Article = b.item_id WHERE Id_Componente = 32 AND tax <> 0 AND b.min_price < b.rate_3 AND PrecioEspecial IS NULL; -- Incremento por paquete suelto INSERT INTO tmp.bionic_component SELECT b.warehouse_id, b.item_id, 22, rate_2 - rate_3 FROM t_bionic_temp b JOIN vn2008.Compres c ON b.buy_id = c.Id_Compra LEFT JOIN PreciosEspeciales pe ON pe.Id_Cliente = v_customer AND pe.Id_Article = b.item_id WHERE PrecioEspecial IS NULL; -- ******* Fin Bloque para componentes con tarifa_class diferente de NULL -- Reparto INSERT INTO tmp.bionic_component SELECT b.warehouse_id , b.item_id , 15 , COEFICIENTE_DE_INFLACION_GENERAL * ROUND( r.cm3 * art.compression * IF(a.Vista = 1, (GREATEST(art.density,DENSIDAD_MINIMA_PESO_VOLUMETRICO) / DENSIDAD_MINIMA_PESO_VOLUMETRICO ) , 1) * IFNULL(az.price * az.inflacion ,50) / VOLUMEN_CAJA_VERDNATURA, 4 ) cost FROM t_bionic_temp b JOIN vn2008.Articles art ON art.Id_Article = b.item_id JOIN vn2008.Agencias a ON a.Id_Agencia = v_agencia JOIN vn2008.Consignatarios c ON c.Id_Consigna = v_consigna JOIN vn2008.Agencias_province ap ON ap.agency_id = a.agency_id AND ap.warehouse_id = b.warehouse_id AND ap.province_id = c.province_id JOIN vn2008.Agencias_zonas az ON az.Id_Agencia = v_agencia AND az.zona = ap.zona AND az.Id_Article = 71 AND az.warehouse_id = b.warehouse_id LEFT JOIN bi.rotacion r ON r.warehouse_id = b.warehouse_id AND r.Id_Article = b.item_id HAVING cost <> 0; -- Reparto bonificado INSERT INTO tmp.bionic_component SELECT b.warehouse_id , b.item_id , 41 , COEFICIENTE_DE_INFLACION_GENERAL * ROUND( r.cm3 * art.compression * IF(a.Vista = 1, (GREATEST(art.density,DENSIDAD_MINIMA_PESO_VOLUMETRICO) / DENSIDAD_MINIMA_PESO_VOLUMETRICO ) , 1) -- * awb.bonus * az.inflacion / VOLUMEN_CAJA_VERDNATURA, 4 ) cost FROM t_bionic_temp b JOIN vn2008.Articles art ON art.Id_Article = b.item_id JOIN vn2008.Agencias a ON a.Id_Agencia = v_agencia JOIN vn2008.Consignatarios c ON c.Id_Consigna = v_consigna JOIN vn2008.Agencias_province ap ON ap.agency_id = a.agency_id AND ap.warehouse_id = b.warehouse_id AND ap.province_id = c.province_id JOIN vn2008.Agencias_zonas az ON az.Id_Agencia = v_agencia AND az.zona = ap.zona AND az.Id_Article = 71 AND az.warehouse_id = b.warehouse_id -- JOIN vn2008.agency_weekday_bonus awb ON awb.warehouse_id = az.warehouse_id AND awb.zona = az.zona AND a.agency_id = awb.agency_id LEFT JOIN bi.rotacion r ON r.warehouse_id = b.warehouse_id AND r.Id_Article = b.item_id JOIN tmp.agencyHourGetShipped ah ON ah.warehouseFk = awb.warehouse_id AND weekday(ah.landed) = awb.weekDay HAVING cost <> 0 LIMIT 1; -- PAK 12-05-2015 -- EMBOLSADO IF (SELECT COUNT(*) FROM vn.addressForPackaging WHERE addressFk = v_consigna) THEN -- IF v_consigna IN (13690, 3402, 5661, 4233) THEN INSERT INTO tmp.bionic_component SELECT b.warehouse_id, b.item_id, 38, ap.packagingValue cost FROM t_bionic_temp b JOIN vn.addressForPackaging ap WHERE ap.addressFk = v_consigna; END IF; -- JGF 14-08-2015 -- Modificacion de precio por dia de preparacion del pedido INSERT INTO tmp.bionic_component SELECT cb.warehouse_id, cb.item_id, 14, cb.base * (IFNULL(pe.percentage,pp.percentage)/100) FROM t_components_base cb JOIN tmp.agencyHourGetShipped ah ON ah.warehouseFk = cb.warehouse_id LEFT JOIN vn2008.preparation_percentage pp ON pp.week_day = weekday(ah.shipped) AND cb.warehouse_id = IFNULL(pp.warehouse_id,cb.warehouse_id) LEFT JOIN vn2008.preparation_exception pe ON pe.exception_day = ah.shipped AND cb.warehouse_id = IFNULL(pe.warehouse_id,cb.warehouse_id) WHERE IFNULL(pe.percentage,pp.percentage); -- Creamos la tabla tmp.bionic_component_copy por que mysql no puede reabrir una tabla temporal DROP TEMPORARY TABLE IF EXISTS tmp.bionic_component_copy; CREATE TEMPORARY TABLE tmp.bionic_component_copy SELECT * FROM tmp.bionic_component; -- JGF 19-01-2016 -- Precios especiales INSERT INTO tmp.bionic_component SELECT b.warehouse_id, b.item_id, 10, pe.PrecioEspecial - SUM(cost) sum_cost FROM tmp.bionic_component_copy b JOIN bi.tarifa_componentes t ON b.component_id = t.Id_Componente JOIN PreciosEspeciales pe ON pe.Id_Cliente = v_customer AND pe.Id_Article = b.item_id WHERE t.tarifa_class IS NULL GROUP BY b.item_id, b.warehouse_id HAVING ABS(sum_cost) > 0.001; -- Lotes DROP TEMPORARY TABLE IF EXISTS t_component_sum; CREATE TEMPORARY TABLE t_component_sum (INDEX (item_id, warehouse_id)) ENGINE = MEMORY SELECT SUM(cost) sum_cost, b.item_id, b.warehouse_id, t.tarifa_class FROM tmp.bionic_component b JOIN bi.tarifa_componentes t ON b.component_id = t.Id_Componente GROUP BY b.item_id, b.warehouse_id, t.tarifa_class; -- ***** Inicia Modifica t_bionic_rate las diferentes tarifas -- Tarifa por unidad minima DROP TEMPORARY TABLE IF EXISTS t_bionic_rate; CREATE TEMPORARY TABLE t_bionic_rate ENGINE = MEMORY SELECT b.warehouse_id, item_id, 1 rate, IF(box = 1, `grouping`, 1) `grouping`, SUM(sum_cost) price FROM t_bionic_temp b JOIN t_component_sum cs USING(item_id, warehouse_id) WHERE IFNULL(cs.tarifa_class,1) = 1 AND box < 2 AND (packing > `grouping` or box = 0) GROUP BY warehouse_id, item_id; -- Tarifa por caja INSERT INTO t_bionic_rate (warehouse_id, item_id, rate, `grouping`, price) SELECT b.warehouse_id, item_id, 2 rate, packing `grouping`, SUM(sum_cost) price FROM t_bionic_temp b JOIN t_component_sum cs USING(item_id, warehouse_id) WHERE available IS NULL OR (IFNULL(cs.tarifa_class,2) = 2 AND packing > 0 AND available >= packing) GROUP BY warehouse_id, item_id; -- Tarifa para toda la cantidad disponible INSERT INTO t_bionic_rate (warehouse_id, item_id, rate, `grouping`, price) SELECT b.warehouse_id, item_id, 3 rate, available `grouping`, SUM(sum_cost) price FROM t_bionic_temp b JOIN t_component_sum cs USING(item_id, warehouse_id) WHERE IFNULL(cs.tarifa_class,3) = 3 GROUP BY warehouse_id, item_id; -- ***** Fin Modifica t_bionic_rate las diferentes tarifas DROP TEMPORARY TABLE IF EXISTS tmp.bionic_price; CREATE TEMPORARY TABLE tmp.bionic_price LIKE template_bionic_price; INSERT INTO tmp.bionic_price (warehouse_id, item_id, rate, `grouping`, price) SELECT * FROM ( SELECT * FROM t_bionic_rate ORDER BY price ) t GROUP BY item_id, warehouse_id, `grouping`; DROP TEMPORARY TABLE IF EXISTS tmp.travel_tree; CREATE TEMPORARY TABLE tmp.travel_tree ENGINE = MEMORY SELECT * FROM tmp.agencyHourGetShipped; -- Limpieza DROP TEMPORARY TABLE tmp.agencyHourGetShipped; DROP TEMPORARY TABLE t_bionic_temp; DROP TEMPORARY TABLE t_component_sum; DROP TEMPORARY TABLE t_components_base; DROP TEMPORARY TABLE t_bionic_rate; DROP TEMPORARY TABLE tmp.bionic_component_copy; END$$ DELIMITER ; /* -- bionic_from_ticket ----------------------------------------------------------------------- USE `vn2008`; DROP procedure IF EXISTS `bionic_from_ticket`; DELIMITER $$ USE `vn2008`$$ CREATE DEFINER=`root`@`%` PROCEDURE `bionic_from_ticket`( -- DEPRECATED use vn.ticketComponentPreview vLanded DATE, -- fecha de recepcion de mercancia v_consigna INT, v_agencia INT, v_ticket INT) BEGIN DECLARE vWarehouseFk INT; DECLARE vShipped DATE; SELECT warehouse_id INTO vWarehouseFk FROM Tickets WHERE Id_Ticket = v_ticket; CALL bionic_free(); CALL vn.zoneGetShippedWarehouse(vLanded,v_consigna, v_agencia); SELECT shipped INTO vShipped FROM tmp.zoneGetShipped WHERE warehouseFk = vWarehouseFk; CALL item_last_buy_ (vWarehouseFk, vShipped); DROP TEMPORARY TABLE IF EXISTS tmp.bionic_lot; CREATE TEMPORARY TABLE tmp.bionic_lot SELECT ilb.warehouse_id, NULL available, m.Id_Article item_id, ilb.buy_id FROM Movimientos m LEFT JOIN t_item_last_buy ilb ON ilb.item_id = m.Id_Article WHERE m.Id_Ticket = v_ticket AND m.Id_Article != 100 GROUP BY warehouse_id, item_id; DROP TEMPORARY TABLE t_item_last_buy; CALL bionic_calc_component ( v_consigna, v_agencia); REPLACE INTO tmp.bionic_component (warehouse_id, item_id, component_id, cost) SELECT t.warehouse_id, m.Id_Article, mc.Id_Componente, mc.Valor FROM Movimientos_componentes mc JOIN Movimientos m ON m.Id_Movimiento = mc.Id_Movimiento JOIN Tickets t ON t.Id_Ticket = m.Id_Ticket JOIN tarifa_componentes tc ON tc.Id_componente = mc.Id_Componente WHERE m.Id_Ticket = v_ticket AND tc.is_renewable = FALSE; -- para recuperar el shipment en caso de que se necesite SET @shipment = vShipped; DROP TEMPORARY TABLE tmp.bionic_lot; IF IFNULL(vShipped,CURDATE() - 1) < CURDATE() THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'No se puede realizar el cambio'; END IF; END$$ DELIMITER ; */ -- ticketCalculate ---------------------------------------------------------------------- USE `vn`; DROP procedure IF EXISTS `ticketCalculate`; DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `ticketCalculate`( vLanded DATE, vAddressFk INT, vAgencyModeFk INT) proc: BEGIN /** * Calcula los articulos disponibles y sus precios * * @table tmp.item(itemFk) Listado de artículos a calcular * @param vLanded Fecha de recepcion de mercancia * @param vAddressFk Id del consignatario * @param vAgencyModeFk Id de la agencia * @return tmp.ticketCalculateItem(itemFk, available, producer, * item, size, stems, category, inkFk, image, origin, price) * @return tmp.ticketLot(warehouseFk, itemFk, available, buyFk) * @return tmp.ticketComponent * @return tmp.ticketComponentPrice * @return tmp.zoneGetShipped **/ DECLARE vAvailableCalc INT; DECLARE vShipment DATE; DECLARE vClient INT; DECLARE vWarehouseFk SMALLINT; DECLARE vDone BOOL; DECLARE cTravelTree CURSOR FOR SELECT warehouseFk, shipped FROM tmp.zoneGetShipped; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; -- Establece los almacenes y las fechas que van a entrar al disponible SELECT clientFk INTO vClient FROM address WHERE id = vAddressFk; CALL vn.zoneGetShippedWarehouse(vLanded, vAddressFk, vAgencyModeFk); DROP TEMPORARY TABLE IF EXISTS tmp.ticketLot; CREATE TEMPORARY TABLE tmp.ticketLot( `warehouseFk` smallint(5) unsigned NOT NULL, `itemFk` int(11) NOT NULL, `available` double DEFAULT NULL, `buyFk` int(11) DEFAULT NULL, `fix` tinyint(3) unsigned DEFAULT '0', KEY `itemFk` (`itemFk`), KEY `item_warehouse` (`itemFk`,`warehouseFk`) USING HASH ) ENGINE=MEMORY DEFAULT CHARSET=utf8; OPEN cTravelTree; l: LOOP SET vDone = FALSE; FETCH cTravelTree INTO vWarehouseFk, vShipment; IF vDone THEN LEAVE l; END IF; CALL `cache`.available_refresh (vAvailableCalc, FALSE, vWarehouseFk, vShipment); CALL buyUltimate (vWarehouseFk, vShipment); INSERT INTO tmp.ticketLot (warehouseFk, itemFk, available, buyFk) SELECT vWarehouseFk, i.item_id, IFNULL(i.available, 0), bu.buyFk FROM `cache`.available i JOIN tmp.item br ON br.itemFk = i.item_id LEFT JOIN item it ON it.id = i.item_id LEFT JOIN tmp.buyUltimate bu ON bu.itemFk = i.item_id WHERE i.calc_id = vAvailableCalc AND it.id != 100 AND i.available > 0; DROP TEMPORARY TABLE tmp.buyUltimate; END LOOP; CLOSE cTravelTree; CALL vn.ticketComponentCalculate(vAddressFk, vAgencyModeFk); DROP TEMPORARY TABLE IF EXISTS tmp.ticketCalculateItem; CREATE TEMPORARY TABLE tmp.ticketCalculateItem ENGINE = MEMORY SELECT b.itemFk, SUM(b.available) available, p.name producer, i.name item, i.size size, i.stems, i.category, i.inkFk, i.image, o.code origin, bl.price FROM tmp.ticketLot b JOIN item i ON b.itemFk = i.id LEFT JOIN producer p ON p.id = i.producerFk AND p.isVisible JOIN origin o ON o.id = i.originFk JOIN ( SELECT MIN(price) price, itemFk FROM tmp.ticketComponentPrice GROUP BY itemFk ) bl ON bl.itemFk = b.itemFk GROUP BY b.itemFk; END$$ DELIMITER ; -- ticketCalculateSale ---------------------------------------------------------------------- USE `vn`; DROP procedure IF EXISTS `ticketCalculateSale`; DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `ticketCalculateSale`(IN vSale BIGINT) proc: BEGIN DECLARE vShipped DATE; DECLARE vWarehouse SMALLINT; DECLARE vAgencyMode INT; DECLARE vAddress INT; DECLARE vTicket BIGINT; DECLARE vItem BIGINT; DECLARE vLanded DATE; DECLARE vTicketFree BOOLEAN DEFAULT TRUE; SELECT FALSE INTO vTicketFree FROM vn.ticket t JOIN vn.sale s ON s.ticketFk = t.id LEFT JOIN vn.ticketState ts ON ts.ticketFk = t.id WHERE s.id = vSale AND (t.refFk != "" OR (ts.alertLevel > 0 AND s.price != 0)) LIMIT 1; SELECT ticketFk, itemFk INTO vTicket, vItem FROM sale WHERE id = vSale; SELECT t.warehouseFk, DATE(t.shipped), t.addressFk, t.agencyModeFk, t.landed INTO vWarehouse, vShipped, vAddress, vAgencyMode, vLanded FROM agencyMode a JOIN ticket t ON t.agencyModeFk = a.id WHERE t.id = vTicket; DROP TEMPORARY TABLE IF EXISTS tmp.zoneGetShipped; CREATE TEMPORARY TABLE tmp.zoneGetShipped ENGINE = MEMORY SELECT vWarehouse warehouseFk, vShipped shipped, vLanded landed; CALL buyUltimate (vWarehouse, vShipped); DELETE FROM tmp.buyUltimate WHERE itemFk != vItem; DROP TEMPORARY TABLE IF EXISTS tmp.ticketLot; CREATE TEMPORARY TABLE tmp.ticketLot SELECT vWarehouse warehouseFk, NULL available, vItem itemFk, buyFk FROM tmp.buyUltimate WHERE itemFk = vItem; CALL ticketComponentCalculate(vAddress, vAgencyMode); DROP TEMPORARY TABLE IF EXISTS tmp.sale; CREATE TEMPORARY TABLE tmp.sale (PRIMARY KEY (saleFk)) ENGINE = MEMORY SELECT vSale saleFk,vWarehouse warehouseFk; CALL ticketComponentUpdateSale(IF(vTicketFree,1,6)); INSERT INTO vn.ticketLog (originFk, userFk, `action`, description) VALUES (vTicket, account.userGetId(), 'update', CONCAT('Bionizo linea id ', vSale)); DROP TEMPORARY TABLE tmp.buyUltimate; END$$ DELIMITER ; -- zoneGetAgency --------------------------------------------------------------------------------- USE `vn`; DROP procedure IF EXISTS `zoneGetAgency`; DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `zoneGetAgency`(vAddress INT, vLanded DATE) BEGIN /** * Devuelve el listado de agencias disponibles para la fecha * y dirección pasadas. * * @param vAddress Id de dirección de envío, %NULL si es recogida * @param vDate Fecha de recogida * @select Listado de agencias disponibles */ DECLARE vPostalCode varchar(10); SELECT postalCode INTO vPostalCode FROM address WHERE id = vAddress; DROP TEMPORARY TABLE IF EXISTS tmp.zoneGetAgency; CREATE TEMPORARY TABLE tmp.zoneGetAgency (INDEX (agencyModeFk)) ENGINE = MEMORY SELECT * FROM ( SELECT am.id agencyModeFk, am.name agencyMode, am.description, am.deliveryMethodFk, TIMESTAMPADD(DAY,-z.travelingDays, vLanded) shipped, zi.isIncluded, z.warehouseFk FROM zoneGeo zgSon JOIN zoneGeo zgFather ON zgSon.lft BETWEEN zgFather.lft AND zgFather.rgt JOIN zoneIncluded zi ON zi.geoFk = zgFather.id JOIN zone z ON z.id = zi.zoneFk JOIN zoneCalendar zc ON zc.zoneFk = z.id JOIN agencyMode am ON am.id = z.agencyModeFk WHERE zgSon.`name` LIKE vPostalCode AND zc.delivered = vLanded AND IF(TIMESTAMPADD(DAY,-z.travelingDays, vLanded) = CURDATE(), hour(now()) < hour(z.`hour`),TRUE) ORDER BY zgFather.depth DESC) t GROUP BY agencyModeFk HAVING isIncluded > 0; END$$ DELIMITER ; -- bionic_available_type_filters --------------------------------------------------------------------- USE `vn2008`; DROP procedure IF EXISTS `bionic_available_types_filter`; DELIMITER $$ CREATE DEFINER=`root`@`%` PROCEDURE `bionic_available_types_filter`( v_date DATE, v_consigna INT, v_agencia INT) BEGIN /** * Este procedimiento devuelve una tabla t_bionic_available_types * que debe de ser borrar por quien la llame, y se conecta con la tabla articlelist * que tambien hay que eliminar. * * @param vDatefecha de recepcion de mercancia * @table t_bionic_available_types */ CALL vn.ticketCalculate(v_date, v_consigna, v_agencia); -- Introducimos los valores en una tabla temporal DROP TEMPORARY TABLE IF EXISTS t_bionic_available_types; CALL check_table_existence('articlelist'); IF @table_exists THEN call util.throw('No usar articlelist'); -- SET v_list = 'JOIN vn2008.articlelist AL ON AL.Id_Article = a.Id_Article '; END IF; CREATE TEMPORARY TABLE t_bionic_available_types SELECT a.tipo_id, t.Tipo, r.reino, count(*) as item_count FROM tmp.ticketCalculateItem tci JOIN vn2008.Articles a ON tci.itemFk = a.Id_Article JOIN vn2008.Tipos t ON t.tipo_id = a.tipo_id JOIN vn2008.reinos r ON r.id = t.reino_id WHERE tci.available > 0 GROUP BY a.tipo_id; DROP TEMPORARY TABLE tmp.ticketCalculateItem; END$$ DELIMITER ; -- ticketCalculateFromType --------------------------------------------------------------------- USE `vn`; DROP procedure IF EXISTS `ticketCalculateFromType`; DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `ticketCalculateFromType`( vLanded DATE, vAddressFk INT, vAgencyModeFk INT, vTypeFk INT) BEGIN DROP TEMPORARY TABLE IF EXISTS tmp.item; CREATE TEMPORARY TABLE tmp.item (INDEX (itemFk)) ENGINE = MEMORY SELECT id itemFk FROM vn.item WHERE typeFk = vTypeFk; CALL ticketCalculate(vLanded, vAddressFk, vAgencyModeFk); DROP TEMPORARY TABLE tmp.item; DROP TEMPORARY TABLE tmp.ticketLot; END$$ DELIMITER ; -- order_confirmWithUser` --------------------------------------------------------------------- USE `hedera`; DROP PROCEDURE IF EXISTS `orderConfirm`; DROP procedure IF EXISTS `order_confirm_bionic`; DROP procedure IF EXISTS `orderConfirmWithUser`; DROP procedure IF EXISTS `order_confirmWithUser`; DELIMITER $$ USE `hedera`$$ CREATE DEFINER=`root`@`%` PROCEDURE `order_confirmWithUser`(IN `vOrder` INT, IN `vUserId` INT) BEGIN /** * Confirms an order, creating each of its tickets on the corresponding * date, store and user. * * @param vOrder The order identifier * @param vUser The user identifier */ DECLARE vOk BOOL; DECLARE vDone BOOL DEFAULT FALSE; DECLARE vWarehouse INT; DECLARE vShipment DATETIME; DECLARE vTicket INT; DECLARE vNotes VARCHAR(255); DECLARE vItem INT; DECLARE vConcept VARCHAR(30); DECLARE vAmount INT; DECLARE vPrice DECIMAL(10,2); DECLARE vSale INT; DECLARE vRate INT; DECLARE vRowId INT; DECLARE vDelivery DATE; DECLARE vAddress INT; DECLARE vIsConfirmed BOOL; DECLARE vClientId INT; DECLARE vCompanyId INT; DECLARE vAgencyModeId INT; DECLARE TICKET_FREE INT DEFAULT 2; DECLARE SYSTEM_WORKER INT DEFAULT 20; DECLARE cDates CURSOR FOR SELECT zgs.shipped, r.warehouse_id FROM `order` o JOIN order_row r ON r.order_id = o.id LEFT JOIN tmp.zoneGetShipped zgs ON zgs.warehouseFk = r.warehouse_id WHERE o.id = vOrder AND r.amount != 0 GROUP BY r.warehouse_id; DECLARE cRows CURSOR FOR SELECT r.id, r.item_id, a.Article, r.amount, r.price, r.rate FROM order_row r JOIN vn2008.Articles a ON a.Id_Article = r.item_id WHERE r.amount != 0 AND r.warehouse_id = vWarehouse AND r.order_id = vOrder ORDER BY r.rate DESC; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; RESIGNAL; END; -- Carga los datos del pedido SELECT o.date_send, o.address_id, o.note, o.confirmed, cs.Id_Cliente, o.company_id, o.agency_id INTO vDelivery, vAddress, vNotes, vIsConfirmed, vClientId, vCompanyId, vAgencyModeId FROM hedera.`order` o JOIN vn2008.Consignatarios cs ON cs.Id_Consigna = o.address_id WHERE id = vOrder; -- Comprueba que el pedido no está confirmado IF vIsConfirmed THEN CALL util.throw ('ORDER_ALREADY_CONFIRMED'); END IF; -- Comprueba que el pedido no está vacío SELECT COUNT(*) > 0 INTO vOk FROM order_row WHERE order_id = vOrder AND amount > 0; IF !vOk THEN CALL util.throw ('ORDER_EMPTY'); END IF; -- Carga las fechas de salida de cada almacén CALL vn.zoneGetShippedWarehouse (vDelivery, vAddress, vAgencyModeId); -- Trabajador que realiza la acción IF vUserId IS NULL THEN SELECT employeeFk INTO vUserId FROM orderConfig; END IF; -- Crea los tickets del pedido START TRANSACTION; OPEN cDates; lDates: LOOP SET vTicket = NULL; SET vDone = FALSE; FETCH cDates INTO vShipment, vWarehouse; IF vDone THEN LEAVE lDates; END IF; -- Busca un ticket existente que coincida con los parametros SELECT Id_Ticket INTO vTicket FROM vn2008.Tickets t LEFT JOIN vn.ticketState tls on tls.ticket = t.Id_Ticket JOIN `order` o ON o.address_id = t.Id_Consigna AND vWarehouse = t.warehouse_id AND o.agency_id = t.Id_Agencia AND t.landing = o.date_send AND vShipment = DATE(t.Fecha) WHERE o.id = vOrder AND t.Factura IS NULL AND IFNULL(tls.alertLevel,0) = 0 AND t.Id_Cliente <> 1118 LIMIT 1; -- Crea el ticket en el caso de no existir uno adecuado IF vTicket IS NULL THEN CALL vn.ticketCreateWithUser( vClientId, IFNULL(vShipment, CURDATE()), vWarehouse, vCompanyId, vAddress, vAgencyModeId, NULL, vDelivery, vUserId, vTicket ); ELSE INSERT INTO vncontrol.inter SET Id_Ticket = vTicket, Id_Trabajador = SYSTEM_WORKER, state_id = TICKET_FREE; END IF; INSERT IGNORE INTO vn2008.order_Tickets SET order_id = vOrder, Id_Ticket = vTicket; -- Añade las notas IF vNotes IS NOT NULL AND vNotes != '' THEN INSERT INTO vn2008.ticket_observation SET Id_Ticket = vTicket, observation_type_id = 4 /* salesperson */, `text` = vNotes ON DUPLICATE KEY UPDATE `text` = CONCAT(VALUES(`text`),'. ', `text`); END IF; -- Añade los movimientos y sus componentes OPEN cRows; lRows: LOOP SET vDone = FALSE; FETCH cRows INTO vRowId, vItem, vConcept, vAmount, vPrice, vRate; IF vDone THEN LEAVE lRows; END IF; INSERT INTO vn2008.Movimientos SET Id_Article = vItem, Id_Ticket = vTicket, Concepte = vConcept, Cantidad = vAmount, Preu = vPrice, CostFixat = 0, PrecioFijado = TRUE; SET vSale = LAST_INSERT_ID(); INSERT INTO vn2008.Movimientos_componentes (Id_Movimiento, Id_Componente, Valor) SELECT vSale, cm.component_id, cm.price FROM order_component cm JOIN bi.tarifa_componentes tc ON tc.Id_Componente = cm.component_id WHERE cm.order_row_id = vRowId GROUP BY vSale, cm.component_id; UPDATE order_row SET Id_Movimiento = vSale WHERE id = vRowId; END LOOP; CLOSE cRows; -- Fija el coste DROP TEMPORARY TABLE IF EXISTS tComponents; CREATE TEMPORARY TABLE tComponents (INDEX (saleFk)) ENGINE = MEMORY SELECT SUM(mc.Valor) valueSum, mc.Id_Movimiento saleFk FROM vn2008.Movimientos_componentes mc JOIN bi.tarifa_componentes tc USING(Id_Componente) JOIN bi.tarifa_componentes_series tcs ON tcs.tarifa_componentes_series_id = tc.tarifa_componentes_series_id AND tcs.base JOIN vn2008.Movimientos m ON m.Id_Movimiento = mc.Id_Movimiento WHERE m.Id_Ticket = vTicket GROUP BY mc.Id_Movimiento; UPDATE vn2008.Movimientos m JOIN tComponents mc ON mc.saleFk = m.Id_Movimiento SET m.CostFixat = valueSum; DROP TEMPORARY TABLE tComponents; END LOOP; CLOSE cDates; DELETE FROM basketOrder WHERE orderFk = vOrder; UPDATE `order` SET confirmed = TRUE, confirm_date = NOW() WHERE id = vOrder; COMMIT; END$$ DELIMITER ; -- orderConfirmWithUser` --------------------------------------------------------------------- USE `vn`; DROP procedure IF EXISTS `vn`.`agencyHourGetAgency`; DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `agencyHourGetAgencyKk`(vAddress INT, vDate DATE) BEGIN /** * DEPRECATED usar zoneGetAgency * Devuelve el listado de agencias disponibles para la fecha * y dirección pasadas. * * @param vAddress Id de dirección de envío, %NULL si es recogida * @param vDate Fecha de recogida * @table agencyModeList Listado de agencias disponibles */ DECLARE vAgency INT; DECLARE vDone BOOL DEFAULT FALSE; DECLARE vCur CURSOR FOR SELECT DISTINCT a.id FROM agency a JOIN agencyHour ah ON ah.agencyFk = a.id; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; DROP TEMPORARY TABLE IF EXISTS agencyModeList; CREATE TEMPORARY TABLE agencyModeList ( id INT NOT NULL, agency VARCHAR(20), description VARCHAR(45), deliveryMethodFk VARCHAR(45), shipped DATE, warehouse VARCHAR(45), PRIMARY KEY(id) ) ENGINE = MEMORY; OPEN vCur; FETCH vCur INTO vAgency; WHILE NOT vDone DO CALL vn.agencyHourGetShipped(vDate, vAddress, vAgency); INSERT INTO agencyModeList SELECT a.id, a.name, a.description, a.deliveryMethodFk, ah.shipped, w.name FROM agencyMode a JOIN tmp.agencyHourGetShipped ah JOIN warehouse w on w.id = ah.warehouseFk WHERE a.agencyFk = vAgency AND a.web ON DUPLICATE KEY UPDATE warehouse = CONCAT(warehouse, ', ', w.name); FETCH vCur INTO vAgency; END WHILE; CLOSE vCur; DROP TEMPORARY TABLE tmp.agencyHourGetShipped; SELECT * FROM agencyModeList; DROP TEMPORARY TABLE IF EXISTS agencyModeList; END$$ DELIMITER ; -- ticketComponentPreview` --------------------------------------------------------------------- USE `vn`; DROP procedure IF EXISTS `ticketComponentPreview`; DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `ticketComponentPreview`( vTicketFk INT, vLanded DATE, vAddressFk INT, vAgencyModeFk INT, vWarehouseFk SMALLINT) BEGIN DECLARE vShipped DATE; DECLARE vBuyOrderItem INT DEFAULT 100; DECLARE vHasDataChanged BOOL DEFAULT FALSE; DECLARE vHasAddressChanged BOOL; DECLARE vHasAgencyModeChanged BOOL DEFAULT FALSE; DECLARE vHasWarehouseChanged BOOL DEFAULT FALSE; DECLARE vAddressTypeRateFk INT DEFAULT NULL; DECLARE vAgencyModeTypeRateFk INT DEFAULT NULL; DECLARE vHasChangeAll BOOL DEFAULT FALSE; SELECT DATE(landed) <> vLanded, addressFk <> vAddressFk, agencyModeFk <> vAgencyModeFk, warehouseFk <> vWarehouseFk INTO vHasDataChanged, vHasAddressChanged, vHasAgencyModeChanged, vHasWarehouseChanged FROM vn.ticket t WHERE t.id = vTicketFk; IF vHasDataChanged OR vHasWarehouseChanged THEN SET vHasChangeAll = TRUE; END IF; IF vHasAddressChanged THEN SET vAddressTypeRateFk = 5; END IF; IF vHasAgencyModeChanged THEN SET vAgencyModeTypeRateFk = 6; END IF; CALL zoneGetShippedWarehouse(vLanded, vAddressFk, vAgencyModeFk); SELECT shipped INTO vShipped FROM tmp.zoneGetShipped WHERE warehouseFk = vWarehouseFk; CALL buyUltimate(vWarehouseFk, vShipped); DROP TEMPORARY TABLE IF EXISTS tmp.ticketLot; CREATE TEMPORARY TABLE tmp.ticketLot ENGINE = MEMORY ( SELECT vWarehouseFk AS warehouseFk, NULL AS available, s.itemFk, bu.buyFk FROM sale s LEFT JOIN tmp.buyUltimate bu ON bu.itemFk = s.itemFk WHERE s.ticketFk = vTicketFk AND s.itemFk != vBuyOrderItem GROUP BY bu.warehouseFk, bu.itemFk); CALL ticketComponentCalculate(vAddressFk, vAgencyModeFk); REPLACE INTO tmp.ticketComponent (warehouseFk, itemFk, componentFk, cost) SELECT t.warehouseFk, s.itemFk, sc.componentFk, sc.value FROM saleComponent sc JOIN sale s ON s.id = sc.saleFk JOIN ticket t ON t.id = s.ticketFk JOIN componentRate cr ON cr.id = sc.componentFk WHERE s.ticketFk = vTicketFk AND (cr.isRenewable = FALSE OR (NOT vHasChangeAll AND (NOT (cr.componentTypeRate <=> vAddressTypeRateFk OR cr.componentTypeRate <=> vAgencyModeTypeRateFk)))); SET @shipped = vShipped; DROP TEMPORARY TABLE tmp.zoneGetShipped, tmp.buyUltimate, tmp.ticketLot; IF IFNULL(vShipped, CURDATE() - 1) < CURDATE() THEN CALL util.throw('NO_AGENCY_AVAILABLE'); END IF; END$$ DELIMITER ; -- orderCheckConfig` --------------------------------------------------------------------- USE `hedera`; DROP procedure IF EXISTS `orderCheckConfig`; DELIMITER $$ USE `hedera`$$ CREATE DEFINER=`root`@`%` PROCEDURE `orderCheckConfig`(vOrder INT) proc: BEGIN /** * Comprueba que la configuración del pedido es correcta. * * @param vOrder Identificador del pedido */ DECLARE vDeliveryMethod VARCHAR(255); DECLARE vLanded DATE; DECLARE vAgencyMode INT; DECLARE vAddress INT; DECLARE vIsAvailable BOOL; -- Obtiene los datos del pedido SELECT d.code, o.date_send, o.agency_id, o.address_id INTO vDeliveryMethod, vLanded, vAgencyMode, vAddress FROM `order` o JOIN vn.deliveryMethod d ON d.id = o.delivery_method_id WHERE o.id = vOrder; -- Comprueba que se ha seleccionado una dirección IF vDeliveryMethod IN ('AGENCY', 'DELIVERY') && vAddress IS NULL THEN CALL util.throw ('ORDER_EMPTY_ADDRESS'); END IF; -- Comprueba que la agencia es correcta CALL vn.zoneGetAgency(vAddress, vLanded); SELECT COUNT(*) > 0 INTO vIsAvailable FROM tmp.zoneGetAgency WHERE agencyModeFk = vAgencyMode; IF !vIsAvailable THEN CALL util.throw ('ORDER_INVALID_AGENCY'); END IF; DROP TEMPORARY TABLE tmp.zoneGetAgency; END$$ DELIMITER ; -- agencyListAvailable` --------------------------------------------------------------------- DROP procedure IF EXISTS `vn`.`agencyListAvailable`; DELIMITER $$ CREATE DEFINER=`root`@`%` PROCEDURE `vn`.`__agencyListAvailable`(vDate DATE, vAddress INT) READS SQL DATA BEGIN /** * DEPRECATED usar zoneGetAgency * Devuelve la lista de almacenes disponibles y la fecha de * envío desde cada uno. * * @param vDate Fecha de recepción de mercancía * @param vAddress Id consignatario, %NULL para recogida * @return agencyAvailable Lista de almacenes disponibles */ DECLARE vMaxDays INT DEFAULT DATEDIFF(vDate, CURDATE()); DECLARE vWday TINYINT DEFAULT WEEKDAY(vDate); DECLARE vHour TINYINT DEFAULT HOUR(NOW()); DECLARE vProvince INT; SELECT provinceFk INTO vProvince FROM address WHERE id = vAddress; DROP TEMPORARY TABLE IF EXISTS tmp.agencyAvailable; CREATE TEMPORARY TABLE tmp.agencyAvailable (INDEX (agencyFk)) ENGINE = MEMORY SELECT agencyFk, warehouseFk FROM agencyHour h WHERE (provinceFk = vProvince OR provinceFk IS NULL) AND (weekDay = vWday OR weekDay IS NULL) AND (substractDay < vMaxDays OR (substractDay = vMaxDays AND maxHour > vHour)); END$$ DELIMITER ; -- agencyIsAvailable` --------------------------------------------------------------------- DROP function IF EXISTS `vn`.`agencyIsAvailable`; DELIMITER $$ CREATE DEFINER=`root`@`%` FUNCTION `vn`.`__agencyIsAvailable`(vAgency INT, vDate DATE, vAddress INT) RETURNS tinyint(1) READS SQL DATA BEGIN /** * Comprueba si la agencia esta disponible para la fecha y * dirección dadas, es decir, si es posible enviar mercancía * desde al menos uno de los almacenes por la agencia, fecha * y direcciones especificadas. * * @param vAgency Id de agencia * @param vDate Fecha de recepción de mercancía * @param vAddress Id consignatario, %NULL para recogida * @return %TRUE si la agencia esta disponible, %FALSE en caso contrario */ DECLARE vMaxDays INT DEFAULT DATEDIFF(vDate, CURDATE()); DECLARE vWday TINYINT DEFAULT WEEKDAY(vDate); DECLARE vHour TINYINT DEFAULT HOUR(NOW()); DECLARE vProvince INT; DECLARE isAvailable BOOL; SELECT provinceFk INTO vProvince FROM address WHERE id = vAddress; SELECT COUNT(*) > 0 INTO isAvailable FROM agencyHour h JOIN agencyMode a ON a.agencyFk = h.agencyFk WHERE (h.provinceFk = vProvince OR h.provinceFk IS NULL) AND (h.weekDay = vWday OR h.weekDay IS NULL) AND (h.substractDay < vMaxDays OR (h.substractDay = vMaxDays AND h.maxHour > vHour)) AND a.id = vAgency; RETURN isAvailable; END$$ DELIMITER ; -- ticket_recalcComponents` --------------------------------------------------------------------- USE `vn2008`; DROP procedure IF EXISTS `vn2008`.`bionic_calc_ticket`; USE `vn`; DROP procedure IF EXISTS `ticket_recalcComponents`; USE `vn`; DROP procedure IF EXISTS `ticket_recalcComponents`; DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `ticket_recalcComponents`(IN vTicketFk BIGINT ) proc: BEGIN /** * Este procedimiento trata de "rebionizar" un ticket, * eliminando los componentes existentes e insertandolos de nuevo * * @param vTicketFk Id del ticket * @return tmp.buyUltimate */ DECLARE vShipped DATE; DECLARE vWarehouseFk SMALLINT; DECLARE vAgencyModeFk INT; DECLARE vAddressFk INT; DECLARE vLanded DATE; DECLARE vIsTicketEditable BOOLEAN; SELECT (IFNULL(ts.alertLevel,0) >0 or IFNULL(t.refFk,"") != "") = FALSE INTO vIsTicketEditable FROM ticket t LEFT JOIN ticketState ts ON t.id = ts.ticket WHERE id = vTicketFk; SELECT warehouseFk, date(shipped), addressFk, agencyModeFk, landed INTO vWarehouseFk, vShipped, vAddressFk, vAgencyModeFk, vLanded FROM ticket WHERE id = vTicketFk; CALL zoneGetShippedWarehouse(vLanded, vAddressFk , vAgencyModeFk); CALL vn.buyUltimate (vWarehouseFk, vShipped); -- rellena la tabla buyUltimate con la ultima compra DROP TEMPORARY TABLE IF EXISTS tmp.ticketLot; CREATE TEMPORARY TABLE tmp.ticketLot SELECT vWarehouseFk warehouseFk, NULL available, s.itemFk, bu.buyFk FROM sale s LEFT JOIN tmp.buyUltimate bu ON bu.itemFk = s.itemFk WHERE s.ticketFk = vTicketFk GROUP BY s.itemFk; CALL vn.ticketComponentCalculate(vAddressFk,vAgencyModeFk); DROP TEMPORARY TABLE IF EXISTS tmp.sale; CREATE TEMPORARY TABLE tmp.sale (PRIMARY KEY (saleFk)) ENGINE = MEMORY SELECT id saleFk, vWarehouseFk warehouseFk FROM sale s WHERE s.ticketFk = vTicketFk; CALL vn.ticketComponentUpdateSale(IF(vIsTicketEditable,1,6)); -- si el ticket esta facturado, respeta los precios IF vLanded IS NULL THEN CALL zoneGetLanded(vShipped, vAddressFk, vAgencyModeFk, vWarehouseFk); UPDATE vn2008.Tickets t SET t.landing = (SELECT landed FROM tmp.zoneGetLanded) WHERE Id_Ticket = vTicketFk; DROP TEMPORARY TABLE tmp.zoneGetLanded; END IF; DROP TEMPORARY TABLE tmp.buyUltimate; DROP TEMPORARY TABLE tmp.ticketComponentPrice; DROP TEMPORARY TABLE tmp.ticketComponent; DROP TEMPORARY TABLE tmp.sale; END$$ -- ticketCalculatePurge` --------------------------------------------------------------------- DELIMITER ; USE `vn`; DROP procedure IF EXISTS `ticketCalculatePurge`; DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `ticketCalculatePurge`() BEGIN DROP TEMPORARY TABLE tmp.ticketCalculateItem, tmp.ticketComponentPrice, tmp.ticketComponent, tmp.ticketLot, tmp.zoneGetShipped; END$$ DELIMITER ; -- `vn`.`component` ----------------------------------------------- CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `vn`.`component` AS SELECT `t`.`Id_Componente` AS `id`, `t`.`Componente` AS `name`, `t`.`tarifa_componentes_series_id` AS `typeFk`, `t`.`tarifa_class` AS `classRate`, `t`.`tax` AS `tax`, `t`.`is_renewable` AS `isRenewable` FROM `bi`.`tarifa_componentes` `t`; -- componentType -------------------------------------------------------- CREATE OR REPLACE ALGORITHM = UNDEFINED DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW `vn`.`componentType` AS SELECT `t`.`tarifa_componentes_series_id` AS `id`, `t`.`Serie` AS `type`, `t`.`base` AS `base` FROM `bi`.`tarifa_componentes_series` `t`;