refs #5328 mod funcion createTicketRefund #1498
20
CHANGELOG.md
20
CHANGELOG.md
|
@ -5,17 +5,33 @@ 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).
|
||||||
|
|
||||||
## [2316.01] - 2023-05-04
|
## [2320.01] - 2023-05-25
|
||||||
|
|
||||||
|
### Added
|
||||||
|
-
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
-
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
-
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [2318.01] - 2023-05-08
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
- (Usuarios -> Histórico) Nueva sección
|
- (Usuarios -> Histórico) Nueva sección
|
||||||
- (Roles -> Histórico) Nueva sección
|
- (Roles -> Histórico) Nueva sección
|
||||||
|
- (General -> Traducciones) Correo de bienvenida a clientes al portugués y al francés
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- (Artículo -> Precio fijado) Modificado el buscador superior por uno lateral
|
- (Artículo -> Precio fijado) Modificado el buscador superior por uno lateral
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
-
|
- (Ticket -> Boxing) Arreglado selección de horas
|
||||||
|
- (Cesta -> Índice) Optimizada búsqueda
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [2314.01] - 2023-04-20
|
## [2314.01] - 2023-04-20
|
||||||
|
|
|
@ -40,8 +40,7 @@ module.exports = Self => {
|
||||||
try {
|
try {
|
||||||
const sale = await models.Sale.findById(saleId, null, myOptions);
|
const sale = await models.Sale.findById(saleId, null, myOptions);
|
||||||
const saleUpdated = await sale.updateAttributes({
|
const saleUpdated = await sale.updateAttributes({
|
||||||
originalQuantity: sale.quantity,
|
quantity
|
||||||
quantity: quantity
|
|
||||||
}, myOptions);
|
}, myOptions);
|
||||||
|
|
||||||
if (tx) await tx.commit();
|
if (tx) await tx.commit();
|
||||||
|
|
|
@ -30,7 +30,7 @@ describe('setSaleQuantity()', () => {
|
||||||
await models.Collection.setSaleQuantity(saleId, newQuantity, options);
|
await models.Collection.setSaleQuantity(saleId, newQuantity, options);
|
||||||
const updateSale = await models.Sale.findById(saleId, null, options);
|
const updateSale = await models.Sale.findById(saleId, null, options);
|
||||||
|
|
||||||
expect(updateSale.originalQuantity).toEqual(originalSale.quantity);
|
expect(updateSale.quantity).not.toEqual(originalSale.quantity);
|
||||||
expect(updateSale.quantity).toEqual(newQuantity);
|
expect(updateSale.quantity).toEqual(newQuantity);
|
||||||
|
|
||||||
await tx.rollback();
|
await tx.rollback();
|
||||||
|
|
|
@ -34,6 +34,8 @@ async function test() {
|
||||||
app.boot(bootOptions,
|
app.boot(bootOptions,
|
||||||
err => err ? reject(err) : resolve());
|
err => err ? reject(err) : resolve());
|
||||||
});
|
});
|
||||||
|
// FIXME: Workaround to wait for loopback to be ready
|
||||||
|
await app.models.Application.status();
|
||||||
|
|
||||||
const Jasmine = require('jasmine');
|
const Jasmine = require('jasmine');
|
||||||
const jasmine = new Jasmine();
|
const jasmine = new Jasmine();
|
||||||
|
@ -53,7 +55,7 @@ async function test() {
|
||||||
const JunitReporter = require('jasmine-reporters');
|
const JunitReporter = require('jasmine-reporters');
|
||||||
jasmine.addReporter(new JunitReporter.JUnitXmlReporter());
|
jasmine.addReporter(new JunitReporter.JUnitXmlReporter());
|
||||||
|
|
||||||
jasmine.jasmine.DEFAULT_TIMEOUT_INTERVAL = 90000;
|
jasmine.jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;
|
||||||
jasmine.exitOnCompletion = true;
|
jasmine.exitOnCompletion = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`invoiceOut_new`(
|
||||||
BEGIN
|
BEGIN
|
||||||
/**
|
/**
|
||||||
* Creación de facturas emitidas.
|
* Creación de facturas emitidas.
|
||||||
* requiere previamente tabla ticketToInvoice(id).
|
* requiere previamente tabla tmp.ticketToInvoice(id).
|
||||||
*
|
*
|
||||||
* @param vSerial serie a la cual se hace la factura
|
* @param vSerial serie a la cual se hace la factura
|
||||||
* @param vInvoiceDate fecha de la factura
|
* @param vInvoiceDate fecha de la factura
|
||||||
|
@ -36,13 +36,13 @@ BEGIN
|
||||||
|
|
||||||
SELECT t.clientFk, t.companyFk
|
SELECT t.clientFk, t.companyFk
|
||||||
INTO vClient, vCompany
|
INTO vClient, vCompany
|
||||||
FROM ticketToInvoice tt
|
FROM tmp.ticketToInvoice tt
|
||||||
JOIN ticket t ON t.id = tt.id
|
JOIN ticket t ON t.id = tt.id
|
||||||
LIMIT 1;
|
LIMIT 1;
|
||||||
|
|
||||||
-- Eliminem de ticketToInvoice els tickets que no han de ser facturats
|
-- Eliminem de tmp.ticketToInvoice els tickets que no han de ser facturats
|
||||||
DELETE ti.*
|
DELETE ti.*
|
||||||
FROM ticketToInvoice ti
|
FROM tmp.ticketToInvoice ti
|
||||||
JOIN ticket t ON t.id = ti.id
|
JOIN ticket t ON t.id = ti.id
|
||||||
JOIN sale s ON s.ticketFk = t.id
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
JOIN item i ON i.id = s.itemFk
|
JOIN item i ON i.id = s.itemFk
|
||||||
|
@ -57,7 +57,7 @@ BEGIN
|
||||||
|
|
||||||
SELECT SUM(s.quantity * s.price * (100 - s.discount)/100), ts.id
|
SELECT SUM(s.quantity * s.price * (100 - s.discount)/100), ts.id
|
||||||
INTO vIsAnySaleToInvoice, vIsAnyServiceToInvoice
|
INTO vIsAnySaleToInvoice, vIsAnyServiceToInvoice
|
||||||
FROM ticketToInvoice t
|
FROM tmp.ticketToInvoice t
|
||||||
LEFT JOIN sale s ON s.ticketFk = t.id
|
LEFT JOIN sale s ON s.ticketFk = t.id
|
||||||
LEFT JOIN ticketService ts ON ts.ticketFk = t.id;
|
LEFT JOIN ticketService ts ON ts.ticketFk = t.id;
|
||||||
|
|
||||||
|
@ -100,13 +100,13 @@ BEGIN
|
||||||
WHERE id = vNewInvoiceId;
|
WHERE id = vNewInvoiceId;
|
||||||
|
|
||||||
UPDATE ticket t
|
UPDATE ticket t
|
||||||
JOIN ticketToInvoice ti ON ti.id = t.id
|
JOIN tmp.ticketToInvoice ti ON ti.id = t.id
|
||||||
SET t.refFk = vNewRef;
|
SET t.refFk = vNewRef;
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS tmp.updateInter;
|
DROP TEMPORARY TABLE IF EXISTS tmp.updateInter;
|
||||||
CREATE TEMPORARY TABLE tmp.updateInter ENGINE = MEMORY
|
CREATE TEMPORARY TABLE tmp.updateInter ENGINE = MEMORY
|
||||||
SELECT s.id,ti.id ticket_id,vWorker Id_Trabajador
|
SELECT s.id,ti.id ticket_id,vWorker Id_Trabajador
|
||||||
FROM ticketToInvoice ti
|
FROM tmp.ticketToInvoice ti
|
||||||
LEFT JOIN ticketState ts ON ti.id = ts.ticket
|
LEFT JOIN ticketState ts ON ti.id = ts.ticket
|
||||||
JOIN state s
|
JOIN state s
|
||||||
WHERE IFNULL(ts.alertLevel,0) < 3 and s.`code` = getAlert3State(ti.id);
|
WHERE IFNULL(ts.alertLevel,0) < 3 and s.`code` = getAlert3State(ti.id);
|
||||||
|
@ -116,7 +116,7 @@ BEGIN
|
||||||
|
|
||||||
INSERT INTO ticketLog (action, userFk, originFk, description)
|
INSERT INTO ticketLog (action, userFk, originFk, description)
|
||||||
SELECT 'UPDATE', account.myUser_getId(), ti.id, CONCAT('Crea factura ', vNewRef)
|
SELECT 'UPDATE', account.myUser_getId(), ti.id, CONCAT('Crea factura ', vNewRef)
|
||||||
FROM ticketToInvoice ti;
|
FROM tmp.ticketToInvoice ti;
|
||||||
|
|
||||||
CALL invoiceExpenceMake(vNewInvoiceId);
|
CALL invoiceExpenceMake(vNewInvoiceId);
|
||||||
CALL invoiceTaxMake(vNewInvoiceId,vTaxArea);
|
CALL invoiceTaxMake(vNewInvoiceId,vTaxArea);
|
||||||
|
@ -159,7 +159,7 @@ BEGIN
|
||||||
(KEY (ticketFk))
|
(KEY (ticketFk))
|
||||||
ENGINE = MEMORY
|
ENGINE = MEMORY
|
||||||
SELECT id ticketFk
|
SELECT id ticketFk
|
||||||
FROM ticketToInvoice;
|
FROM tmp.ticketToInvoice;
|
||||||
|
|
||||||
CALL `ticket_getTax`('NATIONAL');
|
CALL `ticket_getTax`('NATIONAL');
|
||||||
|
|
||||||
|
@ -220,6 +220,6 @@ BEGIN
|
||||||
|
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
DROP TEMPORARY TABLE `ticketToInvoice`;
|
DROP TEMPORARY TABLE `tmp`.`ticketToInvoice`;
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
|
@ -10,7 +10,7 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`invoiceOut_new`(
|
||||||
BEGIN
|
BEGIN
|
||||||
/**
|
/**
|
||||||
* Creación de facturas emitidas.
|
* Creación de facturas emitidas.
|
||||||
* requiere previamente tabla ticketToInvoice(id).
|
* requiere previamente tabla tmp.ticketToInvoice(id).
|
||||||
*
|
*
|
||||||
* @param vSerial serie a la cual se hace la factura
|
* @param vSerial serie a la cual se hace la factura
|
||||||
* @param vInvoiceDate fecha de la factura
|
* @param vInvoiceDate fecha de la factura
|
||||||
|
@ -49,7 +49,7 @@ BEGIN
|
||||||
vCompanyFk,
|
vCompanyFk,
|
||||||
vMaxShipped,
|
vMaxShipped,
|
||||||
vIsCorrectInvoiceDate
|
vIsCorrectInvoiceDate
|
||||||
FROM ticketToInvoice tt
|
FROM tmp.ticketToInvoice tt
|
||||||
JOIN ticket t ON t.id = tt.id;
|
JOIN ticket t ON t.id = tt.id;
|
||||||
|
|
||||||
IF(vMaxShipped > vInvoiceDate) THEN
|
IF(vMaxShipped > vInvoiceDate) THEN
|
||||||
|
@ -60,9 +60,9 @@ BEGIN
|
||||||
CALL util.throw('Exists an invoice with a previous date');
|
CALL util.throw('Exists an invoice with a previous date');
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- Eliminem de ticketToInvoice els tickets que no han de ser facturats
|
-- Eliminem de tmp.ticketToInvoice els tickets que no han de ser facturats
|
||||||
DELETE ti.*
|
DELETE ti.*
|
||||||
FROM ticketToInvoice ti
|
FROM tmp.ticketToInvoice ti
|
||||||
JOIN ticket t ON t.id = ti.id
|
JOIN ticket t ON t.id = ti.id
|
||||||
JOIN sale s ON s.ticketFk = t.id
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
JOIN item i ON i.id = s.itemFk
|
JOIN item i ON i.id = s.itemFk
|
||||||
|
@ -77,11 +77,11 @@ BEGIN
|
||||||
|
|
||||||
SELECT SUM(s.quantity * s.price * (100 - s.discount)/100) <> 0
|
SELECT SUM(s.quantity * s.price * (100 - s.discount)/100) <> 0
|
||||||
INTO vIsAnySaleToInvoice
|
INTO vIsAnySaleToInvoice
|
||||||
FROM ticketToInvoice t
|
FROM tmp.ticketToInvoice t
|
||||||
JOIN sale s ON s.ticketFk = t.id;
|
JOIN sale s ON s.ticketFk = t.id;
|
||||||
|
|
||||||
SELECT COUNT(*) > 0 INTO vIsAnyServiceToInvoice
|
SELECT COUNT(*) > 0 INTO vIsAnyServiceToInvoice
|
||||||
FROM ticketToInvoice t
|
FROM tmp.ticketToInvoice t
|
||||||
JOIN ticketService ts ON ts.ticketFk = t.id;
|
JOIN ticketService ts ON ts.ticketFk = t.id;
|
||||||
|
|
||||||
IF (vIsAnySaleToInvoice OR vIsAnyServiceToInvoice)
|
IF (vIsAnySaleToInvoice OR vIsAnyServiceToInvoice)
|
||||||
|
@ -121,13 +121,13 @@ BEGIN
|
||||||
WHERE id = vNewInvoiceId;
|
WHERE id = vNewInvoiceId;
|
||||||
|
|
||||||
UPDATE ticket t
|
UPDATE ticket t
|
||||||
JOIN ticketToInvoice ti ON ti.id = t.id
|
JOIN tmp.ticketToInvoice ti ON ti.id = t.id
|
||||||
SET t.refFk = vNewRef;
|
SET t.refFk = vNewRef;
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS tmp.updateInter;
|
DROP TEMPORARY TABLE IF EXISTS tmp.updateInter;
|
||||||
CREATE TEMPORARY TABLE tmp.updateInter ENGINE = MEMORY
|
CREATE TEMPORARY TABLE tmp.updateInter ENGINE = MEMORY
|
||||||
SELECT s.id,ti.id ticket_id,vWorker Id_Trabajador
|
SELECT s.id,ti.id ticket_id,vWorker Id_Trabajador
|
||||||
FROM ticketToInvoice ti
|
FROM tmp.ticketToInvoice ti
|
||||||
LEFT JOIN ticketState ts ON ti.id = ts.ticket
|
LEFT JOIN ticketState ts ON ti.id = ts.ticket
|
||||||
JOIN state s
|
JOIN state s
|
||||||
WHERE IFNULL(ts.alertLevel,0) < 3 and s.`code` = getAlert3State(ti.id);
|
WHERE IFNULL(ts.alertLevel,0) < 3 and s.`code` = getAlert3State(ti.id);
|
||||||
|
@ -137,7 +137,7 @@ BEGIN
|
||||||
|
|
||||||
INSERT INTO ticketLog (action, userFk, originFk, description)
|
INSERT INTO ticketLog (action, userFk, originFk, description)
|
||||||
SELECT 'UPDATE', account.myUser_getId(), ti.id, CONCAT('Crea factura ', vNewRef)
|
SELECT 'UPDATE', account.myUser_getId(), ti.id, CONCAT('Crea factura ', vNewRef)
|
||||||
FROM ticketToInvoice ti;
|
FROM tmp.ticketToInvoice ti;
|
||||||
|
|
||||||
CALL invoiceExpenceMake(vNewInvoiceId);
|
CALL invoiceExpenceMake(vNewInvoiceId);
|
||||||
CALL invoiceTaxMake(vNewInvoiceId,vTaxArea);
|
CALL invoiceTaxMake(vNewInvoiceId,vTaxArea);
|
||||||
|
@ -175,7 +175,7 @@ BEGIN
|
||||||
(KEY (ticketFk))
|
(KEY (ticketFk))
|
||||||
ENGINE = MEMORY
|
ENGINE = MEMORY
|
||||||
SELECT id ticketFk
|
SELECT id ticketFk
|
||||||
FROM ticketToInvoice;
|
FROM tmp.ticketToInvoice;
|
||||||
|
|
||||||
CALL `ticket_getTax`('NATIONAL');
|
CALL `ticket_getTax`('NATIONAL');
|
||||||
|
|
||||||
|
@ -253,6 +253,6 @@ BEGIN
|
||||||
DROP TEMPORARY TABLE tmp.ticketServiceTax;
|
DROP TEMPORARY TABLE tmp.ticketServiceTax;
|
||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
DROP TEMPORARY TABLE `ticketToInvoice`;
|
DROP TEMPORARY TABLE tmp.`ticketToInvoice`;
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
|
@ -1,5 +0,0 @@
|
||||||
UPDATE vn.supplier s
|
|
||||||
JOIN vn.country c ON c.id = s.countryFk
|
|
||||||
SET s.nif = MID(REPLACE(s.nif, ' ', ''), 3, LENGTH(REPLACE(s.nif, ' ', '')) - 1)
|
|
||||||
WHERE s.isVies = TRUE
|
|
||||||
AND c.code = LEFT(REPLACE(s.nif, ' ', ''), 2);
|
|
|
@ -1,5 +0,0 @@
|
||||||
UPDATE IGNORE vn.client c
|
|
||||||
JOIN vn.country co ON co.id = c.countryFk
|
|
||||||
SET c.fi = MID(REPLACE(c.fi, ' ', ''), 3, LENGTH(REPLACE(c.fi, ' ', '')) - 1)
|
|
||||||
WHERE c.isVies = TRUE
|
|
||||||
AND co.code = LEFT(REPLACE(c.fi, ' ', ''), 2);
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
CREATE OR REPLACE
|
||||||
|
ALGORITHM = UNDEFINED VIEW `vn`.`zoneEstimatedDelivery` AS
|
||||||
|
select
|
||||||
|
`t`.`zoneFk` AS `zoneFk`,
|
||||||
|
cast(`util`.`VN_CURDATE`() + interval hour(ifnull(`zc`.`hour`, `z`.`hour`)) * 60 + minute(ifnull(`zc`.`hour`, `z`.`hour`)) minute as time) AS `hourTheoretical`,
|
||||||
|
cast(sum(`sv`.`volume`) as decimal(5, 1)) AS `totalVolume`,
|
||||||
|
cast(sum(if(`s`.`alertLevel` < 2, `sv`.`volume`, 0)) as decimal(5, 1)) AS `remainingVolume`,
|
||||||
|
greatest(
|
||||||
|
ifnull(`lhp`.`m3`, 0),
|
||||||
|
ifnull(`dl`.`minSpeed`, 0)
|
||||||
|
) AS `speed`,
|
||||||
|
cast(`zc`.`hour` + interval -sum(if(`s`.`alertLevel` < 2, `sv`.`volume`, 0)) * 60 / greatest(ifnull(`lhp`.`m3`, 0), ifnull(`dl`.`minSpeed`, 0)) minute as time) AS `hourEffective`,
|
||||||
|
floor(-sum(if(`s`.`alertLevel` < 2, `sv`.`volume`, 0)) * 60 / greatest(ifnull(`lhp`.`m3`, 0), ifnull(`dl`.`minSpeed`, 0))) AS `minutesLess`,
|
||||||
|
cast(`zc`.`hour` + interval -sum(if(`s`.`alertLevel` < 2, `sv`.`volume`, 0)) * 60 / greatest(ifnull(`lhp`.`m3`, 0), ifnull(`dl`.`minSpeed`, 0)) minute as time) AS `etc`
|
||||||
|
from
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
`vn`.`ticket` `t`
|
||||||
|
join `vn`.`ticketStateToday` `tst` on
|
||||||
|
(
|
||||||
|
`tst`.`ticket` = `t`.`id`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
join `vn`.`state` `s` on
|
||||||
|
(
|
||||||
|
`s`.`id` = `tst`.`state`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
join `vn`.`saleVolume` `sv` on
|
||||||
|
(
|
||||||
|
`sv`.`ticketFk` = `t`.`id`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
left join `vn`.`lastHourProduction` `lhp` on
|
||||||
|
(
|
||||||
|
`lhp`.`warehouseFk` = `t`.`warehouseFk`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
join `vn`.`warehouse` `w` on
|
||||||
|
(
|
||||||
|
`w`.`id` = `t`.`warehouseFk`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
join `vn`.`warehouseAlias` `wa` on
|
||||||
|
(
|
||||||
|
`wa`.`id` = `w`.`aliasFk`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
straight_join `vn`.`zone` `z` on
|
||||||
|
(
|
||||||
|
`z`.`id` = `t`.`zoneFk`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
left join `vn`.`zoneClosure` `zc` on
|
||||||
|
(
|
||||||
|
`zc`.`zoneFk` = `t`.`zoneFk`
|
||||||
|
and `zc`.`dated` = `util`.`VN_CURDATE`()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
left join `cache`.`departure_limit` `dl` on
|
||||||
|
(
|
||||||
|
`dl`.`warehouse_id` = `t`.`warehouseFk`
|
||||||
|
and `dl`.`fecha` = `util`.`VN_CURDATE`()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
where
|
||||||
|
`w`.`hasProduction` <> 0
|
||||||
|
and cast(`t`.`shipped` as date) = `util`.`VN_CURDATE`()
|
||||||
|
group by
|
||||||
|
`t`.`zoneFk`;
|
|
@ -0,0 +1,5 @@
|
||||||
|
DROP PROCEDURE IF EXISTS `vn`.`sale_setQuantity`;
|
||||||
|
DROP PROCEDURE IF EXISTS `vn`.`collection_updateSale`;
|
||||||
|
DROP PROCEDURE IF EXISTS `vn`.`replaceMovimientosMark`;
|
||||||
|
DROP PROCEDURE IF EXISTS `vn`.`saleTracking_Replace`;
|
||||||
|
DROP PROCEDURE IF EXISTS `vn`.`sale_updateOriginalQuantity`;
|
|
@ -1 +1 @@
|
||||||
ALTER TABLE `vn`.`ticketConfig` ADD daysForWarningClaim INT DEFAULT 2 NOT NULL COMMENT 'dias restantes hasta que salte el aviso de reclamación fuerade plazo';
|
ALTER TABLE `vn`.`ticketConfig` ADD daysForWarningClaim INT DEFAULT 2 NOT NULL COMMENT 'dias restantes hasta que salte el aviso de reclamación fuera de plazo';
|
|
@ -0,0 +1,5 @@
|
||||||
|
UPDATE `vn`.`supplier` s
|
||||||
|
JOIN `vn`.`country` c ON c.id = s.countryFk
|
||||||
|
SET s.nif = MID(REPLACE(s.nif, ' ', ''), 3, LENGTH(REPLACE(s.nif, ' ', '')) - 1)
|
||||||
|
WHERE s.isVies = TRUE
|
||||||
|
AND c.code = LEFT(REPLACE(s.nif, ' ', ''), 2);
|
|
@ -0,0 +1,5 @@
|
||||||
|
UPDATE IGNORE `vn`.`client` c
|
||||||
|
JOIN `vn`.`country` co ON co.id = c.countryFk
|
||||||
|
SET c.fi = MID(REPLACE(c.fi, ' ', ''), 3, LENGTH(REPLACE(c.fi, ' ', '')) - 1)
|
||||||
|
WHERE c.isVies = TRUE
|
||||||
|
AND co.code = LEFT(REPLACE(c.fi, ' ', ''), 2);
|
|
@ -42776,7 +42776,7 @@ CREATE DEFINER=`root`@`localhost` FUNCTION `hasAnyNegativeBase`() RETURNS tinyin
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
/* Calcula si existe alguna base imponible negativa
|
/* Calcula si existe alguna base imponible negativa
|
||||||
* Requiere la tabla temporal vn.ticketToInvoice(id)
|
* Requiere la tabla temporal tmp.ticketToInvoice(id)
|
||||||
*
|
*
|
||||||
* returns BOOLEAN
|
* returns BOOLEAN
|
||||||
*/
|
*/
|
||||||
|
@ -42787,7 +42787,7 @@ BEGIN
|
||||||
(KEY (ticketFk))
|
(KEY (ticketFk))
|
||||||
ENGINE = MEMORY
|
ENGINE = MEMORY
|
||||||
SELECT id ticketFk
|
SELECT id ticketFk
|
||||||
FROM ticketToInvoice;
|
FROM tmp.ticketToInvoice;
|
||||||
|
|
||||||
CALL ticket_getTax(NULL);
|
CALL ticket_getTax(NULL);
|
||||||
|
|
||||||
|
@ -55223,7 +55223,7 @@ DELIMITER ;;
|
||||||
CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceExpenceMake`(IN vInvoice INT)
|
CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceExpenceMake`(IN vInvoice INT)
|
||||||
BEGIN
|
BEGIN
|
||||||
/* Inserta las partidas de gasto correspondientes a la factura
|
/* Inserta las partidas de gasto correspondientes a la factura
|
||||||
* REQUIERE tabla ticketToInvoice
|
* REQUIERE tabla tmp.ticketToInvoice
|
||||||
* @param vInvoice Numero de factura
|
* @param vInvoice Numero de factura
|
||||||
*/
|
*/
|
||||||
DELETE FROM invoiceOutExpence
|
DELETE FROM invoiceOutExpence
|
||||||
|
@ -55233,7 +55233,7 @@ BEGIN
|
||||||
SELECT vInvoice,
|
SELECT vInvoice,
|
||||||
expenceFk,
|
expenceFk,
|
||||||
SUM(ROUND(quantity * price * (100 - discount)/100,2)) amount
|
SUM(ROUND(quantity * price * (100 - discount)/100,2)) amount
|
||||||
FROM ticketToInvoice t
|
FROM tmp.ticketToInvoice t
|
||||||
JOIN sale s ON s.ticketFk = t.id
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
JOIN item i ON i.id = s.itemFk
|
JOIN item i ON i.id = s.itemFk
|
||||||
GROUP BY i.expenceFk
|
GROUP BY i.expenceFk
|
||||||
|
@ -55243,7 +55243,7 @@ BEGIN
|
||||||
SELECT vInvoice,
|
SELECT vInvoice,
|
||||||
tst.expenceFk,
|
tst.expenceFk,
|
||||||
SUM(ROUND(ts.quantity * ts.price ,2)) amount
|
SUM(ROUND(ts.quantity * ts.price ,2)) amount
|
||||||
FROM ticketToInvoice t
|
FROM tmp.ticketToInvoice t
|
||||||
JOIN ticketService ts ON ts.ticketFk = t.id
|
JOIN ticketService ts ON ts.ticketFk = t.id
|
||||||
JOIN ticketServiceType tst ON tst.id = ts.ticketServiceTypeFk
|
JOIN ticketServiceType tst ON tst.id = ts.ticketServiceTypeFk
|
||||||
HAVING amount != 0;
|
HAVING amount != 0;
|
||||||
|
@ -55270,9 +55270,9 @@ BEGIN
|
||||||
|
|
||||||
SET vMaxTicketDate = vn2008.DAYEND(vMaxTicketDate);
|
SET vMaxTicketDate = vn2008.DAYEND(vMaxTicketDate);
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS `ticketToInvoice`;
|
DROP TEMPORARY TABLE IF EXISTS `tmp`.`ticketToInvoice`;
|
||||||
|
|
||||||
CREATE TEMPORARY TABLE `ticketToInvoice`
|
CREATE TEMPORARY TABLE `tmp`.`ticketToInvoice`
|
||||||
(PRIMARY KEY (`id`))
|
(PRIMARY KEY (`id`))
|
||||||
ENGINE = MEMORY
|
ENGINE = MEMORY
|
||||||
SELECT Id_Ticket id FROM vn2008.Tickets WHERE (Fecha BETWEEN vMinDateTicket
|
SELECT Id_Ticket id FROM vn2008.Tickets WHERE (Fecha BETWEEN vMinDateTicket
|
||||||
|
@ -55305,8 +55305,8 @@ BEGIN
|
||||||
SET vMinTicketDate = util.firstDayOfYear(vMaxTicketDate - INTERVAL 1 YEAR);
|
SET vMinTicketDate = util.firstDayOfYear(vMaxTicketDate - INTERVAL 1 YEAR);
|
||||||
SET vMaxTicketDate = util.dayend(vMaxTicketDate);
|
SET vMaxTicketDate = util.dayend(vMaxTicketDate);
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS `ticketToInvoice`;
|
DROP TEMPORARY TABLE IF EXISTS `tmp`.`ticketToInvoice`;
|
||||||
CREATE TEMPORARY TABLE `ticketToInvoice`
|
CREATE TEMPORARY TABLE `tmp`.`ticketToInvoice`
|
||||||
(PRIMARY KEY (`id`))
|
(PRIMARY KEY (`id`))
|
||||||
ENGINE = MEMORY
|
ENGINE = MEMORY
|
||||||
SELECT id FROM ticket t
|
SELECT id FROM ticket t
|
||||||
|
@ -55333,9 +55333,9 @@ DELIMITER ;;
|
||||||
CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceFromTicket`(IN vTicket INT)
|
CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceFromTicket`(IN vTicket INT)
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS `ticketToInvoice`;
|
DROP TEMPORARY TABLE IF EXISTS `tmp`.`ticketToInvoice`;
|
||||||
|
|
||||||
CREATE TEMPORARY TABLE `ticketToInvoice`
|
CREATE TEMPORARY TABLE `tmp`.`ticketToInvoice`
|
||||||
(PRIMARY KEY (`id`))
|
(PRIMARY KEY (`id`))
|
||||||
ENGINE = MEMORY
|
ENGINE = MEMORY
|
||||||
SELECT id FROM vn.ticket
|
SELECT id FROM vn.ticket
|
||||||
|
@ -55931,9 +55931,9 @@ BEGIN
|
||||||
JOIN invoiceOut io ON io.companyFk = s.id
|
JOIN invoiceOut io ON io.companyFk = s.id
|
||||||
WHERE io.id = vInvoiceFk;
|
WHERE io.id = vInvoiceFk;
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS ticketToInvoice;
|
DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
|
||||||
|
|
||||||
CREATE TEMPORARY TABLE ticketToInvoice
|
CREATE TEMPORARY TABLE tmp.ticketToInvoice
|
||||||
SELECT id
|
SELECT id
|
||||||
FROM ticket
|
FROM ticket
|
||||||
WHERE refFk = vInvoiceRef;
|
WHERE refFk = vInvoiceRef;
|
||||||
|
@ -56408,9 +56408,9 @@ BEGIN
|
||||||
JOIN client c ON c.id = io.clientFk
|
JOIN client c ON c.id = io.clientFk
|
||||||
WHERE io.id = vInvoice;
|
WHERE io.id = vInvoice;
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS ticketToInvoice;
|
DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
|
||||||
|
|
||||||
CREATE TEMPORARY TABLE ticketToInvoice
|
CREATE TEMPORARY TABLE tmp.ticketToInvoice
|
||||||
SELECT id
|
SELECT id
|
||||||
FROM ticket
|
FROM ticket
|
||||||
WHERE refFk = vInvoiceRef;
|
WHERE refFk = vInvoiceRef;
|
||||||
|
@ -56456,7 +56456,7 @@ CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceOut_exportationFromClient`(
|
||||||
vCompanyFk INT)
|
vCompanyFk INT)
|
||||||
BEGIN
|
BEGIN
|
||||||
/**
|
/**
|
||||||
* Genera tabla temporal ticketToInvoice necesaría para el proceso de facturación
|
* Genera tabla temporal tmp.ticketToInvoice necesaría para el proceso de facturación
|
||||||
* Los abonos quedan excluidos en las exportaciones
|
* Los abonos quedan excluidos en las exportaciones
|
||||||
*
|
*
|
||||||
* @param vMaxTicketDate Fecha hasta la cual cogerá tickets para facturar
|
* @param vMaxTicketDate Fecha hasta la cual cogerá tickets para facturar
|
||||||
|
@ -56467,8 +56467,8 @@ BEGIN
|
||||||
SET vMinTicketDate = util.firstDayOfYear(vMaxTicketDate - INTERVAL 1 YEAR);
|
SET vMinTicketDate = util.firstDayOfYear(vMaxTicketDate - INTERVAL 1 YEAR);
|
||||||
SET vMaxTicketDate = util.dayend(vMaxTicketDate);
|
SET vMaxTicketDate = util.dayend(vMaxTicketDate);
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS `ticketToInvoice`;
|
DROP TEMPORARY TABLE IF EXISTS `tmp`.`ticketToInvoice`;
|
||||||
CREATE TEMPORARY TABLE `ticketToInvoice`
|
CREATE TEMPORARY TABLE `tmp`.`ticketToInvoice`
|
||||||
(PRIMARY KEY (`id`))
|
(PRIMARY KEY (`id`))
|
||||||
ENGINE = MEMORY
|
ENGINE = MEMORY
|
||||||
SELECT t.id
|
SELECT t.id
|
||||||
|
@ -56503,7 +56503,7 @@ CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceOut_new`(
|
||||||
BEGIN
|
BEGIN
|
||||||
/**
|
/**
|
||||||
* Creación de facturas emitidas.
|
* Creación de facturas emitidas.
|
||||||
* requiere previamente tabla ticketToInvoice(id).
|
* requiere previamente tabla tmp.ticketToInvoice(id).
|
||||||
*
|
*
|
||||||
* @param vSerial serie a la cual se hace la factura
|
* @param vSerial serie a la cual se hace la factura
|
||||||
* @param vInvoiceDate fecha de la factura
|
* @param vInvoiceDate fecha de la factura
|
||||||
|
@ -56531,13 +56531,13 @@ BEGIN
|
||||||
|
|
||||||
SELECT t.clientFk, t.companyFk
|
SELECT t.clientFk, t.companyFk
|
||||||
INTO vClientFk, vCompanyFk
|
INTO vClientFk, vCompanyFk
|
||||||
FROM ticketToInvoice tt
|
FROM tmp.ticketToInvoice tt
|
||||||
JOIN ticket t ON t.id = tt.id
|
JOIN ticket t ON t.id = tt.id
|
||||||
LIMIT 1;
|
LIMIT 1;
|
||||||
|
|
||||||
-- Eliminem de ticketToInvoice els tickets que no han de ser facturats
|
-- Eliminem de tmp.ticketToInvoice els tickets que no han de ser facturats
|
||||||
DELETE ti.*
|
DELETE ti.*
|
||||||
FROM ticketToInvoice ti
|
FROM tmp.ticketToInvoice ti
|
||||||
JOIN ticket t ON t.id = ti.id
|
JOIN ticket t ON t.id = ti.id
|
||||||
JOIN sale s ON s.ticketFk = t.id
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
JOIN item i ON i.id = s.itemFk
|
JOIN item i ON i.id = s.itemFk
|
||||||
|
@ -56552,7 +56552,7 @@ BEGIN
|
||||||
|
|
||||||
SELECT SUM(s.quantity * s.price * (100 - s.discount)/100), ts.id
|
SELECT SUM(s.quantity * s.price * (100 - s.discount)/100), ts.id
|
||||||
INTO vIsAnySaleToInvoice, vIsAnyServiceToInvoice
|
INTO vIsAnySaleToInvoice, vIsAnyServiceToInvoice
|
||||||
FROM ticketToInvoice t
|
FROM tmp.ticketToInvoice t
|
||||||
LEFT JOIN sale s ON s.ticketFk = t.id
|
LEFT JOIN sale s ON s.ticketFk = t.id
|
||||||
LEFT JOIN ticketService ts ON ts.ticketFk = t.id;
|
LEFT JOIN ticketService ts ON ts.ticketFk = t.id;
|
||||||
|
|
||||||
|
@ -56593,13 +56593,13 @@ BEGIN
|
||||||
WHERE id = vNewInvoiceId;
|
WHERE id = vNewInvoiceId;
|
||||||
|
|
||||||
UPDATE ticket t
|
UPDATE ticket t
|
||||||
JOIN ticketToInvoice ti ON ti.id = t.id
|
JOIN tmp.ticketToInvoice ti ON ti.id = t.id
|
||||||
SET t.refFk = vNewRef;
|
SET t.refFk = vNewRef;
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS tmp.updateInter;
|
DROP TEMPORARY TABLE IF EXISTS tmp.updateInter;
|
||||||
CREATE TEMPORARY TABLE tmp.updateInter ENGINE = MEMORY
|
CREATE TEMPORARY TABLE tmp.updateInter ENGINE = MEMORY
|
||||||
SELECT s.id,ti.id ticket_id,vWorker Id_Trabajador
|
SELECT s.id,ti.id ticket_id,vWorker Id_Trabajador
|
||||||
FROM ticketToInvoice ti
|
FROM tmp.ticketToInvoice ti
|
||||||
LEFT JOIN ticketState ts ON ti.id = ts.ticket
|
LEFT JOIN ticketState ts ON ti.id = ts.ticket
|
||||||
JOIN state s
|
JOIN state s
|
||||||
WHERE IFNULL(ts.alertLevel,0) < 3 and s.`code` = getAlert3State(ti.id);
|
WHERE IFNULL(ts.alertLevel,0) < 3 and s.`code` = getAlert3State(ti.id);
|
||||||
|
@ -56609,7 +56609,7 @@ BEGIN
|
||||||
|
|
||||||
INSERT INTO ticketLog (action, userFk, originFk, description)
|
INSERT INTO ticketLog (action, userFk, originFk, description)
|
||||||
SELECT 'UPDATE', account.myUser_getId(), ti.id, CONCAT('Crea factura ', vNewRef)
|
SELECT 'UPDATE', account.myUser_getId(), ti.id, CONCAT('Crea factura ', vNewRef)
|
||||||
FROM ticketToInvoice ti;
|
FROM tmp.ticketToInvoice ti;
|
||||||
|
|
||||||
CALL invoiceExpenceMake(vNewInvoiceId);
|
CALL invoiceExpenceMake(vNewInvoiceId);
|
||||||
CALL invoiceTaxMake(vNewInvoiceId,vTaxArea);
|
CALL invoiceTaxMake(vNewInvoiceId,vTaxArea);
|
||||||
|
@ -56647,7 +56647,7 @@ BEGIN
|
||||||
(KEY (ticketFk))
|
(KEY (ticketFk))
|
||||||
ENGINE = MEMORY
|
ENGINE = MEMORY
|
||||||
SELECT id ticketFk
|
SELECT id ticketFk
|
||||||
FROM ticketToInvoice;
|
FROM tmp.ticketToInvoice;
|
||||||
|
|
||||||
CALL `ticket_getTax`('NATIONAL');
|
CALL `ticket_getTax`('NATIONAL');
|
||||||
|
|
||||||
|
@ -56725,7 +56725,7 @@ BEGIN
|
||||||
DROP TEMPORARY TABLE tmp.ticketServiceTax;
|
DROP TEMPORARY TABLE tmp.ticketServiceTax;
|
||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
DROP TEMPORARY TABLE `ticketToInvoice`;
|
DROP TEMPORARY TABLE `tmp`.`ticketToInvoice`;
|
||||||
END ;;
|
END ;;
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
/*!50003 SET sql_mode = @saved_sql_mode */ ;
|
/*!50003 SET sql_mode = @saved_sql_mode */ ;
|
||||||
|
@ -56876,7 +56876,7 @@ BEGIN
|
||||||
(KEY (ticketFk))
|
(KEY (ticketFk))
|
||||||
ENGINE = MEMORY
|
ENGINE = MEMORY
|
||||||
SELECT id ticketFk
|
SELECT id ticketFk
|
||||||
FROM ticketToInvoice;
|
FROM tmp.ticketToInvoice;
|
||||||
|
|
||||||
CALL ticket_getTax(vTaxArea);
|
CALL ticket_getTax(vTaxArea);
|
||||||
|
|
||||||
|
@ -68689,7 +68689,7 @@ DELIMITER ;
|
||||||
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
/*!50003 SET character_set_client = @saved_cs_client */ ;
|
||||||
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
/*!50003 SET character_set_results = @saved_cs_results */ ;
|
||||||
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
/*!50003 SET collation_connection = @saved_col_connection */ ;
|
||||||
/*!50003 DROP PROCEDURE IF EXISTS `ticketToInvoiceByAddress` */;
|
/*!50003 DROP PROCEDURE IF EXISTS `tmp`.`ticketToInvoiceByAddress` */;
|
||||||
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
|
||||||
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
|
||||||
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
|
||||||
|
@ -68709,9 +68709,9 @@ BEGIN
|
||||||
|
|
||||||
SET vEnded = util.dayEnd(vEnded);
|
SET vEnded = util.dayEnd(vEnded);
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS vn.ticketToInvoice;
|
DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
|
||||||
|
|
||||||
CREATE TEMPORARY TABLE vn.ticketToInvoice
|
CREATE TEMPORARY TABLE tmp.ticketToInvoice
|
||||||
SELECT id
|
SELECT id
|
||||||
FROM vn.ticket
|
FROM vn.ticket
|
||||||
WHERE addressFk = vAddress
|
WHERE addressFk = vAddress
|
||||||
|
@ -68745,9 +68745,9 @@ BEGIN
|
||||||
|
|
||||||
SET vEnded = util.dayEnd(vEnded);
|
SET vEnded = util.dayEnd(vEnded);
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS vn.ticketToInvoice;
|
DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
|
||||||
|
|
||||||
CREATE TEMPORARY TABLE vn.ticketToInvoice
|
CREATE TEMPORARY TABLE tmp.ticketToInvoice
|
||||||
SELECT id
|
SELECT id
|
||||||
FROM vn.ticket
|
FROM vn.ticket
|
||||||
WHERE clientFk = vClient
|
WHERE clientFk = vClient
|
||||||
|
@ -68808,9 +68808,9 @@ BEGIN
|
||||||
JOIN vn.client c ON c.id = io.clientFk
|
JOIN vn.client c ON c.id = io.clientFk
|
||||||
WHERE io.id = vInvoice;
|
WHERE io.id = vInvoice;
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS vn.ticketToInvoice;
|
DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
|
||||||
|
|
||||||
CREATE TEMPORARY TABLE vn.ticketToInvoice
|
CREATE TEMPORARY TABLE tmp.ticketToInvoice
|
||||||
SELECT id
|
SELECT id
|
||||||
FROM vn.ticket
|
FROM vn.ticket
|
||||||
WHERE refFk = vInvoiceRef;
|
WHERE refFk = vInvoiceRef;
|
||||||
|
|
|
@ -218,23 +218,6 @@ let actions = {
|
||||||
return handle.jsonValue();
|
return handle.jsonValue();
|
||||||
},
|
},
|
||||||
|
|
||||||
getValue: async function(selector) {
|
|
||||||
return await this.waitToGetProperty(selector, 'value');
|
|
||||||
},
|
|
||||||
|
|
||||||
getValues: async function(selectorMap) {
|
|
||||||
const values = {};
|
|
||||||
for (const key in selectorMap)
|
|
||||||
values[key] = await this.waitToGetProperty(selectorMap[key], 'value');
|
|
||||||
return values;
|
|
||||||
},
|
|
||||||
|
|
||||||
innerText: async function(selector) {
|
|
||||||
const element = await this.$(selector);
|
|
||||||
const handle = await element.getProperty('innerText');
|
|
||||||
return handle.jsonValue();
|
|
||||||
},
|
|
||||||
|
|
||||||
waitPropertyLength: async function(selector, property, minLength) {
|
waitPropertyLength: async function(selector, property, minLength) {
|
||||||
await this.waitForFunction((selector, property, minLength) => {
|
await this.waitForFunction((selector, property, minLength) => {
|
||||||
const element = document.querySelector(selector);
|
const element = document.querySelector(selector);
|
||||||
|
@ -431,7 +414,7 @@ let actions = {
|
||||||
const selector = 'vn-snackbar .shape.shown';
|
const selector = 'vn-snackbar .shape.shown';
|
||||||
await this.waitForSelector(selector);
|
await this.waitForSelector(selector);
|
||||||
|
|
||||||
let message = await this.evaluate(selector => {
|
const message = await this.evaluate(selector => {
|
||||||
const shape = document.querySelector(selector);
|
const shape = document.querySelector(selector);
|
||||||
const message = {
|
const message = {
|
||||||
text: shape.querySelector('.text').innerText
|
text: shape.querySelector('.text').innerText
|
||||||
|
@ -448,6 +431,8 @@ let actions = {
|
||||||
return message;
|
return message;
|
||||||
}, selector);
|
}, selector);
|
||||||
|
|
||||||
|
message.isSuccess = message.type == 'success';
|
||||||
|
|
||||||
await this.hideSnackbar();
|
await this.hideSnackbar();
|
||||||
return message;
|
return message;
|
||||||
},
|
},
|
||||||
|
@ -483,28 +468,6 @@ let actions = {
|
||||||
}, selector);
|
}, selector);
|
||||||
},
|
},
|
||||||
|
|
||||||
clearInput: async function(selector) {
|
|
||||||
await this.waitForSelector(selector);
|
|
||||||
|
|
||||||
let field = await this.evaluate(selector => {
|
|
||||||
return document.querySelector(`${selector} input`).closest('.vn-field').$ctrl.field;
|
|
||||||
}, selector);
|
|
||||||
|
|
||||||
if ((field != null && field != '') || field == '0') {
|
|
||||||
let coords = await this.evaluate(selector => {
|
|
||||||
let rect = document.querySelector(selector).getBoundingClientRect();
|
|
||||||
return {x: rect.x + (rect.width / 2), y: rect.y + (rect.height / 2), width: rect.width};
|
|
||||||
}, selector);
|
|
||||||
await this.mouse.move(coords.x, coords.y);
|
|
||||||
await this.waitForSelector(`${selector} [icon="clear"]`, {visible: true});
|
|
||||||
await this.waitToClick(`${selector} [icon="clear"]`);
|
|
||||||
}
|
|
||||||
|
|
||||||
await this.evaluate(selector => {
|
|
||||||
return document.querySelector(`${selector} input`).closest('.vn-field').$ctrl.field == '';
|
|
||||||
}, selector);
|
|
||||||
},
|
|
||||||
|
|
||||||
autocompleteSearch: async function(selector, searchValue) {
|
autocompleteSearch: async function(selector, searchValue) {
|
||||||
let builtSelector = await this.selectorFormater(selector);
|
let builtSelector = await this.selectorFormater(selector);
|
||||||
|
|
||||||
|
@ -536,9 +499,8 @@ let actions = {
|
||||||
|
|
||||||
checkboxState: async function(selector) {
|
checkboxState: async function(selector) {
|
||||||
await this.waitForSelector(selector);
|
await this.waitForSelector(selector);
|
||||||
return this.evaluate(selector => {
|
const value = await this.getInputValue(selector);
|
||||||
let checkbox = document.querySelector(selector);
|
switch (value) {
|
||||||
switch (checkbox.$ctrl.field) {
|
|
||||||
case null:
|
case null:
|
||||||
return 'intermediate';
|
return 'intermediate';
|
||||||
case true:
|
case true:
|
||||||
|
@ -546,7 +508,6 @@ let actions = {
|
||||||
default:
|
default:
|
||||||
return 'unchecked';
|
return 'unchecked';
|
||||||
}
|
}
|
||||||
}, selector);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
isDisabled: async function(selector) {
|
isDisabled: async function(selector) {
|
||||||
|
@ -639,6 +600,138 @@ let actions = {
|
||||||
|
|
||||||
waitForContentLoaded: async function() {
|
waitForContentLoaded: async function() {
|
||||||
await this.waitForSpinnerLoad();
|
await this.waitForSpinnerLoad();
|
||||||
|
},
|
||||||
|
|
||||||
|
async getInputValue(selector) {
|
||||||
|
return this.evaluate(selector => {
|
||||||
|
const input = document.querySelector(selector);
|
||||||
|
return input.$ctrl.field;
|
||||||
|
}, selector);
|
||||||
|
},
|
||||||
|
|
||||||
|
async getValue(selector) {
|
||||||
|
return await this.waitToGetProperty(selector, 'value');
|
||||||
|
},
|
||||||
|
|
||||||
|
async innerText(selector) {
|
||||||
|
const element = await this.$(selector);
|
||||||
|
const handle = await element.getProperty('innerText');
|
||||||
|
return handle.jsonValue();
|
||||||
|
},
|
||||||
|
|
||||||
|
async setInput(selector, value) {
|
||||||
|
const input = await this.$(selector);
|
||||||
|
const tagName = (await input.evaluate(e => e.tagName)).toLowerCase();
|
||||||
|
|
||||||
|
switch (tagName) {
|
||||||
|
case 'vn-textfield':
|
||||||
|
case 'vn-datalist':
|
||||||
|
case 'vn-input-number':
|
||||||
|
await this.clearInput(selector);
|
||||||
|
if (value)
|
||||||
|
await this.write(selector, value.toString());
|
||||||
|
break;
|
||||||
|
case 'vn-autocomplete':
|
||||||
|
if (value)
|
||||||
|
await this.autocompleteSearch(selector, value.toString());
|
||||||
|
else
|
||||||
|
await this.clearInput(selector);
|
||||||
|
break;
|
||||||
|
case 'vn-date-picker':
|
||||||
|
if (value)
|
||||||
|
await this.pickDate(selector, value);
|
||||||
|
else
|
||||||
|
await this.clearInput(selector);
|
||||||
|
break;
|
||||||
|
case 'vn-input-time':
|
||||||
|
if (value)
|
||||||
|
await this.pickTime(selector, value);
|
||||||
|
else
|
||||||
|
await this.clearInput(selector);
|
||||||
|
break;
|
||||||
|
case 'vn-check':
|
||||||
|
for (let i = 0; i < 3; i++) {
|
||||||
|
if (await this.getInput(selector) == value) break;
|
||||||
|
await this.click(selector);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async getInput(selector) {
|
||||||
|
const input = await this.$(selector);
|
||||||
|
const tagName = (await input.evaluate(e => e.tagName)).toLowerCase();
|
||||||
|
let el;
|
||||||
|
let value;
|
||||||
|
|
||||||
|
switch (tagName) {
|
||||||
|
case 'vn-textfield':
|
||||||
|
case 'vn-autocomplete':
|
||||||
|
case 'vn-input-time':
|
||||||
|
case 'vn-datalist':
|
||||||
|
el = await input.$('input');
|
||||||
|
value = await el.getProperty('value');
|
||||||
|
return value.jsonValue();
|
||||||
|
case 'vn-check':
|
||||||
|
case 'vn-input-number':
|
||||||
|
return await this.getInputValue(selector);
|
||||||
|
case 'vn-textarea':
|
||||||
|
el = await input.$('textarea');
|
||||||
|
value = await el.getProperty('value');
|
||||||
|
return value.jsonValue();
|
||||||
|
case 'vn-date-picker':
|
||||||
|
el = await input.$('input');
|
||||||
|
value = await el.getProperty('value');
|
||||||
|
if (value) {
|
||||||
|
const date = new Date(await value.jsonValue());
|
||||||
|
date.setUTCHours(0, 0, 0, 0);
|
||||||
|
return date;
|
||||||
|
} else
|
||||||
|
return null;
|
||||||
|
default:
|
||||||
|
value = await this.innerText(selector);
|
||||||
|
return value.jsonValue();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async clearInput(selector) {
|
||||||
|
await this.waitForSelector(selector);
|
||||||
|
|
||||||
|
let field = await this.evaluate(selector => {
|
||||||
|
return document.querySelector(`${selector} input`).closest('.vn-field').$ctrl.field;
|
||||||
|
}, selector);
|
||||||
|
|
||||||
|
if ((field != null && field != '') || field == '0') {
|
||||||
|
let coords = await this.evaluate(selector => {
|
||||||
|
let rect = document.querySelector(selector).getBoundingClientRect();
|
||||||
|
return {x: rect.x + (rect.width / 2), y: rect.y + (rect.height / 2), width: rect.width};
|
||||||
|
}, selector);
|
||||||
|
await this.mouse.move(coords.x, coords.y);
|
||||||
|
await this.waitForSelector(`${selector} [icon="clear"]`, {visible: true});
|
||||||
|
await this.waitToClick(`${selector} [icon="clear"]`);
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.evaluate(selector => {
|
||||||
|
return document.querySelector(`${selector} input`).closest('.vn-field').$ctrl.field == '';
|
||||||
|
}, selector);
|
||||||
|
},
|
||||||
|
|
||||||
|
async fetchForm(selector, inputNames) {
|
||||||
|
const values = {};
|
||||||
|
for (const inputName of inputNames)
|
||||||
|
values[inputName] = await this.getInput(`${selector} [vn-name="${inputName}"]`);
|
||||||
|
return values;
|
||||||
|
},
|
||||||
|
|
||||||
|
async fillForm(selector, values) {
|
||||||
|
for (const inputName in values)
|
||||||
|
await this.setInput(`${selector} [vn-name="${inputName}"]`, values[inputName]);
|
||||||
|
},
|
||||||
|
|
||||||
|
async sendForm(selector, values) {
|
||||||
|
if (values) await this.fillForm(selector, values);
|
||||||
|
await this.click(`${selector} button[type=submit]`);
|
||||||
|
return await this.waitForSnackbar();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -646,12 +739,14 @@ export function extendPage(page) {
|
||||||
for (let name in actions) {
|
for (let name in actions) {
|
||||||
page[name] = async(...args) => {
|
page[name] = async(...args) => {
|
||||||
try {
|
try {
|
||||||
return actions[name].apply(page, args);
|
return await actions[name].apply(page, args);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
let stringArgs = args
|
let stringArgs = args
|
||||||
.map(i => typeof i == 'function' ? 'Function' : i)
|
.map(i => typeof i == 'function' ? 'Function' : `'${i}'`)
|
||||||
.join(', ');
|
.join(', ');
|
||||||
throw new Error(`.${name}(${stringArgs}): ${err.message}`);
|
const myErr = new Error(`${err.message}\n at Page.${name}(${stringArgs})`);
|
||||||
|
myErr.stack = err.stack;
|
||||||
|
throw myErr;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -193,10 +193,6 @@ export default {
|
||||||
saveNewPoscode: '#savePostcode',
|
saveNewPoscode: '#savePostcode',
|
||||||
createButton: 'vn-client-create button[type=submit]'
|
createButton: 'vn-client-create button[type=submit]'
|
||||||
},
|
},
|
||||||
clientDescriptor: {
|
|
||||||
moreMenu: 'vn-client-descriptor vn-icon-button[icon=more_vert]',
|
|
||||||
simpleTicketButton: '.vn-menu [name="simpleTicket"]'
|
|
||||||
},
|
|
||||||
clientBasicData: {
|
clientBasicData: {
|
||||||
name: 'vn-client-basic-data vn-textfield[ng-model="$ctrl.client.name"]',
|
name: 'vn-client-basic-data vn-textfield[ng-model="$ctrl.client.name"]',
|
||||||
contact: 'vn-client-basic-data vn-textfield[ng-model="$ctrl.client.contact"]',
|
contact: 'vn-client-basic-data vn-textfield[ng-model="$ctrl.client.contact"]',
|
||||||
|
@ -231,23 +227,6 @@ export default {
|
||||||
saveButton: 'button[type=submit]',
|
saveButton: 'button[type=submit]',
|
||||||
watcher: 'vn-client-fiscal-data vn-watcher'
|
watcher: 'vn-client-fiscal-data vn-watcher'
|
||||||
},
|
},
|
||||||
clientBillingData: {
|
|
||||||
payMethod: 'vn-client-billing-data vn-autocomplete[ng-model="$ctrl.client.payMethodFk"]',
|
|
||||||
IBAN: 'vn-client-billing-data vn-textfield[ng-model="$ctrl.client.iban"]',
|
|
||||||
dueDay: 'vn-client-billing-data vn-input-number[ng-model="$ctrl.client.dueDay"]',
|
|
||||||
receivedCoreLCRCheckbox: 'vn-client-billing-data vn-check[label="Received LCR"]',
|
|
||||||
receivedCoreVNLCheckbox: 'vn-client-billing-data vn-check[label="Received core VNL"]',
|
|
||||||
receivedB2BVNLCheckbox: 'vn-client-billing-data vn-check[label="Received B2B VNL"]',
|
|
||||||
swiftBic: 'vn-client-billing-data vn-autocomplete[ng-model="$ctrl.client.bankEntityFk"]',
|
|
||||||
newBankEntityButton: 'vn-client-billing-data vn-icon-button[vn-tooltip="New bank entity"] > button',
|
|
||||||
newBankEntityName: '.vn-dialog.shown vn-textfield[ng-model="$ctrl.data.name"]',
|
|
||||||
newBankEntityBIC: '.vn-dialog.shown vn-textfield[ng-model="$ctrl.data.bic"]',
|
|
||||||
newBankEntityCountry: '.vn-dialog.shown vn-autocomplete[ng-model="$ctrl.data.countryFk"]',
|
|
||||||
newBankEntityCode: '.vn-dialog.shown vn-textfield[ng-model="$ctrl.data.id"]',
|
|
||||||
acceptBankEntityButton: '.vn-dialog.shown button[response="accept"]',
|
|
||||||
saveButton: 'vn-client-billing-data button[type=submit]',
|
|
||||||
watcher: 'vn-client-billing-data vn-watcher'
|
|
||||||
},
|
|
||||||
clientAddresses: {
|
clientAddresses: {
|
||||||
addressesButton: 'vn-left-menu a[ui-sref="client.card.address.index"]',
|
addressesButton: 'vn-left-menu a[ui-sref="client.card.address.index"]',
|
||||||
createAddress: 'vn-client-address-index vn-float-button',
|
createAddress: 'vn-client-address-index vn-float-button',
|
||||||
|
@ -306,21 +285,6 @@ export default {
|
||||||
clientMandate: {
|
clientMandate: {
|
||||||
firstMandateText: 'vn-client-mandate vn-card vn-table vn-tbody > vn-tr'
|
firstMandateText: 'vn-client-mandate vn-card vn-table vn-tbody > vn-tr'
|
||||||
},
|
},
|
||||||
clientBalance: {
|
|
||||||
company: 'vn-client-balance-index vn-autocomplete[ng-model="$ctrl.companyId"]',
|
|
||||||
newPaymentButton: `vn-float-button`,
|
|
||||||
newPaymentBank: '.vn-dialog.shown vn-autocomplete[ng-model="$ctrl.bankFk"]',
|
|
||||||
newPaymentAmount: '.vn-dialog.shown vn-input-number[ng-model="$ctrl.amountPaid"]',
|
|
||||||
newDescription: 'vn-textfield[ng-model="$ctrl.receipt.description"]',
|
|
||||||
deliveredAmount: '.vn-dialog vn-input-number[ng-model="$ctrl.deliveredAmount"]',
|
|
||||||
refundAmount: '.vn-dialog vn-input-number[ng-model="$ctrl.amountToReturn"]',
|
|
||||||
saveButton: '.vn-dialog.shown [response="accept"]',
|
|
||||||
anyBalanceLine: 'vn-client-balance-index vn-tbody > vn-tr',
|
|
||||||
firstLineBalance: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td:nth-child(8)',
|
|
||||||
firstLineReference: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td-editable',
|
|
||||||
firstLineReferenceInput: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td-editable > div > field > vn-textfield',
|
|
||||||
compensationButton: 'vn-client-balance-index vn-icon-button[vn-dialog="send_compensation"]'
|
|
||||||
},
|
|
||||||
webPayment: {
|
webPayment: {
|
||||||
confirmFirstPaymentButton: 'vn-client-web-payment vn-tr:nth-child(1) vn-icon-button[icon="done_all"]',
|
confirmFirstPaymentButton: 'vn-client-web-payment vn-tr:nth-child(1) vn-icon-button[icon="done_all"]',
|
||||||
firstPaymentConfirmed: 'vn-client-web-payment vn-tr:nth-child(1) vn-icon[icon="check"]'
|
firstPaymentConfirmed: 'vn-client-web-payment vn-tr:nth-child(1) vn-icon[icon="check"]'
|
||||||
|
@ -466,10 +430,6 @@ export default {
|
||||||
packingOut: 'vn-input-number[ng-model="$ctrl.item.packingOut"]',
|
packingOut: 'vn-input-number[ng-model="$ctrl.item.packingOut"]',
|
||||||
isActiveCheckbox: 'vn-check[label="Active"]',
|
isActiveCheckbox: 'vn-check[label="Active"]',
|
||||||
priceInKgCheckbox: 'vn-check[label="Price in kg"]',
|
priceInKgCheckbox: 'vn-check[label="Price in kg"]',
|
||||||
newIntrastatButton: 'vn-item-basic-data vn-icon-button[vn-tooltip="New intrastat"] > button',
|
|
||||||
newIntrastatId: '.vn-dialog.shown vn-input-number[ng-model="$ctrl.newIntrastat.intrastatId"]',
|
|
||||||
newIntrastatDescription: '.vn-dialog.shown vn-textfield[ng-model="$ctrl.newIntrastat.description"]',
|
|
||||||
acceptIntrastatButton: '.vn-dialog.shown button[response="accept"]',
|
|
||||||
submitBasicDataButton: `button[type=submit]`
|
submitBasicDataButton: `button[type=submit]`
|
||||||
},
|
},
|
||||||
itemTags: {
|
itemTags: {
|
||||||
|
@ -622,13 +582,6 @@ export default {
|
||||||
saveButton: '.vn-dialog.shown [response="accept"]',
|
saveButton: '.vn-dialog.shown [response="accept"]',
|
||||||
expeditionRow: 'vn-ticket-expedition vn-table vn-tbody > vn-tr'
|
expeditionRow: 'vn-ticket-expedition vn-table vn-tbody > vn-tr'
|
||||||
},
|
},
|
||||||
ticketPackages: {
|
|
||||||
firstPackage: 'vn-autocomplete[label="Package"]',
|
|
||||||
firstQuantity: 'vn-ticket-package vn-horizontal:nth-child(1) vn-input-number[ng-model="package.quantity"]',
|
|
||||||
firstRemovePackageButton: 'vn-icon-button[vn-tooltip="Remove package"]',
|
|
||||||
addPackageButton: 'vn-icon-button[vn-tooltip="Add package"]',
|
|
||||||
savePackagesButton: `button[type=submit]`
|
|
||||||
},
|
|
||||||
ticketSales: {
|
ticketSales: {
|
||||||
setOk: 'vn-ticket-sale vn-tool-bar > vn-button[label="Ok"] > button',
|
setOk: 'vn-ticket-sale vn-tool-bar > vn-button[label="Ok"] > button',
|
||||||
saleLine: 'vn-table div > vn-tbody > vn-tr vn-check',
|
saleLine: 'vn-table div > vn-tbody > vn-tr vn-check',
|
||||||
|
@ -873,15 +826,6 @@ export default {
|
||||||
landedDatePicker: 'vn-date-picker[label="Landed"]',
|
landedDatePicker: 'vn-date-picker[label="Landed"]',
|
||||||
createButton: 'button[type=submit]'
|
createButton: 'button[type=submit]'
|
||||||
},
|
},
|
||||||
orderSummary: {
|
|
||||||
id: 'vn-order-summary vn-one:nth-child(1) > vn-label-value:nth-child(1) span',
|
|
||||||
alias: 'vn-order-summary vn-one:nth-child(1) > vn-label-value:nth-child(2) span',
|
|
||||||
consignee: 'vn-order-summary vn-one:nth-child(2) > vn-label-value:nth-child(6) span',
|
|
||||||
subtotal: 'vn-order-summary vn-one.taxes > p:nth-child(1)',
|
|
||||||
vat: 'vn-order-summary vn-one.taxes > p:nth-child(2)',
|
|
||||||
total: 'vn-order-summary vn-one.taxes > p:nth-child(3)',
|
|
||||||
sale: 'vn-order-summary vn-tbody > vn-tr',
|
|
||||||
},
|
|
||||||
orderCatalog: {
|
orderCatalog: {
|
||||||
plantRealmButton: 'vn-order-catalog > vn-side-menu vn-icon[icon="icon-plant"]',
|
plantRealmButton: 'vn-order-catalog > vn-side-menu vn-icon[icon="icon-plant"]',
|
||||||
type: 'vn-order-catalog vn-autocomplete[data="$ctrl.itemTypes"]',
|
type: 'vn-order-catalog vn-autocomplete[data="$ctrl.itemTypes"]',
|
||||||
|
@ -899,14 +843,6 @@ export default {
|
||||||
fifthFilterRemoveButton: 'vn-order-catalog > vn-side-menu .chips > vn-chip:nth-child(5) vn-icon[icon=cancel]',
|
fifthFilterRemoveButton: 'vn-order-catalog > vn-side-menu .chips > vn-chip:nth-child(5) vn-icon[icon=cancel]',
|
||||||
sixthFilterRemoveButton: 'vn-order-catalog > vn-side-menu .chips > vn-chip:nth-child(6) vn-icon[icon=cancel]',
|
sixthFilterRemoveButton: 'vn-order-catalog > vn-side-menu .chips > vn-chip:nth-child(6) vn-icon[icon=cancel]',
|
||||||
},
|
},
|
||||||
orderBasicData: {
|
|
||||||
client: 'vn-autocomplete[label="Client"]',
|
|
||||||
address: 'vn-autocomplete[label="Address"]',
|
|
||||||
agency: 'vn-autocomplete[label="Agency"]',
|
|
||||||
observation: 'vn-textarea[label="Notes"]',
|
|
||||||
saveButton: `button[type=submit]`,
|
|
||||||
acceptButton: '.vn-confirm.shown button[response="accept"]'
|
|
||||||
},
|
|
||||||
orderLine: {
|
orderLine: {
|
||||||
orderSubtotal: 'vn-order-line .header :first-child',
|
orderSubtotal: 'vn-order-line .header :first-child',
|
||||||
firstLineDeleteButton: 'vn-order-line vn-tbody > vn-tr:nth-child(1) vn-icon[icon="delete"]',
|
firstLineDeleteButton: 'vn-order-line vn-tbody > vn-tr:nth-child(1) vn-icon[icon="delete"]',
|
||||||
|
@ -946,16 +882,6 @@ export default {
|
||||||
goToRouteSummaryButton: 'vn-route-summary > vn-card > h5 > a',
|
goToRouteSummaryButton: 'vn-route-summary > vn-card > h5 > a',
|
||||||
|
|
||||||
},
|
},
|
||||||
routeBasicData: {
|
|
||||||
worker: 'vn-route-basic-data vn-autocomplete[ng-model="$ctrl.route.workerFk"]',
|
|
||||||
vehicle: 'vn-route-basic-data vn-autocomplete[ng-model="$ctrl.route.vehicleFk"]',
|
|
||||||
kmStart: 'vn-route-basic-data vn-input-number[ng-model="$ctrl.route.kmStart"]',
|
|
||||||
kmEnd: 'vn-route-basic-data vn-input-number[ng-model="$ctrl.route.kmEnd"]',
|
|
||||||
createdDate: 'vn-route-basic-data vn-date-picker[ng-model="$ctrl.route.created"]',
|
|
||||||
startedHour: 'vn-route-basic-data vn-input-time[ng-model="$ctrl.route.started"]',
|
|
||||||
finishedHour: 'vn-route-basic-data vn-input-time[ng-model="$ctrl.route.finished"]',
|
|
||||||
saveButton: 'vn-route-basic-data button[type=submit]'
|
|
||||||
},
|
|
||||||
routeTickets: {
|
routeTickets: {
|
||||||
firstTicketPriority: 'vn-route-tickets vn-tr:nth-child(1) vn-input-number[ng-model="ticket.priority"]',
|
firstTicketPriority: 'vn-route-tickets vn-tr:nth-child(1) vn-input-number[ng-model="ticket.priority"]',
|
||||||
firstTicketCheckbox: 'vn-route-tickets vn-tr:nth-child(1) vn-check',
|
firstTicketCheckbox: 'vn-route-tickets vn-tr:nth-child(1) vn-check',
|
||||||
|
@ -1240,22 +1166,6 @@ export default {
|
||||||
confirmed: 'vn-entry-summary vn-check[label="Confirmed"]',
|
confirmed: 'vn-entry-summary vn-check[label="Confirmed"]',
|
||||||
anyBuyLine: 'vn-entry-summary tr.dark-row'
|
anyBuyLine: 'vn-entry-summary tr.dark-row'
|
||||||
},
|
},
|
||||||
entryBasicData: {
|
|
||||||
reference: 'vn-entry-basic-data vn-textfield[ng-model="$ctrl.entry.reference"]',
|
|
||||||
invoiceNumber: 'vn-entry-basic-data vn-textfield[ng-model="$ctrl.entry.invoiceNumber"]',
|
|
||||||
notes: 'vn-entry-basic-data vn-textfield[ng-model="$ctrl.entry.notes"]',
|
|
||||||
observations: 'vn-entry-basic-data vn-textarea[ng-model="$ctrl.entry.observation"]',
|
|
||||||
supplier: 'vn-entry-basic-data vn-autocomplete[ng-model="$ctrl.entry.supplierFk"]',
|
|
||||||
currency: 'vn-entry-basic-data vn-autocomplete[ng-model="$ctrl.entry.currencyFk"]',
|
|
||||||
commission: 'vn-entry-basic-data vn-input-number[ng-model="$ctrl.entry.commission"]',
|
|
||||||
company: 'vn-entry-basic-data vn-autocomplete[ng-model="$ctrl.entry.companyFk"]',
|
|
||||||
ordered: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isOrdered"]',
|
|
||||||
confirmed: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isConfirmed"]',
|
|
||||||
inventory: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isExcludedFromAvailable"]',
|
|
||||||
raid: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isRaid"]',
|
|
||||||
booked: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isBooked"]',
|
|
||||||
save: 'vn-entry-basic-data button[type=submit]',
|
|
||||||
},
|
|
||||||
entryDescriptor: {
|
entryDescriptor: {
|
||||||
agency: 'vn-entry-descriptor div.body vn-label-value:nth-child(1) span',
|
agency: 'vn-entry-descriptor div.body vn-label-value:nth-child(1) span',
|
||||||
travelsQuicklink: 'vn-entry-descriptor vn-quick-link[icon="local_airport"] > a',
|
travelsQuicklink: 'vn-entry-descriptor vn-quick-link[icon="local_airport"] > a',
|
||||||
|
|
|
@ -15,81 +15,55 @@ describe('SmartTable SearchBar integration', () => {
|
||||||
await browser.close();
|
await browser.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('as filters in smart-table section', () => {
|
it('should search by type in searchBar, reload page and have same results', async() => {
|
||||||
it('should search by type in searchBar', async() => {
|
|
||||||
await page.waitToClick(selectors.itemsIndex.openAdvancedSearchButton);
|
await page.waitToClick(selectors.itemsIndex.openAdvancedSearchButton);
|
||||||
await page.autocompleteSearch(selectors.itemsIndex.advancedSearchItemType, 'Anthurium');
|
await page.autocompleteSearch(selectors.itemsIndex.advancedSearchItemType, 'Anthurium');
|
||||||
await page.waitToClick(selectors.itemsIndex.advancedSearchButton);
|
await page.waitToClick(selectors.itemsIndex.advancedSearchButton);
|
||||||
await page.waitForNumberOfElements(selectors.itemsIndex.searchResult, 3);
|
await page.waitForNumberOfElements(selectors.itemsIndex.searchResult, 3);
|
||||||
});
|
|
||||||
|
|
||||||
it('should reload page and have same results', async() => {
|
|
||||||
await page.reload({
|
await page.reload({
|
||||||
waitUntil: 'networkidle2'
|
waitUntil: 'networkidle2'
|
||||||
});
|
});
|
||||||
|
|
||||||
await page.waitForNumberOfElements(selectors.itemsIndex.searchResult, 3);
|
await page.waitForNumberOfElements(selectors.itemsIndex.searchResult, 3);
|
||||||
});
|
|
||||||
|
|
||||||
it('should search by grouping in smartTable', async() => {
|
|
||||||
await page.waitToClick(selectors.itemsIndex.advancedSmartTableButton);
|
await page.waitToClick(selectors.itemsIndex.advancedSmartTableButton);
|
||||||
await page.write(selectors.itemsIndex.advancedSmartTableGrouping, '1');
|
await page.write(selectors.itemsIndex.advancedSmartTableGrouping, '1');
|
||||||
await page.keyboard.press('Enter');
|
await page.keyboard.press('Enter');
|
||||||
await page.waitForNumberOfElements(selectors.itemsIndex.searchResult, 2);
|
await page.waitForNumberOfElements(selectors.itemsIndex.searchResult, 2);
|
||||||
});
|
|
||||||
|
|
||||||
it('should now reload page and have same results', async() => {
|
|
||||||
await page.reload({
|
await page.reload({
|
||||||
waitUntil: 'networkidle2'
|
waitUntil: 'networkidle2'
|
||||||
});
|
});
|
||||||
|
|
||||||
await page.waitForNumberOfElements(selectors.itemsIndex.searchResult, 2);
|
await page.waitForNumberOfElements(selectors.itemsIndex.searchResult, 2);
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
describe('as filters in section without smart-table', () => {
|
it('should filter in section without smart-table and search in searchBar go to zone section', async() => {
|
||||||
it('go to zone section', async() => {
|
|
||||||
await page.loginAndModule('salesPerson', 'zone');
|
await page.loginAndModule('salesPerson', 'zone');
|
||||||
await page.waitToClick(selectors.globalItems.searchButton);
|
await page.waitToClick(selectors.globalItems.searchButton);
|
||||||
});
|
|
||||||
|
|
||||||
it('should search in searchBar first time', async() => {
|
|
||||||
await page.doSearch('A');
|
await page.doSearch('A');
|
||||||
const count = await page.countElement(selectors.zoneIndex.searchResult);
|
const firstCount = await page.countElement(selectors.zoneIndex.searchResult);
|
||||||
|
|
||||||
expect(count).toEqual(7);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should search in searchBar second time', async() => {
|
|
||||||
await page.doSearch('A');
|
await page.doSearch('A');
|
||||||
const count = await page.countElement(selectors.zoneIndex.searchResult);
|
const secondCount = await page.countElement(selectors.zoneIndex.searchResult);
|
||||||
|
|
||||||
expect(count).toEqual(7);
|
expect(firstCount).toEqual(7);
|
||||||
|
expect(secondCount).toEqual(7);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should search in searchBar third time', async() => {
|
it('should order orders by first id and order by last id, reload page and have same order', async() => {
|
||||||
await page.doSearch('A');
|
|
||||||
const count = await page.countElement(selectors.zoneIndex.searchResult);
|
|
||||||
|
|
||||||
expect(count).toEqual(7);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('as orders', () => {
|
|
||||||
it('should order by first id', async() => {
|
|
||||||
await page.loginAndModule('developer', 'item');
|
await page.loginAndModule('developer', 'item');
|
||||||
await page.accessToSection('item.fixedPrice');
|
await page.accessToSection('item.fixedPrice');
|
||||||
await page.keyboard.press('Enter');
|
await page.keyboard.press('Enter');
|
||||||
|
|
||||||
await page.waitForTextInField(selectors.itemFixedPrice.firstItemID, '1');
|
await page.waitForTextInField(selectors.itemFixedPrice.firstItemID, '1');
|
||||||
});
|
|
||||||
|
|
||||||
it('should order by last id, reload page and have same order', async() => {
|
|
||||||
await page.waitToClick(selectors.itemFixedPrice.orderColumnId);
|
await page.waitToClick(selectors.itemFixedPrice.orderColumnId);
|
||||||
await page.reload({
|
await page.reload({
|
||||||
waitUntil: 'networkidle2'
|
waitUntil: 'networkidle2'
|
||||||
});
|
});
|
||||||
await page.waitForTextInField(selectors.itemFixedPrice.firstItemID, '13');
|
await page.waitForTextInField(selectors.itemFixedPrice.firstItemID, '13');
|
||||||
});
|
});
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -171,100 +171,40 @@ describe('Client Edit fiscalData path', () => {
|
||||||
expect(result).toEqual('SMASH');
|
expect(result).toEqual('SMASH');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should confirm the fiscal id have been edited', async() => {
|
it('should confirm the fiscal data have been edited', async() => {
|
||||||
const result = await page.waitToGetProperty(selectors.clientFiscalData.fiscalId, 'value');
|
const fiscalId = await page.waitToGetProperty(selectors.clientFiscalData.fiscalId, 'value');
|
||||||
|
const address = await page.waitToGetProperty(selectors.clientFiscalData.address, 'value');
|
||||||
|
const postcode = await page.waitToGetProperty(selectors.clientFiscalData.postcode, 'value');
|
||||||
|
const sageTax = await page.waitToGetProperty(selectors.clientFiscalData.sageTax, 'value');
|
||||||
|
const sageTransaction = await page.waitToGetProperty(selectors.clientFiscalData.sageTransaction, 'value');
|
||||||
|
const city = await page.waitToGetProperty(selectors.clientFiscalData.city, 'value');
|
||||||
|
const province = await page.waitToGetProperty(selectors.clientFiscalData.province, 'value');
|
||||||
|
const country = await page.waitToGetProperty(selectors.clientFiscalData.country, 'value');
|
||||||
|
const active = await page.checkboxState(selectors.clientFiscalData.activeCheckbox);
|
||||||
|
const frozen = await page.checkboxState(selectors.clientFiscalData.frozenCheckbox);
|
||||||
|
const hasToInvoice = await page.checkboxState(selectors.clientFiscalData.hasToInvoiceCheckbox);
|
||||||
|
const vies = await page.checkboxState(selectors.clientFiscalData.viesCheckbox);
|
||||||
|
const notifyByMail = await page.checkboxState(selectors.clientFiscalData.notifyByMailCheckbox);
|
||||||
|
const invoiceByAddress = await page.checkboxState(selectors.clientFiscalData.invoiceByAddressCheckbox);
|
||||||
|
const equalizationTax = await page.checkboxState(selectors.clientFiscalData.equalizationTaxCheckbox);
|
||||||
|
const verifiedData = await page.checkboxState(selectors.clientFiscalData.verifiedDataCheckbox);
|
||||||
|
|
||||||
expect(result).toEqual('94980061C');
|
expect(fiscalId).toEqual('94980061C');
|
||||||
});
|
expect(address).toEqual('Somewhere edited');
|
||||||
|
expect(postcode).toContain('46000');
|
||||||
it('should confirm the address have been edited', async() => {
|
expect(sageTax).toEqual('Operaciones no sujetas');
|
||||||
const result = await page.waitToGetProperty(selectors.clientFiscalData.address, 'value');
|
expect(sageTransaction).toEqual('Regularización de inversiones');
|
||||||
|
expect(city).toEqual('Valencia');
|
||||||
expect(result).toEqual('Somewhere edited');
|
expect(province).toContain('Province one');
|
||||||
});
|
expect(country).toEqual('España');
|
||||||
|
expect(active).toBe('unchecked');
|
||||||
it('should confirm the postcode have been edited', async() => {
|
expect(frozen).toBe('checked');
|
||||||
const result = await page.waitToGetProperty(selectors.clientFiscalData.postcode, 'value');
|
expect(hasToInvoice).toBe('unchecked');
|
||||||
|
expect(vies).toBe('checked');
|
||||||
expect(result).toContain('46000');
|
expect(notifyByMail).toBe('unchecked');
|
||||||
});
|
expect(invoiceByAddress).toBe('checked');
|
||||||
|
expect(equalizationTax).toBe('unchecked');
|
||||||
it('should confirm the sageTax have been edited', async() => {
|
expect(verifiedData).toBe('checked');
|
||||||
const result = await page.waitToGetProperty(selectors.clientFiscalData.sageTax, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('Operaciones no sujetas');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the sageTransaction have been edited', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.clientFiscalData.sageTransaction, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('36: Regularización de inversiones');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the city have been autocompleted', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.clientFiscalData.city, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('Valencia');
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should confirm the province have been autocompleted`, async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.clientFiscalData.province, 'value');
|
|
||||||
|
|
||||||
expect(result).toContain('Province one');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the country have been autocompleted', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.clientFiscalData.country, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('España');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm active checkbox is unchecked', async() => {
|
|
||||||
const result = await page.checkboxState(selectors.clientFiscalData.activeCheckbox);
|
|
||||||
|
|
||||||
expect(result).toBe('unchecked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm frozen checkbox is checked', async() => {
|
|
||||||
const result = await page.checkboxState(selectors.clientFiscalData.frozenCheckbox);
|
|
||||||
|
|
||||||
expect(result).toBe('checked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm Has to invoice checkbox is unchecked', async() => {
|
|
||||||
const result = await page.checkboxState(selectors.clientFiscalData.hasToInvoiceCheckbox);
|
|
||||||
|
|
||||||
expect(result).toBe('unchecked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm Vies checkbox is checked', async() => {
|
|
||||||
const result = await page.checkboxState(selectors.clientFiscalData.viesCheckbox);
|
|
||||||
|
|
||||||
expect(result).toBe('checked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm Notify by email checkbox is unchecked', async() => {
|
|
||||||
const result = await page.checkboxState(selectors.clientFiscalData.notifyByMailCheckbox);
|
|
||||||
|
|
||||||
expect(result).toBe('unchecked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm invoice by address checkbox is checked', async() => {
|
|
||||||
const result = await page.checkboxState(selectors.clientFiscalData.invoiceByAddressCheckbox);
|
|
||||||
|
|
||||||
expect(result).toBe('checked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm Equalization tax checkbox is unchecked', async() => {
|
|
||||||
const result = await page.checkboxState(selectors.clientFiscalData.equalizationTaxCheckbox);
|
|
||||||
|
|
||||||
expect(result).toBe('unchecked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm Verified data checkbox is checked', async() => {
|
|
||||||
const result = await page.checkboxState(selectors.clientFiscalData.verifiedDataCheckbox);
|
|
||||||
|
|
||||||
expect(result).toBe('checked');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// confirm invoice by address checkbox gets checked if the EQtax differs between addresses step 1
|
// confirm invoice by address checkbox gets checked if the EQtax differs between addresses step 1
|
||||||
|
|
|
@ -1,6 +1,23 @@
|
||||||
import selectors from '../../helpers/selectors';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
|
const $ = {
|
||||||
|
payMethod: 'vn-client-billing-data vn-autocomplete[ng-model="$ctrl.client.payMethodFk"]',
|
||||||
|
IBAN: 'vn-client-billing-data vn-textfield[ng-model="$ctrl.client.iban"]',
|
||||||
|
dueDay: 'vn-client-billing-data vn-input-number[ng-model="$ctrl.client.dueDay"]',
|
||||||
|
receivedCoreLCRCheckbox: 'vn-client-billing-data vn-check[label="Received LCR"]',
|
||||||
|
receivedCoreVNLCheckbox: 'vn-client-billing-data vn-check[label="Received core VNL"]',
|
||||||
|
receivedB2BVNLCheckbox: 'vn-client-billing-data vn-check[label="Received B2B VNL"]',
|
||||||
|
swiftBic: 'vn-client-billing-data vn-autocomplete[ng-model="$ctrl.client.bankEntityFk"]',
|
||||||
|
newBankEntityButton: 'vn-client-billing-data vn-icon-button[vn-tooltip="New bank entity"] > button',
|
||||||
|
newBankEntityName: '.vn-dialog.shown vn-textfield[ng-model="$ctrl.data.name"]',
|
||||||
|
newBankEntityBIC: '.vn-dialog.shown vn-textfield[ng-model="$ctrl.data.bic"]',
|
||||||
|
newBankEntityCountry: '.vn-dialog.shown vn-autocomplete[ng-model="$ctrl.data.countryFk"]',
|
||||||
|
newBankEntityCode: '.vn-dialog.shown vn-textfield[ng-model="$ctrl.data.id"]',
|
||||||
|
acceptBankEntityButton: '.vn-dialog.shown button[response="accept"]',
|
||||||
|
saveButton: 'vn-client-billing-data button[type=submit]',
|
||||||
|
watcher: 'vn-client-billing-data vn-watcher'
|
||||||
|
};
|
||||||
|
|
||||||
describe('Client Edit billing data path', () => {
|
describe('Client Edit billing data path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
|
@ -17,93 +34,72 @@ describe('Client Edit billing data path', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should attempt to edit the billing data without an IBAN but fail`, async() => {
|
it(`should attempt to edit the billing data without an IBAN but fail`, async() => {
|
||||||
await page.autocompleteSearch(selectors.clientBillingData.payMethod, 'PayMethod with IBAN');
|
await page.autocompleteSearch($.payMethod, 'PayMethod with IBAN');
|
||||||
await page.autocompleteSearch(selectors.clientBillingData.swiftBic, 'BBKKESMMMMM');
|
await page.autocompleteSearch($.swiftBic, 'BBKKESMMMMM');
|
||||||
await page.clearInput(selectors.clientBillingData.dueDay);
|
await page.clearInput($.dueDay);
|
||||||
await page.write(selectors.clientBillingData.dueDay, '60');
|
await page.write($.dueDay, '60');
|
||||||
await page.waitForTextInField(selectors.clientBillingData.dueDay, '60');
|
await page.waitForTextInField($.dueDay, '60');
|
||||||
await page.waitToClick(selectors.clientBillingData.receivedCoreLCRCheckbox);
|
await page.waitToClick($.receivedCoreLCRCheckbox);
|
||||||
await page.waitToClick(selectors.clientBillingData.receivedCoreVNLCheckbox);
|
await page.waitToClick($.receivedCoreVNLCheckbox);
|
||||||
await page.waitToClick(selectors.clientBillingData.receivedB2BVNLCheckbox);
|
await page.waitToClick($.receivedB2BVNLCheckbox);
|
||||||
await page.waitToClick(selectors.clientBillingData.saveButton);
|
await page.waitToClick($.saveButton);
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('That payment method requires an IBAN');
|
expect(message.text).toContain('That payment method requires an IBAN');
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should create a new BIC code`, async() => {
|
it(`should create a new BIC code`, async() => {
|
||||||
await page.waitToClick(selectors.clientBillingData.newBankEntityButton);
|
await page.waitToClick($.newBankEntityButton);
|
||||||
await page.write(selectors.clientBillingData.newBankEntityName, 'Gotham City Bank');
|
await page.write($.newBankEntityName, 'Gotham City Bank');
|
||||||
await page.write(selectors.clientBillingData.newBankEntityBIC, 'GTHMCT');
|
await page.write($.newBankEntityBIC, 'GTHMCT');
|
||||||
await page.autocompleteSearch(selectors.clientBillingData.newBankEntityCountry, 'España');
|
await page.autocompleteSearch($.newBankEntityCountry, 'España');
|
||||||
await page.write(selectors.clientBillingData.newBankEntityCode, '9999');
|
await page.write($.newBankEntityCode, '9999');
|
||||||
await page.waitToClick(selectors.clientBillingData.acceptBankEntityButton);
|
await page.waitToClick($.acceptBankEntityButton);
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
await page.waitForTextInField(selectors.clientBillingData.swiftBic, 'Gotham City Bank');
|
await page.waitForTextInField($.swiftBic, 'GTHMCT');
|
||||||
const newcode = await page.waitToGetProperty(selectors.clientBillingData.swiftBic, 'value');
|
const newcode = await page.waitToGetProperty($.swiftBic, 'value');
|
||||||
|
|
||||||
expect(newcode).toEqual('GTHMCT Gotham City Bank');
|
|
||||||
|
|
||||||
|
expect(newcode).toEqual('GTHMCT');
|
||||||
expect(message.text).toContain('Data saved!');
|
expect(message.text).toContain('Data saved!');
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should confirm the IBAN pay method was sucessfully saved`, async() => {
|
it(`should confirm the IBAN pay method was sucessfully saved`, async() => {
|
||||||
const payMethod = await page.waitToGetProperty(selectors.clientBillingData.payMethod, 'value');
|
const payMethod = await page.waitToGetProperty($.payMethod, 'value');
|
||||||
|
|
||||||
expect(payMethod).toEqual('PayMethod with IBAN');
|
expect(payMethod).toEqual('PayMethod with IBAN');
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should clear the BIC code field, update the IBAN to see how he BIC code autocompletes`, async() => {
|
it(`should clear the BIC code field, update the IBAN to see how he BIC code autocompletes`, async() => {
|
||||||
await page.write(selectors.clientBillingData.IBAN, 'ES9121000418450200051332');
|
await page.write($.IBAN, 'ES9121000418450200051332');
|
||||||
await page.keyboard.press('Tab');
|
await page.keyboard.press('Tab');
|
||||||
await page.keyboard.press('Tab');
|
await page.keyboard.press('Tab');
|
||||||
await page.waitForTextInField(selectors.clientBillingData.swiftBic, 'caixesbb');
|
await page.waitForTextInField($.swiftBic, 'caixesbb');
|
||||||
let automaticCode = await page.waitToGetProperty(selectors.clientBillingData.swiftBic, 'value');
|
let automaticCode = await page.waitToGetProperty($.swiftBic, 'value');
|
||||||
|
|
||||||
expect(automaticCode).toEqual('CAIXESBB Caixa Bank');
|
expect(automaticCode).toEqual('CAIXESBB');
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should save the form with all its new data`, async() => {
|
it(`should save the form with all its new data`, async() => {
|
||||||
await page.waitForWatcherData(selectors.clientBillingData.watcher);
|
await page.waitForWatcherData($.watcher);
|
||||||
await page.waitToClick(selectors.clientBillingData.saveButton);
|
await page.waitToClick($.saveButton);
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Notification sent!');
|
expect(message.text).toContain('Notification sent!');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should confirm the due day have been edited', async() => {
|
it('should confirm the billing data have been edited', async() => {
|
||||||
const dueDate = await page.waitToGetProperty(selectors.clientBillingData.dueDay, 'value');
|
const dueDate = await page.waitToGetProperty($.dueDay, 'value');
|
||||||
|
const IBAN = await page.waitToGetProperty($.IBAN, 'value');
|
||||||
|
const swiftBic = await page.waitToGetProperty($.swiftBic, 'value');
|
||||||
|
const receivedCoreLCR = await page.checkboxState($.receivedCoreLCRCheckbox);
|
||||||
|
const receivedCoreVNL = await page.checkboxState($.receivedCoreVNLCheckbox);
|
||||||
|
const receivedB2BVNL = await page.checkboxState($.receivedB2BVNLCheckbox);
|
||||||
|
|
||||||
expect(dueDate).toEqual('60');
|
expect(dueDate).toEqual('60');
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the IBAN was saved', async() => {
|
|
||||||
const IBAN = await page.waitToGetProperty(selectors.clientBillingData.IBAN, 'value');
|
|
||||||
|
|
||||||
expect(IBAN).toEqual('ES9121000418450200051332');
|
expect(IBAN).toEqual('ES9121000418450200051332');
|
||||||
});
|
expect(swiftBic).toEqual('CAIXESBB');
|
||||||
|
expect(receivedCoreLCR).toBe('checked');
|
||||||
it('should confirm the swift / BIC code was saved', async() => {
|
expect(receivedCoreVNL).toBe('unchecked');
|
||||||
const code = await page.waitToGetProperty(selectors.clientBillingData.swiftBic, 'value');
|
expect(receivedB2BVNL).toBe('unchecked');
|
||||||
|
|
||||||
expect(code).toEqual('CAIXESBB Caixa Bank');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm Received LCR checkbox is checked', async() => {
|
|
||||||
const result = await page.checkboxState(selectors.clientBillingData.receivedCoreLCRCheckbox);
|
|
||||||
|
|
||||||
expect(result).toBe('checked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm Received core VNL checkbox is unchecked', async() => {
|
|
||||||
const result = await page.checkboxState(selectors.clientBillingData.receivedCoreVNLCheckbox);
|
|
||||||
|
|
||||||
expect(result).toBe('unchecked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm Received B2B VNL checkbox is unchecked', async() => {
|
|
||||||
const result = await page.checkboxState(selectors.clientBillingData.receivedB2BVNLCheckbox);
|
|
||||||
|
|
||||||
expect(result).toBe('unchecked');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -29,19 +29,16 @@ describe('Client Add greuge path', () => {
|
||||||
expect(message.text).toContain('Some fields are invalid');
|
expect(message.text).toContain('Some fields are invalid');
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should create a new greuge with all its data`, async() => {
|
it(`should create a new greuge with all its data and confirm the greuge was added to the list`, async() => {
|
||||||
await page.write(selectors.clientGreuge.amount, '999');
|
await page.write(selectors.clientGreuge.amount, '999');
|
||||||
await page.waitForTextInField(selectors.clientGreuge.amount, '999');
|
await page.waitForTextInField(selectors.clientGreuge.amount, '999');
|
||||||
await page.write(selectors.clientGreuge.description, 'new armor for Batman!');
|
await page.write(selectors.clientGreuge.description, 'new armor for Batman!');
|
||||||
await page.waitToClick(selectors.clientGreuge.saveButton);
|
await page.waitToClick(selectors.clientGreuge.saveButton);
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the greuge was added to the list', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.clientGreuge.firstGreugeText, 'innerText');
|
const result = await page.waitToGetProperty(selectors.clientGreuge.firstGreugeText, 'innerText');
|
||||||
|
|
||||||
|
expect(message.text).toContain('Data saved!');
|
||||||
expect(result).toContain(999);
|
expect(result).toContain(999);
|
||||||
expect(result).toContain('new armor for Batman!');
|
expect(result).toContain('new armor for Batman!');
|
||||||
expect(result).toContain('Diff');
|
expect(result).toContain('Diff');
|
||||||
|
|
|
@ -1,6 +1,17 @@
|
||||||
import selectors from '../../helpers/selectors';
|
import selectors from '../../helpers/selectors';
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
|
const $ = {
|
||||||
|
company: 'vn-client-balance-index vn-autocomplete[ng-model="$ctrl.companyId"]',
|
||||||
|
newPaymentButton: `vn-float-button`,
|
||||||
|
newPayment: '.vn-dialog.shown',
|
||||||
|
refundAmount: '.vn-dialog.shown [vn-name="amountToReturn"]',
|
||||||
|
saveButton: '.vn-dialog.shown [response="accept"]',
|
||||||
|
firstLineBalance: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td:nth-child(8)',
|
||||||
|
firstLineReference: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td-editable',
|
||||||
|
firstLineReferenceInput: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td-editable vn-textfield',
|
||||||
|
};
|
||||||
|
|
||||||
describe('Client balance path', () => {
|
describe('Client balance path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
|
@ -18,125 +29,100 @@ describe('Client balance path', () => {
|
||||||
it('should now edit the local user config data', async() => {
|
it('should now edit the local user config data', async() => {
|
||||||
await page.waitToClick(selectors.globalItems.userMenuButton);
|
await page.waitToClick(selectors.globalItems.userMenuButton);
|
||||||
await page.autocompleteSearch(selectors.globalItems.userLocalCompany, 'CCs');
|
await page.autocompleteSearch(selectors.globalItems.userLocalCompany, 'CCs');
|
||||||
const message = await page.waitForSnackbar();
|
const companyMessage = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should access to the balance section to check the data shown matches the local settings', async() => {
|
|
||||||
await page.accessToSection('client.card.balance.index');
|
await page.accessToSection('client.card.balance.index');
|
||||||
let result = await page.waitToGetProperty(selectors.clientBalance.company, 'value');
|
const company = await page.getValue($.company);
|
||||||
|
|
||||||
expect(result).toEqual('CCs');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should now clear the user local settings', async() => {
|
|
||||||
await page.waitToClick(selectors.globalItems.userMenuButton);
|
await page.waitToClick(selectors.globalItems.userMenuButton);
|
||||||
await page.clearInput(selectors.globalItems.userConfigThirdAutocomplete);
|
await page.clearInput(selectors.globalItems.userConfigThirdAutocomplete);
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reload the section', async() => {
|
|
||||||
await page.closePopup();
|
await page.closePopup();
|
||||||
await page.reloadSection('client.card.balance.index');
|
await page.reloadSection('client.card.balance.index');
|
||||||
|
|
||||||
|
expect(companyMessage.isSuccess).toBeTrue();
|
||||||
|
expect(company).toEqual('CCs');
|
||||||
|
expect(message.isSuccess).toBeTrue();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should create a new payment that clears the debt', async() => {
|
it('should create a new payment that clears the debt', async() => {
|
||||||
await page.closePopup();
|
await page.waitToClick($.newPaymentButton);
|
||||||
await page.waitToClick(selectors.clientBalance.newPaymentButton);
|
await page.fillForm($.newPayment, {
|
||||||
await page.autocompleteSearch(selectors.clientBalance.newPaymentBank, 'Cash');
|
bank: 'Cash',
|
||||||
await page.clearInput(selectors.clientBalance.newDescription);
|
description: 'Description',
|
||||||
await page.write(selectors.clientBalance.newDescription, 'Description');
|
viewReceipt: false
|
||||||
await page.waitToClick(selectors.clientBalance.saveButton);
|
});
|
||||||
|
await page.respondToDialog('accept');
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
expect(message.isSuccess).toBeTrue();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should edit the 1st line reference', async() => {
|
it('should edit the 1st line reference and check data', async() => {
|
||||||
await page.waitToClick(selectors.clientBalance.firstLineReference);
|
await page.waitToClick($.firstLineReference);
|
||||||
await page.write(selectors.clientBalance.firstLineReferenceInput, 'Miscellaneous payment');
|
await page.write($.firstLineReferenceInput, 'Miscellaneous payment');
|
||||||
await page.keyboard.press('Enter');
|
await page.keyboard.press('Enter');
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check balance is now 0, the reference was saved and the company is now VNL becouse the user local settings were removed', async() => {
|
|
||||||
await page.waitForSpinnerLoad();
|
await page.waitForSpinnerLoad();
|
||||||
let company = await page
|
let company = await page.getValue($.company);
|
||||||
.waitToGetProperty(selectors.clientBalance.company, 'value');
|
let reference = await page.innerText($.firstLineReference);
|
||||||
|
let firstBalanceLine = await page.innerText($.firstLineBalance);
|
||||||
let reference = await page
|
|
||||||
.waitToGetProperty(selectors.clientBalance.firstLineReference, 'innerText');
|
|
||||||
|
|
||||||
let firstBalanceLine = await page
|
|
||||||
.waitToGetProperty(selectors.clientBalance.firstLineBalance, 'innerText');
|
|
||||||
|
|
||||||
|
expect(message.isSuccess).toBeTrue();
|
||||||
expect(company).toEqual('VNL');
|
expect(company).toEqual('VNL');
|
||||||
expect(reference).toEqual('Miscellaneous payment');
|
expect(reference).toEqual('Miscellaneous payment');
|
||||||
expect(firstBalanceLine).toContain('0.00');
|
expect(firstBalanceLine).toContain('0.00');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should create a new payment and check the cash comparison works correctly', async() => {
|
it('should create a new payment, check the cash comparison works correctly and balance value is -100', async() => {
|
||||||
const amountPaid = '100';
|
await page.waitToClick($.newPaymentButton);
|
||||||
const cashHanded = '500';
|
await page.fillForm($.newPayment, {
|
||||||
const expectedRefund = '400';
|
amountPaid: 100,
|
||||||
|
description: 'Payment',
|
||||||
await page.waitToClick(selectors.clientBalance.newPaymentButton);
|
deliveredAmount: 500,
|
||||||
await page.write(selectors.clientBalance.newPaymentAmount, amountPaid);
|
viewReceipt: false
|
||||||
await page.clearInput(selectors.clientBalance.newDescription);
|
});
|
||||||
await page.write(selectors.clientBalance.newDescription, 'Payment');
|
const refund = await page.getValue($.refundAmount);
|
||||||
await page.write(selectors.clientBalance.deliveredAmount, cashHanded);
|
await page.respondToDialog('accept');
|
||||||
const refund = await page.waitToGetProperty(selectors.clientBalance.refundAmount, 'value');
|
|
||||||
await page.waitToClick(selectors.clientBalance.saveButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(refund).toEqual(expectedRefund);
|
const result = await page.innerText($.firstLineBalance);
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the balance value is now -100', async() => {
|
|
||||||
let result = await page
|
|
||||||
.waitToGetProperty(selectors.clientBalance.firstLineBalance, 'innerText');
|
|
||||||
|
|
||||||
|
expect(refund).toEqual('400');
|
||||||
|
expect(message.isSuccess).toBeTrue();
|
||||||
expect(result).toContain('-€100.00');
|
expect(result).toContain('-€100.00');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should create a new payment and check the cash exceeded the maximum', async() => {
|
it('should create a new payment and check the cash exceeded the maximum', async() => {
|
||||||
const amountPaid = '1001';
|
await page.waitToClick($.newPaymentButton);
|
||||||
|
await page.fillForm($.newPayment, {
|
||||||
await page.closePopup();
|
bank: 'Cash',
|
||||||
await page.waitToClick(selectors.clientBalance.newPaymentButton);
|
amountPaid: 1001,
|
||||||
await page.autocompleteSearch(selectors.clientBalance.newPaymentBank, 'Cash');
|
description: 'Payment'
|
||||||
await page.write(selectors.clientBalance.newPaymentAmount, amountPaid);
|
});
|
||||||
await page.clearInput(selectors.clientBalance.newDescription);
|
await page.waitToClick($.saveButton);
|
||||||
await page.write(selectors.clientBalance.newDescription, 'Payment');
|
|
||||||
await page.waitToClick(selectors.clientBalance.saveButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Amount exceeded');
|
expect(message.text).toContain('Amount exceeded');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should create a new payment that sets the balance back to the original negative value', async() => {
|
it('should create a new payment that sets the balance back to negative value and check it', async() => {
|
||||||
await page.closePopup();
|
await page.closePopup();
|
||||||
await page.waitToClick(selectors.clientBalance.newPaymentButton);
|
await page.waitToClick($.newPaymentButton);
|
||||||
await page.autocompleteSearch(selectors.clientBalance.newPaymentBank, 'Pay on receipt');
|
|
||||||
await page.overwrite(selectors.clientBalance.newPaymentAmount, '-150');
|
await page.fillForm($.newPayment, {
|
||||||
await page.clearInput(selectors.clientBalance.newDescription);
|
bank: 'Pay on receipt',
|
||||||
await page.write(selectors.clientBalance.newDescription, 'Description');
|
amountPaid: -150,
|
||||||
await page.waitToClick(selectors.clientBalance.saveButton);
|
description: 'Description'
|
||||||
|
});
|
||||||
|
await page.respondToDialog('accept');
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
const result = await page.innerText($.firstLineBalance);
|
||||||
});
|
|
||||||
|
|
||||||
it('should check balance is now 50', async() => {
|
|
||||||
let result = await page
|
|
||||||
.waitToGetProperty(selectors.clientBalance.firstLineBalance, 'innerText');
|
|
||||||
|
|
||||||
|
expect(message.isSuccess).toBeTrue();
|
||||||
expect(result).toEqual('€50.00');
|
expect(result).toEqual('€50.00');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -149,12 +135,9 @@ describe('Client balance path', () => {
|
||||||
await page.waitForState('client.index');
|
await page.waitForState('client.index');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should now search for the user Petter Parker', async() => {
|
it('should now search for the user Petter Parker not check the payment button is not present', async() => {
|
||||||
await page.accessToSearchResult('Petter Parker');
|
await page.accessToSearchResult('Petter Parker');
|
||||||
await page.accessToSection('client.card.balance.index');
|
await page.accessToSection('client.card.balance.index');
|
||||||
});
|
await page.waitForSelector($.newPaymentButton, {hidden: true});
|
||||||
|
|
||||||
it('should not be able to click the new payment button as it isnt present', async() => {
|
|
||||||
await page.waitForSelector(selectors.clientBalance.newPaymentButton, {hidden: true});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
import selectors from '../../helpers/selectors';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
|
const $ = {
|
||||||
|
company: 'vn-client-balance-index vn-autocomplete[ng-model="$ctrl.companyId"]',
|
||||||
|
compensationButton: 'vn-client-balance-index vn-icon-button[vn-dialog="send_compensation"]',
|
||||||
|
saveButton: '.vn-dialog.shown [response="accept"]'
|
||||||
|
};
|
||||||
|
|
||||||
describe('Client Send balance compensation', () => {
|
describe('Client Send balance compensation', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
|
@ -17,9 +22,9 @@ describe('Client Send balance compensation', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should click on send compensation button`, async() => {
|
it(`should click on send compensation button`, async() => {
|
||||||
await page.autocompleteSearch(selectors.clientBalance.company, 'VNL');
|
await page.autocompleteSearch($.company, 'VNL');
|
||||||
await page.waitToClick(selectors.clientBalance.compensationButton);
|
await page.waitToClick($.compensationButton);
|
||||||
await page.waitToClick(selectors.clientBalance.saveButton);
|
await page.waitToClick($.saveButton);
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Notification sent!');
|
expect(message.text).toContain('Notification sent!');
|
||||||
|
|
|
@ -1,14 +1,23 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
|
const $ = {
|
||||||
|
form: 'vn-item-basic-data form',
|
||||||
|
intrastatForm: '.vn-dialog.shown form',
|
||||||
|
newIntrastatButton: 'vn-item-basic-data vn-icon-button[vn-tooltip="New intrastat"] > button'
|
||||||
|
};
|
||||||
|
|
||||||
describe('Item Edit basic data path', () => {
|
describe('Item Edit basic data path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
|
|
||||||
beforeAll(async() => {
|
beforeAll(async() => {
|
||||||
browser = await getBrowser();
|
browser = await getBrowser();
|
||||||
page = browser.page;
|
page = browser.page;
|
||||||
await page.loginAndModule('buyer', 'item');
|
await page.loginAndModule('buyer', 'item');
|
||||||
await page.accessToSearchResult('Melee weapon combat fist 15cm');
|
await page.accessToSearchResult('Melee weapon combat fist 15cm');
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(async() => {
|
||||||
await page.accessToSection('item.card.basicData');
|
await page.accessToSection('item.card.basicData');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -16,124 +25,42 @@ describe('Item Edit basic data path', () => {
|
||||||
await browser.close();
|
await browser.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should check the descritor edit button is visible for buyer`, async() => {
|
it(`should edit the item basic data and confirm the item data was edited`, async() => {
|
||||||
await page.waitForSelector(selectors.itemDescriptor.editButton, {visible: true});
|
const values = {
|
||||||
});
|
name: 'Rose of Purity',
|
||||||
|
longName: 'RS Rose of Purity',
|
||||||
|
type: 'Anthurium',
|
||||||
|
intrastat: 'Coral y materiales similares',
|
||||||
|
origin: 'Spain',
|
||||||
|
relevancy: 1,
|
||||||
|
generic: 'Pallet',
|
||||||
|
isActive: false,
|
||||||
|
priceInKg: true,
|
||||||
|
isFragile: true,
|
||||||
|
packingOut: 5
|
||||||
|
};
|
||||||
|
|
||||||
it(`should edit the item basic data`, async() => {
|
const message = await page.sendForm($.form, values);
|
||||||
await page.clearInput(selectors.itemBasicData.name);
|
|
||||||
await page.write(selectors.itemBasicData.name, 'Rose of Purity');
|
|
||||||
await page.clearInput(selectors.itemBasicData.longName);
|
|
||||||
await page.write(selectors.itemBasicData.longName, 'RS Rose of Purity');
|
|
||||||
await page.autocompleteSearch(selectors.itemBasicData.type, 'Anthurium');
|
|
||||||
await page.autocompleteSearch(selectors.itemBasicData.intrastat, 'Coral y materiales similares');
|
|
||||||
await page.autocompleteSearch(selectors.itemBasicData.origin, 'Spain');
|
|
||||||
await page.clearInput(selectors.itemBasicData.relevancy);
|
|
||||||
await page.write(selectors.itemBasicData.relevancy, '1');
|
|
||||||
await page.clearInput(selectors.itemBasicData.generic);
|
|
||||||
await page.autocompleteSearch(selectors.itemBasicData.generic, '16');
|
|
||||||
await page.waitToClick(selectors.itemBasicData.isActiveCheckbox);
|
|
||||||
await page.waitToClick(selectors.itemBasicData.priceInKgCheckbox);
|
|
||||||
await page.waitToClick(selectors.itemBasicData.isFragile);
|
|
||||||
await page.write(selectors.itemBasicData.packingOut, '5');
|
|
||||||
await page.waitToClick(selectors.itemBasicData.submitBasicDataButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should create a new intrastat`, async() => {
|
|
||||||
await page.waitToClick(selectors.itemBasicData.newIntrastatButton);
|
|
||||||
await page.write(selectors.itemBasicData.newIntrastatId, '588420239');
|
|
||||||
await page.write(selectors.itemBasicData.newIntrastatDescription, 'Tropical Flowers');
|
|
||||||
await page.waitToClick(selectors.itemBasicData.acceptIntrastatButton);
|
|
||||||
await page.waitForTextInField(selectors.itemBasicData.intrastat, 'Tropical Flowers');
|
|
||||||
let newcode = await page.waitToGetProperty(selectors.itemBasicData.intrastat, 'value');
|
|
||||||
|
|
||||||
expect(newcode).toEqual('588420239 Tropical Flowers');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should save with the new intrastat', async() => {
|
|
||||||
await page.waitToClick(selectors.itemBasicData.submitBasicDataButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should confirm the item name was edited`, async() => {
|
|
||||||
await page.reloadSection('item.card.basicData');
|
await page.reloadSection('item.card.basicData');
|
||||||
const result = await page.waitToGetProperty(selectors.itemBasicData.name, 'value');
|
const formValues = await page.fetchForm($.form, Object.keys(values));
|
||||||
|
|
||||||
expect(result).toEqual('Rose of Purity');
|
expect(message.isSuccess).toBeTrue();
|
||||||
|
expect(formValues).toEqual(values);
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should confirm the item type was edited`, async() => {
|
it(`should create a new intrastat and save it`, async() => {
|
||||||
const result = await page
|
await page.click($.newIntrastatButton);
|
||||||
.waitToGetProperty(selectors.itemBasicData.type, 'value');
|
await page.fillForm($.intrastatForm, {
|
||||||
|
id: '588420239',
|
||||||
expect(result).toEqual('Anthurium');
|
description: 'Tropical Flowers'
|
||||||
});
|
});
|
||||||
|
await page.respondToDialog('accept');
|
||||||
|
|
||||||
it(`should confirm the item intrastat was edited`, async() => {
|
const message = await page.sendForm($.form);
|
||||||
const result = await page
|
await page.reloadSection('item.card.basicData');
|
||||||
.waitToGetProperty(selectors.itemBasicData.intrastat, 'value');
|
const formValues = await page.fetchForm($.form, ['intrastat']);
|
||||||
|
|
||||||
expect(result).toEqual('588420239 Tropical Flowers');
|
expect(message.isSuccess).toBeTrue();
|
||||||
});
|
expect(formValues).toEqual({intrastat: 'Tropical Flowers'});
|
||||||
|
|
||||||
it(`should confirm the item relevancy was edited`, async() => {
|
|
||||||
const result = await page
|
|
||||||
.waitToGetProperty(selectors.itemBasicData.relevancy, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('1');
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should confirm the item origin was edited`, async() => {
|
|
||||||
const result = await page
|
|
||||||
.waitToGetProperty(selectors.itemBasicData.origin, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('Spain');
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should confirm the item generic was edited`, async() => {
|
|
||||||
const result = await page
|
|
||||||
.waitToGetProperty(selectors.itemBasicData.generic, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('16 - Pallet');
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should confirm the item long name was edited`, async() => {
|
|
||||||
const result = await page
|
|
||||||
.waitToGetProperty(selectors.itemBasicData.longName, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('RS Rose of Purity');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm isFragile checkbox is unchecked', async() => {
|
|
||||||
const result = await page
|
|
||||||
.checkboxState(selectors.itemBasicData.isFragile);
|
|
||||||
|
|
||||||
expect(result).toBe('checked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm isActive checkbox is unchecked', async() => {
|
|
||||||
const result = await page
|
|
||||||
.checkboxState(selectors.itemBasicData.isActiveCheckbox);
|
|
||||||
|
|
||||||
expect(result).toBe('unchecked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the priceInKg checkbox is checked', async() => {
|
|
||||||
const result = await page
|
|
||||||
.checkboxState(selectors.itemBasicData.priceInKgCheckbox);
|
|
||||||
|
|
||||||
expect(result).toBe('checked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should confirm the item packingOut was edited`, async() => {
|
|
||||||
const result = await page
|
|
||||||
.waitToGetProperty(selectors.itemBasicData.packingOut, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('5');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -53,12 +53,4 @@ describe('Item edit tax path', () => {
|
||||||
|
|
||||||
expect(firstVatType).toEqual('Reduced VAT');
|
expect(firstVatType).toEqual('Reduced VAT');
|
||||||
});
|
});
|
||||||
|
|
||||||
// # #2680 Undo changes button bugs
|
|
||||||
xit(`should now click the undo changes button and see the form is restored`, async() => {
|
|
||||||
await page.waitToClick(selectors.itemTax.undoChangesButton);
|
|
||||||
const firstVatType = await page.waitToGetProperty(selectors.itemTax.firstClass, 'value');
|
|
||||||
|
|
||||||
expect(firstVatType).toEqual('General VAT');
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
import selectors from '../../helpers/selectors.js';
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
|
const $ = {
|
||||||
|
form: 'vn-item-create form'
|
||||||
|
};
|
||||||
|
|
||||||
describe('Item Create', () => {
|
describe('Item Create', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
|
@ -14,13 +18,6 @@ describe('Item Create', () => {
|
||||||
await browser.close();
|
await browser.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should search for the item Infinity Gauntlet to confirm it isn't created yet`, async() => {
|
|
||||||
await page.doSearch('Infinity Gauntlet');
|
|
||||||
const resultsCount = await page.countElement(selectors.itemsIndex.searchResult);
|
|
||||||
|
|
||||||
expect(resultsCount).toEqual(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should access to the create item view by clicking the create floating button', async() => {
|
it('should access to the create item view by clicking the create floating button', async() => {
|
||||||
await page.waitToClick(selectors.itemsIndex.createItemButton);
|
await page.waitToClick(selectors.itemsIndex.createItemButton);
|
||||||
await page.waitForState('item.create');
|
await page.waitForState('item.create');
|
||||||
|
@ -37,44 +34,32 @@ describe('Item Create', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error when insert an invalid priority', async() => {
|
it('should throw an error when insert an invalid priority', async() => {
|
||||||
await page.write(selectors.itemCreateView.temporalName, 'Infinity Gauntlet');
|
const values = {
|
||||||
await page.autocompleteSearch(selectors.itemCreateView.type, 'Crisantemo');
|
name: 'Infinity Gauntlet',
|
||||||
await page.autocompleteSearch(selectors.itemCreateView.intrastat, 'Coral y materiales similares');
|
type: 'Crisantemo',
|
||||||
await page.autocompleteSearch(selectors.itemCreateView.origin, 'Holand');
|
intrastat: 'Coral y materiales similares',
|
||||||
await page.clearInput(selectors.itemCreateView.priority);
|
origin: 'Holand',
|
||||||
await page.waitToClick(selectors.itemCreateView.createButton);
|
priority: null
|
||||||
const message = await page.waitForSnackbar();
|
};
|
||||||
|
const message = await page.sendForm($.form, values);
|
||||||
|
|
||||||
expect(message.text).toContain('Valid priorities');
|
expect(message.text).toContain('Valid priorities');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should create the Infinity Gauntlet item', async() => {
|
it('should create the Infinity Gauntlet item', async() => {
|
||||||
await page.autocompleteSearch(selectors.itemCreateView.priority, '2');
|
const values = {
|
||||||
await page.waitToClick(selectors.itemCreateView.createButton);
|
name: 'Infinity Gauntlet',
|
||||||
const message = await page.waitForSnackbar();
|
type: 'Crisantemo',
|
||||||
|
intrastat: 'Coral y materiales similares',
|
||||||
|
origin: 'Holand',
|
||||||
|
priority: '2'
|
||||||
|
};
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
await page.fillForm($.form, values);
|
||||||
});
|
const formValues = await page.fetchForm($.form, Object.keys(values));
|
||||||
|
const message = await page.sendForm($.form);
|
||||||
|
|
||||||
it('should confirm Infinity Gauntlet item was created', async() => {
|
expect(message.isSuccess).toBeTrue();
|
||||||
let result = await page
|
expect(formValues).toEqual(values);
|
||||||
.waitToGetProperty(selectors.itemBasicData.name, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('Infinity Gauntlet');
|
|
||||||
|
|
||||||
result = await page
|
|
||||||
.waitToGetProperty(selectors.itemBasicData.type, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('Crisantemo');
|
|
||||||
|
|
||||||
result = await page
|
|
||||||
.waitToGetProperty(selectors.itemBasicData.intrastat, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('5080000 Coral y materiales similares');
|
|
||||||
|
|
||||||
result = await page
|
|
||||||
.waitToGetProperty(selectors.itemBasicData.origin, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('Holand');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
import selectors from '../../helpers/selectors.js';
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
|
const $ = selectors.itemFixedPrice;
|
||||||
|
|
||||||
describe('Item fixed prices path', () => {
|
describe('Item fixed prices path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
|
@ -22,63 +24,63 @@ describe('Item fixed prices path', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should filter using all the fields', async() => {
|
it('should filter using all the fields', async() => {
|
||||||
await page.write(selectors.itemFixedPrice.generalSearchFilter, 'item');
|
await page.write($.generalSearchFilter, 'item');
|
||||||
await page.keyboard.press('Enter');
|
await page.keyboard.press('Enter');
|
||||||
|
|
||||||
expect(httpRequest).toContain('search=item');
|
expect(httpRequest).toContain('search=item');
|
||||||
|
|
||||||
await page.click(selectors.itemFixedPrice.chip);
|
await page.click($.chip);
|
||||||
await page.click(selectors.itemFixedPrice.reignFilter);
|
await page.click($.reignFilter);
|
||||||
|
|
||||||
expect(httpRequest).toContain('categoryFk');
|
expect(httpRequest).toContain('categoryFk');
|
||||||
|
|
||||||
await page.autocompleteSearch(selectors.itemFixedPrice.typeFilter, 'Alstroemeria');
|
await page.autocompleteSearch($.typeFilter, 'Alstroemeria');
|
||||||
|
|
||||||
expect(httpRequest).toContain('typeFk');
|
expect(httpRequest).toContain('typeFk');
|
||||||
|
|
||||||
await page.click(selectors.itemFixedPrice.chip);
|
await page.click($.chip);
|
||||||
await page.autocompleteSearch(selectors.itemFixedPrice.buyerFilter, 'buyerNick');
|
await page.autocompleteSearch($.buyerFilter, 'buyerNick');
|
||||||
|
|
||||||
expect(httpRequest).toContain('buyerFk');
|
expect(httpRequest).toContain('buyerFk');
|
||||||
|
|
||||||
await page.click(selectors.itemFixedPrice.chip);
|
await page.click($.chip);
|
||||||
await page.autocompleteSearch(selectors.itemFixedPrice.warehouseFilter, 'Algemesi');
|
await page.autocompleteSearch($.warehouseFilter, 'Algemesi');
|
||||||
|
|
||||||
expect(httpRequest).toContain('warehouseFk');
|
expect(httpRequest).toContain('warehouseFk');
|
||||||
|
|
||||||
await page.click(selectors.itemFixedPrice.chip);
|
await page.click($.chip);
|
||||||
await page.click(selectors.itemFixedPrice.mineFilter);
|
await page.click($.mineFilter);
|
||||||
|
|
||||||
expect(httpRequest).toContain('mine=true');
|
expect(httpRequest).toContain('mine=true');
|
||||||
|
|
||||||
await page.click(selectors.itemFixedPrice.chip);
|
await page.click($.chip);
|
||||||
await page.click(selectors.itemFixedPrice.hasMinPriceFilter);
|
await page.click($.hasMinPriceFilter);
|
||||||
|
|
||||||
expect(httpRequest).toContain('hasMinPrice=true');
|
expect(httpRequest).toContain('hasMinPrice=true');
|
||||||
|
|
||||||
await page.click(selectors.itemFixedPrice.chip);
|
await page.click($.chip);
|
||||||
await page.click(selectors.itemFixedPrice.addTag);
|
await page.click($.addTag);
|
||||||
await page.autocompleteSearch(selectors.itemFixedPrice.tagFilter, 'Color');
|
await page.autocompleteSearch($.tagFilter, 'Color');
|
||||||
await page.autocompleteSearch(selectors.itemFixedPrice.tagValueFilter, 'Brown');
|
await page.autocompleteSearch($.tagValueFilter, 'Brown');
|
||||||
|
|
||||||
expect(httpRequest).toContain('tags');
|
expect(httpRequest).toContain('tags');
|
||||||
|
|
||||||
await page.click(selectors.itemFixedPrice.chip);
|
await page.click($.chip);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should click on the add new fixed price button', async() => {
|
it('should click on the add new fixed price button', async() => {
|
||||||
await page.waitToClick(selectors.itemFixedPrice.add);
|
await page.waitToClick($.add);
|
||||||
await page.waitForSelector(selectors.itemFixedPrice.fourthFixedPrice);
|
await page.waitForSelector($.fourthFixedPrice);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should fill the fixed price data', async() => {
|
it('should fill the fixed price data', async() => {
|
||||||
const now = Date.vnNew();
|
const now = Date.vnNew();
|
||||||
await page.autocompleteSearch(selectors.itemFixedPrice.fourthWarehouse, 'Warehouse one');
|
await page.autocompleteSearch($.fourthWarehouse, 'Warehouse one');
|
||||||
await page.writeOnEditableTD(selectors.itemFixedPrice.fourthGroupingPrice, '1');
|
await page.writeOnEditableTD($.fourthGroupingPrice, '1');
|
||||||
await page.writeOnEditableTD(selectors.itemFixedPrice.fourthPackingPrice, '1');
|
await page.writeOnEditableTD($.fourthPackingPrice, '1');
|
||||||
await page.write(selectors.itemFixedPrice.fourthMinPrice, '1');
|
await page.write($.fourthMinPrice, '1');
|
||||||
await page.pickDate(selectors.itemFixedPrice.fourthStarted, now);
|
await page.pickDate($.fourthStarted, now);
|
||||||
await page.pickDate(selectors.itemFixedPrice.fourthEnded, now);
|
await page.pickDate($.fourthEnded, now);
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
expect(message.text).toContain('Data saved!');
|
||||||
|
@ -87,7 +89,7 @@ describe('Item fixed prices path', () => {
|
||||||
it('should reload the section and check the created price has the expected ID', async() => {
|
it('should reload the section and check the created price has the expected ID', async() => {
|
||||||
await page.goto(`http://localhost:5000/#!/item/fixed-price`);
|
await page.goto(`http://localhost:5000/#!/item/fixed-price`);
|
||||||
|
|
||||||
const result = await page.waitToGetProperty(selectors.itemFixedPrice.fourthItemID, 'value');
|
const result = await page.waitToGetProperty($.fourthItemID, 'value');
|
||||||
|
|
||||||
expect(result).toContain('13');
|
expect(result).toContain('13');
|
||||||
});
|
});
|
||||||
|
|
|
@ -316,7 +316,7 @@ describe('Ticket Edit sale path', () => {
|
||||||
it('should confirm the transfered quantity is the correct one', async() => {
|
it('should confirm the transfered quantity is the correct one', async() => {
|
||||||
const result = await page.waitToGetProperty(selectors.ticketSales.secondSaleQuantityCell, 'innerText');
|
const result = await page.waitToGetProperty(selectors.ticketSales.secondSaleQuantityCell, 'innerText');
|
||||||
|
|
||||||
expect(result).toContain('20');
|
expect(result).toContain('10');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should go back to the original ticket sales section', async() => {
|
it('should go back to the original ticket sales section', async() => {
|
||||||
|
@ -425,20 +425,6 @@ describe('Ticket Edit sale path', () => {
|
||||||
expect(result).toBeFalsy();
|
expect(result).toBeFalsy();
|
||||||
});
|
});
|
||||||
|
|
||||||
// tickets no longer update their totals instantly, a task performed ever 5-10 mins does it. disabled this test until it changes.
|
|
||||||
xit('should update all sales discount', async() => {
|
|
||||||
await page.closePopup();
|
|
||||||
await page.waitToClick(selectors.ticketSales.moreMenu);
|
|
||||||
await page.waitToClick(selectors.ticketSales.moreMenuUpdateDiscount);
|
|
||||||
await page.waitForSelector(selectors.ticketSales.moreMenuUpdateDiscountInput);
|
|
||||||
await page.type(selectors.ticketSales.moreMenuUpdateDiscountInput, '100');
|
|
||||||
await page.keyboard.press('Enter');
|
|
||||||
await page.waitForTextInElement(selectors.ticketSales.totalImport, '0.00');
|
|
||||||
const result = await page.waitToGetProperty(selectors.ticketSales.totalImport, 'innerText');
|
|
||||||
|
|
||||||
expect(result).toContain('0.00');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should log in as Production role and go to a target ticket summary', async() => {
|
it('should log in as Production role and go to a target ticket summary', async() => {
|
||||||
await page.loginAndModule('production', 'ticket');
|
await page.loginAndModule('production', 'ticket');
|
||||||
await page.accessToSearchResult('13');
|
await page.accessToSearchResult('13');
|
||||||
|
|
|
@ -1,6 +1,13 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
|
const $ = {
|
||||||
|
firstPackage: 'vn-autocomplete[label="Package"]',
|
||||||
|
firstQuantity: 'vn-ticket-package vn-horizontal:nth-child(1) vn-input-number[ng-model="package.quantity"]',
|
||||||
|
firstRemovePackageButton: 'vn-icon-button[vn-tooltip="Remove package"]',
|
||||||
|
addPackageButton: 'vn-icon-button[vn-tooltip="Add package"]',
|
||||||
|
savePackagesButton: `button[type=submit]`
|
||||||
|
};
|
||||||
|
|
||||||
describe('Ticket Create packages path', () => {
|
describe('Ticket Create packages path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
|
@ -18,19 +25,19 @@ describe('Ticket Create packages path', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should attempt create a new package but receive an error if package is blank`, async() => {
|
it(`should attempt create a new package but receive an error if package is blank`, async() => {
|
||||||
await page.waitToClick(selectors.ticketPackages.firstRemovePackageButton);
|
await page.waitToClick($.firstRemovePackageButton);
|
||||||
await page.waitToClick(selectors.ticketPackages.addPackageButton);
|
await page.waitToClick($.addPackageButton);
|
||||||
await page.write(selectors.ticketPackages.firstQuantity, '99');
|
await page.write($.firstQuantity, '99');
|
||||||
await page.waitToClick(selectors.ticketPackages.savePackagesButton);
|
await page.waitToClick($.savePackagesButton);
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Package cannot be blank');
|
expect(message.text).toContain('Package cannot be blank');
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should delete the first package and receive and error to save a new one with blank quantity`, async() => {
|
it(`should delete the first package and receive and error to save a new one with blank quantity`, async() => {
|
||||||
await page.clearInput(selectors.ticketPackages.firstQuantity);
|
await page.clearInput($.firstQuantity);
|
||||||
await page.autocompleteSearch(selectors.ticketPackages.firstPackage, 'Container medical box 1m');
|
await page.autocompleteSearch($.firstPackage, 'Container medical box 1m');
|
||||||
await page.waitToClick(selectors.ticketPackages.savePackagesButton);
|
await page.waitToClick($.savePackagesButton);
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Some fields are invalid');
|
expect(message.text).toContain('Some fields are invalid');
|
||||||
|
@ -40,15 +47,15 @@ describe('Ticket Create packages path', () => {
|
||||||
const result = await page
|
const result = await page
|
||||||
.evaluate(selector => {
|
.evaluate(selector => {
|
||||||
return document.querySelector(`${selector} input`).checkValidity();
|
return document.querySelector(`${selector} input`).checkValidity();
|
||||||
}, selectors.ticketPackages.firstQuantity);
|
}, $.firstQuantity);
|
||||||
|
|
||||||
expect(result).toBeTruthy();
|
expect(result).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should create a new package with correct data`, async() => {
|
it(`should create a new package with correct data`, async() => {
|
||||||
await page.clearInput(selectors.ticketPackages.firstQuantity);
|
await page.clearInput($.firstQuantity);
|
||||||
await page.write(selectors.ticketPackages.firstQuantity, '-99');
|
await page.write($.firstQuantity, '-99');
|
||||||
await page.waitToClick(selectors.ticketPackages.savePackagesButton);
|
await page.waitToClick($.savePackagesButton);
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
expect(message.text).toContain('Data saved!');
|
||||||
|
@ -56,15 +63,15 @@ describe('Ticket Create packages path', () => {
|
||||||
|
|
||||||
it(`should confirm the first select is the expected one`, async() => {
|
it(`should confirm the first select is the expected one`, async() => {
|
||||||
await page.reloadSection('ticket.card.package');
|
await page.reloadSection('ticket.card.package');
|
||||||
await page.waitForTextInField(selectors.ticketPackages.firstPackage, 'Container medical box 1m');
|
await page.waitForTextInField($.firstPackage, 'Container medical box 1m');
|
||||||
const result = await page.waitToGetProperty(selectors.ticketPackages.firstPackage, 'value');
|
const result = await page.waitToGetProperty($.firstPackage, 'value');
|
||||||
|
|
||||||
expect(result).toEqual('7 : Container medical box 1m');
|
expect(result).toEqual('Container medical box 1m');
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should confirm quantity is just a number and the string part was ignored by the imput number`, async() => {
|
it(`should confirm quantity is just a number and the string part was ignored by the imput number`, async() => {
|
||||||
await page.waitForTextInField(selectors.ticketPackages.firstQuantity, '-99');
|
await page.waitForTextInField($.firstQuantity, '-99');
|
||||||
const result = await page.waitToGetProperty(selectors.ticketPackages.firstQuantity, 'value');
|
const result = await page.waitToGetProperty($.firstQuantity, 'value');
|
||||||
|
|
||||||
expect(result).toEqual('-99');
|
expect(result).toEqual('-99');
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
|
const $ = {
|
||||||
|
form: 'vn-ticket-create-card',
|
||||||
|
moreMenu: 'vn-client-descriptor vn-icon-button[icon=more_vert]',
|
||||||
|
simpleTicketButton: '.vn-menu [name="simpleTicket"]'
|
||||||
|
};
|
||||||
|
|
||||||
describe('Ticket create from client path', () => {
|
describe('Ticket create from client path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
|
@ -16,20 +21,17 @@ describe('Ticket create from client path', () => {
|
||||||
await browser.close();
|
await browser.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should click the create simple ticket on the descriptor menu', async() => {
|
it('should create simple ticket and check if the client details are the expected ones', async() => {
|
||||||
await page.waitToClick(selectors.clientDescriptor.moreMenu);
|
await page.waitToClick($.moreMenu);
|
||||||
await page.waitToClick(selectors.clientDescriptor.simpleTicketButton);
|
await page.waitToClick($.simpleTicketButton);
|
||||||
await page.waitForState('ticket.create');
|
await page.waitForState('ticket.create');
|
||||||
});
|
|
||||||
|
|
||||||
it('should check if the client details are the expected ones', async() => {
|
const values = {
|
||||||
const client = await page
|
client: 'Petter Parker',
|
||||||
.waitToGetProperty(selectors.createTicketView.client, 'value');
|
address: 'Petter Parker'
|
||||||
|
};
|
||||||
|
const formValues = await page.fetchForm($.form, Object.keys(values));
|
||||||
|
|
||||||
const address = await page
|
expect(formValues).toEqual(values);
|
||||||
.waitToGetProperty(selectors.createTicketView.address, 'value');
|
|
||||||
|
|
||||||
expect(client).toContain('Petter Parker');
|
|
||||||
expect(address).toContain('20 Ingram Street');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,5 +1,10 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
import selectors from '../../helpers/selectors.js';
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
const $ = {
|
||||||
|
newPayment: '.vn-dialog.shown',
|
||||||
|
anyBalanceLine: 'vn-client-balance-index vn-tbody > vn-tr',
|
||||||
|
firstLineReference: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td-editable'
|
||||||
|
};
|
||||||
|
|
||||||
describe('Ticket index payout path', () => {
|
describe('Ticket index payout path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
|
@ -8,17 +13,14 @@ describe('Ticket index payout path', () => {
|
||||||
beforeAll(async() => {
|
beforeAll(async() => {
|
||||||
browser = await getBrowser();
|
browser = await getBrowser();
|
||||||
page = browser.page;
|
page = browser.page;
|
||||||
|
await page.loginAndModule('administrative', 'ticket');
|
||||||
|
await page.waitForState('ticket.index');
|
||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async() => {
|
afterAll(async() => {
|
||||||
await browser.close();
|
await browser.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should navigate to the ticket index', async() => {
|
|
||||||
await page.loginAndModule('administrative', 'ticket');
|
|
||||||
await page.waitForState('ticket.index');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the second ticket from a client and 1 of another', async() => {
|
it('should check the second ticket from a client and 1 of another', async() => {
|
||||||
await page.waitToClick(selectors.globalItems.searchButton);
|
await page.waitToClick(selectors.globalItems.searchButton);
|
||||||
await page.waitToClick(selectors.ticketsIndex.thirdTicketCheckbox);
|
await page.waitToClick(selectors.ticketsIndex.thirdTicketCheckbox);
|
||||||
|
@ -42,27 +44,27 @@ describe('Ticket index payout path', () => {
|
||||||
await page.waitForSelector(selectors.ticketsIndex.payoutCompany);
|
await page.waitForSelector(selectors.ticketsIndex.payoutCompany);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should fill the company and bank to perform a payout', async() => {
|
it('should fill the company and bank to perform a payout and check a new balance line was entered', async() => {
|
||||||
await page.autocompleteSearch(selectors.ticketsIndex.payoutCompany, 'VNL');
|
await page.fillForm($.newPayment, {
|
||||||
await page.autocompleteSearch(selectors.ticketsIndex.payoutBank, 'cash');
|
company: 'VNL',
|
||||||
await page.write(selectors.clientBalance.newPaymentAmount, '100');
|
bank: 'cash',
|
||||||
await page.write(selectors.ticketsIndex.payoutDescription, 'Payment');
|
amountPaid: 100,
|
||||||
await page.waitToClick(selectors.ticketsIndex.submitPayout);
|
description: 'Payment',
|
||||||
|
viewReceipt: false
|
||||||
|
});
|
||||||
|
await page.respondToDialog('accept');
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should navigate to the client balance section and check a new balance line was entered', async() => {
|
|
||||||
await page.waitToClick(selectors.globalItems.homeButton);
|
await page.waitToClick(selectors.globalItems.homeButton);
|
||||||
await page.selectModule('client');
|
await page.selectModule('client');
|
||||||
await page.accessToSearchResult('1101');
|
await page.accessToSearchResult('1101');
|
||||||
await page.accessToSection('client.card.balance.index');
|
await page.accessToSection('client.card.balance.index');
|
||||||
await page.waitForSelector(selectors.clientBalance.anyBalanceLine);
|
await page.waitForSelector($.anyBalanceLine);
|
||||||
const count = await page.countElement(selectors.clientBalance.anyBalanceLine);
|
const count = await page.countElement($.anyBalanceLine);
|
||||||
const reference = await page.waitToGetProperty(selectors.clientBalance.firstLineReference, 'innerText');
|
const reference = await page.innerText($.firstLineReference);
|
||||||
|
|
||||||
|
expect(message.isSuccess).toBeTrue();
|
||||||
expect(count).toEqual(4);
|
expect(count).toEqual(4);
|
||||||
expect(reference).toContain('Cash, Albaran: 7, 8Payment');
|
expect(reference).toContain('Payment');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
import selectors from '../../helpers/selectors.js';
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
describe('Ticket Future path', () => {
|
// 'https:// redmine.verdnatura.es/issues/5642'
|
||||||
|
xdescribe('Ticket Future path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
let httpRequest;
|
let httpRequest;
|
||||||
|
@ -44,95 +45,67 @@ describe('Ticket Future path', () => {
|
||||||
expect(message.text).toContain('originDated is a required argument');
|
expect(message.text).toContain('originDated is a required argument');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should search with the required data', async() => {
|
// it('should search with the required data', async() => {
|
||||||
await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
|
// await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
|
||||||
await page.waitToClick(selectors.ticketFuture.submit);
|
// await page.waitToClick(selectors.ticketFuture.submit);
|
||||||
|
|
||||||
expect(httpRequest).toBeDefined();
|
// expect(httpRequest).toBeDefined();
|
||||||
});
|
// });
|
||||||
|
|
||||||
it('should search with the origin IPT', async() => {
|
// it('should search with the origin IPT', async() => {
|
||||||
await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
|
// await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
|
||||||
|
|
||||||
await page.autocompleteSearch(selectors.ticketFuture.ipt, 'H');
|
// await page.autocompleteSearch(selectors.ticketFuture.ipt, 'H');
|
||||||
await page.waitToClick(selectors.ticketFuture.submit);
|
// await page.waitToClick(selectors.ticketFuture.submit);
|
||||||
|
|
||||||
expect(httpRequest).toContain('ipt=H');
|
// expect(httpRequest).toContain('ipt=H');
|
||||||
});
|
// });
|
||||||
|
|
||||||
it('should search with the destination IPT', async() => {
|
// it('should search with the destination IPT', async() => {
|
||||||
await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
|
// await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
|
||||||
|
|
||||||
await page.clearInput(selectors.ticketFuture.ipt);
|
// await page.clearInput(selectors.ticketFuture.ipt);
|
||||||
|
|
||||||
await page.autocompleteSearch(selectors.ticketFuture.futureIpt, 'H');
|
// await page.autocompleteSearch(selectors.ticketFuture.futureIpt, 'H');
|
||||||
await page.waitToClick(selectors.ticketFuture.submit);
|
// await page.waitToClick(selectors.ticketFuture.submit);
|
||||||
|
|
||||||
expect(httpRequest).toContain('futureIpt=H');
|
// expect(httpRequest).toContain('futureIpt=H');
|
||||||
});
|
// });
|
||||||
|
|
||||||
it('should search with the origin grouped state', async() => {
|
// it('should search with the origin grouped state', async() => {
|
||||||
await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
|
// await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
|
||||||
|
|
||||||
await page.clearInput(selectors.ticketFuture.futureIpt);
|
// await page.clearInput(selectors.ticketFuture.futureIpt);
|
||||||
|
|
||||||
await page.autocompleteSearch(selectors.ticketFuture.state, 'Free');
|
// await page.autocompleteSearch(selectors.ticketFuture.state, 'Free');
|
||||||
await page.waitToClick(selectors.ticketFuture.submit);
|
// await page.waitToClick(selectors.ticketFuture.submit);
|
||||||
|
|
||||||
expect(httpRequest).toContain('state=FREE');
|
// expect(httpRequest).toContain('state=FREE');
|
||||||
});
|
// });
|
||||||
|
|
||||||
it('should search with the destination grouped state', async() => {
|
// it('should search with the destination grouped state', async() => {
|
||||||
await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
|
// await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
|
||||||
|
|
||||||
await page.clearInput(selectors.ticketFuture.state);
|
// await page.clearInput(selectors.ticketFuture.state);
|
||||||
|
|
||||||
await page.autocompleteSearch(selectors.ticketFuture.futureState, 'Free');
|
// await page.autocompleteSearch(selectors.ticketFuture.futureState, 'Free');
|
||||||
await page.waitToClick(selectors.ticketFuture.submit);
|
// await page.waitToClick(selectors.ticketFuture.submit);
|
||||||
|
|
||||||
expect(httpRequest).toContain('futureState=FREE');
|
// expect(httpRequest).toContain('futureState=FREE');
|
||||||
|
|
||||||
await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
|
// await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
|
||||||
await page.clearInput(selectors.ticketFuture.futureState);
|
// await page.clearInput(selectors.ticketFuture.futureState);
|
||||||
await page.waitToClick(selectors.ticketFuture.submit);
|
// await page.waitToClick(selectors.ticketFuture.submit);
|
||||||
});
|
// });
|
||||||
|
|
||||||
it('should search in smart-table with an ID Origin', async() => {
|
// it('should check the three last tickets and move to the future', async() => {
|
||||||
await page.waitToClick(selectors.ticketFuture.tableButtonSearch);
|
// await page.waitForNumberOfElements(selectors.ticketFuture.searchResult, 4);
|
||||||
await page.write(selectors.ticketFuture.tableId, '1');
|
// await page.waitToClick(selectors.ticketFuture.multiCheck);
|
||||||
await page.keyboard.press('Enter');
|
// await page.waitToClick(selectors.ticketFuture.firstCheck);
|
||||||
|
// await page.waitToClick(selectors.ticketFuture.moveButton);
|
||||||
|
// await page.waitToClick(selectors.globalItems.acceptButton);
|
||||||
|
// const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(httpRequest).toContain('id');
|
// expect(message.text).toContain('Tickets moved successfully!');
|
||||||
await page.waitToClick(selectors.ticketFuture.tableButtonSearch);
|
// });
|
||||||
});
|
|
||||||
|
|
||||||
it('should search in smart-table with an IPT Destination', async() => {
|
|
||||||
await page.waitToClick(selectors.ticketFuture.tableButtonSearch);
|
|
||||||
await page.autocompleteSearch(selectors.ticketFuture.tableFutureIpt, 'H');
|
|
||||||
|
|
||||||
expect(httpRequest).toContain('futureIpt');
|
|
||||||
await page.waitToClick(selectors.ticketFuture.tableButtonSearch);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should search in smart-table with an ID Destination', async() => {
|
|
||||||
await page.waitToClick(selectors.ticketFuture.tableButtonSearch);
|
|
||||||
await page.write(selectors.ticketFuture.tableFutureId, '1');
|
|
||||||
await page.keyboard.press('Enter');
|
|
||||||
|
|
||||||
expect(httpRequest).toContain('futureId');
|
|
||||||
await page.waitToClick(selectors.ticketFuture.tableButtonSearch);
|
|
||||||
await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton);
|
|
||||||
await page.waitToClick(selectors.ticketFuture.submit);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the three last tickets and move to the future', async() => {
|
|
||||||
await page.waitForNumberOfElements(selectors.ticketFuture.searchResult, 4);
|
|
||||||
await page.waitToClick(selectors.ticketFuture.multiCheck);
|
|
||||||
await page.waitToClick(selectors.ticketFuture.firstCheck);
|
|
||||||
await page.waitToClick(selectors.ticketFuture.moveButton);
|
|
||||||
await page.waitToClick(selectors.globalItems.acceptButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Tickets moved successfully!');
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
import selectors from '../../helpers/selectors.js';
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
describe('Ticket Advance path', () => {
|
// 'https:// redmine.verdnatura.es/issues/5642'
|
||||||
|
xdescribe('Ticket Advance path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
let httpRequest;
|
let httpRequest;
|
||||||
|
@ -45,65 +46,43 @@ describe('Ticket Advance path', () => {
|
||||||
expect(message.text).toContain('dateFuture is a required argument');
|
expect(message.text).toContain('dateFuture is a required argument');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should search with the required data', async() => {
|
// it('should search with the required data', async() => {
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
// await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
// await page.waitToClick(selectors.ticketAdvance.submit);
|
||||||
|
|
||||||
expect(httpRequest).toBeDefined();
|
// expect(httpRequest).toBeDefined();
|
||||||
});
|
// });
|
||||||
|
|
||||||
it('should search with the origin IPT', async() => {
|
// it('should search with the origin IPT', async() => {
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
// await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
||||||
await page.autocompleteSearch(selectors.ticketAdvance.futureIpt, 'H');
|
// await page.autocompleteSearch(selectors.ticketAdvance.futureIpt, 'H');
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
// await page.waitToClick(selectors.ticketAdvance.submit);
|
||||||
|
|
||||||
expect(httpRequest).toContain('futureIpt=H');
|
// expect(httpRequest).toContain('futureIpt=H');
|
||||||
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
// await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
||||||
await page.clearInput(selectors.ticketAdvance.futureIpt);
|
// await page.clearInput(selectors.ticketAdvance.futureIpt);
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
// await page.waitToClick(selectors.ticketAdvance.submit);
|
||||||
});
|
// });
|
||||||
|
|
||||||
it('should search with the destination IPT', async() => {
|
// it('should search with the destination IPT', async() => {
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
// await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
||||||
await page.autocompleteSearch(selectors.ticketAdvance.ipt, 'H');
|
// await page.autocompleteSearch(selectors.ticketAdvance.ipt, 'H');
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
// await page.waitToClick(selectors.ticketAdvance.submit);
|
||||||
|
|
||||||
expect(httpRequest).toContain('ipt=H');
|
// expect(httpRequest).toContain('ipt=H');
|
||||||
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
// await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
||||||
await page.clearInput(selectors.ticketAdvance.ipt);
|
// await page.clearInput(selectors.ticketAdvance.ipt);
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
// await page.waitToClick(selectors.ticketAdvance.submit);
|
||||||
});
|
// });
|
||||||
|
|
||||||
it('should search in smart-table with an IPT Origin', async() => {
|
// it('should check the first ticket and move to the present', async() => {
|
||||||
await page.waitToClick(selectors.ticketAdvance.tableButtonSearch);
|
// await page.waitToClick(selectors.ticketAdvance.firstCheck);
|
||||||
await page.autocompleteSearch(selectors.ticketAdvance.tableFutureIpt, 'V');
|
// await page.waitToClick(selectors.ticketAdvance.moveButton);
|
||||||
|
// await page.waitToClick(selectors.ticketAdvance.acceptButton);
|
||||||
|
// const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(httpRequest).toContain('futureIpt');
|
// expect(message.text).toContain('Tickets moved successfully!');
|
||||||
|
// });
|
||||||
await page.waitToClick(selectors.ticketAdvance.tableButtonSearch);
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should search in smart-table with an IPT Destination', async() => {
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.tableButtonSearch);
|
|
||||||
await page.autocompleteSearch(selectors.ticketAdvance.tableIpt, 'V');
|
|
||||||
|
|
||||||
expect(httpRequest).toContain('ipt');
|
|
||||||
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.tableButtonSearch);
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton);
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.submit);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the first ticket and move to the present', async() => {
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.firstCheck);
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.moveButton);
|
|
||||||
await page.waitToClick(selectors.ticketAdvance.acceptButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Tickets moved successfully!');
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,15 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
|
const $ = {
|
||||||
|
id: 'vn-order-summary vn-one:nth-child(1) > vn-label-value:nth-child(1) span',
|
||||||
|
alias: 'vn-order-summary vn-one:nth-child(1) > vn-label-value:nth-child(2) span',
|
||||||
|
consignee: 'vn-order-summary vn-one:nth-child(2) > vn-label-value:nth-child(6) span',
|
||||||
|
subtotal: 'vn-order-summary vn-one.taxes > p:nth-child(1)',
|
||||||
|
vat: 'vn-order-summary vn-one.taxes > p:nth-child(2)',
|
||||||
|
total: 'vn-order-summary vn-one.taxes > p:nth-child(3)',
|
||||||
|
sale: 'vn-order-summary vn-tbody > vn-tr',
|
||||||
|
};
|
||||||
|
|
||||||
describe('Order summary path', () => {
|
describe('Order summary path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
|
@ -15,49 +24,23 @@ describe('Order summary path', () => {
|
||||||
await browser.close();
|
await browser.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should reach the order summary section', async() => {
|
it('should reach the order summary section and check data', async() => {
|
||||||
await page.waitForState('order.card.summary');
|
await page.waitForState('order.card.summary');
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the summary contains the order id', async() => {
|
const id = await page.innerText($.id);
|
||||||
const result = await page.waitToGetProperty(selectors.orderSummary.id, 'innerText');
|
const alias = await page.innerText($.alias);
|
||||||
|
const consignee = await page.innerText($.consignee);
|
||||||
|
const subtotal = await page.innerText($.subtotal);
|
||||||
|
const vat = await page.innerText($.vat);
|
||||||
|
const total = await page.innerText($.total);
|
||||||
|
const sale = await page.countElement($.sale);
|
||||||
|
|
||||||
expect(result).toEqual('16');
|
expect(id).toEqual('16');
|
||||||
});
|
expect(alias).toEqual('Many places');
|
||||||
|
expect(consignee).toEqual('address 26 - Gotham (Province one)');
|
||||||
it('should check the summary contains the order alias', async() => {
|
expect(subtotal.length).toBeGreaterThan(1);
|
||||||
const result = await page.waitToGetProperty(selectors.orderSummary.alias, 'innerText');
|
expect(vat.length).toBeGreaterThan(1);
|
||||||
|
expect(total.length).toBeGreaterThan(1);
|
||||||
expect(result).toEqual('Many places');
|
expect(sale).toBeGreaterThan(0);
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the summary contains the order consignee', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.orderSummary.consignee, 'innerText');
|
|
||||||
|
|
||||||
expect(result).toEqual('address 26 - Gotham (Province one)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the summary contains the order subtotal', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.orderSummary.subtotal, 'innerText');
|
|
||||||
|
|
||||||
expect(result.length).toBeGreaterThan(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the summary contains the order vat', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.orderSummary.vat, 'innerText');
|
|
||||||
|
|
||||||
expect(result.length).toBeGreaterThan(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the summary contains the order total', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.orderSummary.total, 'innerText');
|
|
||||||
|
|
||||||
expect(result.length).toBeGreaterThan(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the summary contains the order sales', async() => {
|
|
||||||
const result = await page.countElement(selectors.orderSummary.sale);
|
|
||||||
|
|
||||||
expect(result).toBeGreaterThan(0);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,6 +1,13 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
import selectors from '../../helpers/selectors.js';
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
|
const $ = {
|
||||||
|
form: 'vn-order-basic-data form',
|
||||||
|
observation: 'vn-order-basic-data form [vn-name="note"]',
|
||||||
|
saveButton: `vn-order-basic-data form button[type=submit]`,
|
||||||
|
acceptButton: '.vn-confirm.shown button[response="accept"]'
|
||||||
|
};
|
||||||
|
|
||||||
describe('Order edit basic data path', () => {
|
describe('Order edit basic data path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
|
@ -20,90 +27,43 @@ describe('Order edit basic data path', () => {
|
||||||
|
|
||||||
describe('when confirmed order', () => {
|
describe('when confirmed order', () => {
|
||||||
it('should not be able to change the client', async() => {
|
it('should not be able to change the client', async() => {
|
||||||
await page.autocompleteSearch(selectors.orderBasicData.client, 'Tony Stark');
|
const message = await page.sendForm($.form, {
|
||||||
await page.autocompleteSearch(selectors.orderBasicData.address, 'Tony Stark');
|
client: 'Tony Stark',
|
||||||
await page.waitToClick(selectors.orderBasicData.saveButton);
|
address: 'Tony Stark',
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain(`You can't make changes on the basic data of an confirmed order or with rows`);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('when order with rows', () => {
|
expect(message.text).toContain(`You can't make changes on the basic data`);
|
||||||
it('should now navigate to order index', async() => {
|
|
||||||
const orderId = '16';
|
|
||||||
|
|
||||||
await page.waitToClick(selectors.orderDescriptor.returnToModuleIndexButton);
|
|
||||||
await page.waitToClick(selectors.globalItems.acceptButton);
|
|
||||||
await page.waitForContentLoaded();
|
|
||||||
await page.accessToSearchResult(orderId);
|
|
||||||
await page.accessToSection('order.card.basicData');
|
|
||||||
await page.waitForSelector(selectors.orderBasicData.observation, {visible: true});
|
|
||||||
await page.waitForState('order.card.basicData');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should not be able to change anything', async() => {
|
|
||||||
await page.write(selectors.orderBasicData.observation, 'observation');
|
|
||||||
await page.waitToClick(selectors.orderBasicData.saveButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain(`You can't make changes on the basic data of an confirmed order or with rows`);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('when new order', () => {
|
describe('when new order', () => {
|
||||||
it('should navigate to the order index and click the new order button', async() => {
|
it('should create an order and edit its basic data', async() => {
|
||||||
await page.waitToClick(selectors.globalItems.returnToModuleIndexButton);
|
await page.waitToClick(selectors.globalItems.returnToModuleIndexButton);
|
||||||
await page.waitToClick(selectors.orderBasicData.acceptButton);
|
await page.waitToClick($.acceptButton);
|
||||||
await page.waitForContentLoaded();
|
await page.waitForContentLoaded();
|
||||||
await page.waitToClick(selectors.ordersIndex.createOrderButton);
|
await page.waitToClick(selectors.ordersIndex.createOrderButton);
|
||||||
await page.waitForState('order.create');
|
await page.waitForState('order.create');
|
||||||
});
|
|
||||||
|
|
||||||
it('should now create a new one', async() => {
|
|
||||||
await page.autocompleteSearch(selectors.createOrderView.client, 'Jessica Jones');
|
await page.autocompleteSearch(selectors.createOrderView.client, 'Jessica Jones');
|
||||||
await page.pickDate(selectors.createOrderView.landedDatePicker);
|
await page.pickDate(selectors.createOrderView.landedDatePicker);
|
||||||
await page.autocompleteSearch(selectors.createOrderView.agency, 'Other agency');
|
await page.autocompleteSearch(selectors.createOrderView.agency, 'Other agency');
|
||||||
await page.waitToClick(selectors.createOrderView.createButton);
|
await page.waitToClick(selectors.createOrderView.createButton);
|
||||||
await page.waitForState('order.card.catalog');
|
await page.waitForState('order.card.catalog');
|
||||||
});
|
|
||||||
|
|
||||||
it('should navigate to the basic data section of the new order', async() => {
|
|
||||||
await page.accessToSection('order.card.basicData');
|
await page.accessToSection('order.card.basicData');
|
||||||
await page.waitForState('order.card.basicData');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should be able to modify all the properties', async() => {
|
const values = {
|
||||||
await page.autocompleteSearch(selectors.orderBasicData.client, 'Tony Stark');
|
client: 'Tony Stark',
|
||||||
await page.autocompleteSearch(selectors.orderBasicData.address, 'Tony Stark');
|
address: 'Tony Stark',
|
||||||
await page.autocompleteSearch(selectors.orderBasicData.agency, 'Other agency');
|
agencyMode: 'Other agency'
|
||||||
await page.write(selectors.orderBasicData.observation, 'my observation');
|
};
|
||||||
await page.waitToClick(selectors.orderBasicData.saveButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
const message = await page.sendForm($.form, values);
|
||||||
});
|
|
||||||
|
|
||||||
it('should now confirm the client have been edited', async() => {
|
|
||||||
await page.reloadSection('order.card.basicData');
|
await page.reloadSection('order.card.basicData');
|
||||||
const result = await page
|
const formValues = await page.fetchForm($.form, Object.keys(values));
|
||||||
.waitToGetProperty(selectors.orderBasicData.client, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('1104: Tony Stark');
|
expect(message.isSuccess).toBeTrue();
|
||||||
});
|
expect(formValues).toEqual(values);
|
||||||
|
|
||||||
it('should now confirm the agency have been edited', async() => {
|
|
||||||
const result = await page
|
|
||||||
.waitToGetProperty(selectors.orderBasicData.agency, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('Other agency');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should now confirm the observations have been edited', async() => {
|
|
||||||
const result = await page
|
|
||||||
.waitToGetProperty(selectors.orderBasicData.observation, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('my observation');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
describe('Route basic Data path', () => {
|
describe('Route basic Data path', () => {
|
||||||
|
@ -17,47 +16,27 @@ describe('Route basic Data path', () => {
|
||||||
await browser.close();
|
await browser.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should edit the route basic data', async() => {
|
it('should edit the route basic data and confirm the route was edited', async() => {
|
||||||
const nextMonth = Date.vnNew();
|
const nextMonth = Date.vnNew();
|
||||||
nextMonth.setMonth(nextMonth.getMonth() + 1);
|
nextMonth.setMonth(nextMonth.getMonth() + 1);
|
||||||
|
nextMonth.setUTCHours(0, 0, 0, 0);
|
||||||
|
|
||||||
await page.autocompleteSearch(selectors.routeBasicData.worker, 'adminBossNick');
|
const form = 'vn-route-basic-data form';
|
||||||
await page.autocompleteSearch(selectors.routeBasicData.vehicle, '1111-IMK');
|
const values = {
|
||||||
await page.pickDate(selectors.routeBasicData.createdDate, nextMonth);
|
worker: 'adminBossNick',
|
||||||
await page.clearInput(selectors.routeBasicData.kmStart);
|
vehicle: '1111-IMK',
|
||||||
await page.write(selectors.routeBasicData.kmStart, '1');
|
created: nextMonth,
|
||||||
await page.clearInput(selectors.routeBasicData.kmEnd);
|
kmStart: 1,
|
||||||
await page.write(selectors.routeBasicData.kmEnd, '2');
|
kmEnd: 2,
|
||||||
await page.type(`${selectors.routeBasicData.startedHour} input`, '0800');
|
started: '08:00',
|
||||||
await page.type(`${selectors.routeBasicData.finishedHour} input`, '1230');
|
finished: '12:30',
|
||||||
await page.waitToClick(selectors.routeBasicData.saveButton);
|
};
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
const message = await page.sendForm(form, values);
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the worker was edited', async() => {
|
|
||||||
await page.reloadSection('route.card.basicData');
|
await page.reloadSection('route.card.basicData');
|
||||||
const worker = await page.waitToGetProperty(selectors.routeBasicData.worker, 'value');
|
const formValues = await page.fetchForm(form, Object.keys(values));
|
||||||
|
|
||||||
expect(worker).toEqual('adminBoss - adminBossNick');
|
expect(message.isSuccess).toBeTrue();
|
||||||
});
|
expect(formValues).toEqual(values);
|
||||||
|
|
||||||
it('should confirm the vehicle was edited', async() => {
|
|
||||||
const vehicle = await page.waitToGetProperty(selectors.routeBasicData.vehicle, 'value');
|
|
||||||
|
|
||||||
expect(vehicle).toEqual('1111-IMK');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the km start was edited', async() => {
|
|
||||||
const kmStart = await page.waitToGetProperty(selectors.routeBasicData.kmStart, 'value');
|
|
||||||
|
|
||||||
expect(kmStart).toEqual('1');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the km end was edited', async() => {
|
|
||||||
const kmEnd = await page.waitToGetProperty(selectors.routeBasicData.kmEnd, 'value');
|
|
||||||
|
|
||||||
expect(kmEnd).toEqual('2');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -57,11 +57,4 @@ describe('Route tickets path', () => {
|
||||||
it('should now count how many tickets are in route to find one less', async() => {
|
it('should now count how many tickets are in route to find one less', async() => {
|
||||||
await page.waitForNumberOfElements(selectors.routeTickets.anyTicket, 0);
|
await page.waitForNumberOfElements(selectors.routeTickets.anyTicket, 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
// #2862 updateVolume() route descriptor no actualiza volumen
|
|
||||||
xit('should confirm the route volume on the descriptor has been updated by the changes made', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.routeDescriptor.volume, 'innerText');
|
|
||||||
|
|
||||||
expect(result).toEqual('0 / 50 m³');
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -17,55 +17,36 @@ describe('InvoiceIn tax path', () => {
|
||||||
await browser.close();
|
await browser.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should add a new tax', async() => {
|
it('should add a new tax and check it', async() => {
|
||||||
await page.waitToClick(selectors.invoiceInTax.addTaxButton);
|
await page.waitToClick(selectors.invoiceInTax.addTaxButton);
|
||||||
await page.autocompleteSearch(selectors.invoiceInTax.thirdExpense, '6210000567');
|
await page.autocompleteSearch(selectors.invoiceInTax.thirdExpense, '6210000567');
|
||||||
await page.write(selectors.invoiceInTax.thirdTaxableBase, '100');
|
await page.write(selectors.invoiceInTax.thirdTaxableBase, '100');
|
||||||
await page.autocompleteSearch(selectors.invoiceInTax.thirdTaxType, '6');
|
await page.autocompleteSearch(selectors.invoiceInTax.thirdTaxType, 'H.P. IVA');
|
||||||
await page.autocompleteSearch(selectors.invoiceInTax.thirdTransactionType, 'Operaciones exentas');
|
await page.autocompleteSearch(selectors.invoiceInTax.thirdTransactionType, 'Operaciones exentas');
|
||||||
await page.waitToClick(selectors.invoiceInTax.saveButton);
|
await page.waitToClick(selectors.invoiceInTax.saveButton);
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should navigate to the summary and check the taxable base sum is correct', async() => {
|
|
||||||
await page.waitToClick(selectors.invoiceInDescriptor.summaryIcon);
|
await page.waitToClick(selectors.invoiceInDescriptor.summaryIcon);
|
||||||
await page.waitForState('invoiceIn.card.summary');
|
await page.waitForState('invoiceIn.card.summary');
|
||||||
const result = await page.waitToGetProperty(selectors.invoiceInSummary.totalTaxableBase, 'innerText');
|
const total = await page.waitToGetProperty(selectors.invoiceInSummary.totalTaxableBase, 'innerText');
|
||||||
|
|
||||||
expect(result).toEqual('Taxable base €1,323.16');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should navigate back to tax section, check the reciently added line contains the expected expense', async() => {
|
|
||||||
await page.accessToSection('invoiceIn.card.tax');
|
await page.accessToSection('invoiceIn.card.tax');
|
||||||
const result = await page.waitToGetProperty(selectors.invoiceInTax.thirdExpense, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('6210000567: Alquiler VNH');
|
const thirdExpense = await page.waitToGetProperty(selectors.invoiceInTax.thirdExpense, 'value');
|
||||||
});
|
const thirdTaxableBase = await page.waitToGetProperty(selectors.invoiceInTax.thirdTaxableBase, 'value');
|
||||||
|
const thirdTaxType = await page.waitToGetProperty(selectors.invoiceInTax.thirdTaxType, 'value');
|
||||||
|
const thirdTransactionType = await page.waitToGetProperty(selectors.invoiceInTax.thirdTransactionType, 'value');
|
||||||
|
const thirdRate = await page.waitToGetProperty(selectors.invoiceInTax.thirdRate, 'value');
|
||||||
|
|
||||||
it('should check the reciently added line contains the expected taxable base', async() => {
|
expect(message.text).toContain('Data saved!');
|
||||||
const result = await page.waitToGetProperty(selectors.invoiceInTax.thirdTaxableBase, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('100');
|
expect(total).toEqual('Taxable base €1,323.16');
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the reciently added line contains the expected tax type', async() => {
|
expect(thirdExpense).toEqual('6210000567');
|
||||||
const result = await page.waitToGetProperty(selectors.invoiceInTax.thirdTaxType, 'value');
|
expect(thirdTaxableBase).toEqual('100');
|
||||||
|
expect(thirdTaxType).toEqual('H.P. IVA 4% CEE');
|
||||||
expect(result).toEqual('6: H.P. IVA 4% CEE');
|
expect(thirdTransactionType).toEqual('Operaciones exentas');
|
||||||
});
|
expect(thirdRate).toEqual('€4.00');
|
||||||
|
|
||||||
it('should check the reciently added line contains the expected transaction type', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.invoiceInTax.thirdTransactionType, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('37: Operaciones exentas');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the reciently added line contains the expected rate', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.invoiceInTax.thirdRate, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('€4.00');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should delete the added line', async() => {
|
it('should delete the added line', async() => {
|
||||||
|
|
|
@ -15,49 +15,39 @@ describe('InvoiceOut manual invoice path', () => {
|
||||||
await browser.close();
|
await browser.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should open the manual invoice form', async() => {
|
it('should create an invoice from a ticket', async() => {
|
||||||
await page.waitToClick(selectors.invoiceOutIndex.createInvoice);
|
await page.waitToClick(selectors.invoiceOutIndex.createInvoice);
|
||||||
await page.waitForSelector(selectors.invoiceOutIndex.manualInvoiceForm);
|
await page.waitForSelector(selectors.invoiceOutIndex.manualInvoiceForm);
|
||||||
});
|
|
||||||
|
|
||||||
it('should create an invoice from a ticket', async() => {
|
|
||||||
await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceTicket, '15');
|
await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceTicket, '15');
|
||||||
await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceSerial, 'Global nacional');
|
await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceSerial, 'Global nacional');
|
||||||
await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceTaxArea, 'national');
|
await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceTaxArea, 'national');
|
||||||
await page.waitToClick(selectors.invoiceOutIndex.saveInvoice);
|
await page.waitToClick(selectors.invoiceOutIndex.saveInvoice);
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
|
await page.waitForState('invoiceOut.card.summary');
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
expect(message.text).toContain('Data saved!');
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should have been redirected to the created invoice summary`, async() => {
|
it(`should create another invoice from a client`, async() => {
|
||||||
await page.waitForState('invoiceOut.card.summary');
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should navigate back to the invoiceOut index`, async() => {
|
|
||||||
await page.waitToClick(selectors.globalItems.applicationsMenuButton);
|
await page.waitToClick(selectors.globalItems.applicationsMenuButton);
|
||||||
await page.waitForSelector(selectors.globalItems.applicationsMenuVisible);
|
await page.waitForSelector(selectors.globalItems.applicationsMenuVisible);
|
||||||
await page.waitToClick(selectors.globalItems.invoiceOutButton);
|
await page.waitToClick(selectors.globalItems.invoiceOutButton);
|
||||||
await page.waitForSelector(selectors.invoiceOutIndex.topbarSearch);
|
await page.waitForSelector(selectors.invoiceOutIndex.topbarSearch);
|
||||||
await page.waitForState('invoiceOut.index');
|
await page.waitForState('invoiceOut.index');
|
||||||
});
|
|
||||||
|
|
||||||
it('should now open the manual invoice form', async() => {
|
|
||||||
await page.waitToClick(selectors.invoiceOutIndex.createInvoice);
|
await page.waitToClick(selectors.invoiceOutIndex.createInvoice);
|
||||||
await page.waitForSelector(selectors.invoiceOutIndex.manualInvoiceForm);
|
await page.waitForSelector(selectors.invoiceOutIndex.manualInvoiceForm);
|
||||||
});
|
|
||||||
|
|
||||||
it('should create an invoice from a client', async() => {
|
|
||||||
await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceClient, 'Max Eisenhardt');
|
await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceClient, 'Max Eisenhardt');
|
||||||
await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceSerial, 'Global nacional');
|
await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceSerial, 'Global nacional');
|
||||||
await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceTaxArea, 'national');
|
await page.autocompleteSearch(selectors.invoiceOutIndex.manualInvoiceTaxArea, 'national');
|
||||||
await page.waitToClick(selectors.invoiceOutIndex.saveInvoice);
|
await page.waitToClick(selectors.invoiceOutIndex.saveInvoice);
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
|
await page.waitForState('invoiceOut.card.summary');
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
expect(message.text).toContain('Data saved!');
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should have been redirected to the created invoice summary`, async() => {
|
|
||||||
await page.waitForState('invoiceOut.card.summary');
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -18,7 +18,6 @@ describe('InvoiceOut global invoice path', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
let invoicesBeforeOneClient;
|
let invoicesBeforeOneClient;
|
||||||
let invoicesBeforeAllClients;
|
|
||||||
let now = Date.vnNew();
|
let now = Date.vnNew();
|
||||||
|
|
||||||
it('should count the amount of invoices listed before globla invoces are made', async() => {
|
it('should count the amount of invoices listed before globla invoces are made', async() => {
|
||||||
|
@ -27,13 +26,10 @@ describe('InvoiceOut global invoice path', () => {
|
||||||
expect(invoicesBeforeOneClient).toBeGreaterThanOrEqual(4);
|
expect(invoicesBeforeOneClient).toBeGreaterThanOrEqual(4);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should open the global invoice form', async() => {
|
|
||||||
await page.accessToSection('invoiceOut.global-invoicing');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create a global invoice for charles xavier today', async() => {
|
it('should create a global invoice for charles xavier today', async() => {
|
||||||
|
await page.accessToSection('invoiceOut.global-invoicing');
|
||||||
await page.waitToClick(selectors.invoiceOutGlobalInvoicing.oneClient);
|
await page.waitToClick(selectors.invoiceOutGlobalInvoicing.oneClient);
|
||||||
await page.autocompleteSearch(selectors.invoiceOutGlobalInvoicing.clientId, '1108');
|
await page.autocompleteSearch(selectors.invoiceOutGlobalInvoicing.clientId, 'Charles Xavier');
|
||||||
await page.pickDate(selectors.invoiceOutGlobalInvoicing.invoiceDate, now);
|
await page.pickDate(selectors.invoiceOutGlobalInvoicing.invoiceDate, now);
|
||||||
await page.pickDate(selectors.invoiceOutGlobalInvoicing.maxShipped, now);
|
await page.pickDate(selectors.invoiceOutGlobalInvoicing.maxShipped, now);
|
||||||
await page.autocompleteSearch(selectors.invoiceOutGlobalInvoicing.printer, '1');
|
await page.autocompleteSearch(selectors.invoiceOutGlobalInvoicing.printer, '1');
|
||||||
|
|
|
@ -4,9 +4,6 @@ import getBrowser from '../../helpers/puppeteer';
|
||||||
describe('Travel create path', () => {
|
describe('Travel create path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
const date = Date.vnNew();
|
|
||||||
const day = 15;
|
|
||||||
date.setDate(day);
|
|
||||||
|
|
||||||
beforeAll(async() => {
|
beforeAll(async() => {
|
||||||
browser = await getBrowser();
|
browser = await getBrowser();
|
||||||
|
@ -18,60 +15,28 @@ describe('Travel create path', () => {
|
||||||
await browser.close();
|
await browser.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should open the create travel form by clicking on the "new" button', async() => {
|
it('should create a new travel and check it was created with the correct data', async() => {
|
||||||
|
const date = Date.vnNew();
|
||||||
|
date.setDate(15);
|
||||||
|
date.setUTCHours(0, 0, 0, 0);
|
||||||
|
|
||||||
await page.waitToClick(selectors.travelIndex.newTravelButton);
|
await page.waitToClick(selectors.travelIndex.newTravelButton);
|
||||||
await page.waitForState('travel.create');
|
await page.waitForState('travel.create');
|
||||||
});
|
|
||||||
|
|
||||||
it('should fill the reference, agency and ship date then save the form', async() => {
|
const values = {
|
||||||
await page.write(selectors.travelIndex.reference, 'Testing reference');
|
reference: 'Testing reference',
|
||||||
await page.autocompleteSearch(selectors.travelIndex.agency, 'inhouse pickup');
|
agencyMode: 'inhouse pickup',
|
||||||
await page.pickDate(selectors.travelIndex.shipDate, date); // this line autocompletes another 3 fields
|
shipped: date,
|
||||||
await page.waitForTimeout(1000);
|
landed: date,
|
||||||
await page.waitToClick(selectors.travelIndex.save);
|
warehouseOut: 'Warehouse One',
|
||||||
|
warehouseIn: 'Warehouse Five'
|
||||||
|
};
|
||||||
|
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.sendForm('vn-travel-create form', values);
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the user was redirected to the travel basic data upon creation', async() => {
|
|
||||||
await page.waitForState('travel.card.basicData');
|
await page.waitForState('travel.card.basicData');
|
||||||
});
|
const formValues = await page.fetchForm('vn-travel-basic-data form', Object.keys(values));
|
||||||
|
|
||||||
it('should check the travel was created with the correct reference', async() => {
|
expect(message.isSuccess).toBeTrue();
|
||||||
const reference = await page.waitToGetProperty(selectors.travelBasicData.reference, 'value');
|
expect(formValues).toEqual(values);
|
||||||
|
|
||||||
expect(reference).toContain('Testing reference');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the travel was created with the correct agency', async() => {
|
|
||||||
const agency = await page.waitToGetProperty(selectors.travelBasicData.agency, 'value');
|
|
||||||
|
|
||||||
expect(agency).toContain('inhouse pickup');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the travel was created with the correct shiping date', async() => {
|
|
||||||
const shipDate = await page.waitToGetProperty(selectors.travelBasicData.shippedDate, 'value');
|
|
||||||
|
|
||||||
expect(shipDate).toContain(day);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the travel was created with the correct landing date', async() => {
|
|
||||||
const landingDate = await page.waitToGetProperty(selectors.travelBasicData.deliveryDate, 'value');
|
|
||||||
|
|
||||||
expect(landingDate).toContain(day);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the travel was created with the correct warehouseOut', async() => {
|
|
||||||
const warehouseOut = await page.waitToGetProperty(selectors.travelBasicData.outputWarehouse, 'value');
|
|
||||||
|
|
||||||
expect(warehouseOut).toContain('Warehouse One');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the travel was created with the correct warehouseIn', async() => {
|
|
||||||
const warehouseIn = await page.waitToGetProperty(selectors.travelBasicData.inputWarehouse, 'value');
|
|
||||||
|
|
||||||
expect(warehouseIn).toContain('Warehouse Five');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -42,20 +42,6 @@ describe('Entry lastest buys path', () => {
|
||||||
expect(httpRequests.find(req => req.includes(('typeFk')))).toBeDefined();
|
expect(httpRequests.find(req => req.includes(('typeFk')))).toBeDefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should filter by from date', async() => {
|
|
||||||
await page.pickDate(selectors.entryLatestBuys.fromInput, new Date());
|
|
||||||
await page.waitToClick(selectors.entryLatestBuys.chip);
|
|
||||||
|
|
||||||
expect(httpRequests.find(req => req.includes(('from')))).toBeDefined();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should filter by to date', async() => {
|
|
||||||
await page.pickDate(selectors.entryLatestBuys.toInput, new Date());
|
|
||||||
await page.waitToClick(selectors.entryLatestBuys.chip);
|
|
||||||
|
|
||||||
expect(httpRequests.find(req => req.includes(('to')))).toBeDefined();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should filter by sales person', async() => {
|
it('should filter by sales person', async() => {
|
||||||
await page.autocompleteSearch(selectors.entryLatestBuys.salesPersonInput, 'buyerNick');
|
await page.autocompleteSearch(selectors.entryLatestBuys.salesPersonInput, 'buyerNick');
|
||||||
await page.waitToClick(selectors.entryLatestBuys.chip);
|
await page.waitToClick(selectors.entryLatestBuys.chip);
|
||||||
|
|
|
@ -21,8 +21,8 @@ describe('Entry create path', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should fill the form to create a valid entry then redirect to basic Data', async() => {
|
it('should fill the form to create a valid entry then redirect to basic Data', async() => {
|
||||||
await page.autocompleteSearch(selectors.entryIndex.newEntrySupplier, '2');
|
await page.autocompleteSearch(selectors.entryIndex.newEntrySupplier, 'The farmer');
|
||||||
await page.autocompleteSearch(selectors.entryIndex.newEntryTravel, 'Warehouse Three');
|
await page.autocompleteSearch(selectors.entryIndex.newEntryTravel, 'Warehouse');
|
||||||
await page.autocompleteSearch(selectors.entryIndex.newEntryCompany, 'ORN');
|
await page.autocompleteSearch(selectors.entryIndex.newEntryCompany, 'ORN');
|
||||||
|
|
||||||
await page.waitToClick(selectors.entryIndex.saveNewEntry);
|
await page.waitToClick(selectors.entryIndex.saveNewEntry);
|
||||||
|
|
|
@ -1,6 +1,22 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
|
const $ = {
|
||||||
|
reference: 'vn-entry-basic-data vn-textfield[ng-model="$ctrl.entry.reference"]',
|
||||||
|
invoiceNumber: 'vn-entry-basic-data vn-textfield[ng-model="$ctrl.entry.invoiceNumber"]',
|
||||||
|
notes: 'vn-entry-basic-data vn-textfield[ng-model="$ctrl.entry.notes"]',
|
||||||
|
observations: 'vn-entry-basic-data vn-textarea[ng-model="$ctrl.entry.observation"]',
|
||||||
|
supplier: 'vn-entry-basic-data vn-autocomplete[ng-model="$ctrl.entry.supplierFk"]',
|
||||||
|
currency: 'vn-entry-basic-data vn-autocomplete[ng-model="$ctrl.entry.currencyFk"]',
|
||||||
|
commission: 'vn-entry-basic-data vn-input-number[ng-model="$ctrl.entry.commission"]',
|
||||||
|
company: 'vn-entry-basic-data vn-autocomplete[ng-model="$ctrl.entry.companyFk"]',
|
||||||
|
ordered: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isOrdered"]',
|
||||||
|
confirmed: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isConfirmed"]',
|
||||||
|
inventory: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isExcludedFromAvailable"]',
|
||||||
|
raid: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isRaid"]',
|
||||||
|
booked: 'vn-entry-basic-data vn-check[ng-model="$ctrl.entry.isBooked"]',
|
||||||
|
save: 'vn-entry-basic-data button[type=submit]',
|
||||||
|
};
|
||||||
|
|
||||||
describe('Entry basic data path', () => {
|
describe('Entry basic data path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
|
@ -17,98 +33,49 @@ describe('Entry basic data path', () => {
|
||||||
await browser.close();
|
await browser.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should edit the basic data', async() => {
|
it('should edit the basic data and confirm the reference was edited', async() => {
|
||||||
await page.write(selectors.entryBasicData.reference, 'new movement 8');
|
await page.write($.reference, 'new movement 8');
|
||||||
await page.write(selectors.entryBasicData.invoiceNumber, 'new movement 8');
|
await page.write($.invoiceNumber, 'new movement 8');
|
||||||
await page.write(selectors.entryBasicData.observations, ' edited');
|
await page.write($.observations, ' edited');
|
||||||
await page.autocompleteSearch(selectors.entryBasicData.supplier, 'Plants nick');
|
await page.autocompleteSearch($.supplier, 'Plants nick');
|
||||||
await page.autocompleteSearch(selectors.entryBasicData.currency, 'eur');
|
await page.autocompleteSearch($.currency, 'eur');
|
||||||
await page.clearInput(selectors.entryBasicData.commission);
|
await page.clearInput($.commission);
|
||||||
await page.write(selectors.entryBasicData.commission, '100');
|
await page.write($.commission, '100');
|
||||||
await page.autocompleteSearch(selectors.entryBasicData.company, 'CCs');
|
await page.autocompleteSearch($.company, 'CCs');
|
||||||
await page.waitToClick(selectors.entryBasicData.ordered);
|
await page.waitToClick($.ordered);
|
||||||
await page.waitToClick(selectors.entryBasicData.confirmed);
|
await page.waitToClick($.confirmed);
|
||||||
await page.waitToClick(selectors.entryBasicData.inventory);
|
await page.waitToClick($.inventory);
|
||||||
await page.waitToClick(selectors.entryBasicData.raid);
|
await page.waitToClick($.raid);
|
||||||
await page.waitToClick(selectors.entryBasicData.booked);
|
await page.waitToClick($.booked);
|
||||||
await page.waitToClick(selectors.entryBasicData.save);
|
await page.waitToClick($.save);
|
||||||
|
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
|
await page.reloadSection('entry.card.basicData');
|
||||||
|
const reference = await page.waitToGetProperty($.reference, 'value');
|
||||||
|
const supplier = await page.waitToGetProperty($.supplier, 'value');
|
||||||
|
const invoiceNumber = await page.waitToGetProperty($.invoiceNumber, 'value');
|
||||||
|
const observations = await page.waitToGetProperty($.observations, 'value');
|
||||||
|
const currency = await page.waitToGetProperty($.currency, 'value');
|
||||||
|
const commission = await page.waitToGetProperty($.commission, 'value');
|
||||||
|
const company = await page.waitToGetProperty($.company, 'value');
|
||||||
|
const ordered = await page.checkboxState($.ordered);
|
||||||
|
const confirmed = await page.checkboxState($.confirmed);
|
||||||
|
const inventory = await page.checkboxState($.inventory);
|
||||||
|
const raid = await page.checkboxState($.raid);
|
||||||
|
const booked = await page.checkboxState($.booked);
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
expect(message.text).toContain('Data saved!');
|
||||||
});
|
expect(reference).toEqual('new movement 8');
|
||||||
|
expect(supplier).toEqual('Plants nick');
|
||||||
it('should confirm the reference was edited', async() => {
|
expect(invoiceNumber).toEqual('new movement 8');
|
||||||
await page.reloadSection('entry.card.basicData');
|
expect(observations).toEqual('observation two edited');
|
||||||
const result = await page.waitToGetProperty(selectors.entryBasicData.reference, 'value');
|
expect(currency).toEqual('EUR');
|
||||||
|
expect(commission).toEqual('100');
|
||||||
expect(result).toEqual('new movement 8');
|
expect(company).toEqual('CCs');
|
||||||
});
|
expect(ordered).toBe('checked');
|
||||||
|
expect(confirmed).toBe('checked');
|
||||||
it('should confirm the invoiceNumber was edited', async() => {
|
expect(inventory).toBe('checked');
|
||||||
await page.reloadSection('entry.card.basicData');
|
expect(raid).toBe('checked');
|
||||||
const result = await page.waitToGetProperty(selectors.entryBasicData.invoiceNumber, 'value');
|
expect(booked).toBe('checked');
|
||||||
|
|
||||||
expect(result).toEqual('new movement 8');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the observation was edited', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.entryBasicData.observations, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('observation two edited');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the supplier was edited', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.entryBasicData.supplier, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('1 - Plants nick');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the currency was edited', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.entryBasicData.currency, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('EUR');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the commission was edited', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.entryBasicData.commission, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('100');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the company was edited', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.entryBasicData.company, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('CCs');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm ordered was edited', async() => {
|
|
||||||
const result = await page.checkboxState(selectors.entryBasicData.ordered);
|
|
||||||
|
|
||||||
expect(result).toBe('checked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm confirmed was edited', async() => {
|
|
||||||
const result = await page.checkboxState(selectors.entryBasicData.confirmed);
|
|
||||||
|
|
||||||
expect(result).toBe('checked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm inventory was edited', async() => {
|
|
||||||
const result = await page.checkboxState(selectors.entryBasicData.inventory);
|
|
||||||
|
|
||||||
expect(result).toBe('checked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm raid was edited', async() => {
|
|
||||||
const result = await page.checkboxState(selectors.entryBasicData.raid);
|
|
||||||
|
|
||||||
expect(result).toBe('checked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm booked was edited', async() => {
|
|
||||||
const result = await page.checkboxState(selectors.entryBasicData.booked);
|
|
||||||
|
|
||||||
expect(result).toBe('checked');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -86,40 +86,47 @@ describe('Entry import, create and edit buys path', () => {
|
||||||
await page.waitForNumberOfElements(selectors.entryBuys.anyBuyLine, 2);
|
await page.waitForNumberOfElements(selectors.entryBuys.anyBuyLine, 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should edit the newest buy', async() => {
|
it('should edit the newest buy and check data', async() => {
|
||||||
await page.clearInput(selectors.entryBuys.secondBuyPackingPrice);
|
await page.clearInput(selectors.entryBuys.secondBuyPackingPrice);
|
||||||
await page.waitForTimeout(250);
|
await page.waitForTimeout(250);
|
||||||
await page.write(selectors.entryBuys.secondBuyPackingPrice, '100');
|
await page.write(selectors.entryBuys.secondBuyPackingPrice, '100');
|
||||||
|
await page.keyboard.press('Enter');
|
||||||
await page.waitForSnackbar();
|
await page.waitForSnackbar();
|
||||||
|
|
||||||
await page.clearInput(selectors.entryBuys.secondBuyGroupingPrice);
|
await page.clearInput(selectors.entryBuys.secondBuyGroupingPrice);
|
||||||
await page.waitForTimeout(250);
|
await page.waitForTimeout(250);
|
||||||
await page.write(selectors.entryBuys.secondBuyGroupingPrice, '200');
|
await page.write(selectors.entryBuys.secondBuyGroupingPrice, '200');
|
||||||
|
await page.keyboard.press('Enter');
|
||||||
await page.waitForSnackbar();
|
await page.waitForSnackbar();
|
||||||
|
|
||||||
await page.clearInput(selectors.entryBuys.secondBuyPrice);
|
await page.clearInput(selectors.entryBuys.secondBuyPrice);
|
||||||
await page.waitForTimeout(250);
|
await page.waitForTimeout(250);
|
||||||
await page.write(selectors.entryBuys.secondBuyPrice, '300');
|
await page.write(selectors.entryBuys.secondBuyPrice, '300');
|
||||||
|
await page.keyboard.press('Enter');
|
||||||
await page.waitForSnackbar();
|
await page.waitForSnackbar();
|
||||||
|
|
||||||
await page.clearInput(selectors.entryBuys.secondBuyGrouping);
|
await page.clearInput(selectors.entryBuys.secondBuyGrouping);
|
||||||
await page.waitForTimeout(250);
|
await page.waitForTimeout(250);
|
||||||
await page.write(selectors.entryBuys.secondBuyGrouping, '400');
|
await page.write(selectors.entryBuys.secondBuyGrouping, '400');
|
||||||
|
await page.keyboard.press('Enter');
|
||||||
await page.waitForSnackbar();
|
await page.waitForSnackbar();
|
||||||
|
|
||||||
await page.clearInput(selectors.entryBuys.secondBuyPacking);
|
await page.clearInput(selectors.entryBuys.secondBuyPacking);
|
||||||
await page.waitForTimeout(250);
|
await page.waitForTimeout(250);
|
||||||
await page.write(selectors.entryBuys.secondBuyPacking, '500');
|
await page.write(selectors.entryBuys.secondBuyPacking, '500');
|
||||||
|
await page.keyboard.press('Enter');
|
||||||
await page.waitForSnackbar();
|
await page.waitForSnackbar();
|
||||||
|
|
||||||
await page.clearInput(selectors.entryBuys.secondBuyWeight);
|
await page.clearInput(selectors.entryBuys.secondBuyWeight);
|
||||||
await page.waitForTimeout(250);
|
await page.waitForTimeout(250);
|
||||||
await page.write(selectors.entryBuys.secondBuyWeight, '600');
|
await page.write(selectors.entryBuys.secondBuyWeight, '600');
|
||||||
|
await page.keyboard.press('Enter');
|
||||||
await page.waitForSnackbar();
|
await page.waitForSnackbar();
|
||||||
|
|
||||||
await page.clearInput(selectors.entryBuys.secondBuyStickers);
|
await page.clearInput(selectors.entryBuys.secondBuyStickers);
|
||||||
await page.waitForTimeout(250);
|
await page.waitForTimeout(250);
|
||||||
await page.write(selectors.entryBuys.secondBuyStickers, '700');
|
await page.write(selectors.entryBuys.secondBuyStickers, '700');
|
||||||
|
await page.keyboard.press('Enter');
|
||||||
await page.waitForSnackbar();
|
await page.waitForSnackbar();
|
||||||
|
|
||||||
await page.autocompleteSearch(selectors.entryBuys.secondBuyPackage, '94');
|
await page.autocompleteSearch(selectors.entryBuys.secondBuyPackage, '94');
|
||||||
|
@ -128,60 +135,28 @@ describe('Entry import, create and edit buys path', () => {
|
||||||
await page.clearInput(selectors.entryBuys.secondBuyQuantity);
|
await page.clearInput(selectors.entryBuys.secondBuyQuantity);
|
||||||
await page.waitForTimeout(250);
|
await page.waitForTimeout(250);
|
||||||
await page.write(selectors.entryBuys.secondBuyQuantity, '800');
|
await page.write(selectors.entryBuys.secondBuyQuantity, '800');
|
||||||
});
|
await page.keyboard.press('Enter');
|
||||||
|
|
||||||
it('should reload the section and check the packing price is as expected', async() => {
|
|
||||||
await page.reloadSection('entry.card.buy.index');
|
await page.reloadSection('entry.card.buy.index');
|
||||||
const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyPackingPrice, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('100');
|
const secondBuyPackingPrice = await page.getValue(selectors.entryBuys.secondBuyPackingPrice);
|
||||||
});
|
const secondBuyGroupingPrice = await page.getValue(selectors.entryBuys.secondBuyGroupingPrice);
|
||||||
|
const secondBuyPrice = await page.getValue(selectors.entryBuys.secondBuyPrice);
|
||||||
|
const secondBuyGrouping = await page.getValue(selectors.entryBuys.secondBuyGrouping);
|
||||||
|
const secondBuyPacking = await page.getValue(selectors.entryBuys.secondBuyPacking);
|
||||||
|
const secondBuyWeight = await page.getValue(selectors.entryBuys.secondBuyWeight);
|
||||||
|
const secondBuyStickers = await page.getValue(selectors.entryBuys.secondBuyStickers);
|
||||||
|
const secondBuyPackage = await page.getValue(selectors.entryBuys.secondBuyPackage);
|
||||||
|
const secondBuyQuantity = await page.getValue(selectors.entryBuys.secondBuyQuantity);
|
||||||
|
|
||||||
it('should reload the section and check the grouping price is as expected', async() => {
|
expect(secondBuyPackingPrice).toEqual('100');
|
||||||
const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyGroupingPrice, 'value');
|
expect(secondBuyGroupingPrice).toEqual('200');
|
||||||
|
expect(secondBuyPrice).toEqual('300');
|
||||||
expect(result).toEqual('200');
|
expect(secondBuyGrouping).toEqual('400');
|
||||||
});
|
expect(secondBuyPacking).toEqual('500');
|
||||||
|
expect(secondBuyWeight).toEqual('600');
|
||||||
it('should reload the section and check the price is as expected', async() => {
|
expect(secondBuyStickers).toEqual('700');
|
||||||
const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyPrice, 'value');
|
expect(secondBuyPackage).toEqual('94');
|
||||||
|
expect(secondBuyQuantity).toEqual('800');
|
||||||
expect(result).toEqual('300');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reload the section and check the grouping is as expected', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyGrouping, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('400');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reload the section and check the packing is as expected', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyPacking, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('500');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reload the section and check the weight is as expected', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyWeight, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('600');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reload the section and check the stickers are as expected', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyStickers, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('700');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reload the section and check the package is as expected', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyPackage, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('94');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reload the section and check the quantity is as expected', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.entryBuys.secondBuyQuantity, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('800');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,20 +1,5 @@
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
const $ = {
|
|
||||||
saveButton: 'vn-supplier-fiscal-data button[type="submit"]',
|
|
||||||
};
|
|
||||||
const $inputs = {
|
|
||||||
province: 'vn-supplier-fiscal-data [name="province"]',
|
|
||||||
country: 'vn-supplier-fiscal-data [name="country"]',
|
|
||||||
postcode: 'vn-supplier-fiscal-data [name="postcode"]',
|
|
||||||
city: 'vn-supplier-fiscal-data [name="city"]',
|
|
||||||
socialName: 'vn-supplier-fiscal-data [name="socialName"]',
|
|
||||||
taxNumber: 'vn-supplier-fiscal-data [name="taxNumber"]',
|
|
||||||
account: 'vn-supplier-fiscal-data [name="account"]',
|
|
||||||
sageWithholding: 'vn-supplier-fiscal-data [ng-model="$ctrl.supplier.sageWithholdingFk"]',
|
|
||||||
sageTaxType: 'vn-supplier-fiscal-data [ng-model="$ctrl.supplier.sageTaxTypeFk"]'
|
|
||||||
};
|
|
||||||
|
|
||||||
describe('Supplier fiscal data path', () => {
|
describe('Supplier fiscal data path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
|
@ -32,28 +17,32 @@ describe('Supplier fiscal data path', () => {
|
||||||
|
|
||||||
it('should attempt to edit the fiscal data and check data is saved', async() => {
|
it('should attempt to edit the fiscal data and check data is saved', async() => {
|
||||||
await page.accessToSection('supplier.card.fiscalData');
|
await page.accessToSection('supplier.card.fiscalData');
|
||||||
await page.clearInput($inputs.province);
|
|
||||||
await page.clearInput($inputs.country);
|
const form = 'vn-supplier-fiscal-data form';
|
||||||
await page.clearInput($inputs.postcode);
|
const values = {
|
||||||
await page.overwrite($inputs.city, 'Valencia');
|
province: null,
|
||||||
await page.overwrite($inputs.socialName, 'Farmer King SL');
|
country: null,
|
||||||
await page.overwrite($inputs.taxNumber, 'Wrong tax number');
|
postcode: null,
|
||||||
await page.overwrite($inputs.account, '0123456789');
|
city: 'Valencia',
|
||||||
await page.autocompleteSearch($inputs.sageWithholding, 'retencion estimacion objetiva');
|
socialName: 'Farmer King SL',
|
||||||
await page.autocompleteSearch($inputs.sageTaxType, 'operaciones no sujetas');
|
taxNumber: 'Wrong tax number',
|
||||||
await page.click($.saveButton);
|
account: '0123456789',
|
||||||
const errorMessage = await page.waitForSnackbar();
|
sageWithholding: 'retencion estimacion objetiva',
|
||||||
await page.overwrite($inputs.taxNumber, '12345678Z');
|
sageTaxType: 'operaciones no sujetas'
|
||||||
await page.click($.saveButton);
|
};
|
||||||
const successMessage = await page.waitForSnackbar();
|
|
||||||
|
const errorMessage = await page.sendForm(form, values);
|
||||||
|
const message = await page.sendForm(form, {
|
||||||
|
taxNumber: '12345678Z'
|
||||||
|
});
|
||||||
|
|
||||||
await page.reloadSection('supplier.card.fiscalData');
|
await page.reloadSection('supplier.card.fiscalData');
|
||||||
const values = await page.getValues($inputs);
|
const formValues = await page.fetchForm(form, Object.keys(values));
|
||||||
|
|
||||||
expect(errorMessage.text).toContain('Invalid Tax number');
|
expect(errorMessage.text).toContain('Invalid Tax number');
|
||||||
expect(successMessage.type).toBe('success');
|
expect(message.isSuccess).toBeTrue();
|
||||||
expect(values).toEqual({
|
expect(formValues).toEqual({
|
||||||
province: 'Province one (España)',
|
province: 'Province one',
|
||||||
country: 'España',
|
country: 'España',
|
||||||
postcode: '46000',
|
postcode: '46000',
|
||||||
city: 'Valencia',
|
city: 'Valencia',
|
||||||
|
|
|
@ -139,7 +139,7 @@ export default class CrudModel extends ModelProxy {
|
||||||
filter.limit = this.page * this.limit;
|
filter.limit = this.page * this.limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.sendRequest(filter, append);
|
return this.sendRequest(filter, append, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
clear() {
|
clear() {
|
||||||
|
@ -231,12 +231,12 @@ export default class CrudModel extends ModelProxy {
|
||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
|
|
||||||
sendRequest(filter, append) {
|
sendRequest(filter, append, loadMore) {
|
||||||
this.cancelRequest();
|
this.cancelRequest();
|
||||||
this.canceler = this.$q.defer();
|
this.canceler = this.$q.defer();
|
||||||
this.isPaging = append;
|
this.isPaging = append;
|
||||||
|
|
||||||
if (!append && this.status != 'ready')
|
if (!loadMore)
|
||||||
this.status = 'loading';
|
this.status = 'loading';
|
||||||
|
|
||||||
let params = Object.assign(
|
let params = Object.assign(
|
||||||
|
|
|
@ -150,7 +150,7 @@ describe('Component vnCrudModel', () => {
|
||||||
|
|
||||||
controller.loadMore(true);
|
controller.loadMore(true);
|
||||||
|
|
||||||
expect(controller.sendRequest).toHaveBeenCalledWith({'skip': 2}, true);
|
expect(controller.sendRequest).toHaveBeenCalledWith({'skip': 2}, true, true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ export default class Field extends FormInput {
|
||||||
super.$onInit();
|
super.$onInit();
|
||||||
|
|
||||||
if (this.info) this.classList.add('has-icons');
|
if (this.info) this.classList.add('has-icons');
|
||||||
this.input.addEventListener('change', event =>
|
this.element.addEventListener('change', event =>
|
||||||
this.onChange(event));
|
this.onChange(event));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,30 +36,6 @@ describe('Component vnPopover', () => {
|
||||||
|
|
||||||
expect(controller.emit).not.toHaveBeenCalledWith('open');
|
expect(controller.emit).not.toHaveBeenCalledWith('open');
|
||||||
});
|
});
|
||||||
|
|
||||||
// #1615 migrar karma a jest (this doesn't work anymore, needs fixing)
|
|
||||||
xit(`should check that popover is visible into the screen`, () => {
|
|
||||||
$parent.css({
|
|
||||||
backgroundColor: 'red',
|
|
||||||
position: 'absolute',
|
|
||||||
width: '50px',
|
|
||||||
height: '50px',
|
|
||||||
top: '0',
|
|
||||||
left: '100px'
|
|
||||||
});
|
|
||||||
controller.show($parent[0]);
|
|
||||||
|
|
||||||
let rect = controller.popover.getBoundingClientRect();
|
|
||||||
let style = controller.window.getComputedStyle(controller.element);
|
|
||||||
|
|
||||||
expect(style.visibility).toEqual('visible');
|
|
||||||
expect(style.display).not.toEqual('none');
|
|
||||||
|
|
||||||
expect(0).toBeLessThanOrEqual(rect.top);
|
|
||||||
expect(0).toBeLessThanOrEqual(rect.left);
|
|
||||||
expect(controller.window.innerHeight).toBeGreaterThan(rect.bottom);
|
|
||||||
expect(controller.window.innerWidth).toBeGreaterThan(rect.right);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('hide()', () => {
|
describe('hide()', () => {
|
||||||
|
|
|
@ -8,18 +8,8 @@ export default class Th {
|
||||||
$element.on('click', () => this.onToggleOrder());
|
$element.on('click', () => this.onToggleOrder());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Changes the order if the cell has a field and defaultOrder property
|
|
||||||
*/
|
|
||||||
$onInit() {
|
$onInit() {
|
||||||
if (!this.field) return;
|
if (!this.field) return;
|
||||||
|
|
||||||
if (this.defaultOrder) {
|
|
||||||
this.order = this.defaultOrder;
|
|
||||||
this.table.applyOrder(this.field, this.order);
|
|
||||||
this.updateArrow();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.updateArrow();
|
this.updateArrow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,9 +72,6 @@ ngModule.vnComponent('vnTh', {
|
||||||
template: require('./index.html'),
|
template: require('./index.html'),
|
||||||
transclude: true,
|
transclude: true,
|
||||||
controller: Th,
|
controller: Th,
|
||||||
bindings: {
|
|
||||||
defaultOrder: '@?'
|
|
||||||
},
|
|
||||||
require: {
|
require: {
|
||||||
table: '^^vnTable'
|
table: '^^vnTable'
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,17 +17,6 @@ describe('Component vnTh', () => {
|
||||||
controller.column.setAttribute('field', 'MyField');
|
controller.column.setAttribute('field', 'MyField');
|
||||||
}));
|
}));
|
||||||
|
|
||||||
describe('onInit()', () => {
|
|
||||||
it(`should define controllers order as per defaultOrder then call setOrder()`, () => {
|
|
||||||
controller.defaultOrder = 'DESC';
|
|
||||||
jest.spyOn(controller.table, 'setOrder');
|
|
||||||
controller.$onInit();
|
|
||||||
|
|
||||||
expect(controller.order).toEqual('DESC');
|
|
||||||
expect(controller.table.setOrder).toHaveBeenCalledWith('MyField', 'DESC');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('toggleOrder()', () => {
|
describe('toggleOrder()', () => {
|
||||||
it(`should change the ordenation to DESC (descendant) if it was ASC (ascendant)`, () => {
|
it(`should change the ordenation to DESC (descendant) if it was ASC (ascendant)`, () => {
|
||||||
controller.order = 'ASC';
|
controller.order = 'ASC';
|
||||||
|
|
|
@ -160,6 +160,9 @@ export default class Controller extends Section {
|
||||||
const to = new Date(value);
|
const to = new Date(value);
|
||||||
to.setHours(23, 59, 59, 999);
|
to.setHours(23, 59, 59, 999);
|
||||||
return {creationDate: {lte: to}};
|
return {creationDate: {lte: to}};
|
||||||
|
case 'userFk':
|
||||||
|
return filter.who != 'system'
|
||||||
|
? {[prop]: value} : null;
|
||||||
default:
|
default:
|
||||||
return {[prop]: value};
|
return {[prop]: value};
|
||||||
}
|
}
|
||||||
|
|
|
@ -170,5 +170,6 @@
|
||||||
"comercialName": "Comercial",
|
"comercialName": "Comercial",
|
||||||
"Added observation": "Added observation",
|
"Added observation": "Added observation",
|
||||||
"Comment added to client": "Comment added to client",
|
"Comment added to client": "Comment added to client",
|
||||||
"This ticket is already a refund": "This ticket is already a refund"
|
"This ticket is already a refund": "This ticket is already a refund",
|
||||||
|
"A claim with that sale already exists": "A claim with that sale already exists"
|
||||||
}
|
}
|
|
@ -28,7 +28,7 @@ module.exports = Self => {
|
||||||
const isAccount = await models.Account.findById(id);
|
const isAccount = await models.Account.findById(id);
|
||||||
|
|
||||||
if (isClient && !isAccount)
|
if (isClient && !isAccount)
|
||||||
await models.VnUser.setPassword(id, newPassword);
|
await models.Account.setPassword(id, newPassword);
|
||||||
else
|
else
|
||||||
throw new UserError(`Modifiable password only via recovery or by an administrator`);
|
throw new UserError(`Modifiable password only via recovery or by an administrator`);
|
||||||
};
|
};
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
<vn-date-picker
|
<vn-date-picker
|
||||||
label="Date"
|
label="Date"
|
||||||
ng-model="$ctrl.receipt.payed"
|
ng-model="$ctrl.receipt.payed"
|
||||||
|
vn-name="payed"
|
||||||
required="true">
|
required="true">
|
||||||
</vn-date-picker>
|
</vn-date-picker>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
|
@ -21,6 +22,7 @@
|
||||||
show-field="code"
|
show-field="code"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
ng-model="$ctrl.companyFk"
|
ng-model="$ctrl.companyFk"
|
||||||
|
vn-name="company"
|
||||||
required="true">
|
required="true">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
|
@ -33,6 +35,7 @@
|
||||||
fields="['accountingTypeFk']"
|
fields="['accountingTypeFk']"
|
||||||
include="{relation: 'accountingType'}"
|
include="{relation: 'accountingType'}"
|
||||||
ng-model="$ctrl.bankFk"
|
ng-model="$ctrl.bankFk"
|
||||||
|
vn-name="bank"
|
||||||
search-function="$ctrl.bankSearchFunc($search)"
|
search-function="$ctrl.bankSearchFunc($search)"
|
||||||
selection="$ctrl.bankSelection"
|
selection="$ctrl.bankSelection"
|
||||||
order="id"
|
order="id"
|
||||||
|
@ -43,6 +46,7 @@
|
||||||
vn-focus
|
vn-focus
|
||||||
label="Amount"
|
label="Amount"
|
||||||
ng-model="$ctrl.amountPaid"
|
ng-model="$ctrl.amountPaid"
|
||||||
|
vn-name="amountPaid"
|
||||||
step="0.01"
|
step="0.01"
|
||||||
required="true"
|
required="true"
|
||||||
max="$ctrl.maxAmount">
|
max="$ctrl.maxAmount">
|
||||||
|
@ -52,6 +56,7 @@
|
||||||
<h6 translate>Compensation</h6>
|
<h6 translate>Compensation</h6>
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
ng-model="$ctrl.receipt.compensationAccount"
|
ng-model="$ctrl.receipt.compensationAccount"
|
||||||
|
vn-name="compensationAccount"
|
||||||
label="Compensation Account"
|
label="Compensation Account"
|
||||||
on-change="$ctrl.accountShortToStandard(value)">
|
on-change="$ctrl.accountShortToStandard(value)">
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
|
@ -60,6 +65,7 @@
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
label="Reference"
|
label="Reference"
|
||||||
ng-model="$ctrl.receipt.description"
|
ng-model="$ctrl.receipt.description"
|
||||||
|
vn-name="description"
|
||||||
rule
|
rule
|
||||||
required="true">
|
required="true">
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
|
@ -70,23 +76,27 @@
|
||||||
<vn-input-number
|
<vn-input-number
|
||||||
ng-model="$ctrl.deliveredAmount"
|
ng-model="$ctrl.deliveredAmount"
|
||||||
label="Delivered amount"
|
label="Delivered amount"
|
||||||
step="0.01">
|
step="0.01"
|
||||||
|
vn-name="deliveredAmount">
|
||||||
</vn-input-number>
|
</vn-input-number>
|
||||||
<vn-input-number
|
<vn-input-number
|
||||||
disabled="true"
|
disabled="true"
|
||||||
ng-model="$ctrl.amountToReturn"
|
ng-model="$ctrl.amountToReturn"
|
||||||
label="Amount to return">
|
label="Amount to return"
|
||||||
|
vn-name="amountToReturn">
|
||||||
</vn-input-number>
|
</vn-input-number>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
</vn-vertical>
|
</vn-vertical>
|
||||||
<vn-horizontal ng-show="$ctrl.bankSelection.accountingType.code == 'cash'">
|
<vn-horizontal ng-show="$ctrl.bankSelection.accountingType.code == 'cash'">
|
||||||
<vn-check
|
<vn-check
|
||||||
label="View receipt"
|
label="View receipt"
|
||||||
ng-model="$ctrl.viewReceipt">
|
ng-model="$ctrl.viewReceipt"
|
||||||
|
vn-name="viewReceipt">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
<vn-check
|
<vn-check
|
||||||
label="Send email"
|
label="Send email"
|
||||||
ng-model="$ctrl.sendEmail">
|
ng-model="$ctrl.sendEmail"
|
||||||
|
vn-name="sendEmail">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
</tpl-body>
|
</tpl-body>
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
<vn-card class="vn-pa-lg">
|
<vn-card class="vn-pa-lg">
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
|
||||||
label="Billing data"
|
label="Billing data"
|
||||||
vn-acl="salesAssistant, hr"
|
vn-acl="salesAssistant, hr"
|
||||||
ng-model="$ctrl.client.payMethodFk"
|
ng-model="$ctrl.client.payMethodFk"
|
||||||
|
@ -23,7 +22,6 @@
|
||||||
initial-data="$ctrl.client.payMethod">
|
initial-data="$ctrl.client.payMethod">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-input-number
|
<vn-input-number
|
||||||
vn-one
|
|
||||||
min="0"
|
min="0"
|
||||||
step="1"
|
step="1"
|
||||||
label="Due day"
|
label="Due day"
|
||||||
|
@ -34,7 +32,6 @@
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
vn-one
|
|
||||||
label="IBAN"
|
label="IBAN"
|
||||||
ng-model="$ctrl.client.iban"
|
ng-model="$ctrl.client.iban"
|
||||||
rule
|
rule
|
||||||
|
@ -42,11 +39,10 @@
|
||||||
vn-acl="salesAssistant, hr">
|
vn-acl="salesAssistant, hr">
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
|
||||||
label="Swift / BIC"
|
label="Swift / BIC"
|
||||||
url="BankEntities"
|
url="BankEntities"
|
||||||
ng-model="$ctrl.client.bankEntityFk"
|
ng-model="$ctrl.client.bankEntityFk"
|
||||||
fields="['name']"
|
fields="['name', 'bic']"
|
||||||
initial-data="$ctrl.client.bankEntityFk"
|
initial-data="$ctrl.client.bankEntityFk"
|
||||||
on-change="$ctrl.autofillBic()"
|
on-change="$ctrl.autofillBic()"
|
||||||
search-function="{or: [{bic: {like: $search +'%'}}, {name: {like: '%'+ $search +'%'}}]}"
|
search-function="{or: [{bic: {like: $search +'%'}}, {name: {like: '%'+ $search +'%'}}]}"
|
||||||
|
@ -54,7 +50,10 @@
|
||||||
show-field="bic"
|
show-field="bic"
|
||||||
vn-acl="salesAssistant, hr"
|
vn-acl="salesAssistant, hr"
|
||||||
disabled="$ctrl.ibanCountry == 'ES'">
|
disabled="$ctrl.ibanCountry == 'ES'">
|
||||||
<tpl-item>{{bic}} {{name}}</tpl-item>
|
<tpl-item>
|
||||||
|
<div>{{::bic}}</div>
|
||||||
|
<div class="text-secondary text-caption">{{::name}}</div>
|
||||||
|
</tpl-item>
|
||||||
<append>
|
<append>
|
||||||
<vn-icon-button
|
<vn-icon-button
|
||||||
vn-auto
|
vn-auto
|
||||||
|
@ -68,19 +67,16 @@
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-check
|
<vn-check
|
||||||
vn-one
|
|
||||||
label="Received LCR"
|
label="Received LCR"
|
||||||
ng-model="$ctrl.client.hasLcr"
|
ng-model="$ctrl.client.hasLcr"
|
||||||
vn-acl="salesAssistant, hr">
|
vn-acl="salesAssistant, hr">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
<vn-check
|
<vn-check
|
||||||
vn-one
|
|
||||||
label="Received core VNL"
|
label="Received core VNL"
|
||||||
ng-model="$ctrl.client.hasCoreVnl"
|
ng-model="$ctrl.client.hasCoreVnl"
|
||||||
vn-acl="salesAssistant, hr">
|
vn-acl="salesAssistant, hr">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
<vn-check
|
<vn-check
|
||||||
vn-one
|
|
||||||
label="Received B2B VNL"
|
label="Received B2B VNL"
|
||||||
ng-model="$ctrl.client.hasSepaVnl"
|
ng-model="$ctrl.client.hasSepaVnl"
|
||||||
vn-acl="salesAssistant, hr">
|
vn-acl="salesAssistant, hr">
|
||||||
|
@ -100,8 +96,6 @@
|
||||||
</vn-button>
|
</vn-button>
|
||||||
</vn-button-bar>
|
</vn-button-bar>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<!-- New bankentity dialog -->
|
|
||||||
<vn-new-bank-entity
|
<vn-new-bank-entity
|
||||||
vn-id="bankEntity"
|
vn-id="bankEntity"
|
||||||
on-accept="$ctrl.onAccept($data)">
|
on-accept="$ctrl.onAccept($data)">
|
||||||
|
|
|
@ -1,52 +1,111 @@
|
||||||
<mg-ajax path="Clients/{{patch.params.id}}/updateFiscalData" options="vnPatch"></mg-ajax>
|
<mg-ajax path="Clients/{{patch.params.id}}/updateFiscalData" options="vnPatch"></mg-ajax>
|
||||||
<vn-watcher vn-id="watcher" data="$ctrl.client" id-field="id" form="form" save="patch">
|
<vn-watcher
|
||||||
|
vn-id="watcher"
|
||||||
|
data="$ctrl.client"
|
||||||
|
id-field="id"
|
||||||
|
form="form"
|
||||||
|
save="patch">
|
||||||
</vn-watcher>
|
</vn-watcher>
|
||||||
<vn-crud-model auto-load="true" url="Provinces/location" data="provincesLocation" order="name">
|
<vn-crud-model
|
||||||
|
auto-load="true"
|
||||||
|
url="Provinces/location"
|
||||||
|
data="provincesLocation"
|
||||||
|
order="name">
|
||||||
</vn-crud-model>
|
</vn-crud-model>
|
||||||
<vn-crud-model auto-load="true" url="Countries" data="countries" order="country">
|
<vn-crud-model
|
||||||
|
auto-load="true"
|
||||||
|
url="Countries"
|
||||||
|
data="countries"
|
||||||
|
order="country">
|
||||||
</vn-crud-model>
|
</vn-crud-model>
|
||||||
<vn-crud-model auto-load="true" url="SageTaxTypes" data="sageTaxTypes" order="vat">
|
<vn-crud-model
|
||||||
|
auto-load="true"
|
||||||
|
url="SageTaxTypes"
|
||||||
|
data="sageTaxTypes"
|
||||||
|
order="vat">
|
||||||
</vn-crud-model>
|
</vn-crud-model>
|
||||||
<form name="form" ng-submit="$ctrl.onSubmit()" class="vn-w-md">
|
<form name="form" ng-submit="$ctrl.onSubmit()" class="vn-w-md">
|
||||||
<vn-card class="vn-pa-lg">
|
<vn-card class="vn-pa-lg">
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-textfield vn-two vn-focus label="Social name" ng-model="$ctrl.client.socialName" rule
|
<vn-textfield
|
||||||
info="Only letters, numbers and spaces can be used" required="true">
|
vn-focus
|
||||||
|
label="Social name"
|
||||||
|
ng-model="$ctrl.client.socialName"
|
||||||
|
info="Only letters, numbers and spaces can be used"
|
||||||
|
required="true"
|
||||||
|
rule>
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
<vn-textfield vn-one label="Tax number" ng-model="$ctrl.client.fi" rule>
|
<vn-textfield
|
||||||
|
label="Tax number"
|
||||||
|
ng-model="$ctrl.client.fi"
|
||||||
|
rule>
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-textfield vn-two label="Street" ng-model="$ctrl.client.street" rule>
|
<vn-textfield
|
||||||
|
vn-two
|
||||||
|
label="Street"
|
||||||
|
ng-model="$ctrl.client.street"
|
||||||
|
rule>
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-autocomplete vn-one ng-model="$ctrl.client.sageTaxTypeFk" data="sageTaxTypes" show-field="vat"
|
<vn-autocomplete
|
||||||
value-field="id" label="Sage tax type" vn-acl="salesAssistant" rule>
|
ng-model="$ctrl.client.sageTaxTypeFk"
|
||||||
|
data="sageTaxTypes"
|
||||||
|
show-field="vat"
|
||||||
|
value-field="id"
|
||||||
|
label="Sage tax type"
|
||||||
|
vn-acl="salesAssistant"
|
||||||
|
rule>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-autocomplete vn-one ng-model="$ctrl.client.sageTransactionTypeFk" url="SageTransactionTypes"
|
<vn-autocomplete
|
||||||
show-field="transaction" value-field="id" label="Sage transaction type"
|
ng-model="$ctrl.client.sageTransactionTypeFk"
|
||||||
|
url="SageTransactionTypes"
|
||||||
|
show-field="transaction"
|
||||||
|
value-field="id"
|
||||||
|
label="Sage transaction type"
|
||||||
search-function="{or: [{id: $search}, {transaction: {like: '%'+ $search +'%'}}]}"
|
search-function="{or: [{id: $search}, {transaction: {like: '%'+ $search +'%'}}]}"
|
||||||
vn-acl="salesAssistant" order="transaction" rule>
|
vn-acl="salesAssistant"
|
||||||
|
order="transaction"
|
||||||
|
rule>
|
||||||
<tpl-item>{{id}}: {{transaction}}</tpl-item>
|
<tpl-item>{{id}}: {{transaction}}</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-datalist vn-one label="Postcode" ng-model="$ctrl.client.postcode" selection="$ctrl.postcode"
|
<vn-datalist
|
||||||
url="Postcodes/location" fields="['code','townFk']" order="code, townFk" value-field="code"
|
label="Postcode"
|
||||||
show-field="code" rule>
|
ng-model="$ctrl.client.postcode"
|
||||||
|
selection="$ctrl.postcode"
|
||||||
|
url="Postcodes/location"
|
||||||
|
fields="['code','townFk']"
|
||||||
|
order="code, townFk"
|
||||||
|
value-field="code"
|
||||||
|
show-field="code"
|
||||||
|
rule>
|
||||||
<tpl-item>
|
<tpl-item>
|
||||||
{{code}} - {{town.name}} ({{town.province.name}},
|
{{code}} - {{town.name}} ({{town.province.name}},
|
||||||
{{town.province.country.country}})
|
{{town.province.country.country}})
|
||||||
</tpl-item>
|
</tpl-item>
|
||||||
<append>
|
<append>
|
||||||
<vn-icon-button icon="add_circle" vn-tooltip="New postcode" ng-click="postcode.open()"
|
<vn-icon-button
|
||||||
vn-acl="deliveryBoss" vn-acl-action="remove">
|
icon="add_circle"
|
||||||
|
vn-tooltip="New postcode"
|
||||||
|
ng-click="postcode.open()"
|
||||||
|
vn-acl="deliveryBoss"
|
||||||
|
vn-acl-action="remove">
|
||||||
</vn-icon-button>
|
</vn-icon-button>
|
||||||
</append>
|
</append>
|
||||||
</vn-datalist>
|
</vn-datalist>
|
||||||
<vn-datalist vn-id="town" vn-one label="City" ng-model="$ctrl.client.city" selection="$ctrl.town"
|
<vn-datalist
|
||||||
url="Towns/location" fields="['id', 'name', 'provinceFk']" show-field="name" value-field="name">
|
vn-id="town"
|
||||||
|
label="City"
|
||||||
|
ng-model="$ctrl.client.city"
|
||||||
|
selection="$ctrl.town"
|
||||||
|
url="Towns/location"
|
||||||
|
fields="['id', 'name', 'provinceFk']"
|
||||||
|
show-field="name"
|
||||||
|
value-field="name">
|
||||||
<tpl-item>
|
<tpl-item>
|
||||||
{{name}}, {{province.name}}
|
{{name}}, {{province.name}}
|
||||||
({{province.country.country}})
|
({{province.country.country}})
|
||||||
|
@ -54,48 +113,83 @@
|
||||||
</vn-datalist>
|
</vn-datalist>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-autocomplete vn-id="province" vn-one label="Province" ng-model="$ctrl.client.provinceFk"
|
<vn-autocomplete
|
||||||
selection="$ctrl.province" data="provincesLocation" fields="['id', 'name', 'countryFk']"
|
vn-one
|
||||||
show-field="name" value-field="id" rule>
|
vn-id="province"
|
||||||
|
label="Province"
|
||||||
|
ng-model="$ctrl.client.provinceFk"
|
||||||
|
selection="$ctrl.province"
|
||||||
|
data="provincesLocation"
|
||||||
|
fields="['id', 'name', 'countryFk']"
|
||||||
|
show-field="name"
|
||||||
|
value-field="id"
|
||||||
|
rule>
|
||||||
<tpl-item>{{name}} ({{country.country}})</tpl-item>
|
<tpl-item>{{name}} ({{country.country}})</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-autocomplete vn-id="country" vn-one ng-model="$ctrl.client.countryFk" data="countries"
|
<vn-autocomplete
|
||||||
show-field="country" value-field="id" label="Country" rule>
|
vn-one
|
||||||
|
vn-id="country"
|
||||||
|
ng-model="$ctrl.client.countryFk"
|
||||||
|
data="countries"
|
||||||
|
show-field="country"
|
||||||
|
value-field="id"
|
||||||
|
label="Country"
|
||||||
|
rule>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-check vn-one label="Active" ng-model="$ctrl.client.isActive">
|
<vn-check
|
||||||
|
label="Active"
|
||||||
|
ng-model="$ctrl.client.isActive">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
<vn-check vn-one label="Frozen" ng-model="$ctrl.client.isFreezed">
|
<vn-check
|
||||||
|
label="Frozen"
|
||||||
|
ng-model="$ctrl.client.isFreezed">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-check vn-one label="Has to invoice" ng-model="$ctrl.client.hasToInvoice">
|
<vn-check
|
||||||
|
label="Has to invoice"
|
||||||
|
ng-model="$ctrl.client.hasToInvoice">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
<vn-check vn-one label="Vies"
|
<vn-check
|
||||||
|
label="Vies"
|
||||||
info="When activating it, do not enter the country code in the ID field."
|
info="When activating it, do not enter the country code in the ID field."
|
||||||
ng-model="$ctrl.client.isVies">
|
ng-model="$ctrl.client.isVies">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-check vn-one label="Notify by email" ng-model="$ctrl.client.isToBeMailed">
|
<vn-check
|
||||||
|
label="Notify by email"
|
||||||
|
ng-model="$ctrl.client.isToBeMailed">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
<vn-check vn-one label="Invoice by address" ng-model="$ctrl.client.hasToInvoiceByAddress">
|
<vn-check
|
||||||
|
label="Invoice by address"
|
||||||
|
ng-model="$ctrl.client.hasToInvoiceByAddress">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-check vn-one label="Is equalizated" ng-model="$ctrl.client.isEqualizated"
|
<vn-check
|
||||||
|
label="Is equalizated"
|
||||||
|
ng-model="$ctrl.client.isEqualizated"
|
||||||
info="In order to invoice, this field is not consulted, but the consignee's ET. When modifying this field if the invoice by address option is not checked, the change will be automatically propagated to all addresses, otherwise the user will be asked if he wants to propagate it or not."
|
info="In order to invoice, this field is not consulted, but the consignee's ET. When modifying this field if the invoice by address option is not checked, the change will be automatically propagated to all addresses, otherwise the user will be asked if he wants to propagate it or not."
|
||||||
on-change="$ctrl.onChangeEqualizated(value)">
|
on-change="$ctrl.onChangeEqualizated(value)">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
<vn-check vn-one label="Verified data" ng-model="$ctrl.client.isTaxDataChecked" vn-acl="salesAssistant">
|
<vn-check
|
||||||
|
label="Verified data"
|
||||||
|
ng-model="$ctrl.client.isTaxDataChecked"
|
||||||
|
vn-acl="salesAssistant">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-check vn-one label="Incoterms authorization" ng-model="$ctrl.client.hasIncoterms"
|
<vn-check
|
||||||
|
label="Incoterms authorization"
|
||||||
|
ng-model="$ctrl.client.hasIncoterms"
|
||||||
vn-acl="administrative">
|
vn-acl="administrative">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
<vn-check vn-one label="Electronic invoice" ng-model="$ctrl.client.hasElectronicInvoice"
|
<vn-check
|
||||||
|
label="Electronic invoice"
|
||||||
|
ng-model="$ctrl.client.hasElectronicInvoice"
|
||||||
vn-acl="administrative">
|
vn-acl="administrative">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
|
@ -103,17 +197,26 @@
|
||||||
<vn-button-bar>
|
<vn-button-bar>
|
||||||
<vn-submit disabled="!watcher.dataChanged()" label="Save">
|
<vn-submit disabled="!watcher.dataChanged()" label="Save">
|
||||||
</vn-submit>
|
</vn-submit>
|
||||||
<vn-button class="cancel" label="Undo changes" disabled="!watcher.dataChanged()"
|
<vn-button
|
||||||
|
class="cancel"
|
||||||
|
label="Undo changes"
|
||||||
|
disabled="!watcher.dataChanged()"
|
||||||
ng-click="watcher.loadOriginalData()">
|
ng-click="watcher.loadOriginalData()">
|
||||||
</vn-button>
|
</vn-button>
|
||||||
</vn-button-bar>
|
</vn-button-bar>
|
||||||
</form>
|
</form>
|
||||||
<vn-confirm vn-id="propagate-isEqualizated" question="You changed the equalization tax"
|
<vn-confirm
|
||||||
message="Do you want to spread the change?" on-accept="$ctrl.onAcceptEt()">
|
vn-id="propagate-isEqualizated"
|
||||||
|
question="You changed the equalization tax"
|
||||||
|
message="Do you want to spread the change?"
|
||||||
|
on-accept="$ctrl.onAcceptEt()">
|
||||||
</vn-confirm>
|
</vn-confirm>
|
||||||
<vn-confirm vn-id="confirm-duplicatedClient" message="Found a client with this data"
|
<vn-confirm
|
||||||
|
vn-id="confirm-duplicatedClient"
|
||||||
|
message="Found a client with this data"
|
||||||
on-accept="$ctrl.onAcceptDuplication()">
|
on-accept="$ctrl.onAcceptDuplication()">
|
||||||
</vn-confirm>
|
</vn-confirm>
|
||||||
<!-- New postcode dialog -->
|
<vn-geo-postcode
|
||||||
<vn-geo-postcode vn-id="postcode" on-response="$ctrl.onResponse($response)">
|
vn-id="postcode"
|
||||||
|
on-response="$ctrl.onResponse($response)">
|
||||||
</vn-geo-postcode>
|
</vn-geo-postcode>
|
|
@ -28,7 +28,7 @@
|
||||||
<vn-table model="model" auto-load="false">
|
<vn-table model="model" auto-load="false">
|
||||||
<vn-thead>
|
<vn-thead>
|
||||||
<vn-tr>
|
<vn-tr>
|
||||||
<vn-th field="shipped" default-order="DESC" expand>Date</vn-th>
|
<vn-th field="shipped" expand>Date</vn-th>
|
||||||
<vn-th field="userFk">Created by</vn-thfield></vn-th>
|
<vn-th field="userFk">Created by</vn-thfield></vn-th>
|
||||||
<vn-th field="description">Comment</vn-th>
|
<vn-th field="description">Comment</vn-th>
|
||||||
<vn-th field="greugeTypeFk">Type</vn-th>
|
<vn-th field="greugeTypeFk">Type</vn-th>
|
||||||
|
|
|
@ -11,8 +11,7 @@ class Controller extends Section {
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'name']
|
fields: ['id', 'name']
|
||||||
},
|
},
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
relation: 'user',
|
relation: 'user',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'name']
|
fields: ['id', 'name']
|
||||||
|
@ -24,8 +23,6 @@ class Controller extends Section {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Controller.$inject = ['$element', '$scope'];
|
|
||||||
|
|
||||||
ngModule.vnComponent('vnClientGreugeIndex', {
|
ngModule.vnComponent('vnClientGreugeIndex', {
|
||||||
template: require('./index.html'),
|
template: require('./index.html'),
|
||||||
controller: Controller
|
controller: Controller
|
||||||
|
|
|
@ -19,7 +19,8 @@
|
||||||
label="Supplier"
|
label="Supplier"
|
||||||
required="true">
|
required="true">
|
||||||
<tpl-item>
|
<tpl-item>
|
||||||
{{::id}} - {{::nickname}}
|
<div>#{{::nickname}}</div>
|
||||||
|
<div class="text-secondary text-caption">#{{::id}}</div>
|
||||||
</tpl-item>
|
</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
|
@ -28,12 +29,16 @@
|
||||||
url="Travels/filter"
|
url="Travels/filter"
|
||||||
search-function="$ctrl.searchFunction($search)"
|
search-function="$ctrl.searchFunction($search)"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
|
show-field="warehouseInName"
|
||||||
order="id"
|
order="id"
|
||||||
label="Travel"
|
label="Travel"
|
||||||
required="true">
|
required="true">
|
||||||
<tpl-item>
|
<tpl-item>
|
||||||
|
<div>
|
||||||
{{::agencyModeName}} - {{::warehouseInName}} ({{::shipped | date: 'dd/MM/yyyy'}}) →
|
{{::agencyModeName}} - {{::warehouseInName}} ({{::shipped | date: 'dd/MM/yyyy'}}) →
|
||||||
{{::warehouseOutName}} ({{::landed | date: 'dd/MM/yyyy'}})
|
{{::warehouseOutName}} ({{::landed | date: 'dd/MM/yyyy'}})
|
||||||
|
</div>
|
||||||
|
<div class="text-secondary text-caption">#{{::id}}</div>
|
||||||
</tpl-item>
|
</tpl-item>
|
||||||
<append>
|
<append>
|
||||||
<vn-icon-button
|
<vn-icon-button
|
||||||
|
|
|
@ -66,14 +66,15 @@
|
||||||
vn-focus
|
vn-focus
|
||||||
url="Items/withName"
|
url="Items/withName"
|
||||||
ng-model="buy.itemFk"
|
ng-model="buy.itemFk"
|
||||||
show-field="name"
|
show-field="id"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
search-function="$ctrl.itemSearchFunc($search)"
|
search-function="$ctrl.itemSearchFunc($search)"
|
||||||
on-change="$ctrl.saveBuy(buy)"
|
on-change="$ctrl.saveBuy(buy)"
|
||||||
order="id DESC"
|
order="id DESC"
|
||||||
tabindex="1">
|
tabindex="1">
|
||||||
<tpl-item>
|
<tpl-item>
|
||||||
{{::id}} - {{::name}}
|
<div>{{::name}}</div>
|
||||||
|
<div class="text-secondary text-caption">#{{::id}}</div>
|
||||||
</tpl-item>
|
</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</td>
|
</td>
|
||||||
|
|
|
@ -21,7 +21,8 @@
|
||||||
order="nickname"
|
order="nickname"
|
||||||
required="true">
|
required="true">
|
||||||
<tpl-item>
|
<tpl-item>
|
||||||
{{::id}} - {{::nickname}}
|
<div>{{::nickname}}</div>
|
||||||
|
<div class="text-secondary text-caption">#{{::id}}</div>
|
||||||
</tpl-item>
|
</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
|
@ -31,11 +32,16 @@
|
||||||
ng-model="$ctrl.entry.travelFk"
|
ng-model="$ctrl.entry.travelFk"
|
||||||
url="Travels/filter"
|
url="Travels/filter"
|
||||||
search-function="$ctrl.searchFunction($search)"
|
search-function="$ctrl.searchFunction($search)"
|
||||||
|
show-field="warehouseInName"
|
||||||
order="id"
|
order="id"
|
||||||
required="true">
|
required="true">
|
||||||
<tpl-item>
|
<tpl-item>
|
||||||
{{::agencyModeName}} - {{::warehouseInName}} ({{::shipped | date: 'dd/MM/yyyy'}}) →
|
<div>
|
||||||
{{::warehouseOutName}} ({{::landed | date: 'dd/MM/yyyy'}})
|
{{::agencyModeName}}
|
||||||
|
- {{::warehouseInName}} ({{::shipped | date: 'dd/MM/yyyy'}})
|
||||||
|
→ {{::warehouseOutName}} ({{::landed | date: 'dd/MM/yyyy'}})
|
||||||
|
</div>
|
||||||
|
<div class="text-secondary text-caption">#{{::id}}</div>
|
||||||
</tpl-item>
|
</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
|
|
|
@ -57,7 +57,10 @@
|
||||||
search-function="{or: [{id: $search}, {vat: {like: '%'+ $search +'%'}}]}"
|
search-function="{or: [{id: $search}, {vat: {like: '%'+ $search +'%'}}]}"
|
||||||
selection="taxRateSelection"
|
selection="taxRateSelection"
|
||||||
rule>
|
rule>
|
||||||
<tpl-item>{{id}}: {{vat}}</tpl-item>
|
<tpl-item>
|
||||||
|
<div>{{::vat}}</div>
|
||||||
|
<div class="text-secondary text-caption">#{{::id}}</div>
|
||||||
|
</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-autocomplete vn-three
|
<vn-autocomplete vn-three
|
||||||
label="Sage transaction"
|
label="Sage transaction"
|
||||||
|
@ -66,7 +69,10 @@
|
||||||
show-field="transaction"
|
show-field="transaction"
|
||||||
search-function="{or: [{id: $search}, {transaction: {like: '%'+ $search +'%'}}]}"
|
search-function="{or: [{id: $search}, {transaction: {like: '%'+ $search +'%'}}]}"
|
||||||
rule>
|
rule>
|
||||||
<tpl-item>{{id}}: {{transaction}}</tpl-item>
|
<tpl-item>
|
||||||
|
<div>{{::transaction}}</div>
|
||||||
|
<div class="text-secondary text-caption">#{{::id}}</div>
|
||||||
|
</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
disabled="true"
|
disabled="true"
|
||||||
|
|
|
@ -98,7 +98,10 @@
|
||||||
ng-model="$ctrl.clientId"
|
ng-model="$ctrl.clientId"
|
||||||
required="true"
|
required="true"
|
||||||
ng-if="$ctrl.clientsToInvoice == 'one'">
|
ng-if="$ctrl.clientsToInvoice == 'one'">
|
||||||
<tpl-item>{{::id}} - {{::name}}</tpl-item>
|
<tpl-item>
|
||||||
|
<div>{{::name}}</div>
|
||||||
|
<div class="text-secondary text-caption">#{{::id}}</div>
|
||||||
|
</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-date-picker
|
<vn-date-picker
|
||||||
vn-one
|
vn-one
|
||||||
|
|
|
@ -27,13 +27,15 @@
|
||||||
url="Tickets"
|
url="Tickets"
|
||||||
label="Ticket"
|
label="Ticket"
|
||||||
search-function="{or: [{id: $search}, {nickname: {like: '%'+$search+'%'}}]}"
|
search-function="{or: [{id: $search}, {nickname: {like: '%'+$search+'%'}}]}"
|
||||||
show-field="nickname"
|
show-field="id"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
|
fields="['nickname']"
|
||||||
ng-model="$ctrl.invoice.ticketFk"
|
ng-model="$ctrl.invoice.ticketFk"
|
||||||
order="shipped DESC"
|
order="shipped DESC"
|
||||||
on-change="$ctrl.invoice.clientFk = null">
|
on-change="$ctrl.invoice.clientFk = null">
|
||||||
<tpl-item>
|
<tpl-item>
|
||||||
{{::id}} - {{::nickname}}
|
<div>#{{::id}}</div>
|
||||||
|
<div class="text-secondary text-caption">{{::nickname}}</div>
|
||||||
</tpl-item>
|
</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-none class="or vn-px-md" translate>Or</vn-none>
|
<vn-none class="or vn-px-md" translate>Or</vn-none>
|
||||||
|
|
|
@ -20,47 +20,52 @@
|
||||||
<vn-card class="vn-pa-lg">
|
<vn-card class="vn-pa-lg">
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
vn-one
|
|
||||||
label="Name"
|
label="Name"
|
||||||
ng-model="$ctrl.item.name"
|
ng-model="$ctrl.item.name"
|
||||||
|
vn-name="name"
|
||||||
rule
|
rule
|
||||||
vn-focus>
|
vn-focus>
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
vn-one label="Full name"
|
label="Full name"
|
||||||
ng-model="$ctrl.item.longName"
|
ng-model="$ctrl.item.longName"
|
||||||
|
vn-name="longName"
|
||||||
rule
|
rule
|
||||||
info="Full name calculates based on tags 1-3. Is not recommended to change it manually">
|
info="Full name calculates based on tags 1-3. Is not recommended to change it manually">
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
<vn-autocomplete vn-one
|
<vn-autocomplete
|
||||||
url="ItemTypes"
|
url="ItemTypes"
|
||||||
label="Type"
|
label="Type"
|
||||||
show-field="name"
|
show-field="name"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
ng-model="$ctrl.item.typeFk"
|
ng-model="$ctrl.item.typeFk"
|
||||||
|
vn-name="type"
|
||||||
initial-data="$ctrl.item.itemType"
|
initial-data="$ctrl.item.itemType"
|
||||||
fields="['categoryFk']"
|
fields="['categoryFk']"
|
||||||
include="'category'">
|
include="'category'">
|
||||||
<tpl-item>
|
<tpl-item>
|
||||||
<div>{{name}}</div>
|
<div>{{::name}}</div>
|
||||||
<div class="text-caption text-secondary">
|
<div class="text-caption text-secondary">
|
||||||
{{category.name}}
|
{{::category.name}}
|
||||||
</div>
|
</div>
|
||||||
</tpl-item>
|
</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-autocomplete vn-one
|
<vn-autocomplete
|
||||||
url="Intrastats"
|
url="Intrastats"
|
||||||
label="Intrastat"
|
label="Intrastat"
|
||||||
show-field="description"
|
show-field="description"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
ng-model="$ctrl.item.intrastatFk"
|
ng-model="$ctrl.item.intrastatFk"
|
||||||
|
vn-name="intrastat"
|
||||||
search-function="{or: [{id: {like: $search +'%'}}, {description: {like: '%'+ $search +'%'}}]}"
|
search-function="{or: [{id: {like: $search +'%'}}, {description: {like: '%'+ $search +'%'}}]}"
|
||||||
initial-data="$ctrl.item.intrastat">
|
initial-data="$ctrl.item.intrastat">
|
||||||
<tpl-item style="display: flex;">
|
<tpl-item>
|
||||||
<div style="width: 6em; text-align: right; padding-right: 1em;">{{::id}}</div>
|
|
||||||
<div>{{::description}}</div>
|
<div>{{::description}}</div>
|
||||||
|
<div class="text-caption text-secondary">
|
||||||
|
#{{::id}}
|
||||||
|
</div>
|
||||||
</tpl-item>
|
</tpl-item>
|
||||||
<append>
|
<append>
|
||||||
<vn-icon-button
|
<vn-icon-button
|
||||||
|
@ -70,83 +75,88 @@
|
||||||
</vn-icon-button>
|
</vn-icon-button>
|
||||||
</append>
|
</append>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-autocomplete vn-one
|
<vn-autocomplete
|
||||||
url="Expenses"
|
url="Expenses"
|
||||||
label="Expense"
|
label="Expense"
|
||||||
ng-model="$ctrl.item.expenseFk"
|
ng-model="$ctrl.item.expenseFk"
|
||||||
|
vn-name="expence"
|
||||||
initial-data="$ctrl.item.expense">
|
initial-data="$ctrl.item.expense">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-autocomplete vn-one
|
<vn-autocomplete
|
||||||
data="originsData"
|
data="originsData"
|
||||||
label="Origin"
|
label="Origin"
|
||||||
show-field="name"
|
show-field="name"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
ng-model="$ctrl.item.originFk"
|
ng-model="$ctrl.item.originFk"
|
||||||
|
vn-name="origin"
|
||||||
initial-data="$ctrl.item.origin">
|
initial-data="$ctrl.item.origin">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
vn-one
|
|
||||||
label="Reference"
|
label="Reference"
|
||||||
ng-model="$ctrl.item.comment"
|
ng-model="$ctrl.item.comment"
|
||||||
|
vn-name="comment"
|
||||||
rule>
|
rule>
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-input-number
|
<vn-input-number
|
||||||
vn-one
|
|
||||||
min="0"
|
min="0"
|
||||||
label="Relevancy"
|
label="Relevancy"
|
||||||
ng-model="$ctrl.item.relevancy"
|
ng-model="$ctrl.item.relevancy"
|
||||||
|
vn-name="relevancy"
|
||||||
rule>
|
rule>
|
||||||
</vn-input-number>
|
</vn-input-number>
|
||||||
<vn-input-number
|
<vn-input-number
|
||||||
vn-one
|
|
||||||
min="0"
|
min="0"
|
||||||
label="Size"
|
label="Size"
|
||||||
ng-model="$ctrl.item.size"
|
ng-model="$ctrl.item.size"
|
||||||
|
vn-name="size"
|
||||||
rule>
|
rule>
|
||||||
</vn-input-number>
|
</vn-input-number>
|
||||||
<vn-input-number
|
<vn-input-number
|
||||||
vn-one
|
|
||||||
min="0"
|
min="0"
|
||||||
label="stems"
|
label="stems"
|
||||||
ng-model="$ctrl.item.stems"
|
ng-model="$ctrl.item.stems"
|
||||||
|
vn-name="stems"
|
||||||
rule>
|
rule>
|
||||||
</vn-input-number>
|
</vn-input-number>
|
||||||
<vn-input-number
|
<vn-input-number
|
||||||
vn-one
|
|
||||||
min="0"
|
min="0"
|
||||||
label="Multiplier"
|
label="Multiplier"
|
||||||
ng-model="$ctrl.item.stemMultiplier">
|
ng-model="$ctrl.item.stemMultiplier"
|
||||||
|
vn-name="stemMultiplier">
|
||||||
</vn-input-number>
|
</vn-input-number>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-input-number
|
<vn-input-number
|
||||||
vn-one
|
|
||||||
min="0"
|
min="0"
|
||||||
label="Weight/Piece"
|
label="Weight/Piece"
|
||||||
ng-model="$ctrl.item.weightByPiece"
|
ng-model="$ctrl.item.weightByPiece"
|
||||||
|
vn-name="weightByPiece"
|
||||||
rule>
|
rule>
|
||||||
</vn-input-number>
|
</vn-input-number>
|
||||||
<vn-input-number
|
<vn-input-number
|
||||||
vn-one
|
|
||||||
min="0"
|
min="0"
|
||||||
label="Units/Box"
|
label="Units/Box"
|
||||||
ng-model="$ctrl.item.packingOut"
|
ng-model="$ctrl.item.packingOut"
|
||||||
|
vn-name="packingOut"
|
||||||
rule>
|
rule>
|
||||||
</vn-input-number>
|
</vn-input-number>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
|
||||||
label="Generic"
|
label="Generic"
|
||||||
url="Items/withName"
|
url="Items/withName"
|
||||||
ng-model="$ctrl.item.genericFk"
|
ng-model="$ctrl.item.genericFk"
|
||||||
|
vn-name="generic"
|
||||||
show-field="name"
|
show-field="name"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
search-function="$ctrl.itemSearchFunc($search)"
|
search-function="$ctrl.itemSearchFunc($search)"
|
||||||
order="id DESC"
|
order="id DESC"
|
||||||
tabindex="1">
|
tabindex="1">
|
||||||
<tpl-item>
|
<tpl-item>
|
||||||
{{::id}} - {{::name}}
|
<div>{{::name}}</div>
|
||||||
|
<div class="text-caption text-secondary">
|
||||||
|
#{{::id}}
|
||||||
|
</div>
|
||||||
</tpl-item>
|
</tpl-item>
|
||||||
<append>
|
<append>
|
||||||
<vn-icon-button
|
<vn-icon-button
|
||||||
|
@ -159,33 +169,33 @@
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-textarea
|
<vn-textarea
|
||||||
vn-one
|
|
||||||
label="Description"
|
label="Description"
|
||||||
ng-model="$ctrl.item.description"
|
ng-model="$ctrl.item.description"
|
||||||
|
vn-name="description"
|
||||||
rule>
|
rule>
|
||||||
</vn-textarea>
|
</vn-textarea>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-check
|
<vn-check
|
||||||
vn-one
|
|
||||||
label="Active"
|
label="Active"
|
||||||
ng-model="$ctrl.item.isActive">
|
ng-model="$ctrl.item.isActive"
|
||||||
|
vn-name="isActive">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
<vn-check
|
<vn-check
|
||||||
vn-one
|
|
||||||
label="Price in kg"
|
label="Price in kg"
|
||||||
ng-model="$ctrl.item.hasKgPrice">
|
ng-model="$ctrl.item.hasKgPrice"
|
||||||
|
vn-name="priceInKg">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
<vn-check
|
<vn-check
|
||||||
vn-one
|
|
||||||
label="Fragile"
|
label="Fragile"
|
||||||
ng-model="$ctrl.item.isFragile"
|
ng-model="$ctrl.item.isFragile"
|
||||||
|
vn-name="isFragile"
|
||||||
info="Is shown at website, app that this item cannot travel (wreath, palms, ...)">
|
info="Is shown at website, app that this item cannot travel (wreath, palms, ...)">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
<vn-check
|
<vn-check
|
||||||
vn-one
|
|
||||||
label="Do photo"
|
label="Do photo"
|
||||||
ng-model="$ctrl.item.isPhotoRequested"
|
ng-model="$ctrl.item.isPhotoRequested"
|
||||||
|
vn-name="isPhotoRequested"
|
||||||
info="This item does need a photo">
|
info="This item does need a photo">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
|
@ -211,16 +221,19 @@
|
||||||
message="New intrastat">
|
message="New intrastat">
|
||||||
<tpl-body>
|
<tpl-body>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-input-number vn-one vn-focus
|
<vn-input-number
|
||||||
|
vn-focus
|
||||||
label="Identifier"
|
label="Identifier"
|
||||||
ng-model="$ctrl.newIntrastat.intrastatId"
|
ng-model="$ctrl.newIntrastat.intrastatId"
|
||||||
|
vn-name="id"
|
||||||
required="true">
|
required="true">
|
||||||
</vn-input-number>
|
</vn-input-number>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-textfield vn-one
|
<vn-textfield
|
||||||
label="Description"
|
label="Description"
|
||||||
ng-model="$ctrl.newIntrastat.description"
|
ng-model="$ctrl.newIntrastat.description"
|
||||||
|
vn-name="description"
|
||||||
required="true">
|
required="true">
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
label="Name"
|
label="Name"
|
||||||
ng-model="$ctrl.item.provisionalName"
|
ng-model="$ctrl.item.provisionalName"
|
||||||
|
vn-name="name"
|
||||||
vn-focus>
|
vn-focus>
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
|
@ -25,20 +26,23 @@
|
||||||
url="Tags"
|
url="Tags"
|
||||||
show-field="name"
|
show-field="name"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
label="Tag">
|
label="Tag"
|
||||||
|
vn-name="tag">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
data="$ctrl.validPriorities"
|
data="$ctrl.validPriorities"
|
||||||
label="Priority"
|
label="Priority"
|
||||||
ng-model="$ctrl.item.priority"
|
ng-model="$ctrl.item.priority"
|
||||||
show-field="priority"
|
show-field="priority"
|
||||||
value-field="priority">
|
value-field="priority"
|
||||||
|
vn-name="priority">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
label="Type"
|
label="Type"
|
||||||
ng-model="$ctrl.item.typeFk"
|
ng-model="$ctrl.item.typeFk"
|
||||||
|
vn-name="type"
|
||||||
url="ItemTypes"
|
url="ItemTypes"
|
||||||
fields="['code', 'categoryFk']"
|
fields="['code', 'categoryFk']"
|
||||||
search-function="{or: [{code: {like: $search +'%'}}, {name: {like: '%'+ $search +'%'}}]}"
|
search-function="{or: [{code: {like: $search +'%'}}, {name: {like: '%'+ $search +'%'}}]}"
|
||||||
|
@ -56,20 +60,24 @@
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
label="Intrastat"
|
label="Intrastat"
|
||||||
ng-model="$ctrl.item.intrastatFk"
|
ng-model="$ctrl.item.intrastatFk"
|
||||||
|
vn-name="intrastat"
|
||||||
url="Intrastats"
|
url="Intrastats"
|
||||||
show-field="description"
|
show-field="description"
|
||||||
search-function="{or: [{id: {like: $search +'%'}}, {description: {like: '%'+ $search +'%'}}]}">
|
search-function="{or: [{id: {like: $search +'%'}}, {description: {like: '%'+ $search +'%'}}]}">
|
||||||
<tpl-item style="display: flex;">
|
<tpl-item>
|
||||||
<div style="width: 6em; text-align: right; padding-right: 1em;">{{::id}}</div>
|
|
||||||
<div>{{::description}}</div>
|
<div>{{::description}}</div>
|
||||||
|
<div class="text-caption text-secondary">
|
||||||
|
#{{::id}}
|
||||||
|
</div>
|
||||||
</tpl-item>
|
</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-autocomplete vn-one
|
<vn-autocomplete
|
||||||
data="originsData"
|
data="originsData"
|
||||||
label="Origin"
|
label="Origin"
|
||||||
ng-model="$ctrl.item.originFk">
|
ng-model="$ctrl.item.originFk"
|
||||||
|
vn-name="origin">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
</vn-card>
|
</vn-card>
|
||||||
|
|
|
@ -81,7 +81,8 @@
|
||||||
class="dense"
|
class="dense"
|
||||||
url="Items/withName"
|
url="Items/withName"
|
||||||
ng-model="price.itemFk"
|
ng-model="price.itemFk"
|
||||||
show-field="name"
|
fields="['name']"
|
||||||
|
show-field="id"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
search-function="$ctrl.itemSearchFunc($search)"
|
search-function="$ctrl.itemSearchFunc($search)"
|
||||||
on-change="$ctrl.upsertPrice(price, true)"
|
on-change="$ctrl.upsertPrice(price, true)"
|
||||||
|
|
|
@ -141,7 +141,7 @@ module.exports = Self => {
|
||||||
let stmt;
|
let stmt;
|
||||||
|
|
||||||
stmt = new ParameterizedSQL(
|
stmt = new ParameterizedSQL(
|
||||||
`CREATE TEMPORARY TABLE tmp.filter
|
`CREATE OR REPLACE TEMPORARY TABLE tmp.filter
|
||||||
(INDEX (id))
|
(INDEX (id))
|
||||||
ENGINE = MEMORY
|
ENGINE = MEMORY
|
||||||
SELECT
|
SELECT
|
||||||
|
|
|
@ -19,13 +19,17 @@
|
||||||
vn-one
|
vn-one
|
||||||
url="Clients"
|
url="Clients"
|
||||||
label="Client"
|
label="Client"
|
||||||
search-function="{or: [{id: $search}, {name: {like: '%'+$search+'%'}}]}"
|
search-function="{or: [{id: $search}, {name: {like: '%'+ $search +'%'}}]}"
|
||||||
show-field="name"
|
show-field="name"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
ng-model="$ctrl.order.clientFk"
|
ng-model="$ctrl.order.clientFk"
|
||||||
|
vn-name="client"
|
||||||
selection="$ctrl.selection"
|
selection="$ctrl.selection"
|
||||||
fields="['defaultAddressFk']">
|
fields="['defaultAddressFk']">
|
||||||
<tpl-item>{{::id}}: {{::name}}</tpl-item>
|
<tpl-item>
|
||||||
|
<div>{{::name}}</div>
|
||||||
|
<div class="text-secondary text-caption">#{{::id}}</div>
|
||||||
|
</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
vn-one
|
||||||
|
@ -36,6 +40,7 @@
|
||||||
show-field="nickname"
|
show-field="nickname"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
ng-model="$ctrl.order.addressFk"
|
ng-model="$ctrl.order.addressFk"
|
||||||
|
vn-name="address"
|
||||||
on-change="$ctrl.getAvailableAgencies()">
|
on-change="$ctrl.getAvailableAgencies()">
|
||||||
<tpl-item>{{::nickname}}</tpl-item>
|
<tpl-item>{{::nickname}}</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
|
@ -45,6 +50,7 @@
|
||||||
vn-one
|
vn-one
|
||||||
label="Landed"
|
label="Landed"
|
||||||
ng-model="$ctrl.order.landed"
|
ng-model="$ctrl.order.landed"
|
||||||
|
vn-name="landed"
|
||||||
on-change="$ctrl.getAvailableAgencies()">
|
on-change="$ctrl.getAvailableAgencies()">
|
||||||
</vn-date-picker>
|
</vn-date-picker>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
|
@ -53,7 +59,8 @@
|
||||||
label="Agency"
|
label="Agency"
|
||||||
show-field="agencyMode"
|
show-field="agencyMode"
|
||||||
value-field="agencyModeFk"
|
value-field="agencyModeFk"
|
||||||
ng-model="$ctrl.order.agencyModeFk">
|
ng-model="$ctrl.order.agencyModeFk"
|
||||||
|
vn-name="agencyMode">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
|
@ -61,6 +68,7 @@
|
||||||
vn-one
|
vn-one
|
||||||
label="Notes"
|
label="Notes"
|
||||||
ng-model="$ctrl.order.note"
|
ng-model="$ctrl.order.note"
|
||||||
|
vn-name="note"
|
||||||
rule>
|
rule>
|
||||||
</vn-textarea>
|
</vn-textarea>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
show-field="name"
|
show-field="name"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
ng-model="$ctrl.clientFk"
|
ng-model="$ctrl.clientFk"
|
||||||
|
vn-name="client"
|
||||||
order="id">
|
order="id">
|
||||||
<tpl-item>{{id}}: {{name}}</tpl-item>
|
<tpl-item>{{id}}: {{name}}</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
|
@ -15,6 +16,7 @@
|
||||||
url="{{ $ctrl.clientFk ? 'Clients/'+ $ctrl.clientFk +'/addresses' : null }}"
|
url="{{ $ctrl.clientFk ? 'Clients/'+ $ctrl.clientFk +'/addresses' : null }}"
|
||||||
fields="['nickname', 'street', 'city']"
|
fields="['nickname', 'street', 'city']"
|
||||||
ng-model="$ctrl.addressFk"
|
ng-model="$ctrl.addressFk"
|
||||||
|
vn-name="address"
|
||||||
show-field="nickname"
|
show-field="nickname"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
label="Address">
|
label="Address">
|
||||||
|
@ -22,7 +24,8 @@
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-date-picker
|
<vn-date-picker
|
||||||
label="Landed"
|
label="Landed"
|
||||||
ng-model="$ctrl.landed">
|
ng-model="$ctrl.landed"
|
||||||
|
vn-name="landed">
|
||||||
</vn-date-picker>
|
</vn-date-picker>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
disabled="!$ctrl.clientFk || !$ctrl.landed"
|
disabled="!$ctrl.clientFk || !$ctrl.landed"
|
||||||
|
@ -30,5 +33,6 @@
|
||||||
label="Agency"
|
label="Agency"
|
||||||
show-field="agencyMode"
|
show-field="agencyMode"
|
||||||
value-field="agencyModeFk"
|
value-field="agencyModeFk"
|
||||||
ng-model="$ctrl.order.agencyModeFk">
|
ng-model="$ctrl.order.agencyModeFk"
|
||||||
|
vn-name="agencyMode">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
<vn-table model="model">
|
<vn-table model="model">
|
||||||
<vn-thead>
|
<vn-thead>
|
||||||
<vn-tr>
|
<vn-tr>
|
||||||
<vn-th shrink field="itemFk" default-order="ASC" number>Item</vn-th>
|
<vn-th shrink field="itemFk" number>Item</vn-th>
|
||||||
<vn-th>Description</vn-th>
|
<vn-th>Description</vn-th>
|
||||||
<vn-th shrink field="quantity" number>Quantity</vn-th>
|
<vn-th shrink field="quantity" number>Quantity</vn-th>
|
||||||
<vn-th shrink number>m³ per quantity</vn-th>
|
<vn-th shrink number>m³ per quantity</vn-th>
|
||||||
|
|
|
@ -6,9 +6,10 @@ class Controller extends Section {
|
||||||
constructor($element, $) {
|
constructor($element, $) {
|
||||||
super($element, $);
|
super($element, $);
|
||||||
this.filter = {
|
this.filter = {
|
||||||
include: [{
|
include: {
|
||||||
relation: 'item'
|
relation: 'item'
|
||||||
}]
|
},
|
||||||
|
order: 'itemFk'
|
||||||
};
|
};
|
||||||
this.order = {};
|
this.order = {};
|
||||||
this.ticketVolumes = [];
|
this.ticketVolumes = [];
|
||||||
|
|
|
@ -9,76 +9,80 @@
|
||||||
<vn-card class="vn-pa-lg">
|
<vn-card class="vn-pa-lg">
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
|
||||||
ng-model="$ctrl.route.workerFk"
|
ng-model="$ctrl.route.workerFk"
|
||||||
url="Workers/activeWithInheritedRole"
|
url="Workers/activeWithInheritedRole"
|
||||||
show-field="nickname"
|
show-field="nickname"
|
||||||
search-function="{firstName: $search}"
|
search-function="{firstName: $search}"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
where="{role: 'employee'}"
|
where="{role: 'employee'}"
|
||||||
label="Worker">
|
label="Worker"
|
||||||
|
vn-name="worker">
|
||||||
<tpl-item>
|
<tpl-item>
|
||||||
<div>{{name}} - {{nickname}}</div>
|
<div>{{::nickname}}</div>
|
||||||
|
<div class="text-secondary text-caption">{{::name}}</div>
|
||||||
</tpl-item>
|
</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
|
||||||
ng-model="$ctrl.route.vehicleFk"
|
ng-model="$ctrl.route.vehicleFk"
|
||||||
url="Vehicles"
|
url="Vehicles"
|
||||||
show-field="numberPlate"
|
show-field="numberPlate"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
label="Vehicle">
|
label="Vehicle"
|
||||||
|
vn-name="vehicle">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-date-picker
|
<vn-date-picker
|
||||||
vn-one
|
|
||||||
label="Created"
|
label="Created"
|
||||||
ng-model="$ctrl.route.created">
|
ng-model="$ctrl.route.created"
|
||||||
|
vn-name="created">
|
||||||
</vn-date-picker>
|
</vn-date-picker>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
|
||||||
ng-model="$ctrl.route.agencyModeFk"
|
ng-model="$ctrl.route.agencyModeFk"
|
||||||
url="AgencyModes"
|
url="AgencyModes"
|
||||||
show-field="name"
|
show-field="name"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
label="Agency">
|
label="Agency"
|
||||||
|
vn-name="agencyMode">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-input-number
|
<vn-input-number
|
||||||
vn-one
|
|
||||||
label="Km start"
|
label="Km start"
|
||||||
ng-model="$ctrl.route.kmStart"
|
ng-model="$ctrl.route.kmStart"
|
||||||
|
vn-name="kmStart"
|
||||||
rule>
|
rule>
|
||||||
</vn-input-number>
|
</vn-input-number>
|
||||||
<vn-input-number
|
<vn-input-number
|
||||||
vn-one
|
|
||||||
label="Km end"
|
label="Km end"
|
||||||
ng-model="$ctrl.route.kmEnd"
|
ng-model="$ctrl.route.kmEnd"
|
||||||
|
vn-name="kmEnd"
|
||||||
rule>
|
rule>
|
||||||
</vn-input-number>
|
</vn-input-number>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-input-time
|
<vn-input-time
|
||||||
label="Hour started"
|
label="Hour started"
|
||||||
ng-model="$ctrl.route.started">
|
ng-model="$ctrl.route.started"
|
||||||
|
vn-name="started">
|
||||||
</vn-input-time>
|
</vn-input-time>
|
||||||
<vn-input-time
|
<vn-input-time
|
||||||
label="Hour finished"
|
label="Hour finished"
|
||||||
ng-model="$ctrl.route.finished">
|
ng-model="$ctrl.route.finished"
|
||||||
|
vn-name="finished">
|
||||||
</vn-input-time>
|
</vn-input-time>
|
||||||
<vn-check
|
<vn-check
|
||||||
class="vn-mr-md"
|
class="vn-mr-md"
|
||||||
label="Is served"
|
label="Is served"
|
||||||
ng-model="$ctrl.route.isOk">
|
ng-model="$ctrl.route.isOk"
|
||||||
|
vn-name="isOk">
|
||||||
</vn-check>
|
</vn-check>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-textArea
|
<vn-textArea
|
||||||
vn-one
|
|
||||||
label="Description"
|
label="Description"
|
||||||
ng-model="$ctrl.route.description"
|
ng-model="$ctrl.route.description"
|
||||||
|
vn-name="description"
|
||||||
rule
|
rule
|
||||||
vn-focus>
|
vn-focus>
|
||||||
</vn-textArea>
|
</vn-textArea>
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
vn-two
|
vn-two
|
||||||
vn-focus
|
vn-focus
|
||||||
label="Social name"
|
label="Social name"
|
||||||
name="socialName"
|
vn-name="socialName"
|
||||||
ng-model="$ctrl.supplier.name"
|
ng-model="$ctrl.supplier.name"
|
||||||
info="Only letters, numbers and spaces can be used"
|
info="Only letters, numbers and spaces can be used"
|
||||||
required="true"
|
required="true"
|
||||||
|
@ -51,18 +51,17 @@
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
vn-one
|
vn-one
|
||||||
label="Tax number"
|
label="Tax number"
|
||||||
name="taxNumber"
|
vn-name="taxNumber"
|
||||||
ng-model="$ctrl.supplier.nif"
|
ng-model="$ctrl.supplier.nif"
|
||||||
required="true"
|
required="true"
|
||||||
rule
|
rule>
|
||||||
>
|
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
vn-one
|
vn-one
|
||||||
label="Account"
|
label="Account"
|
||||||
name="account"
|
vn-name="account"
|
||||||
ng-model="$ctrl.supplier.account"
|
ng-model="$ctrl.supplier.account"
|
||||||
insertable="true"
|
insertable="true"
|
||||||
max-length="10"
|
max-length="10"
|
||||||
|
@ -71,7 +70,7 @@
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
vn-one
|
||||||
label="Sage tax type"
|
label="Sage tax type"
|
||||||
name="sageTaxType"
|
vn-name="sageTaxType"
|
||||||
ng-model="$ctrl.supplier.sageTaxTypeFk"
|
ng-model="$ctrl.supplier.sageTaxTypeFk"
|
||||||
data="sageTaxTypes"
|
data="sageTaxTypes"
|
||||||
show-field="vat"
|
show-field="vat"
|
||||||
|
@ -83,7 +82,7 @@
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
vn-one
|
||||||
label="Sage withholding"
|
label="Sage withholding"
|
||||||
name="sageWithholding"
|
vn-name="sageWithholding"
|
||||||
ng-model="$ctrl.supplier.sageWithholdingFk"
|
ng-model="$ctrl.supplier.sageWithholdingFk"
|
||||||
data="sageWithholdings"
|
data="sageWithholdings"
|
||||||
show-field="withholding"
|
show-field="withholding"
|
||||||
|
@ -93,7 +92,7 @@
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
vn-one
|
||||||
label="Sage transaction type"
|
label="Sage transaction type"
|
||||||
name="sageTransactionType"
|
vn-name="sageTransactionType"
|
||||||
ng-model="$ctrl.supplier.sageTransactionTypeFk"
|
ng-model="$ctrl.supplier.sageTransactionTypeFk"
|
||||||
url="SageTransactionTypes"
|
url="SageTransactionTypes"
|
||||||
show-field="transaction"
|
show-field="transaction"
|
||||||
|
@ -108,7 +107,7 @@
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
vn-one
|
||||||
label="Supplier activity"
|
label="Supplier activity"
|
||||||
name="supplierActivity"
|
vn-name="supplierActivity"
|
||||||
ng-model="$ctrl.supplier.supplierActivityFk"
|
ng-model="$ctrl.supplier.supplierActivityFk"
|
||||||
data="supplierActivities"
|
data="supplierActivities"
|
||||||
show-field="name"
|
show-field="name"
|
||||||
|
@ -133,7 +132,7 @@
|
||||||
<vn-datalist
|
<vn-datalist
|
||||||
vn-one
|
vn-one
|
||||||
label="Postcode"
|
label="Postcode"
|
||||||
name="postcode"
|
vn-name="postcode"
|
||||||
ng-model="$ctrl.supplier.postCode"
|
ng-model="$ctrl.supplier.postCode"
|
||||||
selection="$ctrl.postcode"
|
selection="$ctrl.postcode"
|
||||||
url="Postcodes/location"
|
url="Postcodes/location"
|
||||||
|
@ -162,7 +161,7 @@
|
||||||
vn-one
|
vn-one
|
||||||
vn-id="town"
|
vn-id="town"
|
||||||
label="City"
|
label="City"
|
||||||
name="city"
|
vn-name="city"
|
||||||
ng-model="$ctrl.supplier.city"
|
ng-model="$ctrl.supplier.city"
|
||||||
selection="$ctrl.town"
|
selection="$ctrl.town"
|
||||||
url="Towns/location"
|
url="Towns/location"
|
||||||
|
@ -180,7 +179,7 @@
|
||||||
vn-one
|
vn-one
|
||||||
vn-id="province"
|
vn-id="province"
|
||||||
label="Province"
|
label="Province"
|
||||||
name="province"
|
vn-name="province"
|
||||||
ng-model="$ctrl.supplier.provinceFk"
|
ng-model="$ctrl.supplier.provinceFk"
|
||||||
selection="$ctrl.province"
|
selection="$ctrl.province"
|
||||||
data="provincesLocation"
|
data="provincesLocation"
|
||||||
|
@ -196,7 +195,7 @@
|
||||||
vn-two
|
vn-two
|
||||||
vn-id="country"
|
vn-id="country"
|
||||||
label="Country"
|
label="Country"
|
||||||
name="country"
|
vn-name="country"
|
||||||
ng-model="$ctrl.supplier.countryFk"
|
ng-model="$ctrl.supplier.countryFk"
|
||||||
data="countries"
|
data="countries"
|
||||||
show-field="country"
|
show-field="country"
|
||||||
|
|
|
@ -75,8 +75,8 @@ module.exports = function(Self) {
|
||||||
serial = result.serial;
|
serial = result.serial;
|
||||||
|
|
||||||
await Self.rawSql(`
|
await Self.rawSql(`
|
||||||
DROP TEMPORARY TABLE IF EXISTS ticketToInvoice;
|
DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice;
|
||||||
CREATE TEMPORARY TABLE ticketToInvoice
|
CREATE TEMPORARY TABLE tmp.ticketToInvoice
|
||||||
(PRIMARY KEY (id))
|
(PRIMARY KEY (id))
|
||||||
ENGINE = MEMORY
|
ENGINE = MEMORY
|
||||||
SELECT id FROM vn.ticket
|
SELECT id FROM vn.ticket
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
data="warehouses"
|
data="warehouses"
|
||||||
order="name">
|
order="name">
|
||||||
</vn-crud-model>
|
</vn-crud-model>
|
||||||
<vn-autocomplete vn-focus
|
<vn-autocomplete
|
||||||
|
vn-focus
|
||||||
vn-id="client"
|
vn-id="client"
|
||||||
url="Clients"
|
url="Clients"
|
||||||
label="Client"
|
label="Client"
|
||||||
|
@ -12,8 +13,12 @@
|
||||||
show-field="name"
|
show-field="name"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
ng-model="$ctrl.clientId"
|
ng-model="$ctrl.clientId"
|
||||||
|
vn-name="client"
|
||||||
order="id">
|
order="id">
|
||||||
<tpl-item>{{id}}: {{name}}</tpl-item>
|
<tpl-item>
|
||||||
|
<div>{{::name}}</div>
|
||||||
|
<div class="text-secondary text-caption">#{{::id}}</div>
|
||||||
|
</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
disabled="!$ctrl.clientId"
|
disabled="!$ctrl.clientId"
|
||||||
|
@ -21,18 +26,24 @@
|
||||||
fields="['nickname', 'street', 'city']"
|
fields="['nickname', 'street', 'city']"
|
||||||
where="{isActive: true}"
|
where="{isActive: true}"
|
||||||
ng-model="$ctrl.addressId"
|
ng-model="$ctrl.addressId"
|
||||||
|
vn-name="address"
|
||||||
show-field="nickname"
|
show-field="nickname"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
label="Address">
|
label="Address">
|
||||||
<tpl-item>{{nickname}}: {{street}}, {{city}}</tpl-item>
|
<tpl-item>
|
||||||
|
<div>{{::nickname}}</div>
|
||||||
|
<div class="text-secondary text-caption">{{::street}}, {{::city}}</div>
|
||||||
|
</tpl-item>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-date-picker
|
<vn-date-picker
|
||||||
label="Landed"
|
label="Landed"
|
||||||
ng-model="$ctrl.landed">
|
ng-model="$ctrl.landed"
|
||||||
|
vn-name="landed">
|
||||||
</vn-date-picker>
|
</vn-date-picker>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
disabled="!$ctrl.warehouseId && (!$ctrl.clientId || !$ctrl.landed)"
|
disabled="!$ctrl.warehouseId && (!$ctrl.clientId || !$ctrl.landed)"
|
||||||
ng-model="$ctrl.warehouseId"
|
ng-model="$ctrl.warehouseId"
|
||||||
|
vn-name="warehouse"
|
||||||
data="warehouses"
|
data="warehouses"
|
||||||
show-field="name"
|
show-field="name"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
|
@ -44,5 +55,6 @@
|
||||||
label="Agency"
|
label="Agency"
|
||||||
show-field="agencyMode"
|
show-field="agencyMode"
|
||||||
value-field="agencyModeFk"
|
value-field="agencyModeFk"
|
||||||
ng-model="$ctrl.agencyModeId">
|
ng-model="$ctrl.agencyModeId"
|
||||||
|
vn-name="agencyMode">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
|
@ -15,7 +15,6 @@
|
||||||
<vn-card class="vn-pa-lg">
|
<vn-card class="vn-pa-lg">
|
||||||
<vn-horizontal ng-repeat="package in packages track by $index">
|
<vn-horizontal ng-repeat="package in packages track by $index">
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
|
||||||
vn-focus
|
vn-focus
|
||||||
url="Packagings/listPackaging"
|
url="Packagings/listPackaging"
|
||||||
label="Package"
|
label="Package"
|
||||||
|
@ -23,17 +22,19 @@
|
||||||
value-field="packagingFk"
|
value-field="packagingFk"
|
||||||
search-function="{or: [{itemFk: $search}, {'name': {like: '%'+ $search +'%'}}]}"
|
search-function="{or: [{itemFk: $search}, {'name': {like: '%'+ $search +'%'}}]}"
|
||||||
ng-model="package.packagingFk">
|
ng-model="package.packagingFk">
|
||||||
<tpl-item>{{itemFk}} : {{name}}</tpl-item>
|
<tpl-item>
|
||||||
|
<div>{{::name}}</div>
|
||||||
|
<div class="text-secondary text-caption">
|
||||||
|
#{{itemFk}}
|
||||||
|
</div>
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-input-number
|
<vn-input-number
|
||||||
vn-one
|
|
||||||
step="1"
|
step="1"
|
||||||
label="Quantity"
|
label="Quantity"
|
||||||
ng-model="package.quantity"
|
ng-model="package.quantity"
|
||||||
rule="TicketPackaging">
|
rule="TicketPackaging">
|
||||||
</vn-input-number>
|
</vn-input-number>
|
||||||
<vn-date-picker
|
<vn-date-picker
|
||||||
vn-one
|
|
||||||
label="Added"
|
label="Added"
|
||||||
ng-model="package.created"
|
ng-model="package.created"
|
||||||
disabled="true"
|
disabled="true"
|
||||||
|
@ -60,12 +61,13 @@
|
||||||
disabled="!watcher.dataChanged()"
|
disabled="!watcher.dataChanged()"
|
||||||
label="Save">
|
label="Save">
|
||||||
</vn-submit>
|
</vn-submit>
|
||||||
<!-- # #2680 Undo changes button bugs -->
|
<!-- #2680 Undo changes button bug
|
||||||
<!-- <vn-button
|
<vn-button
|
||||||
class="cancel"
|
class="cancel"
|
||||||
label="Undo changes"
|
label="Undo changes"
|
||||||
disabled="!watcher.dataChanged()"
|
disabled="!watcher.dataChanged()"
|
||||||
ng-click="watcher.loadOriginalData()">
|
ng-click="watcher.loadOriginalData()">
|
||||||
</vn-button> -->
|
</vn-button>
|
||||||
|
-->
|
||||||
</vn-button-bar>
|
</vn-button-bar>
|
||||||
</form>
|
</form>
|
|
@ -1,4 +1,5 @@
|
||||||
<vn-crud-model auto-load="false"
|
<vn-crud-model
|
||||||
|
auto-load="true"
|
||||||
vn-id="model"
|
vn-id="model"
|
||||||
url="sales"
|
url="sales"
|
||||||
filter="::$ctrl.filter"
|
filter="::$ctrl.filter"
|
||||||
|
@ -23,7 +24,7 @@
|
||||||
<vn-thead>
|
<vn-thead>
|
||||||
<vn-tr>
|
<vn-tr>
|
||||||
<vn-th field="itemFk" number>Item</vn-th>
|
<vn-th field="itemFk" number>Item</vn-th>
|
||||||
<vn-th field="concept" default-order="ASC">Description</vn-th>
|
<vn-th field="concept">Description</vn-th>
|
||||||
<vn-th field="itemPackingTypeFk" number>Packing type</vn-th>
|
<vn-th field="itemPackingTypeFk" number>Packing type</vn-th>
|
||||||
<vn-th field="quantity" number>Quantity</vn-th>
|
<vn-th field="quantity" number>Quantity</vn-th>
|
||||||
<vn-th number>m³ per quantity</vn-th>
|
<vn-th number>m³ per quantity</vn-th>
|
||||||
|
|
|
@ -5,9 +5,10 @@ class Controller extends Section {
|
||||||
constructor($element, $) {
|
constructor($element, $) {
|
||||||
super($element, $);
|
super($element, $);
|
||||||
this.filter = {
|
this.filter = {
|
||||||
include: [{
|
include: {
|
||||||
relation: 'item'
|
relation: 'item'
|
||||||
}]
|
},
|
||||||
|
order: 'concept'
|
||||||
};
|
};
|
||||||
|
|
||||||
this.ticketVolumes = [];
|
this.ticketVolumes = [];
|
||||||
|
|
|
@ -17,7 +17,8 @@
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
vn-one
|
vn-one
|
||||||
label="Reference"
|
label="Reference"
|
||||||
ng-model="$ctrl.travel.ref">
|
ng-model="$ctrl.travel.ref"
|
||||||
|
vn-name="reference">
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
vn-one
|
||||||
|
@ -25,25 +26,29 @@
|
||||||
url="AgencyModes"
|
url="AgencyModes"
|
||||||
show-field="name"
|
show-field="name"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
label="Agency">
|
label="Agency"
|
||||||
|
vn-name="agencyMode">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-date-picker
|
<vn-date-picker
|
||||||
vn-one
|
vn-one
|
||||||
label="Shipped"
|
label="Shipped"
|
||||||
ng-model="$ctrl.travel.shipped">
|
ng-model="$ctrl.travel.shipped"
|
||||||
|
vn-name="shipped">
|
||||||
</vn-date-picker>
|
</vn-date-picker>
|
||||||
<vn-date-picker
|
<vn-date-picker
|
||||||
vn-one
|
vn-one
|
||||||
label="Landed"
|
label="Landed"
|
||||||
ng-model="$ctrl.travel.landed">
|
ng-model="$ctrl.travel.landed"
|
||||||
|
vn-name="landed">
|
||||||
</vn-date-picker>
|
</vn-date-picker>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
vn-one
|
||||||
ng-model="$ctrl.travel.warehouseOutFk"
|
ng-model="$ctrl.travel.warehouseOutFk"
|
||||||
|
vn-name="warehouseOut"
|
||||||
data="warehouses"
|
data="warehouses"
|
||||||
show-field="name"
|
show-field="name"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
|
@ -52,6 +57,7 @@
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
vn-one
|
vn-one
|
||||||
ng-model="$ctrl.travel.warehouseInFk"
|
ng-model="$ctrl.travel.warehouseInFk"
|
||||||
|
vn-name="warehouseIn"
|
||||||
data="warehouses"
|
data="warehouses"
|
||||||
show-field="name"
|
show-field="name"
|
||||||
value-field="id"
|
value-field="id"
|
||||||
|
|
|
@ -10,11 +10,13 @@
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-textfield
|
<vn-textfield
|
||||||
label="Reference"
|
label="Reference"
|
||||||
ng-model="$ctrl.travel.ref">
|
ng-model="$ctrl.travel.ref"
|
||||||
|
vn-name="reference">
|
||||||
</vn-textfield>
|
</vn-textfield>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
label="Agency"
|
label="Agency"
|
||||||
ng-model="$ctrl.travel.agencyModeFk"
|
ng-model="$ctrl.travel.agencyModeFk"
|
||||||
|
vn-name="agencyMode"
|
||||||
url="AgencyModes">
|
url="AgencyModes">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
|
@ -22,22 +24,26 @@
|
||||||
<vn-date-picker
|
<vn-date-picker
|
||||||
on-change="$ctrl.onShippedChange(value)"
|
on-change="$ctrl.onShippedChange(value)"
|
||||||
label="Shipped"
|
label="Shipped"
|
||||||
ng-model="$ctrl.travel.shipped">
|
ng-model="$ctrl.travel.shipped"
|
||||||
|
vn-name="shipped">
|
||||||
</vn-date-picker>
|
</vn-date-picker>
|
||||||
<vn-date-picker
|
<vn-date-picker
|
||||||
label="Landed"
|
label="Landed"
|
||||||
ng-model="$ctrl.travel.landed">
|
ng-model="$ctrl.travel.landed"
|
||||||
|
vn-name="landed">
|
||||||
</vn-date-picker>
|
</vn-date-picker>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
label="Warehouse Out"
|
label="Warehouse Out"
|
||||||
ng-model="$ctrl.travel.warehouseOutFk"
|
ng-model="$ctrl.travel.warehouseOutFk"
|
||||||
|
vn-name="warehouseOut"
|
||||||
url="Warehouses">
|
url="Warehouses">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
<vn-autocomplete
|
<vn-autocomplete
|
||||||
label="Warehouse In"
|
label="Warehouse In"
|
||||||
ng-model="$ctrl.travel.warehouseInFk"
|
ng-model="$ctrl.travel.warehouseInFk"
|
||||||
|
vn-name="warehouseIn"
|
||||||
url="Warehouses">
|
url="Warehouses">
|
||||||
</vn-autocomplete>
|
</vn-autocomplete>
|
||||||
</vn-horizontal>
|
</vn-horizontal>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "salix-back",
|
"name": "salix-back",
|
||||||
"version": "23.16.01",
|
"version": "23.18.01",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "salix-back",
|
"name": "salix-back",
|
||||||
"version": "23.16.01",
|
"version": "23.20.01",
|
||||||
"author": "Verdnatura Levante SL",
|
"author": "Verdnatura Levante SL",
|
||||||
"description": "Salix backend",
|
"description": "Salix backend",
|
||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
|
|
|
@ -17,9 +17,10 @@ sections:
|
||||||
title: Utilización de GoLabel
|
title: Utilización de GoLabel
|
||||||
description: Para utilizar el programa de impresión de cintas sigue estos pasos
|
description: Para utilizar el programa de impresión de cintas sigue estos pasos
|
||||||
steps:
|
steps:
|
||||||
|
- Adjunto a este correo tenemos el 'model.ezp' (la plantilla de cintas de corona estandar), descárgalo y seguramente lo tengas en la carpeta 'Descargas'
|
||||||
- Abre el programa GoLabel
|
- Abre el programa GoLabel
|
||||||
- Haz clic en el icono de la barra superior con forma de carpeta con una hoja.
|
- Haz clic en el icono de la barra superior con forma de carpeta con una hoja.
|
||||||
- Selecciona el archivo llamado 'model.ezp'(que seguramente este en 'Descargas') adjunto en este correo, haz clic en abrir.
|
- Selecciona el archivo llamado 'model.ezp'(que seguramente este en 'Descargas'), haz clic en abrir.
|
||||||
- Una vez abierto el archivo, haz doble click sobre el texto, en el cuadro que nos sale pulse donde esta el texto de ejemplo (En este caso "TUS HERMANOS") y nos saldra en ese mismo recuadro a la parte izquierda para editarlo y escribir lo que quiera.
|
- Una vez abierto el archivo, haz doble click sobre el texto, en el cuadro que nos sale pulse donde esta el texto de ejemplo (En este caso "TUS HERMANOS") y nos saldra en ese mismo recuadro a la parte izquierda para editarlo y escribir lo que quiera.
|
||||||
- Cuando ya tenga el texto que desee pulse en el boton 'OK'.
|
- Cuando ya tenga el texto que desee pulse en el boton 'OK'.
|
||||||
- Ve a 'Archivo' → 'Guardar Como' y guárdelo en el escritorio en el escritorio con otro nombre.
|
- Ve a 'Archivo' → 'Guardar Como' y guárdelo en el escritorio en el escritorio con otro nombre.
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
subject: Weekly time log
|
subject: Weekly time log
|
||||||
title: Record of hours week {0} year {1}
|
title: Record of hours week {0} year {1}
|
||||||
dear: Dear worker
|
dear: Dear worker
|
||||||
description: Access the following link:<br/><br/>
|
Acceda al siguiente enlace: Access the following link:<br/>
|
||||||
{0} <br/><br/>
|
description:
|
||||||
Click 'SATISFIED' if you agree with the hours worked. Otherwise, press 'NOT SATISFIED', detailing the cause of the disagreement.
|
Click 'SATISFIED' if you agree with the hours worked. Otherwise, press 'NOT SATISFIED', detailing the cause of the disagreement.
|
||||||
|
Hours: Hours
|
|
@ -1,6 +1,7 @@
|
||||||
subject: Registro de horas semanal
|
subject: Registro de horas semanal
|
||||||
title: Registro de horas semana {0} año {1}
|
title: Registro de horas semana {0} año {1}
|
||||||
dear: Estimado trabajador
|
dear: Estimado trabajador
|
||||||
description: Acceda al siguiente enlace:<br/><br/>
|
toaccess: Acceda al siguiente enlace:<br/>
|
||||||
{0} <br/><br/>
|
description:
|
||||||
Pulse 'CONFORME' si esta de acuerdo con las horas trabajadas. En caso contrario pulse 'NO CONFORME', detallando la causa de la disconformidad.
|
Pulse 'CONFORME' si esta de acuerdo con las horas trabajadas. En caso contrario pulse 'NO CONFORME', detallando la causa de la disconformidad.
|
||||||
|
Hours: Horas
|
|
@ -3,7 +3,9 @@
|
||||||
<div class="grid-block vn-pa-ml">
|
<div class="grid-block vn-pa-ml">
|
||||||
<h1>{{ $t('title', [week, year]) }}</h1>
|
<h1>{{ $t('title', [week, year]) }}</h1>
|
||||||
<p>{{$t('dear')}},</p>
|
<p>{{$t('dear')}},</p>
|
||||||
<p v-html="$t('description', [url])"></p>
|
<p v-html="$t('toaccess')"></p>
|
||||||
|
<a :href="url"><button>{{$t('Hours')}}</button></a>
|
||||||
|
<p>{{$t('description')}}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</email-body>
|
</email-body>
|
||||||
|
|
Loading…
Reference in New Issue