refs #6254-collection_getTickets
This commit is contained in:
commit
41ac907b05
|
@ -5,12 +5,10 @@ All notable changes to this project will be documented in this file.
|
||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
|
||||||
## [2340.01] - 2023-10-05
|
## [2340.01] - 2023-10-05
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
## [2338.01] - 2023-09-21
|
## [2338.01] - 2023-09-21
|
||||||
|
|
|
@ -59,8 +59,12 @@ module.exports = Self => {
|
||||||
sh.code,
|
sh.code,
|
||||||
IFNULL(p2.code, p.code) parkingCode,
|
IFNULL(p2.code, p.code) parkingCode,
|
||||||
IFNULL(p2.pickingOrder, p.pickingOrder) pickingOrder,
|
IFNULL(p2.pickingOrder, p.pickingOrder) pickingOrder,
|
||||||
|
<<<<<<< Updated upstream
|
||||||
iss.id itemShelvingSaleFk
|
iss.id itemShelvingSaleFk
|
||||||
iss.isChecked
|
=======
|
||||||
|
iss.id itemShelvingSaleFk,
|
||||||
|
>>>>>>> Stashed changes
|
||||||
|
iss.isPicked
|
||||||
FROM ticketCollection tc
|
FROM ticketCollection tc
|
||||||
LEFT JOIN collection c ON c.id = tc.collectionFk
|
LEFT JOIN collection c ON c.id = tc.collectionFk
|
||||||
JOIN ticket t ON t.id = tc.ticketFk
|
JOIN ticket t ON t.id = tc.ticketFk
|
||||||
|
|
|
@ -0,0 +1,291 @@
|
||||||
|
ALTER TABLE `vn`.`itemShelvingSale` DROP COLUMN IF EXISTS isPicked;
|
||||||
|
|
||||||
|
ALTER TABLE`vn`.`itemShelvingSale`
|
||||||
|
ADD isPicked TINYINT(1) DEFAULT FALSE NOT NULL;
|
||||||
|
|
||||||
|
ALTER TABLE `vn`.`productionConfig` DROP COLUMN IF EXISTS orderMode;
|
||||||
|
|
||||||
|
ALTER TABLE `vn`.`productionConfig`
|
||||||
|
ADD orderMode ENUM('Location', 'Age') NOT NULL DEFAULT 'Location';
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelvingSale_reserveByCollection`(
|
||||||
|
vCollectionFk INT(11)
|
||||||
|
)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Reserva cantidades con ubicaciones para el contenido de una colección
|
||||||
|
*
|
||||||
|
* @param vCollectionFk Identificador de collection
|
||||||
|
*/
|
||||||
|
CREATE OR REPLACE TEMPORARY TABLE tmp.sale
|
||||||
|
(INDEX(saleFk))
|
||||||
|
ENGINE = MEMORY
|
||||||
|
SELECT s.id saleFk, NULL userFk
|
||||||
|
FROM ticketCollection tc
|
||||||
|
JOIN sale s ON s.ticketFk = tc.ticketFk
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT DISTINCT saleFk
|
||||||
|
FROM saleTracking st
|
||||||
|
JOIN state s ON s.id = st.stateFk
|
||||||
|
WHERE st.isChecked
|
||||||
|
AND s.semaphore = 1)st ON st.saleFk = s.id
|
||||||
|
WHERE tc.collectionFk = vCollectionFk
|
||||||
|
AND st.saleFk IS NULL
|
||||||
|
AND NOT s.isPicked;
|
||||||
|
|
||||||
|
CALL itemShelvingSale_reserve();
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelvingSale_setQuantity`(
|
||||||
|
vItemShelvingSaleFk INT(10),
|
||||||
|
vQuantity DECIMAL(10,0),
|
||||||
|
vIsItemShelvingSaleEmpty BOOLEAN
|
||||||
|
)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Gestiona la reserva de un itemShelvingFk, actualizando isPicked y quantity
|
||||||
|
* en vn.itemShelvingSale y vn.sale.isPicked en caso necesario.
|
||||||
|
* Si la reserva de la ubicación es fallida, se regulariza la situación
|
||||||
|
*
|
||||||
|
* @param vItemShelvingSaleFk Id itemShelvingSaleFK
|
||||||
|
* @param vQuantity Cantidad real que se ha cogido de la ubicación
|
||||||
|
* @param vIsItemShelvingSaleEmpty determina si ka ubicación itemShelvingSale se ha
|
||||||
|
* quedado vacio tras el movimiento
|
||||||
|
*/
|
||||||
|
DECLARE vSaleFk INT;
|
||||||
|
DECLARE vCursorSaleFk INT;
|
||||||
|
DECLARE vItemShelvingFk INT;
|
||||||
|
DECLARE vReservedQuantity INT;
|
||||||
|
DECLARE vRemainingQuantity INT;
|
||||||
|
DECLARE vItemFk INT;
|
||||||
|
DECLARE vUserFk INT;
|
||||||
|
DECLARE vDone BOOLEAN DEFAULT FALSE;
|
||||||
|
DECLARE vSales CURSOR FOR
|
||||||
|
SELECT iss.saleFk, iss.userFk
|
||||||
|
FROM itemShelvingSale iss
|
||||||
|
JOIN sale s ON s.id = iss.saleFk
|
||||||
|
WHERE iss.id = vItemShelvingSaleFk
|
||||||
|
AND s.itemFk = vItemFk
|
||||||
|
AND NOT iss.isPicked;
|
||||||
|
|
||||||
|
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
|
||||||
|
|
||||||
|
IF (SELECT isPicked FROM itemShelvingSale WHERE id = vItemShelvingSaleFk) THEN
|
||||||
|
CALL util.throw('Booking completed');
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
SELECT s.itemFk, iss.saleFk, iss.itemShelvingFk
|
||||||
|
INTO vItemFk, vSaleFk, vItemShelvingFk
|
||||||
|
FROM itemShelvingSale iss
|
||||||
|
JOIN sale s ON s.id = iss.saleFk
|
||||||
|
WHERE iss.id = vItemShelvingSaleFk
|
||||||
|
AND NOT iss.isPicked;
|
||||||
|
|
||||||
|
UPDATE itemShelvingSale
|
||||||
|
SET isPicked = TRUE,
|
||||||
|
quantity = vQuantity
|
||||||
|
WHERE id = vItemShelvingSaleFk;
|
||||||
|
|
||||||
|
UPDATE itemShelving
|
||||||
|
SET visible = IF(vIsItemShelvingSaleEmpty, 0, GREATEST(0,visible - vQuantity))
|
||||||
|
WHERE id = vItemShelvingFk;
|
||||||
|
|
||||||
|
IF vIsItemShelvingSaleEmpty THEN
|
||||||
|
OPEN vSales;
|
||||||
|
l: LOOP
|
||||||
|
SET vDone = FALSE;
|
||||||
|
FETCH vSales INTO vCursorSaleFk, vUserFk;
|
||||||
|
IF vDone THEN
|
||||||
|
LEAVE l;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
CREATE OR REPLACE TEMPORARY TABLE tmp.sale
|
||||||
|
(INDEX(saleFk, userFk))
|
||||||
|
ENGINE = MEMORY
|
||||||
|
SELECT vCursorSaleFk, vUserFk;
|
||||||
|
|
||||||
|
CALL itemShelvingSale_reserveWhitUser();
|
||||||
|
DROP TEMPORARY TABLE tmp.sale;
|
||||||
|
|
||||||
|
END LOOP;
|
||||||
|
CLOSE vSales;
|
||||||
|
|
||||||
|
DELETE iss
|
||||||
|
FROM itemShelvingSale iss
|
||||||
|
JOIN sale s ON s.id = iss.saleFk
|
||||||
|
WHERE iss.id = vItemShelvingSaleFk
|
||||||
|
AND s.itemFk = vItemFk
|
||||||
|
AND NOT iss.isPicked;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
SELECT SUM(quantity) INTO vRemainingQuantity
|
||||||
|
FROM itemShelvingSale
|
||||||
|
WHERE saleFk = vSaleFk
|
||||||
|
AND NOT isPicked;
|
||||||
|
|
||||||
|
IF vRemainingQuantity THEN
|
||||||
|
CALL itemShelvingSale_reserveBySale (vSaleFk, vRemainingQuantity, NULL);
|
||||||
|
|
||||||
|
SELECT SUM(quantity) INTO vRemainingQuantity
|
||||||
|
FROM itemShelvingSale
|
||||||
|
WHERE saleFk = vSaleFk
|
||||||
|
AND NOT isPicked;
|
||||||
|
|
||||||
|
IF NOT vRemainingQuantity <=> 0 THEN
|
||||||
|
SELECT SUM(iss.quantity)
|
||||||
|
INTO vReservedQuantity
|
||||||
|
FROM itemShelvingSale iss
|
||||||
|
WHERE iss.saleFk = vSaleFk;
|
||||||
|
|
||||||
|
CALL saleTracking_new(
|
||||||
|
vSaleFk,
|
||||||
|
TRUE,
|
||||||
|
vReservedQuantity,
|
||||||
|
`account`.`myUser_getId`(),
|
||||||
|
NULL,
|
||||||
|
'PREPARED',
|
||||||
|
TRUE);
|
||||||
|
|
||||||
|
UPDATE sale s
|
||||||
|
SET s.quantity = vReservedQuantity
|
||||||
|
WHERE s.id = vSaleFk ;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelvingSale_reserve`()
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Reserva cantidades con ubicaciones para un conjunto de sales del mismo wareHouse
|
||||||
|
*
|
||||||
|
* @table tmp.sale(saleFk, userFk)
|
||||||
|
*/
|
||||||
|
DECLARE vCalcFk INT;
|
||||||
|
DECLARE vWarehouseFk INT;
|
||||||
|
DECLARE vCurrentYear INT DEFAULT YEAR(util.VN_NOW());
|
||||||
|
DECLARE vLastPickingOrder INT;
|
||||||
|
|
||||||
|
SELECT t.warehouseFk, MAX(p.pickingOrder)
|
||||||
|
INTO vWarehouseFk, vLastPickingOrder
|
||||||
|
FROM ticket t
|
||||||
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
|
JOIN tmp.sale ts ON ts.saleFk = s.id
|
||||||
|
LEFT JOIN itemShelvingSale iss ON iss.saleFk = ts.saleFk
|
||||||
|
LEFT JOIN itemShelving ish ON ish.id = iss.itemShelvingFk
|
||||||
|
LEFT JOIN shelving sh ON sh.code = ish.shelvingFk
|
||||||
|
LEFT JOIN parking p ON p.id = sh.parkingFk
|
||||||
|
WHERE t.warehouseFk IS NOT NULL;
|
||||||
|
|
||||||
|
IF vWarehouseFk IS NULL THEN
|
||||||
|
CALL util.throw('Warehouse not set');
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
CALL cache.visible_refresh(vCalcFk, FALSE, vWarehouseFk);
|
||||||
|
|
||||||
|
SET @outstanding = 0;
|
||||||
|
SET @oldsaleFk = 0;
|
||||||
|
|
||||||
|
CREATE OR REPLACE TEMPORARY TABLE tSalePlacementQuantity
|
||||||
|
(INDEX(saleFk))
|
||||||
|
ENGINE = MEMORY
|
||||||
|
SELECT saleFk, userFk, quantityToReserve, itemShelvingFk
|
||||||
|
FROM( SELECT saleFk,
|
||||||
|
sub.userFk,
|
||||||
|
itemShelvingFk ,
|
||||||
|
IF(saleFk <> @oldsaleFk, @outstanding := quantity, @outstanding),
|
||||||
|
@qtr := LEAST(@outstanding, available) quantityToReserve,
|
||||||
|
@outStanding := @outStanding - @qtr,
|
||||||
|
@oldsaleFk := saleFk
|
||||||
|
FROM(
|
||||||
|
SELECT ts.saleFk,
|
||||||
|
ts.userFk,
|
||||||
|
s.quantity,
|
||||||
|
ish.id itemShelvingFk,
|
||||||
|
ish.visible - IFNULL(ishr.reservedQuantity, 0) available
|
||||||
|
FROM tmp.sale ts
|
||||||
|
JOIN sale s ON s.id = ts.saleFk
|
||||||
|
JOIN itemShelving ish ON ish.itemFk = s.itemFk
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT itemShelvingFk, SUM(quantity) reservedQuantity
|
||||||
|
FROM itemShelvingSale
|
||||||
|
WHERE NOT isPicked
|
||||||
|
GROUP BY itemShelvingFk) ishr ON ishr.itemShelvingFk = ish.id
|
||||||
|
JOIN shelving sh ON sh.code = ish.shelvingFk
|
||||||
|
JOIN parking p ON p.id = sh.parkingFk
|
||||||
|
JOIN sector sc ON sc.id = p.sectorFk
|
||||||
|
JOIN warehouse w ON w.id = sc.warehouseFk
|
||||||
|
JOIN productionConfig pc
|
||||||
|
WHERE w.id = vWarehouseFk
|
||||||
|
AND NOT sc.isHideForPickers
|
||||||
|
ORDER BY
|
||||||
|
s.id,
|
||||||
|
p.pickingOrder >= vLastPickingOrder,
|
||||||
|
sh.priority DESC,
|
||||||
|
ish.visible >= s.quantity DESC,
|
||||||
|
s.quantity MOD ish.grouping = 0 DESC,
|
||||||
|
ish.grouping DESC,
|
||||||
|
IF(pc.orderMode = 'Location', p.pickingOrder, ish.created)
|
||||||
|
)sub
|
||||||
|
)sub2
|
||||||
|
WHERE quantityToReserve > 0;
|
||||||
|
|
||||||
|
INSERT INTO itemShelvingSale(
|
||||||
|
itemShelvingFk,
|
||||||
|
saleFk,
|
||||||
|
quantity,
|
||||||
|
userFk)
|
||||||
|
SELECT itemShelvingFk,
|
||||||
|
saleFk,
|
||||||
|
quantityToReserve,
|
||||||
|
IFNULL(userFk, getUser())
|
||||||
|
FROM tSalePlacementQuantity spl;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE tmp.sale;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`itemShelvingSale_reserveBySale`(
|
||||||
|
vSelf INT ,
|
||||||
|
vQuantity INT,
|
||||||
|
vUserFk INT
|
||||||
|
)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Reserva cantida y ubicación para una saleFk
|
||||||
|
*
|
||||||
|
* @param vSelf Identificador de la venta
|
||||||
|
* @param vQuantity Cantidad a reservar
|
||||||
|
* @param vUserFk Id de usuario que realiza la reserva
|
||||||
|
*/
|
||||||
|
CREATE OR REPLACE TEMPORARY TABLE tmp.sale
|
||||||
|
ENGINE = MEMORY
|
||||||
|
SELECT vSelf saleFk, vUserFk userFk;
|
||||||
|
|
||||||
|
CALL itemShelvingSale_reserve();
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`itemShelvingSale_AFTER_INSERT`
|
||||||
|
AFTER INSERT ON `itemShelvingSale`
|
||||||
|
FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
UPDATE vn.sale
|
||||||
|
SET isPicked = TRUE
|
||||||
|
WHERE id = NEW.saleFk;
|
||||||
|
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -1,5 +1,5 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
import selectors from '../../helpers/selectors.js';
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer.js';
|
||||||
|
|
||||||
// #1528 e2e claim/detail
|
// #1528 e2e claim/detail
|
||||||
xdescribe('Claim detail', () => {
|
xdescribe('Claim detail', () => {
|
|
@ -1,97 +0,0 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
|
||||||
|
|
||||||
describe('Claim development', () => {
|
|
||||||
let browser;
|
|
||||||
let page;
|
|
||||||
|
|
||||||
beforeAll(async() => {
|
|
||||||
browser = await getBrowser();
|
|
||||||
page = browser.page;
|
|
||||||
await page.loginAndModule('claimManager', 'claim');
|
|
||||||
await page.accessToSearchResult('1');
|
|
||||||
await page.accessToSection('claim.card.development');
|
|
||||||
});
|
|
||||||
|
|
||||||
afterAll(async() => {
|
|
||||||
await browser.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should delete a development and create a new one', async() => {
|
|
||||||
await page.waitToClick(selectors.claimDevelopment.firstDeleteDevelopmentButton);
|
|
||||||
await page.waitToClick(selectors.claimDevelopment.addDevelopmentButton);
|
|
||||||
await page.autocompleteSearch(selectors.claimDevelopment.secondClaimReason, 'Baja calidad');
|
|
||||||
await page.autocompleteSearch(selectors.claimDevelopment.secondClaimResult, 'Deshidratacion');
|
|
||||||
await page.autocompleteSearch(selectors.claimDevelopment.secondClaimResponsible, 'Calidad general');
|
|
||||||
await page.autocompleteSearch(selectors.claimDevelopment.secondClaimWorker, 'deliveryNick');
|
|
||||||
await page.autocompleteSearch(selectors.claimDevelopment.secondClaimRedelivery, 'Reparto');
|
|
||||||
await page.waitToClick(selectors.claimDevelopment.saveDevelopmentButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should redirect to the next section of claims as the role is claimManager`, async() => {
|
|
||||||
await page.waitForState('claim.card.action');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should edit a development', async() => {
|
|
||||||
await page.reloadSection('claim.card.development');
|
|
||||||
await page.autocompleteSearch(selectors.claimDevelopment.firstClaimReason, 'Calor');
|
|
||||||
await page.autocompleteSearch(selectors.claimDevelopment.firstClaimResult, 'Cocido');
|
|
||||||
await page.autocompleteSearch(selectors.claimDevelopment.firstClaimResponsible, 'Calidad general');
|
|
||||||
await page.autocompleteSearch(selectors.claimDevelopment.firstClaimWorker, 'adminAssistantNick');
|
|
||||||
await page.autocompleteSearch(selectors.claimDevelopment.firstClaimRedelivery, 'Cliente');
|
|
||||||
await page.waitToClick(selectors.claimDevelopment.saveDevelopmentButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the first development is the expected one', async() => {
|
|
||||||
await page.reloadSection('claim.card.development');
|
|
||||||
const reason = await page
|
|
||||||
.waitToGetProperty(selectors.claimDevelopment.firstClaimReason, 'value');
|
|
||||||
|
|
||||||
const result = await page
|
|
||||||
.waitToGetProperty(selectors.claimDevelopment.firstClaimResult, 'value');
|
|
||||||
|
|
||||||
const responsible = await page
|
|
||||||
.waitToGetProperty(selectors.claimDevelopment.firstClaimResponsible, 'value');
|
|
||||||
|
|
||||||
const worker = await page
|
|
||||||
.waitToGetProperty(selectors.claimDevelopment.firstClaimWorker, 'value');
|
|
||||||
|
|
||||||
const redelivery = await page
|
|
||||||
.waitToGetProperty(selectors.claimDevelopment.firstClaimRedelivery, 'value');
|
|
||||||
|
|
||||||
expect(reason).toEqual('Calor');
|
|
||||||
expect(result).toEqual('Baboso/Cocido');
|
|
||||||
expect(responsible).toEqual('Calidad general');
|
|
||||||
expect(worker).toEqual('adminAssistantNick');
|
|
||||||
expect(redelivery).toEqual('Cliente');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the second development is the expected one', async() => {
|
|
||||||
const reason = await page
|
|
||||||
.waitToGetProperty(selectors.claimDevelopment.secondClaimReason, 'value');
|
|
||||||
|
|
||||||
const result = await page
|
|
||||||
.waitToGetProperty(selectors.claimDevelopment.secondClaimResult, 'value');
|
|
||||||
|
|
||||||
const responsible = await page
|
|
||||||
.waitToGetProperty(selectors.claimDevelopment.secondClaimResponsible, 'value');
|
|
||||||
|
|
||||||
const worker = await page
|
|
||||||
.waitToGetProperty(selectors.claimDevelopment.secondClaimWorker, 'value');
|
|
||||||
|
|
||||||
const redelivery = await page
|
|
||||||
.waitToGetProperty(selectors.claimDevelopment.secondClaimRedelivery, 'value');
|
|
||||||
|
|
||||||
expect(reason).toEqual('Baja calidad');
|
|
||||||
expect(result).toEqual('Deshidratacion');
|
|
||||||
expect(responsible).toEqual('Calidad general');
|
|
||||||
expect(worker).toEqual('deliveryNick');
|
|
||||||
expect(redelivery).toEqual('Reparto');
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,5 +1,5 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
import selectors from '../../helpers/selectors.js';
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer.js';
|
||||||
|
|
||||||
describe('Claim action path', () => {
|
describe('Claim action path', () => {
|
||||||
let browser;
|
let browser;
|
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
import selectors from '../../helpers/selectors.js';
|
import selectors from '../../helpers/selectors.js';
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer.js';
|
||||||
|
|
||||||
describe('Claim summary path', () => {
|
describe('Claim summary path', () => {
|
||||||
let browser;
|
let browser;
|
|
@ -1,5 +1,5 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
import selectors from '../../helpers/selectors.js';
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer.js';
|
||||||
|
|
||||||
describe('Claim descriptor path', () => {
|
describe('Claim descriptor path', () => {
|
||||||
let browser;
|
let browser;
|
|
@ -187,6 +187,6 @@
|
||||||
"This ticket is not editable.": "This ticket is not editable.",
|
"This ticket is not editable.": "This ticket is not editable.",
|
||||||
"The ticket doesn't exist.": "The ticket doesn't exist.",
|
"The ticket doesn't exist.": "The ticket doesn't exist.",
|
||||||
"The sales do not exists": "The sales do not exists",
|
"The sales do not exists": "The sales do not exists",
|
||||||
"Ticket without Route": "Ticket without route",
|
"Ticket without Route": "Ticket sin ruta",
|
||||||
"The ticket is in preparation": "The ticket [{{ticketId}}]({{{ticketUrl}}}) of the sales person {{salesPersonId}} is in preparation"
|
"The ticket is in preparation": "The ticket [{{ticketId}}]({{{ticketUrl}}}) of the sales person {{salesPersonId}} is in preparation"
|
||||||
}
|
}
|
||||||
|
|
|
@ -318,5 +318,6 @@
|
||||||
"Street should be uppercase": "La dirección fiscal debe ir en mayúscula",
|
"Street should be uppercase": "La dirección fiscal debe ir en mayúscula",
|
||||||
"The response is not a PDF": "La respuesta no es un PDF",
|
"The response is not a PDF": "La respuesta no es un PDF",
|
||||||
"Ticket without Route": "Ticket sin ruta",
|
"Ticket without Route": "Ticket sin ruta",
|
||||||
"The ticket is in preparation": "El ticket [{{ticketId}}]({{{ticketUrl}}}) del comercial {{salesPersonId}} està en preparación"
|
"Booking completed": "Reserva completada",
|
||||||
}
|
"The ticket is in preparation": "El ticket [{{ticketId}}]({{{ticketUrl}}}) del comercial {{salesPersonId}} está en preparación"
|
||||||
|
}
|
||||||
|
|
|
@ -1,116 +1,2 @@
|
||||||
<vn-crud-model
|
<vn-card>
|
||||||
vn-id="model"
|
</vn-card>
|
||||||
url="ClaimDevelopments"
|
|
||||||
fields="['id', 'claimFk', 'claimReasonFk', 'claimResultFk', 'claimResponsibleFk', 'workerFk', 'claimRedeliveryFk']"
|
|
||||||
link="{claimFk: $ctrl.$params.id}"
|
|
||||||
filter="$ctrl.filter"
|
|
||||||
data="claimDevelopments"
|
|
||||||
auto-load="true">
|
|
||||||
</vn-crud-model>
|
|
||||||
<vn-crud-model
|
|
||||||
url="ClaimReasons"
|
|
||||||
data="claimReasons"
|
|
||||||
order="description"
|
|
||||||
auto-load="true">
|
|
||||||
</vn-crud-model>
|
|
||||||
<vn-crud-model
|
|
||||||
url="ClaimResults"
|
|
||||||
data="claimResults"
|
|
||||||
order="description"
|
|
||||||
auto-load="true">
|
|
||||||
</vn-crud-model>
|
|
||||||
<vn-crud-model
|
|
||||||
url="ClaimResponsibles"
|
|
||||||
data="claimResponsibles"
|
|
||||||
order="description"
|
|
||||||
auto-load="true">
|
|
||||||
</vn-crud-model>
|
|
||||||
<vn-crud-model
|
|
||||||
url="ClaimRedeliveries"
|
|
||||||
data="claimRedeliveries"
|
|
||||||
order="description"
|
|
||||||
auto-load="true">
|
|
||||||
</vn-crud-model>
|
|
||||||
<vn-watcher
|
|
||||||
vn-id="watcher"
|
|
||||||
data="claimDevelopments"
|
|
||||||
form="form">
|
|
||||||
</vn-watcher>
|
|
||||||
<vn-vertical class="vn-w-lg">
|
|
||||||
<vn-card class="vn-pa-lg">
|
|
||||||
<vn-vertical>
|
|
||||||
<form name="form">
|
|
||||||
<vn-horizontal ng-repeat="claimDevelopment in claimDevelopments">
|
|
||||||
<vn-autocomplete
|
|
||||||
vn-focus
|
|
||||||
label="Reason"
|
|
||||||
ng-model="claimDevelopment.claimReasonFk"
|
|
||||||
data="claimReasons"
|
|
||||||
fields="['id', 'description']"
|
|
||||||
show-field="description"
|
|
||||||
rule>
|
|
||||||
</vn-autocomplete>
|
|
||||||
<vn-autocomplete
|
|
||||||
label="Result"
|
|
||||||
ng-model="claimDevelopment.claimResultFk"
|
|
||||||
data="claimResults"
|
|
||||||
fields="['id', 'description']"
|
|
||||||
show-field="description"
|
|
||||||
rule>
|
|
||||||
</vn-autocomplete>
|
|
||||||
<vn-autocomplete
|
|
||||||
label="Responsible"
|
|
||||||
ng-model="claimDevelopment.claimResponsibleFk"
|
|
||||||
data="claimResponsibles"
|
|
||||||
fields="['id', 'description']"
|
|
||||||
show-field="description"
|
|
||||||
rule>
|
|
||||||
</vn-autocomplete>
|
|
||||||
<vn-worker-autocomplete
|
|
||||||
ng-model="claimDevelopment.workerFk"
|
|
||||||
show-field="nickname"
|
|
||||||
rule>
|
|
||||||
</vn-worker-autocomplete>
|
|
||||||
<vn-autocomplete
|
|
||||||
label="Redelivery"
|
|
||||||
ng-model="claimDevelopment.claimRedeliveryFk"
|
|
||||||
data="claimRedeliveries"
|
|
||||||
fields="['id', 'description']"
|
|
||||||
show-field="description"
|
|
||||||
rule>
|
|
||||||
</vn-autocomplete>
|
|
||||||
<vn-icon-button
|
|
||||||
vn-none
|
|
||||||
class="vn-my-md"
|
|
||||||
vn-tooltip="Remove sale"
|
|
||||||
icon="delete"
|
|
||||||
ng-click="model.remove($index)"
|
|
||||||
tabindex="-1">
|
|
||||||
</vn-icon-button>
|
|
||||||
</vn-horizontal>
|
|
||||||
</form>
|
|
||||||
<vn-one class="vn-pt-md">
|
|
||||||
<vn-icon-button
|
|
||||||
vn-bind="+"
|
|
||||||
vn-tooltip="Add sale"
|
|
||||||
icon="add_circle"
|
|
||||||
ng-click="model.insert()">
|
|
||||||
</vn-icon-button>
|
|
||||||
</vn-one>
|
|
||||||
</vn-vertical>
|
|
||||||
</vn-card>
|
|
||||||
<vn-button-bar>
|
|
||||||
<vn-submit
|
|
||||||
disabled="!watcher.dataChanged()"
|
|
||||||
ng-click="$ctrl.onSubmit()"
|
|
||||||
label="Save">
|
|
||||||
</vn-submit>
|
|
||||||
<!-- # #2680 Undo changes button bugs -->
|
|
||||||
<!-- <vn-button
|
|
||||||
class="cancel"
|
|
||||||
label="Undo changes"
|
|
||||||
disabled="!watcher.dataChanged()"
|
|
||||||
ng-click="watcher.loadOriginalData()">
|
|
||||||
</vn-button> -->
|
|
||||||
</vn-button-bar>
|
|
||||||
</vn-vertical>
|
|
||||||
|
|
|
@ -1,17 +1,14 @@
|
||||||
import ngModule from '../module';
|
import ngModule from '../module';
|
||||||
import Section from 'salix/components/section';
|
import Section from 'salix/components/section';
|
||||||
import './style.scss';
|
|
||||||
|
|
||||||
class Controller extends Section {
|
class Controller extends Section {
|
||||||
onSubmit() {
|
constructor($element, $) {
|
||||||
this.$.watcher.check();
|
super($element, $);
|
||||||
this.$.model.save().then(() => {
|
}
|
||||||
this.$.watcher.notifySaved();
|
|
||||||
this.$.watcher.updateOriginalData();
|
|
||||||
|
|
||||||
if (this.aclService.hasAny(['claimManager']))
|
async $onInit() {
|
||||||
this.$state.go('claim.card.action');
|
this.$state.go('claim.card.summary', {id: this.$params.id});
|
||||||
});
|
window.location.href = await this.vnApp.getUrl(`claim/${this.$params.id}/development`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
import './index.js';
|
|
||||||
import watcher from 'core/mocks/watcher';
|
|
||||||
import crudModel from 'core/mocks/crud-model';
|
|
||||||
|
|
||||||
describe('Claim', () => {
|
|
||||||
describe('Component vnClaimDevelopment', () => {
|
|
||||||
let controller;
|
|
||||||
let $scope;
|
|
||||||
|
|
||||||
beforeEach(ngModule('claim'));
|
|
||||||
|
|
||||||
beforeEach(inject(($componentController, $rootScope) => {
|
|
||||||
$scope = $rootScope.$new();
|
|
||||||
$scope.watcher = watcher;
|
|
||||||
$scope.model = crudModel;
|
|
||||||
const $element = angular.element('<vn-claim-development></vn-claim-development>');
|
|
||||||
controller = $componentController('vnClaimDevelopment', {$element, $scope});
|
|
||||||
}));
|
|
||||||
|
|
||||||
describe('onSubmit()', () => {
|
|
||||||
it(`should redirect to 'claim.card.action' state`, () => {
|
|
||||||
jest.spyOn(controller.aclService, 'hasAny').mockReturnValue(true);
|
|
||||||
jest.spyOn(controller.$state, 'go');
|
|
||||||
|
|
||||||
controller.onSubmit();
|
|
||||||
|
|
||||||
expect(controller.$state.go).toHaveBeenCalledWith('claim.card.action');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,8 +0,0 @@
|
||||||
Destination: Destino
|
|
||||||
Development: Trazabilidad
|
|
||||||
Reason: Motivo
|
|
||||||
Result: Consecuencia
|
|
||||||
Responsible: Responsable
|
|
||||||
Worker: Trabajador
|
|
||||||
Redelivery: Devolución
|
|
||||||
Add line: Añadir Linea
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethodCtx('itemShelvingSaleByCollection', {
|
||||||
|
description: 'Insert sales of the collection in itemShelvingSale',
|
||||||
|
accessType: 'WRITE',
|
||||||
|
accepts: [
|
||||||
|
{
|
||||||
|
arg: 'id',
|
||||||
|
type: 'number',
|
||||||
|
description: 'The collection id',
|
||||||
|
required: true,
|
||||||
|
http: {source: 'path'}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
http: {
|
||||||
|
path: `/:id/itemShelvingSaleByCollection`,
|
||||||
|
verb: 'POST'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.itemShelvingSaleByCollection = async(ctx, id, options) => {
|
||||||
|
const myOptions = {userId: ctx.req.accessToken.userId};
|
||||||
|
|
||||||
|
if (typeof options == 'object')
|
||||||
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
|
await Self.rawSql(`CALL vn.itemShelvingSale_addByCollection(?)`, [id], myOptions);
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,41 @@
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethodCtx('itemShelvingSaleSetQuantity', {
|
||||||
|
description: 'Set quanitity of a sale in itemShelvingSale',
|
||||||
|
accessType: 'WRITE',
|
||||||
|
accepts: [
|
||||||
|
{
|
||||||
|
arg: 'id',
|
||||||
|
type: 'number',
|
||||||
|
required: true,
|
||||||
|
description: 'The sale id',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'quantity',
|
||||||
|
type: 'number',
|
||||||
|
required: true,
|
||||||
|
description: 'The quantity to set',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'isItemShelvingSaleEmpty',
|
||||||
|
type: 'boolean',
|
||||||
|
required: true,
|
||||||
|
description: 'True if the shelvingFk is empty ',
|
||||||
|
}
|
||||||
|
],
|
||||||
|
http: {
|
||||||
|
path: `/itemShelvingSaleSetQuantity`,
|
||||||
|
verb: 'POST'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.itemShelvingSaleSetQuantity = async(ctx, id, quantity, isItemShelvingSaleEmpty, options) => {
|
||||||
|
const myOptions = {userId: ctx.req.accessToken.userId};
|
||||||
|
|
||||||
|
if (typeof options == 'object')
|
||||||
|
Object.assign(myOptions, options);
|
||||||
|
|
||||||
|
await Self.rawSql(`CALL vn.itemShelvingSale_setQuantity(?, ?, ? )`,
|
||||||
|
[id, quantity, isItemShelvingSaleEmpty],
|
||||||
|
myOptions);
|
||||||
|
};
|
||||||
|
};
|
|
@ -1,3 +1,5 @@
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
require('../methods/item-shelving-sale/filter')(Self);
|
require('../methods/item-shelving-sale/filter')(Self);
|
||||||
|
require('../methods/item-shelving-sale/itemShelvingSaleByCollection')(Self);
|
||||||
|
require('../methods/item-shelving-sale/itemShelvingSaleSetQuantity')(Self);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "salix-back",
|
"name": "salix-back",
|
||||||
"version": "23.32.02",
|
"version": "23.40.02",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "salix-back",
|
"name": "salix-back",
|
||||||
"version": "23.26.01",
|
"version": "23.40.02",
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"axios": "^1.2.2",
|
"axios": "^1.2.2",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "salix-back",
|
"name": "salix-back",
|
||||||
"version": "23.40.01",
|
"version": "23.40.02",
|
||||||
"author": "Verdnatura Levante SL",
|
"author": "Verdnatura Levante SL",
|
||||||
"description": "Salix backend",
|
"description": "Salix backend",
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
|
|
Loading…
Reference in New Issue