feat: refs #6822 entryTransfer #2503
|
@ -15,7 +15,7 @@ BEGIN
|
||||||
|
|
||||||
DELETE FROM bs.ventas_contables
|
DELETE FROM bs.ventas_contables
|
||||||
WHERE year = vYear
|
WHERE year = vYear
|
||||||
AND month = vMonth;
|
AND month = vMonth;
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS tmp.ticket_list;
|
DROP TEMPORARY TABLE IF EXISTS tmp.ticket_list;
|
||||||
CREATE TEMPORARY TABLE tmp.ticket_list
|
CREATE TEMPORARY TABLE tmp.ticket_list
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`entry_clone`(vSelf INT)
|
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`entry_clone`(vSelf INT, OUT newEntryFk INT)
|
||||||
BEGIN
|
BEGIN
|
||||||
/**
|
/**
|
||||||
* clones an entry.
|
* clones an entry.
|
||||||
|
@ -8,13 +8,19 @@ BEGIN
|
||||||
*/
|
*/
|
||||||
DECLARE vNewEntryFk INT;
|
DECLARE vNewEntryFk INT;
|
||||||
|
|
||||||
|
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
||||||
|
BEGIN
|
||||||
|
ROLLBACK;
|
||||||
|
RESIGNAL;
|
||||||
|
END;
|
||||||
|
|
||||||
START TRANSACTION;
|
START TRANSACTION;
|
||||||
|
|
||||||
CALL entry_cloneHeader(vSelf, vNewEntryFk, NULL);
|
CALL entry_cloneHeader(vSelf, vNewEntryFk, NULL);
|
||||||
CALL entry_copyBuys(vSelf, vNewEntryFk);
|
CALL entry_copyBuys(vSelf, vNewEntryFk);
|
||||||
|
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
SET newEntryFk = vNewEntryFk;
|
||||||
|
|
||||||
SELECT vNewEntryFk;
|
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
|
@ -40,7 +40,7 @@ BEGIN
|
||||||
LEAVE read_loop;
|
LEAVE read_loop;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
IF vIshStickers = vBuyStickers THEN
|
IF vIshStickers = vBuyStickers THEN
|
||||||
UPDATE buy
|
UPDATE buy
|
||||||
SET entryFk = vToEntryFk
|
SET entryFk = vToEntryFk
|
||||||
WHERE id = vBuyFk;
|
WHERE id = vBuyFk;
|
||||||
|
|
|
@ -0,0 +1,119 @@
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_transfer`(vOriginalEntry INT, OUT vNewEntry INT)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Adelanta a mañana la mercancia de una entrada a partir de lo que hay ubicado en el almacén
|
||||||
|
*
|
||||||
|
* @param vOriginalEntry entrada que se quiera adelantar
|
||||||
|
*/
|
||||||
|
DECLARE vNewEntryFk INT;
|
||||||
|
DECLARE vTravelFk INT;
|
||||||
|
DECLARE vWarehouseFk INT;
|
||||||
|
|
||||||
|
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
||||||
|
BEGIN
|
||||||
|
ROLLBACK;
|
||||||
|
RESIGNAL;
|
||||||
|
END;
|
||||||
|
|
||||||
|
-- Clonar la entrada
|
||||||
|
CALL entry_clone(vOriginalEntry,vNewEntryFk);
|
||||||
|
|
||||||
|
START TRANSACTION;
|
||||||
|
|
||||||
|
-- Hay que crear un nuevo travel, con salida hoy y llegada mañana y asignar la entrada nueva al nuevo travel.
|
||||||
|
INSERT INTO travel(
|
||||||
|
shipped,
|
||||||
|
landed,
|
||||||
|
warehouseInFk,
|
||||||
|
warehouseOutFk,
|
||||||
|
`ref`,
|
||||||
|
isReceived,
|
||||||
|
agencyModeFk)
|
||||||
|
SELECT util.VN_CURDATE(),
|
||||||
|
util.VN_CURDATE() + INTERVAL 1 DAY,
|
||||||
|
t.warehouseInFk,
|
||||||
|
t.warehouseInFk,
|
||||||
|
t.`ref`,
|
||||||
|
t.isReceived,
|
||||||
|
t.agencyModeFk
|
||||||
|
FROM travel t
|
||||||
|
JOIN entry e ON e.travelFk = t.id
|
||||||
|
WHERE e.id = vOriginalEntry;
|
||||||
|
|
||||||
|
SET vTravelFk = LAST_INSERT_ID();
|
||||||
|
|
||||||
|
UPDATE entry
|
||||||
|
SET travelFk = vTravelFk
|
||||||
|
WHERE id = vNewEntryFk;
|
||||||
|
|
||||||
|
-- Poner a 0 las cantidades
|
||||||
|
UPDATE buy b
|
||||||
|
SET b.quantity = 0, b.stickers = 0
|
||||||
|
WHERE b.entryFk = vNewEntryFk;
|
||||||
|
|
||||||
|
-- Eliminar duplicados
|
||||||
|
DELETE b.*
|
||||||
|
FROM buy b
|
||||||
|
LEFT JOIN (SELECT b.id, b.itemFk
|
||||||
|
FROM buy b
|
||||||
|
WHERE b.entryFk = vNewEntryFk
|
||||||
|
GROUP BY b.itemFk) tBuy ON tBuy.id = b.id
|
||||||
|
WHERE b.entryFk = vNewEntryFk
|
||||||
|
AND tBuy.id IS NULL;
|
||||||
|
|
||||||
|
SELECT t.warehouseInFk INTO vWarehouseFk
|
||||||
|
FROM travel t
|
||||||
|
JOIN entry e ON e.travelFk = t.id
|
||||||
|
WHERE e.id = vOriginalEntry;
|
||||||
|
|
||||||
|
-- Actualizar la nueva entrada con lo que no está ubicado HOY, descontando lo vendido HOY de esas ubicaciones
|
||||||
|
CREATE OR REPLACE TEMPORARY TABLE tBuy
|
||||||
|
ENGINE = MEMORY
|
||||||
|
SELECT tBuy.itemFk, IFNULL(iss.visible,0) visible, tBuy.totalQuantity, IFNULL(sales.sold,0) sold
|
||||||
|
FROM (SELECT b.itemFk, SUM(b.quantity) totalQuantity
|
||||||
|
FROM buy b
|
||||||
|
WHERE b.entryFk = vOriginalEntry
|
||||||
|
GROUP BY b.itemFk
|
||||||
|
) tBuy
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT ish.itemFk, SUM(visible) visible
|
||||||
|
FROM itemShelving ish
|
||||||
|
JOIN shelving sh ON sh.code = ish.shelvingFk
|
||||||
|
JOIN parking p ON p.id = sh.parkingFk
|
||||||
|
JOIN sector s ON s.id = p.sectorFk
|
||||||
|
WHERE s.warehouseFk = vWarehouseFk
|
||||||
|
AND sh.parked = util.VN_CURDATE()
|
||||||
|
GROUP BY ish.itemFk) iss ON tBuy.itemFk = iss.itemFk
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT s.itemFk, SUM(s.quantity) sold
|
||||||
|
FROM ticket t
|
||||||
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
|
JOIN itemShelvingSale iss ON iss.saleFk = s.id
|
||||||
|
JOIN itemShelving is2 ON is2.id = iss.itemShelvingFk
|
||||||
|
JOIN shelving s2 ON s2.code = is2.shelvingFk
|
||||||
|
WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(util.VN_CURDATE())
|
||||||
|
AND s2.parked = util.VN_CURDATE()
|
||||||
|
GROUP BY s.itemFk) sales ON sales.itemFk = tBuy.itemFk
|
||||||
|
WHERE visible = tBuy.totalQuantity
|
||||||
|
OR iss.itemFk IS NULL;
|
||||||
|
|
||||||
|
UPDATE buy b
|
||||||
|
JOIN (SELECT * FROM tBuy) sub ON sub.itemFk = b.itemFk
|
||||||
|
SET b.quantity = sub.totalQuantity - sub.visible - sub.sold
|
||||||
|
WHERE b.entryFk = vNewEntryFk;
|
||||||
|
|
||||||
|
-- Limpia la nueva entrada
|
||||||
|
DELETE b.*
|
||||||
|
FROM buy b
|
||||||
|
WHERE b.entryFk = vNewEntryFk
|
||||||
|
AND b.quantity = 0;
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
SET vNewEntry = vNewEntryFk;
|
||||||
|
|
||||||
|
CALL cache.visible_refresh(@c,TRUE,7);
|
||||||
|
CALL cache.available_refresh(@c, TRUE, 7, util.VN_CURDATE());
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -0,0 +1,45 @@
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethodCtx('transfer', {
|
||||||
|
description: 'Trasladar la mercancia de una entrada al dia siguiente',
|
||||||
|
accepts: [
|
||||||
|
{
|
||||||
|
arg: 'id',
|
||||||
|
type: 'number',
|
||||||
|
required: true,
|
||||||
|
http: {source: 'path'}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
http: {
|
||||||
|
path: '/:id/transfer',
|
||||||
|
verb: 'POST'
|
||||||
|
},
|
||||||
|
returns: {
|
||||||
|
arg: 'newEntryFk',
|
||||||
|
type: 'number'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.transfer = async(ctx, id, options) => {
|
||||||
|
const myOptions = {userId: ctx.req.accessToken.userId};
|
||||||
|
let tx;
|
||||||
|
|
||||||
|
if (typeof options == 'object')
|
||||||
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
|
if (!myOptions.transaction) {
|
||||||
|
tx = await Self.beginTransaction({});
|
||||||
|
myOptions.transaction = tx;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await Self.rawSql('CALL vn.entry_transfer(?, @vNewEntry)', [id], myOptions);
|
||||||
|
const newEntryFk = await Self.rawSql('SELECT @vNewEntry AS newEntryFk', [], myOptions);
|
||||||
|
|
||||||
|
if (tx) await tx.commit();
|
||||||
|
return newEntryFk;
|
||||||
|
} catch (e) {
|
||||||
|
if (tx) await tx.rollback();
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
|
@ -11,6 +11,7 @@ module.exports = Self => {
|
||||||
require('../methods/entry/addFromPackaging')(Self);
|
require('../methods/entry/addFromPackaging')(Self);
|
||||||
require('../methods/entry/addFromBuy')(Self);
|
require('../methods/entry/addFromBuy')(Self);
|
||||||
require('../methods/entry/buyLabel')(Self);
|
require('../methods/entry/buyLabel')(Self);
|
||||||
|
require('../methods/entry/transfer')(Self);
|
||||||
require('../methods/entry/print')(Self);
|
require('../methods/entry/print')(Self);
|
||||||
|
|
||||||
Self.observe('before save', async function(ctx, options) {
|
Self.observe('before save', async function(ctx, options) {
|
||||||
|
|
Loading…
Reference in New Issue