This commit is contained in:
parent
6cb815faaf
commit
76ed4d2d4b
|
@ -0,0 +1,127 @@
|
||||||
|
DROP PROCEDURE IF EXISTS `vn`.`ticket_canAdvance`;
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
$$
|
||||||
|
CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_canAdvance`(vDateFuture DATE, vDateToAdvance DATE, vWarehouseFk INT)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Devuelve los tickets y la cantidad de lineas de venta que se pueden adelantar.
|
||||||
|
*
|
||||||
|
* @param vDateFuture Fecha de los tickets que se quieren adelantar.
|
||||||
|
* @param vDateToAdvance Fecha a cuando se quiere adelantar.
|
||||||
|
* @param vWarehouseFk Almacén
|
||||||
|
*/
|
||||||
|
|
||||||
|
DECLARE vDateInventory DATE;
|
||||||
|
|
||||||
|
SELECT inventoried INTO vDateInventory FROM config;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.stock;
|
||||||
|
CREATE TEMPORARY TABLE tmp.stock
|
||||||
|
(itemFk INT PRIMARY KEY,
|
||||||
|
amount INT)
|
||||||
|
ENGINE = MEMORY;
|
||||||
|
|
||||||
|
INSERT INTO tmp.stock(itemFk, amount)
|
||||||
|
SELECT itemFk, SUM(quantity) amount FROM
|
||||||
|
(
|
||||||
|
SELECT itemFk, quantity
|
||||||
|
FROM itemTicketOut
|
||||||
|
WHERE shipped >= vDateInventory
|
||||||
|
AND shipped < vDateFuture
|
||||||
|
AND warehouseFk = vWarehouseFk
|
||||||
|
UNION ALL
|
||||||
|
SELECT itemFk, quantity
|
||||||
|
FROM itemEntryIn
|
||||||
|
WHERE landed >= vDateInventory
|
||||||
|
AND landed < vDateFuture
|
||||||
|
AND isVirtualStock = FALSE
|
||||||
|
AND warehouseInFk = vWarehouseFk
|
||||||
|
UNION ALL
|
||||||
|
SELECT itemFk, quantity
|
||||||
|
FROM itemEntryOut
|
||||||
|
WHERE shipped >= vDateInventory
|
||||||
|
AND shipped < vDateFuture
|
||||||
|
AND warehouseOutFk = vWarehouseFk
|
||||||
|
) t
|
||||||
|
GROUP BY itemFk HAVING amount != 0;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.filter;
|
||||||
|
CREATE TEMPORARY TABLE tmp.filter
|
||||||
|
(INDEX (id))
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
origin.ticketFk futureId,
|
||||||
|
dest.ticketFk id,
|
||||||
|
dest.state,
|
||||||
|
origin.futureState,
|
||||||
|
origin.futureIpt,
|
||||||
|
dest.ipt,
|
||||||
|
origin.workerFk,
|
||||||
|
origin.futureLiters,
|
||||||
|
origin.futureLines,
|
||||||
|
dest.shipped,
|
||||||
|
origin.shipped futureShipped,
|
||||||
|
dest.totalWithVat,
|
||||||
|
origin.totalWithVat futureTotalWithVat,
|
||||||
|
dest.agency,
|
||||||
|
origin.futureAgency,
|
||||||
|
dest.lines,
|
||||||
|
dest.liters,
|
||||||
|
origin.futureLines - origin.hasStock AS notMovableLines,
|
||||||
|
(origin.futureLines = origin.hasStock) AS isFullMovable
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
s.ticketFk,
|
||||||
|
t.workerFk,
|
||||||
|
t.shipped,
|
||||||
|
t.totalWithVat,
|
||||||
|
st.name futureState,
|
||||||
|
t.addressFk,
|
||||||
|
am.name futureAgency,
|
||||||
|
count(s.id) futureLines,
|
||||||
|
GROUP_CONCAT(DISTINCT ipt.code ORDER BY ipt.code) futureIpt,
|
||||||
|
CAST(SUM(litros) AS DECIMAL(10,0)) futureLiters,
|
||||||
|
SUM((s.quantity <= IFNULL(st.amount,0))) hasStock
|
||||||
|
FROM ticket t
|
||||||
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
|
JOIN saleVolume sv ON sv.saleFk = s.id
|
||||||
|
JOIN item i ON i.id = s.itemFk
|
||||||
|
JOIN ticketState ts ON ts.ticketFk = t.id
|
||||||
|
JOIN state st ON st.id = ts.stateFk
|
||||||
|
JOIN agencyMode am ON t.agencyModeFk = am.id
|
||||||
|
LEFT JOIN itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
|
||||||
|
LEFT JOIN tmp.stock st ON st.itemFk = i.id
|
||||||
|
WHERE t.shipped BETWEEN vDateFuture AND util.dayend(vDateFuture)
|
||||||
|
AND t.warehouseFk = vWarehouseFk
|
||||||
|
GROUP BY t.id
|
||||||
|
) origin
|
||||||
|
JOIN (
|
||||||
|
SELECT
|
||||||
|
t.id ticketFk,
|
||||||
|
t.addressFk,
|
||||||
|
st.name state,
|
||||||
|
GROUP_CONCAT(DISTINCT ipt.code ORDER BY ipt.code) ipt,
|
||||||
|
t.shipped,
|
||||||
|
t.totalWithVat,
|
||||||
|
am.name agency,
|
||||||
|
CAST(SUM(litros) AS DECIMAL(10,0)) liters,
|
||||||
|
CAST(COUNT(*) AS DECIMAL(10,0)) `lines`
|
||||||
|
FROM ticket t
|
||||||
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
|
JOIN saleVolume sv ON sv.saleFk = s.id
|
||||||
|
JOIN item i ON i.id = s.itemFk
|
||||||
|
JOIN ticketState ts ON ts.ticketFk = t.id
|
||||||
|
JOIN state st ON st.id = ts.stateFk
|
||||||
|
JOIN agencyMode am ON t.agencyModeFk = am.id
|
||||||
|
LEFT JOIN itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
|
||||||
|
WHERE t.shipped BETWEEN vDateToAdvance AND util.dayend(vDateToAdvance)
|
||||||
|
AND t.warehouseFk = vWarehouseFk
|
||||||
|
AND st.order <= 5
|
||||||
|
GROUP BY t.id
|
||||||
|
) dest ON dest.addressFk = origin.addressFk
|
||||||
|
WHERE origin.hasStock != 0;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE tmp.stock;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -1,114 +0,0 @@
|
||||||
DROP PROCEDURE IF EXISTS vn.ticket_canAdvance;
|
|
||||||
|
|
||||||
DELIMITER $$
|
|
||||||
$$
|
|
||||||
CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_canAdvance`(vDateFuture DATE, vDateToAdvance DATE, vWarehouseFk INT)
|
|
||||||
BEGIN
|
|
||||||
/**
|
|
||||||
* Devuelve los tickets y la cantidad de lineas de venta que se pueden adelantar.
|
|
||||||
*
|
|
||||||
* @param vDateFuture Fecha de los tickets que se quieren adelantar.
|
|
||||||
* @param vDateToAdvance Fecha a cuando se quiere adelantar.
|
|
||||||
* @param vWarehouseFk Almacén
|
|
||||||
*/
|
|
||||||
|
|
||||||
DECLARE vDateInventory DATE;
|
|
||||||
|
|
||||||
SELECT inventoried INTO vDateInventory FROM vn.config;
|
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS tmp.stock;
|
|
||||||
CREATE TEMPORARY TABLE tmp.stock
|
|
||||||
(itemFk INT PRIMARY KEY,
|
|
||||||
amount INT)
|
|
||||||
ENGINE = MEMORY;
|
|
||||||
|
|
||||||
INSERT INTO tmp.stock(itemFk, amount)
|
|
||||||
SELECT itemFk, SUM(quantity) amount FROM
|
|
||||||
(
|
|
||||||
SELECT itemFk, quantity
|
|
||||||
FROM vn.itemTicketOut
|
|
||||||
WHERE shipped >= vDateInventory
|
|
||||||
AND shipped < vDateFuture
|
|
||||||
AND warehouseFk = vWarehouseFk
|
|
||||||
UNION ALL
|
|
||||||
SELECT itemFk, quantity
|
|
||||||
FROM vn.itemEntryIn
|
|
||||||
WHERE landed >= vDateInventory
|
|
||||||
AND landed < vDateFuture
|
|
||||||
AND isVirtualStock = FALSE
|
|
||||||
AND warehouseInFk = vWarehouseFk
|
|
||||||
UNION ALL
|
|
||||||
SELECT itemFk, quantity
|
|
||||||
FROM vn.itemEntryOut
|
|
||||||
WHERE shipped >= vDateInventory
|
|
||||||
AND shipped < vDateFuture
|
|
||||||
AND warehouseOutFk = vWarehouseFk
|
|
||||||
) t
|
|
||||||
GROUP BY itemFk HAVING amount != 0;
|
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS tmp.filter;
|
|
||||||
CREATE TEMPORARY TABLE tmp.filter
|
|
||||||
(INDEX (id))
|
|
||||||
|
|
||||||
SELECT
|
|
||||||
*,
|
|
||||||
CASE WHEN sub.futureLines = hasStock THEN '1' ELSE '0' END AS fullMovable
|
|
||||||
FROM (SELECT s.ticketFk futureId,
|
|
||||||
t2.ticketFk id,
|
|
||||||
count(DISTINCT s.id) saleCount,
|
|
||||||
t2.state,
|
|
||||||
st.name futureState,
|
|
||||||
GROUP_CONCAT(DISTINCT ipt.code ORDER BY ipt.code) futureIpt,
|
|
||||||
t2.ipt,
|
|
||||||
t.workerFk,
|
|
||||||
CAST(SUM(litros) AS DECIMAL(10,0)) futureLiters,
|
|
||||||
CAST(COUNT(*) AS DECIMAL(10,0)) `futureLines`,
|
|
||||||
t2.shipped,
|
|
||||||
t.shipped futureShipped,
|
|
||||||
t2.totalWithVat,
|
|
||||||
t.totalWithVat futureTotalWithVat,
|
|
||||||
t2.agency,
|
|
||||||
am.name futureAgency,
|
|
||||||
t2.lines,
|
|
||||||
t2.liters,
|
|
||||||
SUM((s.quantity <= IFNULL(st.amount,0))) AS hasStock
|
|
||||||
FROM vn.ticket t
|
|
||||||
JOIN vn.sale s ON s.ticketFk = t.id
|
|
||||||
JOIN vn.saleVolume sv ON sv.saleFk = s.id
|
|
||||||
JOIN vn.item i ON i.id = s.itemFk
|
|
||||||
JOIN vn.ticketState ts ON ts.ticketFk = t.id
|
|
||||||
JOIN vn.state st ON st.id = ts.stateFk
|
|
||||||
JOIN vn.agencyMode am ON t.agencyModeFk = am.id
|
|
||||||
LEFT JOIN vn.itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
|
|
||||||
LEFT JOIN tmp.stock st ON st.itemFk = i.id
|
|
||||||
JOIN (SELECT
|
|
||||||
t2.id ticketFk,
|
|
||||||
t2.addressFk,
|
|
||||||
st.name state,
|
|
||||||
GROUP_CONCAT(DISTINCT ipt.code ORDER BY ipt.code) ipt,
|
|
||||||
t2.shipped,
|
|
||||||
t2.totalWithVat,
|
|
||||||
am.name agency,
|
|
||||||
CAST(SUM(litros) AS DECIMAL(10,0)) liters,
|
|
||||||
CAST(COUNT(*) AS DECIMAL(10,0)) `lines`
|
|
||||||
FROM vn.ticket t2
|
|
||||||
JOIN vn.sale s ON s.ticketFk = t2.id
|
|
||||||
JOIN vn.saleVolume sv ON sv.saleFk = s.id
|
|
||||||
JOIN vn.item i ON i.id = s.itemFk
|
|
||||||
JOIN vn.ticketState ts ON ts.ticketFk = t2.id
|
|
||||||
JOIN vn.state st ON st.id = ts.stateFk
|
|
||||||
JOIN vn.agencyMode am ON t2.agencyModeFk = am.id
|
|
||||||
LEFT JOIN vn.itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
|
|
||||||
WHERE t2.shipped BETWEEN vDateToAdvance AND util.dayend(vDateToAdvance)
|
|
||||||
AND t2.warehouseFk = vWarehouseFk
|
|
||||||
AND st.order <= 5
|
|
||||||
GROUP BY t2.id) t2 ON t2.addressFk = t.addressFk
|
|
||||||
WHERE t.shipped BETWEEN vDateFuture AND util.dayend(vDateFuture)
|
|
||||||
AND t.warehouseFk = vWarehouseFk
|
|
||||||
GROUP BY t.id
|
|
||||||
) sub
|
|
||||||
WHERE hasStock != 0;
|
|
||||||
|
|
||||||
DROP TEMPORARY TABLE tmp.stock;
|
|
||||||
END$$
|
|
||||||
DELIMITER ;
|
|
|
@ -778,18 +778,16 @@ export default {
|
||||||
ipt: 'vn-autocomplete[label="Destination IPT"]',
|
ipt: 'vn-autocomplete[label="Destination IPT"]',
|
||||||
tableIpt: 'vn-autocomplete[name="ipt"]',
|
tableIpt: 'vn-autocomplete[name="ipt"]',
|
||||||
tableFutureIpt: 'vn-autocomplete[name="futureIpt"]',
|
tableFutureIpt: 'vn-autocomplete[name="futureIpt"]',
|
||||||
futureState: 'vn-check[label="Pending Origin"]',
|
isFullMovable: 'vn-check[ng-model="filter.isFullMovable"]',
|
||||||
state: 'vn-check[label="Pending Destination"]',
|
|
||||||
warehouseFk: 'vn-autocomplete[label="Warehouse"]',
|
warehouseFk: 'vn-autocomplete[label="Warehouse"]',
|
||||||
tableButtonSearch: 'vn-button[vn-tooltip="Search"]',
|
tableButtonSearch: 'vn-button[vn-tooltip="Search"]',
|
||||||
moveButton: 'vn-button[vn-tooltip="Advance tickets"]',
|
moveButton: 'vn-button[vn-tooltip="Advance tickets"]',
|
||||||
acceptButton: '.vn-confirm.shown button[response="accept"]',
|
acceptButton: '.vn-confirm.shown button[response="accept"]',
|
||||||
multiCheck: 'vn-multi-check',
|
firstCheck: 'tbody > tr:nth-child(1) > td > vn-check',
|
||||||
tableId: 'vn-textfield[name="id"]',
|
tableId: 'vn-textfield[name="id"]',
|
||||||
tableFutureId: 'vn-textfield[name="futureId"]',
|
tableFutureId: 'vn-textfield[name="futureId"]',
|
||||||
tableLiters: 'vn-textfield[name="liters"]',
|
tableLiters: 'vn-textfield[name="liters"]',
|
||||||
tableLines: 'vn-textfield[name="lines"]',
|
tableLines: 'vn-textfield[name="lines"]',
|
||||||
tableStock: 'vn-textfield[name="hasStock"]',
|
|
||||||
submit: 'vn-submit[label="Search"]',
|
submit: 'vn-submit[label="Search"]',
|
||||||
table: 'tbody > tr:not(.empty-rows)'
|
table: 'tbody > tr:not(.empty-rows)'
|
||||||
},
|
},
|
||||||
|
|
|
@ -88,7 +88,7 @@ describe('Ticket Advance path', () => {
|
||||||
await page.waitToClick(selectors.ticketAdvance.tableButtonSearch);
|
await page.waitToClick(selectors.ticketAdvance.tableButtonSearch);
|
||||||
await page.autocompleteSearch(selectors.ticketAdvance.tableFutureIpt, 'Vertical');
|
await page.autocompleteSearch(selectors.ticketAdvance.tableFutureIpt, 'Vertical');
|
||||||
|
|
||||||
const request = httpRequests.find(req => req.includes(('ipt')));
|
const request = httpRequests.find(req => req.includes(('futureIpt')));
|
||||||
|
|
||||||
expect(request).toBeDefined();
|
expect(request).toBeDefined();
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ describe('Ticket Advance path', () => {
|
||||||
await page.waitToClick(selectors.ticketAdvance.tableButtonSearch);
|
await page.waitToClick(selectors.ticketAdvance.tableButtonSearch);
|
||||||
await page.autocompleteSearch(selectors.ticketAdvance.tableIpt, 'Vertical');
|
await page.autocompleteSearch(selectors.ticketAdvance.tableIpt, 'Vertical');
|
||||||
|
|
||||||
const request = httpRequests.find(req => req.includes(('futureIpt')));
|
const request = httpRequests.find(req => req.includes(('ipt')));
|
||||||
|
|
||||||
expect(request).toBeDefined();
|
expect(request).toBeDefined();
|
||||||
|
|
||||||
|
@ -114,8 +114,8 @@ describe('Ticket Advance path', () => {
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
await page.waitToClick(selectors.ticketAdvance.submit);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should check the one ticket and move to the present', async() => {
|
it('should check the first ticket and move to the present', async() => {
|
||||||
await page.waitToClick(selectors.ticketAdvance.multiCheck);
|
await page.waitToClick(selectors.ticketAdvance.firstCheck);
|
||||||
await page.waitToClick(selectors.ticketAdvance.moveButton);
|
await page.waitToClick(selectors.ticketAdvance.moveButton);
|
||||||
await page.waitToClick(selectors.ticketAdvance.acceptButton);
|
await page.waitToClick(selectors.ticketAdvance.acceptButton);
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
|
@ -50,7 +50,7 @@ module.exports = Self => {
|
||||||
required: false
|
required: false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
arg: 'fullMovable',
|
arg: 'isFullMovable',
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
description: 'True when lines and stock of origin are equal',
|
description: 'True when lines and stock of origin are equal',
|
||||||
required: false
|
required: false
|
||||||
|
@ -99,8 +99,8 @@ module.exports = Self => {
|
||||||
{'f.futureIpt': null}
|
{'f.futureIpt': null}
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
case 'fullMovable':
|
case 'isFullMovable':
|
||||||
return {'f.fullMovable': value};
|
return {'f.isFullMovable': value};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -39,7 +39,7 @@ describe('ticket getTicketsAdvance()', () => {
|
||||||
dateFuture: tomorrow,
|
dateFuture: tomorrow,
|
||||||
dateToAdvance: today,
|
dateToAdvance: today,
|
||||||
warehouseFk: 1,
|
warehouseFk: 1,
|
||||||
fullMovable: true
|
isFullMovable: true
|
||||||
};
|
};
|
||||||
|
|
||||||
const ctx = {req: {accessToken: {userId: 9}}, args};
|
const ctx = {req: {accessToken: {userId: 9}}, args};
|
||||||
|
@ -64,7 +64,7 @@ describe('ticket getTicketsAdvance()', () => {
|
||||||
dateFuture: tomorrow,
|
dateFuture: tomorrow,
|
||||||
dateToAdvance: today,
|
dateToAdvance: today,
|
||||||
warehouseFk: 1,
|
warehouseFk: 1,
|
||||||
fullMovable: false
|
isFullMovable: false
|
||||||
};
|
};
|
||||||
|
|
||||||
const ctx = {req: {accessToken: {userId: 9}}, args};
|
const ctx = {req: {accessToken: {userId: 9}}, args};
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
<vn-check
|
<vn-check
|
||||||
vn-one
|
vn-one
|
||||||
label="100% movable"
|
label="100% movable"
|
||||||
ng-model="filter.fullMovable"
|
ng-model="filter.isFullMovable"
|
||||||
triple-state="true">
|
triple-state="true">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
|
|
|
@ -81,8 +81,8 @@
|
||||||
<th field="futureLiters">
|
<th field="futureLiters">
|
||||||
<span translate>Liters</span>
|
<span translate>Liters</span>
|
||||||
</th>
|
</th>
|
||||||
<th field="hasStock">
|
<th field="notMovableLines">
|
||||||
<span>Stock</span>
|
<span translate>Not Movable</span>
|
||||||
</th>
|
</th>
|
||||||
<th field="futureLines">
|
<th field="futureLines">
|
||||||
<span translate>Lines</span>
|
<span translate>Lines</span>
|
||||||
|
@ -155,7 +155,7 @@
|
||||||
</span>
|
</span>
|
||||||
</td>
|
</td>
|
||||||
<td>{{::ticket.futureLiters | dashIfEmpty}}</td>
|
<td>{{::ticket.futureLiters | dashIfEmpty}}</td>
|
||||||
<td>{{::ticket.hasStock | dashIfEmpty}}</td>
|
<td>{{::ticket.notMovableLines | dashIfEmpty}}</td>
|
||||||
<td>{{::ticket.futureLines | dashIfEmpty}}</td>
|
<td>{{::ticket.futureLines | dashIfEmpty}}</td>
|
||||||
<td>
|
<td>
|
||||||
<span
|
<span
|
||||||
|
|
|
@ -194,8 +194,8 @@ export default class Controller extends Section {
|
||||||
return {'totalWithVat': value};
|
return {'totalWithVat': value};
|
||||||
case 'futureTotalWithVat':
|
case 'futureTotalWithVat':
|
||||||
return {'futureTotalWithVat': value};
|
return {'futureTotalWithVat': value};
|
||||||
case 'hasStock':
|
case 'notMovableLines':
|
||||||
return {'hasStock': value};
|
return {'notMovableLines': value};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,3 +8,4 @@ Item Packing Type: Encajado
|
||||||
Origin agency: "Agencia origen: {{agency}}"
|
Origin agency: "Agencia origen: {{agency}}"
|
||||||
Destination agency: "Agencia destino: {{agency}}"
|
Destination agency: "Agencia destino: {{agency}}"
|
||||||
Less than 50€: Menor a 50€
|
Less than 50€: Menor a 50€
|
||||||
|
Not Movable: No movibles
|
||||||
|
|
Loading…
Reference in New Issue