diff --git a/db/changes/10003-easter/04-zoneAlter.sql b/db/changes/10003-easter/04-zoneAlter.sql new file mode 100644 index 0000000000..36bfbf3369 --- /dev/null +++ b/db/changes/10003-easter/04-zoneAlter.sql @@ -0,0 +1,5 @@ + +ALTER TABLE `vn`.`zone` +DROP PRIMARY KEY, +ADD PRIMARY KEY (`id`), +ADD INDEX `zone_name_idx` (`name` ASC); \ No newline at end of file diff --git a/db/changes/10031-zone/00-zone.sql b/db/changes/10031-zone/00-zone.sql new file mode 100644 index 0000000000..5187ae68d5 --- /dev/null +++ b/db/changes/10031-zone/00-zone.sql @@ -0,0 +1,2532 @@ +-- 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 + * @return tmp.ticketComponentPrice + */ + + 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 ('NOT_ZONE_WITH_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 + * @return tmp.ticketComponentPrice + * @return tmp.ticketComponent + * @return tmp.ticketComponentPrice + **/ + + 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 + 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`; \ No newline at end of file diff --git a/db/changes/10032-webZone/00-available_calc.sql b/db/changes/10032-webZone/00-available_calc.sql new file mode 100644 index 0000000000..0a2429cdc0 --- /dev/null +++ b/db/changes/10032-webZone/00-available_calc.sql @@ -0,0 +1,61 @@ + +DROP procedure IF EXISTS `vn`.`available_calc`; +DELIMITER $$ +CREATE DEFINER=`root`@`%` PROCEDURE `vn`.`available_calc`( + vDate DATE, + vAddress INT, + vAgencyMode INT) +BEGIN +/** + * Calculates the available for all available stores + * according to the given parameters. + * + * @param vDate The delivery date + * @param vAddress The delivery address id + * @param vAgencyMode The shipping agency + * @return tmp.availableCalc(calcFk) The available cache ids + */ + DECLARE vCalcFk INT; + DECLARE vShipment DATE; + DECLARE vWarehouse INT; + DECLARE vDone BOOL; + + DECLARE cWarehouses CURSOR FOR + SELECT warehouseFk, shipped FROM tmp.zoneGetShipped; + + DECLARE CONTINUE HANDLER FOR NOT FOUND + SET vDone = TRUE; + + -- Establecemos los almacenes y las fechas que van a entrar al disponible + + CALL vn.zoneGetShippedWarehouse(vDate, vAddress, vAgencyMode); + + DROP TEMPORARY TABLE IF EXISTS tmp.availableCalc; + CREATE TEMPORARY TABLE tmp.availableCalc( + calcFk INT UNSIGNED, + PRIMARY KEY (calcFk) + ) + ENGINE = MEMORY; + + OPEN cWarehouses; + + l: LOOP + SET vDone = FALSE; + FETCH cWarehouses INTO vWarehouse, vShipment; + + IF vDone THEN + LEAVE l; + END IF; + + CALL `cache`.available_refresh(vCalcFk, FALSE, vWarehouse, vShipment); + + INSERT IGNORE INTO tmp.availableCalc + SET calcFk = vCalcFk; + END LOOP; + + CLOSE cWarehouses; + DROP TEMPORARY TABLE tmp.zoneGetShipped; +END$$ + +DELIMITER ; + diff --git a/db/changes/10032-webZone/00-catalog_calcFromItem.sql b/db/changes/10032-webZone/00-catalog_calcFromItem.sql new file mode 100644 index 0000000000..151f0c65c0 --- /dev/null +++ b/db/changes/10032-webZone/00-catalog_calcFromItem.sql @@ -0,0 +1,23 @@ + +DROP procedure IF EXISTS `vn`.`catalog_calcFromItem`; +DELIMITER $$ +CREATE DEFINER=`root`@`%` PROCEDURE `vn`.`catalog_calcFromItem`( + vLanded DATE, + vAddressFk INT, + vAgencyModeFk INT, + vItemFk INT) +BEGIN +/** + * Calculates available and price for a single item. + * + * @param vItemFk The item id + */ + DROP TEMPORARY TABLE IF EXISTS tmp.item; + CREATE TEMPORARY TABLE tmp.item + ENGINE = MEMORY + SELECT vItemFk itemFk; + + CALL ticketCalculate(vLanded, vAddressFk, vAgencyModeFk); + DROP TEMPORARY TABLE tmp.item; +END$$ +DELIMITER ; diff --git a/db/changes/10032-webZone/00-deprecate.sql b/db/changes/10032-webZone/00-deprecate.sql new file mode 100644 index 0000000000..a81628d323 --- /dev/null +++ b/db/changes/10032-webZone/00-deprecate.sql @@ -0,0 +1,240 @@ + +USE `vn2008`; +DROP procedure IF EXISTS `vn2008`.`bionic_available_`; + +DELIMITER $$ +USE `vn2008`$$ +CREATE DEFINER=`root`@`%` PROCEDURE `__bionic_available_`( + vDate DATE, + vAddress INT, + vAgency INT) +BEGIN +/** + * Calcula el disponible para un conjunto de almacenes y fechas + * devueltos por el procedimiento agencyHourGetShipped() + * + * @deprecated Use vn.available_calc() + * @table t_bionic_available Tabla con los ids de cache + */ + DECLARE vAvailableCalc INT; + DECLARE vShipment DATE; + DECLARE vAgencyId INT; + DECLARE vWh INT; + DECLARE vDone BOOL; + DECLARE cTravelTree CURSOR FOR + SELECT warehouseFk, shipped FROM tmp.agencyHourGetShipped; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; + + -- Establecemos los almacenes y las fechas que van a entrar al disponible + + SELECT agency_id INTO vAgencyId + FROM Agencias WHERE Id_Agencia = vAgency; + + CALL vn.agencyHourGetShipped (vDate, vAddress, vAgencyId); + + DROP TEMPORARY TABLE IF EXISTS t_bionic_available; + CREATE TEMPORARY TABLE t_bionic_available( + calc_id INT UNSIGNED, + PRIMARY KEY (calc_id) + ) + ENGINE = MEMORY; + + OPEN cTravelTree; + l: LOOP + SET vDone = FALSE; + FETCH cTravelTree INTO vWh, vShipment; + + IF vDone THEN + LEAVE l; + END IF; + + CALL `cache`.available_refresh (vAvailableCalc, FALSE, vWh, vShipment); + + INSERT IGNORE INTO t_bionic_available + SET calc_id = vAvailableCalc; + END LOOP; + + CLOSE cTravelTree; + DROP TEMPORARY TABLE tmp.agencyHourGetShipped; +END$$ + +DELIMITER ; +; + + +USE `hedera`; +DROP procedure IF EXISTS `hedera`.`bionic_from_item`; + +DELIMITER $$ +USE `hedera`$$ +CREATE DEFINER=`root`@`%` PROCEDURE `__bionic_from_item`(vItem INT) +BEGIN + DECLARE vDate DATE; + DECLARE vAddress INT; + DECLARE vAgencyMode INT; + + SELECT sent, addressFk, agencyModeFk + INTO vDate, vAddress, vAgencyMode + FROM myBasket; + + CALL vn2008.bionic_from_item(vDate, vAddress, vAgencyMode, vItem); +END$$ + +DELIMITER ; +; + + +USE `vn2008`; +DROP procedure IF EXISTS `vn2008`.`bionic_from_order`; + +DELIMITER $$ +USE `vn2008`$$ +CREATE DEFINER=`root`@`%` PROCEDURE `__bionic_from_order`( + v_date DATE, -- fecha de recepcion de mercancia + v_consigna INT, + v_agencia INT, + v_order INT) +BEGIN + DROP TEMPORARY TABLE IF EXISTS tmp.bionic_calc; + CREATE TEMPORARY TABLE tmp.bionic_calc + (PRIMARY KEY (item_id)) + ENGINE = MEMORY + SELECT item_id FROM order_row + WHERE order_id = v_order GROUP BY item_id; + + CALL bionic_calc (v_date, v_consigna, v_agencia); + DROP TEMPORARY TABLE tmp.bionic_calc; +END$$ + +DELIMITER ; +; + + +USE `hedera`; +DROP procedure IF EXISTS `hedera`.`bionicCalcWithDate`; + +DELIMITER $$ +USE `hedera`$$ +CREATE DEFINER=`root`@`%` PROCEDURE `__bionicCalcWithDate`(vDate DATE) +BEGIN + DECLARE vMyAddressFk INTEGER; + DECLARE vMyAgencyModeFk INTEGER; + + SELECT id, agencyModeFk INTO vMyAddressFk, vMyAgencyModeFk + FROM myAddress + WHERE isDefaultAddress; + + CALL vn2008.bionic_calc(vDate, vMyAddressFk, vMyAgencyModeFk); +END$$ + +DELIMITER ; +; + + +USE `hedera`; +DROP procedure IF EXISTS `hedera`.`bionic_calc`; + +DELIMITER $$ +USE `hedera`$$ +CREATE DEFINER=`root`@`%` PROCEDURE `__bionic_calc`() +BEGIN + DECLARE vDate DATE; + DECLARE vAddress INT; + DECLARE vAgencyMode INT; + + SELECT sent, addressFk, agencyModeFk + INTO vDate, vAddress, vAgencyMode + FROM myBasket; + + CALL vn2008.bionic_calc(vDate, vAddress, vAgencyMode); + + IF account.myUserGetName() = 'visitor' + THEN + DROP TEMPORARY TABLE tmp.bionic_component; + UPDATE tmp.bionic_item SET price = NULL; + END IF; +END$$ + +DELIMITER ; +; + + +USE `hedera`; +DROP procedure IF EXISTS `hedera`.`itemGetAvailableOrder`; + +DELIMITER $$ +USE `hedera`$$ +CREATE DEFINER=`root`@`%` PROCEDURE `__itemGetAvailableOrder`(vOrder INT) +BEGIN +/** + * Gets the available items list with an order params. + * + * @table tmp.itemAvailable + */ + DECLARE vDelivery DATE; + DECLARE vAddress INT; + DECLARE vAgency INT; + + SELECT landed, addressFk, agencyModeFk + INTO vDelivery, vAddress, vAgency + FROM myOrder + WHERE id = vOrder; + + CALL vn2008.bionic_available_ (vDelivery, vAddress, vAgency); + + DROP TEMPORARY TABLE IF EXISTS tmp.itemAvailable; + CREATE TEMPORARY TABLE tmp.itemAvailable + (INDEX (id)) + ENGINE = MEMORY + SELECT c.item_id id + FROM cache.available c + JOIN vn2008.t_bionic_available a ON c.calc_id = a.calc_id + WHERE c.available > 0 + GROUP BY c.item_id; + + DROP TEMPORARY TABLE vn2008.t_bionic_available; + +END$$ + +DELIMITER ; +; + + +USE `hedera`; +DROP procedure IF EXISTS `hedera`.`itemGetAvailable`; + +DELIMITER $$ +USE `hedera`$$ +CREATE DEFINER=`root`@`%` PROCEDURE `__itemGetAvailable`() +BEGIN +/** + * Gets the available items list. + * + * @table tmp.itemAvailable + */ + DECLARE vDelivery DATE; + DECLARE vAddress INT; + DECLARE vAgency INT; + + SELECT sent, addressFk, agencyModeFk + INTO vDelivery, vAddress, vAgency + FROM myBasket; + + CALL vn2008.bionic_available_ (vDelivery, vAddress, vAgency); + + DROP TEMPORARY TABLE IF EXISTS tmp.itemAvailable; + CREATE TEMPORARY TABLE tmp.itemAvailable + (INDEX (id)) + ENGINE = MEMORY + SELECT c.item_id id + FROM cache.available c + JOIN vn2008.t_bionic_available a ON c.calc_id = a.calc_id + WHERE c.available > 0 + GROUP BY c.item_id; + + DROP TEMPORARY TABLE vn2008.t_bionic_available; +END$$ + +DELIMITER ; +; diff --git a/db/changes/10032-webZone/00-myBasket_calcCatalogFromItem.sql b/db/changes/10032-webZone/00-myBasket_calcCatalogFromItem.sql new file mode 100644 index 0000000000..ad673b38c4 --- /dev/null +++ b/db/changes/10032-webZone/00-myBasket_calcCatalogFromItem.sql @@ -0,0 +1,18 @@ + +DROP procedure IF EXISTS `hedera`.`myBasket_calcCatalogFromItem`; +DELIMITER $$ +CREATE DEFINER=`root`@`%` PROCEDURE `hedera`.`myBasket_calcCatalogFromItem`(vItem INT) +BEGIN +/** + * Gets the availability and prices for the given item + * using current user basket parameters. + * + * @table tmp.item(itemFk) + * @return tmp.ticketCalculateItem + * @return tmp.ticketComponentPrice + * @return tmp.ticketComponent + * @return tmp.ticketLot + */ + CALL order_calcCatalogFromItem(myBasket_getId(), vItem); +END$$ +DELIMITER ; diff --git a/db/changes/10032-webZone/00-myBasket_calcCatalogFull.sql b/db/changes/10032-webZone/00-myBasket_calcCatalogFull.sql new file mode 100644 index 0000000000..96e06fa3b4 --- /dev/null +++ b/db/changes/10032-webZone/00-myBasket_calcCatalogFull.sql @@ -0,0 +1,17 @@ + +DROP procedure IF EXISTS `hedera`.`myBasket_calcCatalogFull`; +DELIMITER $$ +CREATE DEFINER=`root`@`%` PROCEDURE `hedera`.`myBasket_calcCatalogFull`() +BEGIN +/** + * Gets the availability and prices for the given items + * using current user basket parameters. + * + * @table tmp.item(itemFk) + * @return tmp.ticketCalculateItem + * @return tmp.ticketComponentPrice + * @return tmp.ticketLot + */ + CALL order_calcCatalogFull(myBasket_getId()); +END$$ +DELIMITER ; diff --git a/db/changes/10032-webZone/00-myBasket_getAvailable.sql b/db/changes/10032-webZone/00-myBasket_getAvailable.sql new file mode 100644 index 0000000000..246bbb567a --- /dev/null +++ b/db/changes/10032-webZone/00-myBasket_getAvailable.sql @@ -0,0 +1,14 @@ + +DROP procedure IF EXISTS `hedera`.`myBasket_getAvailable`; +DELIMITER $$ +CREATE DEFINER=`root`@`%` PROCEDURE `hedera`.`myBasket_getAvailable`() +BEGIN +/** + * Gets the available items list. + * + * @table tmp.itemAvailable + */ + CALL order_getAvailable(myBasket_getId()); +END$$ +DELIMITER ; + diff --git a/db/changes/10032-webZone/00-myOrder_getAvailable.sql b/db/changes/10032-webZone/00-myOrder_getAvailable.sql new file mode 100644 index 0000000000..01ceb0228b --- /dev/null +++ b/db/changes/10032-webZone/00-myOrder_getAvailable.sql @@ -0,0 +1,22 @@ + +DROP procedure IF EXISTS `hedera`.`myOrder_getAvailable`; +DELIMITER $$ +CREATE DEFINER=`root`@`%` PROCEDURE `hedera`.`myOrder_getAvailable`(vSelf INT) +BEGIN +/** + * Gets the available items list. + * + * @param vSelf The order id + * @table tmp.itemAvailable + */ + DECLARE isMine BOOL; + + SELECT COUNT(*) INTO isMine + FROM myOrder + WHERE id = vSelf; + + IF isMine THEN + CALL order_getAvailable(vSelf); + END IF; +END$$ +DELIMITER ; diff --git a/db/changes/10032-webZone/00-order_addItem.sql b/db/changes/10032-webZone/00-order_addItem.sql new file mode 100644 index 0000000000..a56679f3e6 --- /dev/null +++ b/db/changes/10032-webZone/00-order_addItem.sql @@ -0,0 +1,97 @@ + +DROP procedure IF EXISTS `hedera`.`order_addItem`; +DELIMITER $$ +CREATE DEFINER=`root`@`%` PROCEDURE `hedera`.`order_addItem`( + vSelf INT, + vWarehouse INT, + vItem INT, + vAmount INT) +BEGIN + DECLARE vRow INT; + DECLARE vAdd INT; + DECLARE vAvailable INT; + DECLARE vDone BOOL; + DECLARE vGrouping INT; + DECLARE vRate INT; + DECLARE vShipment DATE; + DECLARE vPrice DECIMAL(10,2); + DECLARE cur CURSOR FOR + SELECT `grouping`, price, rate + FROM tmp.ticketComponentPrice + WHERE warehouseFk = vWarehouse + AND itemFk = vItem + ORDER BY `grouping` DESC; + + DECLARE CONTINUE HANDLER FOR NOT FOUND + SET vDone = TRUE; + + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; + + CALL order_calcCatalogFromItem(vSelf, vItem); + START TRANSACTION; + + SELECT shipped INTO vShipment + FROM tmp.zoneGetShipped + WHERE warehouseFk = vWarehouse; + + SELECT available INTO vAvailable + FROM tmp.ticketLot + WHERE warehouseFk = vWarehouse + AND itemFk = vItem; + + IF vAmount > IFNULL(vAvailable, 0) THEN + CALL util.throw ('ORDER_ROW_UNAVAILABLE'); + END IF; + + OPEN cur; + + l: LOOP + SET vDone = FALSE; + FETCH cur INTO vGrouping, vPrice, vRate; + + IF vDone THEN + LEAVE l; + END IF; + + SET vAdd = vAmount - MOD(vAmount, vGrouping); + SET vAmount = vAmount - vAdd; + + IF vAdd = 0 THEN + ITERATE l; + END IF; + + INSERT INTO orderRow SET + orderFk = vSelf, + itemFk = vItem, + warehouseFk = vWarehouse, + shipment = vShipment, + rate = vRate, + amount = vAdd, + price = vPrice; + + SET vRow = LAST_INSERT_ID(); + + INSERT INTO orderRowComponent (rowFk, componentFk, price) + SELECT vRow, c.componentFk, c.cost + FROM tmp.ticketComponent c + JOIN vn.component t + ON t.id = c.componentFk + AND (t.classRate IS NULL OR t.classRate = vRate) + WHERE c.warehouseFk = vWarehouse + AND c.itemFk = vItem; + END LOOP; + + CLOSE cur; + + IF vAmount > 0 THEN + CALL util.throw ('AMOUNT_NOT_MATCH_GROUPING'); + END IF; + + COMMIT; + CALL vn.ticketCalculatePurge; +END$$ +DELIMITER ; diff --git a/db/changes/10032-webZone/00-order_calcCatalog.sql b/db/changes/10032-webZone/00-order_calcCatalog.sql new file mode 100644 index 0000000000..2a50d747b7 --- /dev/null +++ b/db/changes/10032-webZone/00-order_calcCatalog.sql @@ -0,0 +1,36 @@ + +DROP procedure IF EXISTS `hedera`.`order_calcCatalog`; +DELIMITER $$ +CREATE DEFINER=`root`@`%` PROCEDURE `hedera`.`order_calcCatalog`(vSelf INT) +BEGIN +/** + * Gets the availability and prices for order items. + * + * @param vSelf The order id + * @return tmp.ticketCalculateItem + * @return tmp.ticketComponentPrice + * @return tmp.ticketComponent + * @return tmp.ticketLot + */ + DECLARE vDate DATE; + DECLARE vAddress INT; + DECLARE vAgencyMode INT; + + SELECT date_send, address_id, agency_id + INTO vDate, vAddress, vAgencyMode + FROM `order` + WHERE id = vSelf; + + DROP TEMPORARY TABLE IF EXISTS tmp.item; + CREATE TEMPORARY TABLE tmp.item + (PRIMARY KEY (itemFk)) + ENGINE = MEMORY + SELECT itemFk FROM orderRow + WHERE orderFk = vSelf + GROUP BY itemFk; + + CALL vn.ticketCalculate(vDate, vAddress, vAgencyMode); + + DROP TEMPORARY TABLE tmp.item; +END$$ +DELIMITER ; diff --git a/db/changes/10032-webZone/00-order_calcCatalogFromItem.sql b/db/changes/10032-webZone/00-order_calcCatalogFromItem.sql new file mode 100644 index 0000000000..ba2533a246 --- /dev/null +++ b/db/changes/10032-webZone/00-order_calcCatalogFromItem.sql @@ -0,0 +1,29 @@ + +DROP procedure IF EXISTS `hedera`.`order_calcCatalogFromItem`; +DELIMITER $$ +CREATE DEFINER=`root`@`%` PROCEDURE `hedera`.`order_calcCatalogFromItem`(vSelf INT, vItem INT) +BEGIN +/** + * Gets the availability and prices for the given item + * using the order parameters. + * + * @param vSelf The order id + * @table tmp.item(itemFk) + * @return tmp.ticketCalculateItem + * @return tmp.ticketComponentPrice + * @return tmp.ticketComponent + * @return tmp.ticketLot + */ + DECLARE vDate DATE; + DECLARE vAddress INT; + DECLARE vAgencyMode INT; + + SELECT date_send, address_id, agency_id + INTO vDate, vAddress, vAgencyMode + FROM `order` + WHERE id = vSelf; + + CALL vn.catalog_calcFromItem(vDate, vAddress, vAgencyMode, vItem); +END$$ +DELIMITER ; + diff --git a/db/changes/10032-webZone/00-order_calcCatalogFull.sql b/db/changes/10032-webZone/00-order_calcCatalogFull.sql new file mode 100644 index 0000000000..221f0ac99a --- /dev/null +++ b/db/changes/10032-webZone/00-order_calcCatalogFull.sql @@ -0,0 +1,33 @@ + +DROP procedure IF EXISTS `hedera`.`order_calcCatalogFull`; +DELIMITER $$ +CREATE DEFINER=`root`@`%` PROCEDURE `hedera`.`order_calcCatalogFull`(vSelf INT) +BEGIN +/** + * Gets the availability and prices for the given items + * using the order parameters. + * + * @param vSelf The order id + * @table tmp.item(itemFk) + * @return tmp.ticketCalculateItem + * @return tmp.ticketComponentPrice + * @return tmp.ticketLot + */ + DECLARE vDate DATE; + DECLARE vAddress INT; + DECLARE vAgencyMode INT; + + SELECT date_send, address_id, agency_id + INTO vDate, vAddress, vAgencyMode + FROM `order` + WHERE id = vSelf; + + CALL vn.ticketCalculate(vDate, vAddress, vAgencyMode); + + IF account.myUserGetName() = 'visitor' + THEN + DROP TEMPORARY TABLE tmp.ticketComponent; + UPDATE tmp.ticketCalculateItem SET price = NULL; + END IF; +END$$ +DELIMITER ; diff --git a/db/changes/10032-webZone/00-order_getAvailable.sql b/db/changes/10032-webZone/00-order_getAvailable.sql new file mode 100644 index 0000000000..1182b48400 --- /dev/null +++ b/db/changes/10032-webZone/00-order_getAvailable.sql @@ -0,0 +1,34 @@ +DROP procedure IF EXISTS `hedera`.`order_getAvailable`; +DELIMITER $$ +CREATE DEFINER=`root`@`%` PROCEDURE `hedera`.`order_getAvailable`(vSelf INT) +BEGIN +/** + * Gets the available items list. + * + * @param vSelf The order id + * @table tmp.itemAvailable + */ + DECLARE vDelivery DATE; + DECLARE vAddress INT; + DECLARE vAgencyMode INT; + + SELECT date_send, address_id, agency_id + INTO vDelivery, vAddress, vAgencyMode + FROM `order` + WHERE id = vSelf; + + CALL vn.available_calc(vDelivery, vAddress, vAgencyMode); + + DROP TEMPORARY TABLE IF EXISTS tmp.itemAvailable; + CREATE TEMPORARY TABLE tmp.itemAvailable + (INDEX (id)) + ENGINE = MEMORY + SELECT DISTINCT a.item_id id + FROM `cache`.available a + JOIN tmp.availableCalc c ON c.calcFk = a.calc_id + WHERE a.available > 0; + + DROP TEMPORARY TABLE tmp.availableCalc; +END$$ + +DELIMITER ; \ No newline at end of file diff --git a/db/changes/10032-webZone/00-order_update.sql b/db/changes/10032-webZone/00-order_update.sql new file mode 100644 index 0000000000..29d6a98fc5 --- /dev/null +++ b/db/changes/10032-webZone/00-order_update.sql @@ -0,0 +1,71 @@ + +DROP procedure IF EXISTS `hedera`.`order_update`; +DELIMITER $$ +CREATE DEFINER=`root`@`%` PROCEDURE `hedera`.`order_update`(vSelf INT) +proc: BEGIN +/** + * Actualiza la líneas de un pedido. + * + * @param vSelf Id del pedido + */ + DECLARE vDate DATE; + DECLARE vAddress INT; + DECLARE vAgencyMode INT; + DECLARE vNRows INT; + + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; + + START TRANSACTION; + + SELECT COUNT(*) INTO vNRows + FROM orderRow WHERE orderFk = vSelf; + + IF vNRows > 0 + THEN + CALL order_calcCatalog(vSelf); + + DELETE c + FROM orderRow r + JOIN orderRowComponent c ON c.rowFk = r.id + WHERE r.orderFk = vSelf; + + UPDATE orderRow r + LEFT JOIN tmp.ticketComponentPrice p + ON p.warehouseFk = r.warehouseFk + AND p.itemFk = r.itemFk + AND p.rate = r.rate + LEFT JOIN tmp.zoneGetShipped t + ON t.warehouseFk = r.warehouseFk + SET + r.price = p.price, + r.amount = IF(p.itemFk IS NOT NULL, + r.amount + IF(@m := MOD(r.amount, p.`grouping`), p.`grouping` - @m, 0), 0), + r.shipment = t.shipped + WHERE r.orderFk = vSelf; + + INSERT INTO orderRowComponent(rowFk, componentFk, price) + SELECT r.id, c.componentFk, c.cost + FROM orderRow r + JOIN tmp.ticketComponent c + ON c.warehouseFk = r.warehouseFk + AND c.itemFk = r.itemFk + JOIN vn.component t + ON t.id = c.componentFk + AND (t.classRate IS NULL OR t.classRate = r.rate) + WHERE r.orderFk = vSelf; + + CALL vn.ticketCalculatePurge; + END IF; + + UPDATE `order` SET date_make = NOW() + WHERE id = vSelf; + + COMMIT; +END$$ + +DELIMITER ; + diff --git a/db/changes/10032-webZone/99-privs.sql b/db/changes/10032-webZone/99-privs.sql new file mode 100644 index 0000000000..2f92e7c145 --- /dev/null +++ b/db/changes/10032-webZone/99-privs.sql @@ -0,0 +1,6 @@ +GRANT EXECUTE ON PROCEDURE vn.zoneGetAgency TO `account`@`%`; +GRANT EXECUTE ON PROCEDURE hedera.myBasket_calcCatalogFromItem TO `guest`@`%`; +GRANT EXECUTE ON PROCEDURE hedera.myBasket_calcCatalogFull TO `guest`@`%`; +GRANT EXECUTE ON PROCEDURE hedera.myBasket_getAvailable TO `guest`@`%`; +GRANT EXECUTE ON PROCEDURE hedera.myOrder_getAvailable TO `guest`@`%`; +CALL account.privSync; diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index 5aa78a40b9..b7f5a07c6e 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -230,8 +230,8 @@ INSERT INTO `vn`.`address`(`id`, `nickname`, `street`, `city`, `postalCode`, `pr (8, 'Charles Xavier', '3800 Victory Pkwy, Cincinnati, OH 45207, USA', 'Silla', 46460, 1, 1111111111, 222222222, 1, 108, 2, NULL, NULL, 0, 1), (9, 'Bruce Banner', 'Somewhere in New York', 'Silla', 46460, 1, 1111111111, 222222222, 1, 109, 2, NULL, NULL, 0, 1), (10, 'Jessica Jones', 'NYCC 2015 Poster', 'Silla', 46460, 1, 1111111111, 222222222, 1, 110, 2, NULL, NULL, 0, 1), - (11, 'Missing', 'The space', 'Silla', 46460, 1, 1111111111, 222222222, 1, 200, 2, NULL, NULL, 0, 1), - (12, 'Trash', 'New York city', 'Silla', 46460, 1, 1111111111, 222222222, 1, 400, 2, NULL, NULL, 0, 1), + (11, 'Missing', 'The space', 'Silla', 46460, 1, 1111111111, 222222222, 1, 200, 10, NULL, NULL, 0, 1), + (12, 'Trash', 'New York city', 'Silla', 46460, 1, 1111111111, 222222222, 1, 400, 10, NULL, NULL, 0, 1), (101, 'address 01', 'Somewhere in Thailand', 'Silla', 46460, 1, 1111111111, 222222222, 1, 109, 2, NULL, NULL, 0, 0), (102, 'address 02', 'Somewhere in Poland', 'Silla', 46460, 1, 3333333333, 444444444, 1, 109, 2, NULL, NULL, 0, 0), (103, 'address 03', 'Somewhere in Japan', 'Silla', 46460, 1, 3333333333, 444444444, 1, 109, 2, NULL, NULL, 0, 0), @@ -262,8 +262,8 @@ INSERT INTO `vn`.`address`(`id`, `nickname`, `street`, `city`, `postalCode`, `pr (128, 'address 28', 'Cerebro', 'Silla', 46460, 1, 1111111111, 222222222, 1, 108, 2, NULL, NULL, 0, 0), (129, 'address 29', 'Luke Cages Bar', 'Silla', 46460, 1, 1111111111, 222222222, 1, 110, 2, NULL, NULL, 0, 0), (130, 'address 30', 'Non valid address', 'Silla', 46460, 1, 1111111111, 222222222, 0, 101, 2, NULL, NULL, 0, 0), - (131, 'Missing', 'The space', 'Silla', 46460, 1, 1111111111, 222222222, 1, 200, 2, NULL, NULL, 0, 0), - (132, 'Trash', 'New York city', 'Silla', 46460, 1, 1111111111, 222222222, 1, 400, 2, NULL, NULL, 0, 0); + (131, 'Missing', 'The space', 'Silla', 46460, 1, 1111111111, 222222222, 1, 200, 10, NULL, NULL, 0, 0), + (132, 'Trash', 'New York city', 'Silla', 46460, 1, 1111111111, 222222222, 1, 400, 10, NULL, NULL, 0, 0); INSERT INTO `vn`.`address`( `nickname`, `street`, `city`, `postalCode`, `provinceFk`, `isActive`, `clientFk`, `agencyModeFk`, `isDefaultAddress`) SELECT name, CONCAT(name, 'Street'), 'SILLA', 46460, 1, 1, id, 2, 1 @@ -434,7 +434,7 @@ INSERT INTO `vn`.`ticket`(`id`, `agencyModeFk`,`warehouseFk`,`routeFk`, `shipped (8 , 1, 1, 4, DATE_ADD(CURDATE(), INTERVAL +1 MONTH), DATE_ADD(CURDATE(), INTERVAL +1 MONTH), 104, 'address 24', 124, NULL, 0, DATE_ADD(CURDATE(), INTERVAL +1 MONTH) ), (9 , 5, 5, 4, DATE_ADD(CURDATE(), INTERVAL -2 MONTH), DATE_ADD(CURDATE(), INTERVAL -2 MONTH), 105, 'address 25', 125, 'A1111111', 0, DATE_ADD(CURDATE(), INTERVAL -2 MONTH) ), (10, 6, 5, 5, DATE_ADD(CURDATE(), INTERVAL -3 MONTH), DATE_ADD(CURDATE(), INTERVAL -3 MONTH), 105, 'address 25', 125, 'A1111111', 0, DATE_ADD(CURDATE(), INTERVAL -3 MONTH) ), - (11, 7, 1, 1, CURDATE() , CURDATE() , 101, 'address 21', 121, NULL, 0, CURDATE() ), + (11, 7, 1, 1, CURDATE() , DATE_ADD(CURDATE(), INTERVAL +1 DAY) , 101, 'address 21', 121, NULL, 0, CURDATE() ), (12, 1, 1, 1, DATE_ADD(CURDATE(), INTERVAL +1 MONTH), DATE_ADD(CURDATE(), INTERVAL +1 MONTH), 101, 'address 21', 121, NULL, 0, DATE_ADD(CURDATE(), INTERVAL +1 MONTH) ), (13, 2, 2, 2, DATE_ADD(CURDATE(), INTERVAL +2 MONTH), DATE_ADD(CURDATE(), INTERVAL +2 MONTH), 101, 'address 21', 121, NULL, 0, DATE_ADD(CURDATE(), INTERVAL +2 MONTH) ), (14, 2, 2, 2, DATE_ADD(CURDATE(), INTERVAL +3 MONTH), DATE_ADD(CURDATE(), INTERVAL +3 MONTH), 101, 'address 21', 121, NULL, 0, DATE_ADD(CURDATE(), INTERVAL +3 MONTH) ), @@ -635,8 +635,8 @@ INSERT INTO `vn`.`sale`(`id`, `itemFk`, `ticketFk`, `concept`, `quantity`, `pric (4, 4, 1, 'Melee weapon heavy shield 1x0.5m', 20, 3.06, 0, 0, 0, DATE_ADD(CURDATE(), INTERVAL -15 DAY)), (5, 1, 2, 'Ranged weapon longbow 2m', 10, 9.10, 0, 0, 0, DATE_ADD(CURDATE(), INTERVAL -10 DAY)), (6, 1, 3, 'Ranged weapon longbow 2m', 15, 6.50, 0, 0, 0, DATE_ADD(CURDATE(), INTERVAL -5 DAY)), - (7, 2, 11, 'Melee weapon combat fist 15cm', 15, 1.46, 0, 0, 0, CURDATE()), - (8, 4, 11, 'Melee weapon heavy shield 1x0.5m', 10, 3.04, 0, 0, 0, CURDATE()), + (7, 2, 11, 'Melee weapon combat fist 15cm', 15, 1.02, 0, 0, 0, CURDATE()), + (8, 4, 11, 'Melee weapon heavy shield 1x0.5m', 10, 3.01, 0, 0, 0, CURDATE()), (9, 1, 16, 'Ranged weapon longbow 2m', 5, 9.10, 0, 0, 0, CURDATE()), (10, 2, 16, 'Melee weapon combat fist 15cm', 10, 1.07, 0, 0, 0, CURDATE()), (11, 1, 16, 'Ranged weapon longbow 2m', 2, 9.10, 0, 0, 0, CURDATE()), @@ -688,13 +688,11 @@ INSERT INTO `vn`.`saleComponent`(`saleFk`, `componentFk`, `value`) (5, 29, -18.72), (5, 39, 0.02), (6, 23, 6.5), - (7, 15, 0.2839), - (7, 21, 0.166), + (7, 15, 0.0114), (7, 28, 5.6), (7, 29, -4.6), (7, 39, 0.01), - (8, 15, 0.039), - (8, 21, -0.003), + (8, 15, 0.0016), (8, 28, 20.72), (8, 29, -19.72), (8, 37, 2), @@ -1290,37 +1288,6 @@ INSERT INTO `vn`.`ticketService`(`id`, `description`, `quantity`, `price`, `taxC (4, 'Documentos', 1, 2.00, 1, 9), (5, 'Documentos', 1, 2.00, 1, 8); - -INSERT INTO `vn`.`zone` (`id`, `name`, `hour`, `warehouseFk`, `agencyModeFk`, `travelingDays`, `price`, `bonus`) - VALUES - (1, 'Zone 1 A', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), '1', '1', '1', '2.3', '2.3'), - (2, 'Zone 1 B', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), '1', '1', '1', '2.3', '2.3'), - (3, 'Zone 2 A', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), '2', '1', '2', '1.2', '1.2'), - (4, 'Zone 2 B', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), '2', '1', '2', '1.2', '1.2'), - (5, 'Zone 3 A', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), '1', '1', '1', '2', '2'), - (6, 'Zone 3 B', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), '1', '1', '1', '2', '2'); - -INSERT INTO `vn`.`zoneIncluded` (`zoneFk`, `geoFk`, `isIncluded`) - VALUES - (1, 3, 0), - (1, 4, 1), - (1, 5, 1), - (2, 3, 1), - (2, 4, 0), - (2, 5, 1), - (3, 2, 1), - (3, 3, 0), - (3, 4, 0), - (3, 5, 1), - (4, 2, 0), - (4, 3, 1), - (4, 4, 1), - (4, 5, 0), - (5, 2, 1), - (5, 3, 1), - (5, 4, 1), - (5, 5, 1); - INSERT INTO `pbx`.`sip`(`user_id`, `extension`, `secret`, `caller_id`) VALUES (1, 1010, '123456', 'employee'), @@ -1408,13 +1375,14 @@ INSERT INTO `vn`.`sharingCart`(`id`, `workerFk`, `started`, `ended`, `workerSubs INSERT INTO `vn`.`zone` (`id`, `name`, `hour`, `warehouseFk`, `agencyModeFk`, `travelingDays`, `price`, `bonus`) VALUES - (1, 'Zone pickup A', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), '1', '1', '1', '0', '0'), - (2, 'Zone pickup B', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), '2', '1', '2', '0', '0'), - (3, 'Zone 247 A', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), '1', '7', '2', '2', '0'), - (4, 'Zone 247 B', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), '2', '7', '1', '2', '0'), - (5, 'Zone expensive A', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), '1', '8', '2', '5', '-1'), - (6, 'Zone expensive B', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), '1', '8', '1', '5', '-1'); - + (1, 'Zone pickup A', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), 1, 1, 0, '0', '0'), + (2, 'Zone pickup B', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), 2, 1, 0, '0', '0'), + (3, 'Zone 247 A', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), 1, 7, 1, '2', '0'), + (4, 'Zone 247 B', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), 2, 7, 1, '2', '0'), + (5, 'Zone expensive A', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), 1, 8, 1, '5', '-1'), + (6, 'Zone expensive B', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), 2, 8, 1, '5', '-1'), + (7, 'Zone refund', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), 1, 10, 0, 0, 0), + (8, 'Zone others', CONCAT(CURRENT_DATE(), ' ', TIME('22:00')), 1, 23, 0, 0, 0); INSERT INTO `vn`.`zoneIncluded` (`zoneFk`, `geoFk`, `isIncluded`) VALUES @@ -1441,7 +1409,15 @@ INSERT INTO `vn`.`zoneIncluded` (`zoneFk`, `geoFk`, `isIncluded`) (6, 3, 1), (6, 4, 0), (6, 5, 1), - (6, 2, 1); + (6, 2, 1), + (7, 3, 0), + (7, 4, 0), + (7, 5, 0), + (7, 2, 1), + (8, 3, 0), + (8, 4, 0), + (8, 5, 0), + (8, 2, 1); INSERT INTO `vn`.`zoneCalendar`(`zoneFk`, `delivered`) VALUES @@ -1482,4 +1458,18 @@ INSERT INTO `vn`.`zoneCalendar`(`zoneFk`, `delivered`) (6, DATE_ADD(CURDATE(), INTERVAL +3 DAY)), (6, DATE_ADD(CURDATE(), INTERVAL +4 DAY)), (6, DATE_ADD(CURDATE(), INTERVAL +5 DAY)), - (6, DATE_ADD(CURDATE(), INTERVAL +6 DAY)); + (6, DATE_ADD(CURDATE(), INTERVAL +6 DAY)), + (7, CURDATE()), + (7, DATE_ADD(CURDATE(), INTERVAL +1 DAY)), + (7, DATE_ADD(CURDATE(), INTERVAL +2 DAY)), + (7, DATE_ADD(CURDATE(), INTERVAL +3 DAY)), + (7, DATE_ADD(CURDATE(), INTERVAL +4 DAY)), + (7, DATE_ADD(CURDATE(), INTERVAL +5 DAY)), + (7, DATE_ADD(CURDATE(), INTERVAL +6 DAY)), + (8, CURDATE()), + (8, DATE_ADD(CURDATE(), INTERVAL +1 DAY)), + (8, DATE_ADD(CURDATE(), INTERVAL +2 DAY)), + (8, DATE_ADD(CURDATE(), INTERVAL +3 DAY)), + (8, DATE_ADD(CURDATE(), INTERVAL +4 DAY)), + (8, DATE_ADD(CURDATE(), INTERVAL +5 DAY)), + (8, DATE_ADD(CURDATE(), INTERVAL +6 DAY)); diff --git a/db/import-changes.sh b/db/import-changes.sh index b3d9d3a028..2b80654d3e 100755 --- a/db/import-changes.sh +++ b/db/import-changes.sh @@ -97,7 +97,7 @@ for DIR_PATH in "$DIR/changes/"*; do for FILE in "$DIR_PATH/"*; do FILE_NAME=$(basename "$FILE") - if [[ ! "$FILE_NAME" =~ ^[0-9]{2}-[a-zA-Z0-9]+\.sql$ ]]; then + if [[ ! "$FILE_NAME" =~ ^[0-9]{2}-[a-zA-Z0-9_]+\.sql$ ]]; then echo "[WARN] Ignoring wrong file name: $FILE_NAME" continue fi diff --git a/loopback/locale/es.json b/loopback/locale/es.json index b067b61217..085561a4b5 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -82,5 +82,6 @@ "That item is not available on that day": "El item no esta disponible para esa fecha", "That item doesn't exists": "That item doesn't exists", "You cannot add or modify services to an invoiced ticket": "No puedes añadir o modificar servicios a un ticket facturado", - "This ticket can not be modified": "Este ticket no puede ser modificado" + "This ticket can not be modified": "Este ticket no puede ser modificado", + "NOT_ZONE_WITH_THIS_PARAMETERS": "Para este día no hay ninguna zona configurada" } \ No newline at end of file diff --git a/modules/agency/back/methods/agency/getLanded.js b/modules/agency/back/methods/agency/getLanded.js index 301f407370..8d21320e3e 100644 --- a/modules/agency/back/methods/agency/getLanded.js +++ b/modules/agency/back/methods/agency/getLanded.js @@ -1,12 +1,32 @@ +const ParameterizedSQL = require('loopback-connector').ParameterizedSQL; + module.exports = Self => { - Self.remoteMethod('getLanded', { + Self.remoteMethodCtx('getLanded', { description: 'Returns the first shipped and landed possible for params', accessType: 'READ', accepts: [{ arg: 'params', - type: 'object', - required: true, - description: 'shipped, addressFk, agencyModeFk, warehouseFk' + type: 'Object', + description: `shipped, addressFk, agencyModeFk, warehouseFk` + }, { + arg: 'shipped', + type: 'date', + required: true + }, + { + arg: 'addressFk', + type: 'number', + required: true + }, + { + arg: 'agencyModeFk', + type: 'number', + required: true + }, + { + arg: 'warehouseFk', + type: 'number', + required: true }], returns: { type: 'object', @@ -18,11 +38,24 @@ module.exports = Self => { } }); - Self.getLanded = async params => { - let query = `CALL vn.zoneGetLanded(?, ?, ?, ?); - SELECT * FROM tmp.zoneGetLanded`; - let result = await Self.rawSql(query, [params.shipped, params.addressFk || null, params.agencyModeFk, params.warehouseFk]); + Self.getLanded = async(ctx, params) => { + let stmts = []; + params = params || ctx.args; + stmts.push(new ParameterizedSQL( + `CALL vn.zoneGetLanded(?, ?, ?, ?)`, [ + params.shipped, + params.addressFk, + params.agencyModeFk, + params.warehouseFk + ] + )); - return result[1][0].landed; + let rsIndex = stmts.push( + `SELECT * FROM tmp.zoneGetLanded`) - 1; + + let sql = ParameterizedSQL.join(stmts, ';'); + let landed = await Self.rawStmt(sql); + + return landed[rsIndex][0]; }; }; diff --git a/modules/agency/back/methods/agency/getShipped.js b/modules/agency/back/methods/agency/getShipped.js index e8142c6143..a88d787134 100644 --- a/modules/agency/back/methods/agency/getShipped.js +++ b/modules/agency/back/methods/agency/getShipped.js @@ -1,15 +1,33 @@ module.exports = Self => { - Self.remoteMethod('getShipped', { + Self.remoteMethodCtx('getShipped', { description: 'Returns the first shipped possible for params', accessType: 'READ', accepts: [{ arg: 'params', - type: 'object', - required: true, - description: 'landed, addressFk, agencyModeFk' + type: 'Object', + description: `landed, addressFk, agencyModeFk, warehouseFk` + }, { + arg: 'landed', + type: 'date', + required: true + }, + { + arg: 'addressFk', + type: 'number', + required: true + }, + { + arg: 'agencyModeFk', + type: 'number', + required: true + }, + { + arg: 'warehouseFk', + type: 'number', + required: true }], returns: { - type: 'object', + type: 'date', root: true }, http: { @@ -18,10 +36,15 @@ module.exports = Self => { } }); - Self.getShipped = async params => { + Self.getShipped = async(ctx, params)=> { + params = params || ctx.args; let query = `CALL vn.zoneGetShipped(?, ?, ?, ?)`; - let result = await Self.rawSql(query, [params.landed, params.addressFk, params.agencyModeFk, 1]); - - return result[0][0].shipped || null; + let [response] = await Self.rawSql(query, [ + params.landed, + params.addressFk, + params.agencyModeFk, + params.warehouseFk + ]); + return (response[0] && response[0].shipped && response[0].shipped.toJSON()) || null; }; }; diff --git a/modules/agency/back/methods/agency/landsThatDay.js b/modules/agency/back/methods/agency/landsThatDay.js index 131e823be6..bead97ad7f 100644 --- a/modules/agency/back/methods/agency/landsThatDay.js +++ b/modules/agency/back/methods/agency/landsThatDay.js @@ -19,9 +19,10 @@ module.exports = Self => { }); Self.landsThatDay = async filter => { - let query = `CALL vn.zoneGetAgency(?, ?)`; + let query = `CALL vn.zoneGetAgency(?, ?); + SELECT * FROM tmp.zoneGetAgency`; let result = await Self.rawSql(query, [filter.addressFk, filter.landed]); - return result; + return result[1]; }; }; diff --git a/modules/ticket/back/methods/ticket/specs/getLanded.spec.js b/modules/agency/back/methods/agency/specs/getLanded.spec.js similarity index 74% rename from modules/ticket/back/methods/ticket/specs/getLanded.spec.js rename to modules/agency/back/methods/agency/specs/getLanded.spec.js index d943f2cafe..aa50529e33 100644 --- a/modules/ticket/back/methods/ticket/specs/getLanded.spec.js +++ b/modules/agency/back/methods/agency/specs/getLanded.spec.js @@ -1,6 +1,6 @@ const app = require('vn-loopback/server/server'); -describe('ticket getLanded()', () => { +describe('agency getLanded()', () => { it('should return a landing date', async() => { let data = { shipped: new Date(), @@ -8,7 +8,7 @@ describe('ticket getLanded()', () => { agencyModeFk: 7, warehouseFk: 1 }; - let result = await app.models.Ticket.getLanded(data); + let result = await app.models.Agency.getLanded({}, data); expect(result.landed).toBeDefined(); }); diff --git a/modules/ticket/back/methods/ticket/specs/getShipped.spec.js b/modules/agency/back/methods/agency/specs/getShipped.spec.js similarity index 69% rename from modules/ticket/back/methods/ticket/specs/getShipped.spec.js rename to modules/agency/back/methods/agency/specs/getShipped.spec.js index d66e247ae4..90a55e5db7 100644 --- a/modules/ticket/back/methods/ticket/specs/getShipped.spec.js +++ b/modules/agency/back/methods/agency/specs/getShipped.spec.js @@ -1,6 +1,6 @@ const app = require('vn-loopback/server/server'); -describe('ticket getShipped()', () => { +describe('agency getShipped()', () => { it('should return a shipment date', async() => { let data = { landed: new Date(), @@ -8,9 +8,9 @@ describe('ticket getShipped()', () => { agencyModeFk: 7, warehouseFk: 1 }; - let result = await app.models.Ticket.getShipped(data); + let result = await app.models.Agency.getShipped({}, data); - expect(result.shipped).toBeDefined(); + expect(result).toBeDefined(); }); it('should not return a shipment date', async() => { @@ -23,8 +23,8 @@ describe('ticket getShipped()', () => { agencyModeFk: 7, warehouseFk: 1 }; - let result = await app.models.Ticket.getShipped(data); + let result = await app.models.Agency.getShipped({}, data); - expect(result).toBeUndefined(); + expect(result).toBeNull(); }); }); diff --git a/modules/agency/back/methods/zone/specs/clone.spec.js b/modules/agency/back/methods/zone/specs/clone.spec.js index cb8cd3216e..a68bef5d81 100644 --- a/modules/agency/back/methods/zone/specs/clone.spec.js +++ b/modules/agency/back/methods/zone/specs/clone.spec.js @@ -11,7 +11,7 @@ describe('agency clone()', () => { it('should clone a zone', async() => { newZone = await app.models.Zone.clone(1); - expect(newZone.name).toEqual('Zone 1 A'); + expect(newZone.name).toEqual('Zone pickup A'); }); }); diff --git a/modules/client/back/methods/client/specs/getCard.spec.js b/modules/client/back/methods/client/specs/getCard.spec.js index 04cb7918e4..7776719b5d 100644 --- a/modules/client/back/methods/client/specs/getCard.spec.js +++ b/modules/client/back/methods/client/specs/getCard.spec.js @@ -7,6 +7,6 @@ describe('Client get', () => { expect(result.id).toEqual(101); expect(result.name).toEqual('Bruce Wayne'); - expect(result.debt).toEqual(-14.78); + expect(result.debt).toEqual(-22.4); }); }); diff --git a/modules/client/back/methods/client/specs/getDebt.spec.js b/modules/client/back/methods/client/specs/getDebt.spec.js index 2d4ebdb0d0..8178bd6eca 100644 --- a/modules/client/back/methods/client/specs/getDebt.spec.js +++ b/modules/client/back/methods/client/specs/getDebt.spec.js @@ -4,7 +4,7 @@ describe('client getDebt()', () => { it('should return the client debt', async() => { let result = await app.models.Client.getDebt(101); - expect(result.debt).toEqual(-14.78); + expect(result.debt).toEqual(-22.4); }); }); diff --git a/modules/client/back/methods/client/specs/summary.spec.js b/modules/client/back/methods/client/specs/summary.spec.js index d9847b2c11..385b9e90bf 100644 --- a/modules/client/back/methods/client/specs/summary.spec.js +++ b/modules/client/back/methods/client/specs/summary.spec.js @@ -17,7 +17,7 @@ describe('client summary()', () => { it('should return a summary object containing debt', async() => { let result = await app.models.Client.summary(101); - expect(result.debt.debt).toEqual(-14.78); + expect(result.debt.debt).toEqual(-22.4); }); it('should return a summary object containing averageInvoiced', async() => { diff --git a/modules/order/back/methods/order-row/addToOrder.js b/modules/order/back/methods/order-row/addToOrder.js index 6537d573b7..45304917c0 100644 --- a/modules/order/back/methods/order-row/addToOrder.js +++ b/modules/order/back/methods/order-row/addToOrder.js @@ -31,7 +31,7 @@ module.exports = Self => { params.items.forEach(item => { promises.push( Self.rawSql( - `CALL hedera.orderAddItem(?, ?, ?, ?)`, + `CALL hedera.order_addItem(?, ?, ?, ?)`, [params.orderFk, item.warehouseFk, item.itemFk, item.quantity] ) ); diff --git a/modules/order/back/methods/order/catalogFilter.js b/modules/order/back/methods/order/catalogFilter.js index 6e805d9573..1c845efdc0 100644 --- a/modules/order/back/methods/order/catalogFilter.js +++ b/modules/order/back/methods/order/catalogFilter.js @@ -166,11 +166,7 @@ module.exports = Self => { JOIN vn.tag t ON t.id = it.tagFk`) - 1; // Clean temporary tables - stmts.push( - `DROP TEMPORARY TABLE - tmp.item, - tmp.ticketCalculateItem, - tmp.ticketComponentPrice`); + stmts.push('CALL vn.ticketCalculatePurge()'); const sql = ParameterizedSQL.join(stmts, ';'); const result = await conn.executeStmt(sql); diff --git a/modules/order/back/methods/order/confirm.js b/modules/order/back/methods/order/confirm.js index 788486060f..b9e4f5ab2d 100644 --- a/modules/order/back/methods/order/confirm.js +++ b/modules/order/back/methods/order/confirm.js @@ -1,5 +1,5 @@ module.exports = Self => { - Self.remoteMethod('confirm', { + Self.remoteMethodCtx('confirm', { description: 'Confirms an order', accessType: 'WRITE', accepts: [{ @@ -19,8 +19,9 @@ module.exports = Self => { } }); - Self.confirm = async orderFk => { - let query = `CALL hedera.orderConfirm(?)`; - return await Self.rawSql(query, [orderFk]); + Self.confirm = async(ctx, orderFk) => { + const userId = ctx.req.accessToken.userId; + let query = `CALL hedera.order_confirmWithUser(?, ?)`; + return await Self.rawSql(query, [orderFk, userId]); }; }; diff --git a/modules/order/back/methods/order/specs/catalogFilter.spec.js b/modules/order/back/methods/order/specs/catalogFilter.spec.js index f0b57f93ea..e800e14ff2 100644 --- a/modules/order/back/methods/order/specs/catalogFilter.spec.js +++ b/modules/order/back/methods/order/specs/catalogFilter.spec.js @@ -8,7 +8,7 @@ describe('order catalogFilter()', () => { } }; let tags = []; - let orderFk = 11; + let orderFk = 20; let orderBy = {field: 'relevancy DESC, name', way: 'DESC'}; let result = await app.models.Order.catalogFilter(orderFk, orderBy, filter, tags); let firstItemId = result[0].id; @@ -25,13 +25,14 @@ describe('order catalogFilter()', () => { } }; - let tags = [{tagFk: 56, value: 'Melee weapon'}]; - let orderFk = 11; + let tags = [{tagFk: 56, value: 'Melee Reinforced weapon'}]; + let orderFk = 20; let orderBy = {field: 'relevancy DESC, name', way: 'DESC'}; let result = await app.models.Order.catalogFilter(orderFk, orderBy, filter, tags); + let firstItemId = result[0].id; expect(result.length).toEqual(1); - expect(firstItemId).toEqual(2); + expect(firstItemId).toEqual(9); }); }); diff --git a/modules/order/front/create/card.js b/modules/order/front/create/card.js index ad6317f020..dc590d8dda 100644 --- a/modules/order/front/create/card.js +++ b/modules/order/front/create/card.js @@ -84,7 +84,7 @@ class Controller { filter = encodeURIComponent(JSON.stringify(filter)); let query = `/api/Agencies/landsThatDay?filter=${filter}`; this.$http.get(query).then(res => { - this._availableAgencies = res.data[0]; + this._availableAgencies = res.data; }); } } diff --git a/modules/ticket/back/methods/sale/specs/priceDifference.spec.js b/modules/ticket/back/methods/sale/specs/priceDifference.spec.js index 7006833fc5..164e05d17d 100644 --- a/modules/ticket/back/methods/sale/specs/priceDifference.spec.js +++ b/modules/ticket/back/methods/sale/specs/priceDifference.spec.js @@ -3,17 +3,19 @@ let UserError = require('vn-loopback/util/user-error'); describe('sale priceDifference()', () => { it('should return ticket price differences', async() => { + let tomorrow = new Date(); + tomorrow.setDate(tomorrow.getDate() + 1); let data = { - landed: new Date(), + landed: tomorrow, addressFk: 121, - agencyModeFk: 1, + agencyModeFk: 7, warehouseFk: 1 }; let result = await app.models.Sale.priceDifference(11, data); - expect(result.totalUnitPrice).toEqual(4.5); - expect(result.totalNewPrice).toEqual(4.24); - expect(result.totalDifference).toEqual(3.75); + expect(result.totalUnitPrice).toEqual(4.03); + expect(result.totalNewPrice).toEqual(4.03); + expect(result.totalDifference).toEqual(0); }); it('should return an error if the ticket state is not valid for modifications', async() => { diff --git a/modules/ticket/back/methods/ticket/getLanded.js b/modules/ticket/back/methods/ticket/getLanded.js deleted file mode 100644 index 987ec0d7ca..0000000000 --- a/modules/ticket/back/methods/ticket/getLanded.js +++ /dev/null @@ -1,45 +0,0 @@ - -const ParameterizedSQL = require('loopback-connector').ParameterizedSQL; - -module.exports = Self => { - Self.remoteMethod('getLanded', { - description: 'Returns ticket available landed date', - accessType: 'READ', - accepts: [{ - arg: 'data', - type: 'Object', - required: true, - description: 'shipped, addressFk, agencyModeFk, warehouseFk', - http: {source: 'body'} - }], - returns: { - type: 'object', - root: true - }, - http: { - path: `/getLanded`, - verb: 'POST' - } - }); - - Self.getLanded = async data => { - let stmts = []; - - stmts.push(new ParameterizedSQL( - `CALL vn.zoneGetLanded(?, ?, ?, ?)`, [ - data.shipped, - data.addressFk, - data.agencyModeFk, - data.warehouseFk - ] - )); - - let rsIndex = stmts.push( - `SELECT * FROM tmp.zoneGetLanded`) - 1; - - let sql = ParameterizedSQL.join(stmts, ';'); - let landed = await Self.rawStmt(sql); - - return landed[rsIndex][0]; - }; -}; diff --git a/modules/ticket/back/methods/ticket/getShipped.js b/modules/ticket/back/methods/ticket/getShipped.js deleted file mode 100644 index 6db1827ade..0000000000 --- a/modules/ticket/back/methods/ticket/getShipped.js +++ /dev/null @@ -1,33 +0,0 @@ -module.exports = Self => { - Self.remoteMethod('getShipped', { - description: 'Returns ticket available shipment date', - accessType: 'READ', - accepts: [{ - arg: 'data', - type: 'Object', - required: true, - description: 'landed, addressFk, agencyModeFk', - http: {source: 'body'} - }], - returns: { - type: 'object', - root: true - }, - http: { - path: `/getShipped`, - verb: 'POST' - } - }); - - Self.getShipped = async data => { - let query = `CALL vn.zoneGetShipped(?, ?, ?, ?)`; - let [response] = await Self.rawSql(query, [ - data.landed, - data.addressFk, - data.agencyModeFk, - data.warehouseFk - ]); - - return (response[0] && response[0].shipped) || null; - }; -}; diff --git a/modules/ticket/back/methods/ticket/new.js b/modules/ticket/back/methods/ticket/new.js index 156d0a33d3..0b37a2b2cf 100644 --- a/modules/ticket/back/methods/ticket/new.js +++ b/modules/ticket/back/methods/ticket/new.js @@ -43,7 +43,7 @@ module.exports = Self => { if (params && params.agencyModeFk) agencyMode = await Self.app.models.AgencyMode.findById(params.agencyModeFk); - if (address.client().type().code === 'normal' && (!agencyMode || agencyMode.name != 'refund')) { + if (address.client().type().code === 'normal' && (!agencyMode || agencyMode.code != 'refund')) { if (address.client().isFreezed) throw new UserError(`You can't create a ticket for a frozen client`); @@ -56,21 +56,22 @@ module.exports = Self => { try { if (!params.shipped && params.landed) { - params.shipped = await Self.app.models.Agency.getShipped({ + params.shipped = await Self.app.models.Agency.getShipped(ctx, { landed: params.landed, addressFk: address.id, - agencyModeFk: agency.agencyModeFk, + agencyModeFk: params.agencyModeFk, warehouseFk: params.warehouseFk }); } if (params.shipped && !params.landed) { - params.landed = await Self.app.models.Agency.getLanded({ + const landedResult = await Self.app.models.Agency.getLanded(ctx, { shipped: params.shipped, addressFk: address.id, agencyModeFk: params.agencyModeFk, warehouseFk: params.warehouseFk }); + params.landed = landedResult.landed; } if (!params.userId && ctx.req && ctx.req.accessToken.userId) diff --git a/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js b/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js index 598bb8abd7..0d27d69b37 100644 --- a/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js +++ b/modules/ticket/back/methods/ticket/specs/componentUpdate.spec.js @@ -9,6 +9,8 @@ describe('ticket componentUpdate()', () => { let componentOfSaleEight = `SELECT value FROM vn.saleComponent WHERE saleFk = 8 AND componentFk = 15`; const today = new Date(); + const tomorrow = new Date(); + tomorrow.setDate(tomorrow.getDate() + 1); let ticketId = 11; beforeAll(async done => { @@ -29,7 +31,7 @@ describe('ticket componentUpdate()', () => { warehouseFk: 1, companyFk: 442, shipped: today, - landed: today, + landed: tomorrow, isDeleted: false, hasToBeUnrouted: false, option: 1 @@ -57,7 +59,7 @@ describe('ticket componentUpdate()', () => { warehouseFk: 1, companyFk: 442, shipped: today, - landed: today, + landed: tomorrow, isDeleted: false, hasToBeUnrouted: false, option: 1 diff --git a/modules/ticket/back/models/ticket.js b/modules/ticket/back/models/ticket.js index a465aa6eac..b2db9aac65 100644 --- a/modules/ticket/back/models/ticket.js +++ b/modules/ticket/back/models/ticket.js @@ -14,8 +14,6 @@ module.exports = Self => { require('../methods/ticket/getVAT')(Self); require('../methods/ticket/getSales')(Self); require('../methods/ticket/getSalesPersonMana')(Self); - require('../methods/ticket/getShipped')(Self); - require('../methods/ticket/getLanded')(Self); require('../methods/ticket/filter')(Self); require('../methods/ticket/getPossibleStowaways')(Self); require('../methods/ticket/canBeInvoiced')(Self); diff --git a/modules/ticket/front/basic-data/step-one/index.js b/modules/ticket/front/basic-data/step-one/index.js index 6462a5e5a3..d913d7339b 100644 --- a/modules/ticket/front/basic-data/step-one/index.js +++ b/modules/ticket/front/basic-data/step-one/index.js @@ -64,15 +64,15 @@ class Controller { } onChangeShipped(value) { - let data = { + let params = { shipped: value, addressFk: this.ticket.addressFk, agencyModeFk: this.ticket.agencyModeFk, warehouseFk: this.ticket.warehouseFk }; - let query = `/api/Tickets/getLanded`; - this.$http.post(query, data).then(res => { + let query = `/api/Agencies/getLanded`; + this.$http.get(query, {params}).then(res => { if (res.data && res.data.landed) this.ticket.landed = res.data.landed; else { @@ -84,17 +84,17 @@ class Controller { } onChangeLanded(value) { - let data = { + let params = { landed: value, addressFk: this.ticket.addressFk, agencyModeFk: this.ticket.agencyModeFk, warehouseFk: this.ticket.warehouseFk }; - let query = `/api/Tickets/getShipped`; - this.$http.post(query, data).then(res => { - if (res.data && res.data.shipped) - this.ticket.shipped = res.data.shipped; + let query = `/api/Agencies/getShipped`; + this.$http.get(query, {params}).then(res => { + if (res.data) + this.ticket.shipped = res.data; else { return this.vnApp.showError( this.$translate.instant(`There's no available agency for this landing date`) diff --git a/modules/ticket/front/basic-data/step-one/index.spec.js b/modules/ticket/front/basic-data/step-one/index.spec.js index c3bac09d60..dc3a92f332 100644 --- a/modules/ticket/front/basic-data/step-one/index.spec.js +++ b/modules/ticket/front/basic-data/step-one/index.spec.js @@ -5,12 +5,15 @@ describe('Ticket', () => { let $state; let controller; let $httpBackend; + let $httpParamSerializer; + beforeEach(ngModule('ticket')); - beforeEach(angular.mock.inject(($componentController, _$state_, _$httpBackend_) => { + beforeEach(angular.mock.inject(($componentController, _$state_, _$httpBackend_, _$httpParamSerializer_) => { $state = _$state_; $httpBackend = _$httpBackend_; + $httpParamSerializer = _$httpParamSerializer_; controller = $componentController('vnTicketBasicDataStepOne', {$state}); })); @@ -66,15 +69,17 @@ describe('Ticket', () => { agencyModeFk: 2, warehouseFk: 1 }; - let data = { + let params = { shipped: shipped, addressFk: 121, agencyModeFk: 2, warehouseFk: 1 }; - $httpBackend.whenPOST(`/api/Tickets/getLanded`, data).respond(200); - $httpBackend.expectPOST(`/api/Tickets/getLanded`, data); + let serializedParams = $httpParamSerializer(params); + $httpBackend.when('GET', `/api/Agencies/getLanded?${serializedParams}`).respond(200); + $httpBackend.expect('GET', `/api/Agencies/getLanded?${serializedParams}`); + controller.onChangeShipped(shipped); $httpBackend.flush(); }); @@ -83,11 +88,24 @@ describe('Ticket', () => { describe('onChangeLanded()', () => { it('should return an available shipment date', async() => { let landed = new Date(); - controller._ticket = {id: 1, landed: landed, addressFk: 121, agencyModeFk: 2}; - let data = {landed: landed, addressFk: 121, agencyModeFk: 2}; + controller._ticket = { + id: 1, + landed: landed, + addressFk: 121, + agencyModeFk: 2, + warehouseFk: 1 + }; + let params = { + landed: landed, + addressFk: 121, + agencyModeFk: 2, + warehouseFk: 1 + }; + + let serializedParams = $httpParamSerializer(params); + $httpBackend.when('GET', `/api/Agencies/getShipped?${serializedParams}`).respond(200); + $httpBackend.expect('GET', `/api/Agencies/getShipped?${serializedParams}`); - $httpBackend.whenPOST(`/api/Tickets/getShipped`, data).respond(200); - $httpBackend.expectPOST(`/api/Tickets/getShipped`, data); controller.onChangeLanded(landed); $httpBackend.flush(); });