DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`entry_getTransfer`( vSelf INT ) BEGIN /** * Retorna los artículos trasladables a partir de una entrada. * * @param vSelf Id de entrada */ DECLARE vDateShipped DATE; DECLARE vDateLanded DATE; DECLARE vWarehouseIn INT; DECLARE vWarehouseOut INT; DECLARE vCalcVisible INT; DECLARE vInventoryDate DATE DEFAULT getInventoryDate(); SELECT shipped, landed, warehouseInFk, warehouseOutFk INTO vDateShipped, vDateLanded, vWarehouseIn, vWarehouseOut FROM travel t JOIN entry e ON e.travelFk = t.id WHERE e.id = vSelf; CALL rate_getPrices(vDateShipped, vWarehouseIn); -- Traslado en almacen origen CREATE OR REPLACE TEMPORARY TABLE tBuy (PRIMARY KEY (itemFk), INDEX(buyFk)) ENGINE = MEMORY SELECT * FROM ( SELECT b.itemFk, b.id buyFk FROM buy b JOIN entry e ON e.id = b.entryFk JOIN travel t ON t.id = e.travelFk WHERE t.landed BETWEEN vInventoryDate AND vDateShipped AND NOT b.isIgnored AND b.price2 >= 0 ORDER BY (vWarehouseOut = t.warehouseInFk) DESC, t.landed DESC LIMIT 10000000000000000000 ) sub GROUP BY itemFk; IF vDateShipped >= util.VN_CURDATE() THEN CALL `cache`.visible_refresh(vCalcVisible, TRUE, vWarehouseOut); CREATE OR REPLACE TEMPORARY TABLE tItem ( `itemFk` int(10) unsigned NOT NULL, `visible` int(11) NOT NULL DEFAULT 0, `available` int(11) NOT NULL DEFAULT 0, `visibleLanding` int(11) NOT NULL DEFAULT 0, `availableLanding` int(11) NOT NULL DEFAULT 0, UNIQUE INDEX i USING HASH (itemFk) ) ENGINE = MEMORY; INSERT INTO tItem(itemFk, visible) SELECT item_id itemFk, visible FROM `cache`.visible WHERE calc_id = vCalcVisible AND visible; CALL `cache`.visible_refresh(vCalcVisible, TRUE, vWarehouseIn); INSERT INTO tItem(itemFk, visibleLanding) SELECT item_id, `visible` FROM `cache`.`visible` v WHERE v.calc_id = vCalcVisible AND v.`visible` ON DUPLICATE KEY UPDATE visibleLanding = v.`visible`; CALL available_traslate(vWarehouseOut, vDateShipped, NULL); INSERT INTO tItem(itemFk, available) SELECT a.item_id, a.available FROM tmp.availableTraslate a WHERE a.available ON DUPLICATE KEY UPDATE available = a.available; CALL available_traslate(vWarehouseIn, vDateLanded, vWarehouseOut); INSERT INTO tItem(itemFk, availableLanding) SELECT a.item_id, a.available FROM tmp.availableTraslate a WHERE a.available ON DUPLICATE KEY UPDATE availableLanding = a.available; ELSE CALL item_getStock(vWarehouseOut, vDateShipped, NULL); CREATE OR REPLACE TEMPORARY TABLE tItem (UNIQUE INDEX i USING HASH (itemFk)) ENGINE = MEMORY SELECT itemFk, `visible`, available, 0 visibleLanding, 0 availableLanding FROM tmp.itemList; END IF; CALL buy_getUltimateFromInterval(NULL, vWarehouseIn,vInventoryDate, vDateLanded); CREATE OR REPLACE TEMPORARY TABLE tTransfer ENGINE = MEMORY SELECT it.code `type`, it.categoryFk, i.typeFk, i.id itemFk, i.name item, i.`size`, i.category, i.inkFk, o.code originCode, b2.quantity, i.stems, CAST(ti.visible AS DECIMAL(10,0)) vis1, CAST(ti.available AS DECIMAL(10,0)) ava1, CAST(ti.visibleLanding AS DECIMAL(10,0)) vis2, CAST(ti.availableLanding AS DECIMAL(10,0)) ava2, COALESCE(b2.`grouping`, b.`grouping`) `grouping`, COALESCE(b2.packing, b.packing) packing, COALESCE(b3.groupingMode, b2.groupingMode, b.groupingMode) package, IFNULL(p.name, s.nickname) productor, TRUE tinta, b.packagingFk, b2.id buyFk, b2.stickers, b.ektFk, it.workerFk, pa.volume, IFNULL(pa.width, 0) width, IFNULL(pa.`depth`, 0) `depth`, IFNULL(pa.height, 0) height, IFNULL(b.buyingValue, 0) buyingValue, IFNULL(b.comissionValue, 0) comissionValue, IFNULL(b.freightValue, 0) freightValue, am.m3, e.commission, pa.isPackageReturnable, IFNULL(pa2.value, pa.value) `value`, r.rate3 r3, r.rate2 r2, it.promo, b.`grouping` groupingOrigin, b.packing packingOrigin, b.id buyFkOrigin, pa.returnCost, b.weight FROM item i JOIN tItem ti ON ti.itemFk = i.id LEFT JOIN producer p ON p.id = i.producerFk LEFT JOIN itemType it ON it.id = i.typeFk JOIN itemCategory ic ON ic.id = it.categoryFk LEFT JOIN origin o ON o.id = i.originFk LEFT JOIN tBuy lb ON lb.itemFk = i.id LEFT JOIN buy b ON b.id = lb.buyFk LEFT JOIN packaging pa ON pa.id = b.packagingFk LEFT JOIN entry e2 ON e2.id = b.entryFk LEFT JOIN supplier s ON s.id = e2.supplierFk LEFT JOIN entry e ON e.id = vSelf LEFT JOIN travel tr ON tr.id = e.travelFk LEFT JOIN agencyMode am ON am.id = tr.agencyModeFk LEFT JOIN buy b2 ON b2.itemFk = i.id AND b2.entryFk = vSelf LEFT JOIN packaging pa2 ON pa2.id = b.packagingFk LEFT JOIN tmp.rate r ON TRUE LEFT JOIN tmp.buyUltimateFromInterval bufi ON bufi.itemFk = i.id LEFT JOIN buy b3 ON b3.id = bufi.buyFk WHERE ic.display AND NOT tr.daysInForward AND (ti.visible OR ti.available) ORDER BY i.typeFk, i.name, i.id, i.size, i.category, o.name; CREATE INDEX tIndex USING HASH ON tTransfer (itemFk); SELECT *, quantity - MOD(quantity , `grouping`) subQuantity, MOD(quantity, `grouping`) soll, ROUND((IF(volume > 0,volume, width * `depth` * IF(height = 0, `size` + 10, height))) / packing, 0) cm3, buyingValue + comissionValue + freightValue cost, @carriage := ROUND((IF(volume > 0, volume, width * `depth` * IF(height = 0, `size` + 10, height))) * m3 / 1000000 / Packing, 3) carriage, @comission := ROUND((buyingValue + comissionValue + freightValue) * commission / 100, 3) commission, ROUND(@packaging := (returnCost + IF(isPackageReturnable, 0, value)) / packing, 3) packaging, @cost := IFNULL((buyingValue + comissionValue + freightValue), 0) + IFNULL(@packaging, 0) + IFNULL(@carriage, 0) + IFNULL(@comission, 0) expense, @rate3 := ROUND(@cost / ( (100 - r3 - promo) / 100), 2) rate3, ROUND(@rate3 * (1 + ((r2 - r3)/100)), 2) rate2, FALSE selected FROM tTransfer; DROP TEMPORARY TABLE IF EXISTS tTransfer, tItem, tBuy, tmp.buyUltimateFromInterval, tmp.rate, tmp.itemList; END$$ DELIMITER ;