USE `vn`; DROP procedure IF EXISTS `ticket_componentPreview`; DELIMITER $$ USE `vn`$$ CREATE DEFINER=`root`@`%` PROCEDURE `ticket_componentPreview`( vTicketFk INT, vLanded DATE, vAddressFk INT, vZoneFk INT, vWarehouseFk SMALLINT) BEGIN /** * Calcula los componentes de los articulos de un ticket * * @param vTicketFk id del ticket * @param vLanded nueva fecha de entrega * @param vAddressFk nuevo consignatario * @param vZoneFk nueva zona * @param vWarehouseFk nuevo warehouse * * @return tmp.ticketComponentPreview (warehouseFk, itemFk, componentFk, cost) */ DECLARE vHasDataChanged BOOL DEFAULT FALSE; DECLARE vHasAddressChanged BOOL; DECLARE vHasZoneChanged BOOL DEFAULT FALSE; DECLARE vHasWarehouseChanged BOOL DEFAULT FALSE; DECLARE vShipped DATE; DECLARE vAddressTypeRateFk INT DEFAULT NULL; DECLARE vAgencyModeTypeRateFk INT DEFAULT NULL; DECLARE vHasChangeAll BOOL DEFAULT FALSE; SELECT DATE(landed) <> vLanded, addressFk <> vAddressFk, zoneFk <> vZoneFk, warehouseFk <> vWarehouseFk INTO vHasDataChanged, vHasAddressChanged, vHasZoneChanged, 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 vHasZoneChanged THEN SET vAgencyModeTypeRateFk = 6; END IF; SELECT TIMESTAMPADD(DAY, -travelingDays, vLanded) INTO vShipped FROM zone WHERE id = vZoneFk; 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, vZoneFk zoneFk FROM sale s LEFT JOIN tmp.buyUltimate bu ON bu.itemFk = s.itemFk WHERE s.ticketFk = vTicketFk GROUP BY bu.warehouseFk, bu.itemFk); CALL catalog_componentPrepare(); CALL catalog_componentCalculate(vZoneFk, vAddressFk, vShipped, vWarehouseFk); 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 `component` c ON c.id = sc.componentFk WHERE s.ticketFk = vTicketFk AND (c.isRenewable = FALSE OR (NOT vHasChangeAll AND (NOT (c.typeFk <=> vAddressTypeRateFk OR c.typeFk <=> vAgencyModeTypeRateFk)))); DROP TEMPORARY TABLE IF EXISTS tmp.ticketComponentPreview; CREATE TEMPORARY TABLE tmp.ticketComponentPreview SELECT * FROM tmp.ticketComponent; CALL catalog_componentPurge(); DROP TEMPORARY TABLE tmp.buyUltimate; IF vShipped IS NULL THEN CALL util.throw('NO_ZONE_AVAILABLE'); END IF; IF vShipped < CURDATE() THEN CALL util.throw('ERROR_PAST_SHIPMENT'); END IF; END$$ DELIMITER ;