testToMaster #1812

Merged
alexm merged 7 commits from testToMaster into master 2023-10-24 12:25:55 +00:00
5 changed files with 161 additions and 37 deletions

View File

@ -0,0 +1,133 @@
DELIMITER $$
$$
CREATE OR REPLACE 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;
CREATE OR REPLACE 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,
origin.futureZoneFk,
origin.futureZoneName,
origin.classColor futureClassColor,
dest.classColor
FROM (
SELECT
s.ticketFk,
c.salesPersonFk 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,
z.id futureZoneFk,
z.name futureZoneName,
st.classColor
FROM ticket t
JOIN client c ON c.id = t.clientFk
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
JOIN zone z ON t.zoneFk = z.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`,
st.classColor
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 ;

View File

@ -1,4 +1,4 @@
FROM debian:stretch-slim FROM debian:bookworm-slim
EXPOSE 80 EXPOSE 80
ENV TZ Europe/Madrid ENV TZ Europe/Madrid

View File

@ -28,32 +28,27 @@ module.exports = Self => {
{ {
arg: 'ipt', arg: 'ipt',
type: 'string', type: 'string',
description: 'Origin Item Packaging Type', description: 'Origin Item Packaging Type'
required: false
}, },
{ {
arg: 'futureIpt', arg: 'futureIpt',
type: 'string', type: 'string',
description: 'Destination Item Packaging Type', description: 'Destination Item Packaging Type'
required: false
}, },
{ {
arg: 'id', arg: 'id',
type: 'number', type: 'number',
description: 'Origin id', description: 'Origin id'
required: false
}, },
{ {
arg: 'futureId', arg: 'futureId',
type: 'number', type: 'number',
description: 'Destination id', description: 'Destination id'
required: false
}, },
{ {
arg: 'isFullMovable', 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
}, },
{ {
arg: 'filter', arg: 'filter',

View File

@ -81,6 +81,9 @@
<th field="futureLiters"> <th field="futureLiters">
<span translate>Liters</span> <span translate>Liters</span>
</th> </th>
<th field="futureZoneFk">
<span translate>Zone</span>
</th>
<th field="notMovableLines"> <th field="notMovableLines">
<span translate>Not Movable</span> <span translate>Not Movable</span>
</th> </th>
@ -155,6 +158,7 @@
</span> </span>
</td> </td>
<td>{{::ticket.futureLiters | dashIfEmpty}}</td> <td>{{::ticket.futureLiters | dashIfEmpty}}</td>
<td>{{::ticket.futureZoneName | dashIfEmpty}}</td>
<td>{{::ticket.notMovableLines | dashIfEmpty}}</td> <td>{{::ticket.notMovableLines | dashIfEmpty}}</td>
<td>{{::ticket.futureLines | dashIfEmpty}}</td> <td>{{::ticket.futureLines | dashIfEmpty}}</td>
<td> <td>

View File

@ -15,28 +15,22 @@ export default class Controller extends Section {
{ {
field: 'state', field: 'state',
searchable: false searchable: false
}, }, {
{
field: 'futureState', field: 'futureState',
searchable: false searchable: false
}, }, {
{
field: 'totalWithVat', field: 'totalWithVat',
searchable: false searchable: false
}, }, {
{
field: 'futureTotalWithVat', field: 'futureTotalWithVat',
searchable: false searchable: false
}, }, {
{
field: 'shipped', field: 'shipped',
searchable: false searchable: false
}, }, {
{
field: 'futureShipped', field: 'futureShipped',
searchable: false searchable: false
}, }, {
{
field: 'ipt', field: 'ipt',
autocomplete: { autocomplete: {
url: 'ItemPackingTypes', url: 'ItemPackingTypes',
@ -44,8 +38,7 @@ export default class Controller extends Section {
showField: 'description', showField: 'description',
valueField: 'code' valueField: 'code'
} }
}, }, {
{
field: 'futureIpt', field: 'futureIpt',
autocomplete: { autocomplete: {
url: 'ItemPackingTypes', url: 'ItemPackingTypes',
@ -53,6 +46,11 @@ export default class Controller extends Section {
showField: 'description', showField: 'description',
valueField: 'code' valueField: 'code'
} }
}, {
field: 'futureZoneFk',
autocomplete: {
url: 'Zones',
}
}, },
] ]
}; };
@ -158,27 +156,21 @@ export default class Controller extends Section {
exprBuilder(param, value) { exprBuilder(param, value) {
switch (param) { switch (param) {
case 'id': case 'id':
return {'id': value};
case 'futureId': case 'futureId':
return {'futureId': value};
case 'liters': case 'liters':
return {'liters': value};
case 'futureLiters': case 'futureLiters':
return {'futureLiters': value};
case 'lines': case 'lines':
return {'lines': value};
case 'futureLines': case 'futureLines':
return {'futureLines': value}; case 'totalWithVat':
case 'futureTotalWithVat':
case 'futureZone':
case 'notMovableLines':
case 'futureZoneFk':
return {[param]: value};
case 'ipt': case 'ipt':
return {'ipt': {like: `%${value}%`}}; return {'ipt': {like: `%${value}%`}};
case 'futureIpt': case 'futureIpt':
return {'futureIpt': {like: `%${value}%`}}; return {'futureIpt': {like: `%${value}%`}};
case 'totalWithVat':
return {'totalWithVat': value};
case 'futureTotalWithVat':
return {'futureTotalWithVat': value};
case 'notMovableLines':
return {'notMovableLines': value};
} }
} }
} }