Merge branch 'dev' into 5507-loadConfigAtStart
This commit is contained in:
commit
37a5e6e6c6
40
CHANGELOG.md
40
CHANGELOG.md
|
@ -5,18 +5,52 @@ 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
|
## [2322.01] - 2023-06-08
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
-
|
- (Tickets -> Crear Factura) Al facturar se envia automáticamente el pdf al cliente
|
||||||
|
- (Artículos -> Histórico) Filtro para mostrar lo anterior al inventario
|
||||||
|
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- (Artículo -> Precio fijado) Modificado el buscador superior por uno lateral
|
- (Trabajadores -> Nuevo trabajador) Los clientes se crean sin 'TR' pero se añade tipo de negocio 'Trabajador'
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- (Tickets -> Líneas) Se permite hacer split de líneas al mismo ticket
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [2320.01] - 2023-05-25
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- (Tickets -> Crear Factura) Al facturar se envia automáticamente el pdf al cliente
|
||||||
|
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- (Trabajadores -> Nuevo trabajador) Los clientes se crean sin 'TR' pero se añade tipo de negocio 'Trabajador'
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
-
|
-
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## [2318.01] - 2023-05-08
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- (Usuarios -> Histórico) Nueva sección
|
||||||
|
- (Roles -> Histórico) Nueva sección
|
||||||
|
- (Trabajadores -> Dar de alta) Permite elegir el método de pago
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- (Artículo -> Precio fijado) Modificado el buscador superior por uno lateral
|
||||||
|
- (Trabajadores -> Dar de alta) Quitada obligatoriedad del iban
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- (Ticket -> Boxing) Arreglado selección de horas
|
||||||
|
- (Cesta -> Índice) Optimizada búsqueda
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## [2314.01] - 2023-04-20
|
## [2314.01] - 2023-04-20
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
|
@ -52,6 +52,7 @@ pipeline {
|
||||||
}}}
|
}}}
|
||||||
environment {
|
environment {
|
||||||
NODE_ENV = ""
|
NODE_ENV = ""
|
||||||
|
TZ = 'Europe/Madrid'
|
||||||
}
|
}
|
||||||
parallel {
|
parallel {
|
||||||
stage('Frontend') {
|
stage('Frontend') {
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -4,25 +4,25 @@ module.exports = Self => {
|
||||||
Self.remoteMethodCtx('deliveryNoteEmail', {
|
Self.remoteMethodCtx('deliveryNoteEmail', {
|
||||||
description: 'Sends the delivery note email with an docuware attached PDF',
|
description: 'Sends the delivery note email with an docuware attached PDF',
|
||||||
accessType: 'WRITE',
|
accessType: 'WRITE',
|
||||||
|
accessScopes: ['docuwareDeliveryNoteEmail'],
|
||||||
accepts: [
|
accepts: [
|
||||||
{
|
{
|
||||||
arg: 'id',
|
arg: 'id',
|
||||||
type: 'string',
|
type: 'number',
|
||||||
required: true,
|
required: true,
|
||||||
description: 'The ticket id',
|
description: 'The ticket id',
|
||||||
http: {source: 'path'}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
arg: 'recipient',
|
|
||||||
type: 'string',
|
|
||||||
description: 'The recipient email',
|
|
||||||
required: true,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
arg: 'recipientId',
|
arg: 'recipientId',
|
||||||
type: 'number',
|
type: 'number',
|
||||||
description: 'The client id',
|
description: 'The client id',
|
||||||
required: false
|
required: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
arg: 'recipient',
|
||||||
|
type: 'string',
|
||||||
|
description: 'The recipient email',
|
||||||
|
required: false,
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
returns: [
|
returns: [
|
||||||
|
@ -41,12 +41,13 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
http: {
|
http: {
|
||||||
path: '/:id/delivery-note-email',
|
path: '/delivery-note-email',
|
||||||
verb: 'POST'
|
verb: 'POST'
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.deliveryNoteEmail = async(ctx, id) => {
|
Self.deliveryNoteEmail = async(ctx, id, recipientId, recipient) => {
|
||||||
|
const models = Self.app.models;
|
||||||
const args = Object.assign({}, ctx.args);
|
const args = Object.assign({}, ctx.args);
|
||||||
const params = {
|
const params = {
|
||||||
recipient: args.recipient,
|
recipient: args.recipient,
|
||||||
|
@ -57,9 +58,14 @@ module.exports = Self => {
|
||||||
for (const param in args)
|
for (const param in args)
|
||||||
params[param] = args[param];
|
params[param] = args[param];
|
||||||
|
|
||||||
|
if (!recipient) {
|
||||||
|
client = await models.Client.findById(recipientId, {fields: ['email']});
|
||||||
|
params.recipient = client.email;
|
||||||
|
}
|
||||||
|
|
||||||
const email = new Email('delivery-note', params);
|
const email = new Email('delivery-note', params);
|
||||||
|
|
||||||
const docuwareFile = await Self.app.models.Docuware.download(ctx, id, 'deliveryNote');
|
const docuwareFile = await models.Docuware.download(ctx, id, 'deliveryNote');
|
||||||
|
|
||||||
return email.send({
|
return email.send({
|
||||||
overrideAttachments: true,
|
overrideAttachments: true,
|
||||||
|
|
|
@ -0,0 +1,130 @@
|
||||||
|
const fs = require('fs-extra');
|
||||||
|
const path = require('path');
|
||||||
|
const UserError = require('vn-loopback/util/user-error');
|
||||||
|
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethod('scrub', {
|
||||||
|
description: 'Deletes images without database reference',
|
||||||
|
accessType: 'WRITE',
|
||||||
|
accepts: [
|
||||||
|
{
|
||||||
|
arg: 'collection',
|
||||||
|
type: 'string',
|
||||||
|
description: 'The collection name',
|
||||||
|
required: true
|
||||||
|
}, {
|
||||||
|
arg: 'remove',
|
||||||
|
type: 'boolean',
|
||||||
|
description: 'Delete instead of move images to trash'
|
||||||
|
}, {
|
||||||
|
arg: 'limit',
|
||||||
|
type: 'integer',
|
||||||
|
description: 'Maximum number of images to clean'
|
||||||
|
}, {
|
||||||
|
arg: 'dryRun',
|
||||||
|
type: 'boolean',
|
||||||
|
description: 'Simulate actions'
|
||||||
|
}, {
|
||||||
|
arg: 'skipLock',
|
||||||
|
type: 'boolean',
|
||||||
|
description: 'Wether to skip exclusive lock'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
returns: {
|
||||||
|
type: 'integer',
|
||||||
|
root: true
|
||||||
|
},
|
||||||
|
http: {
|
||||||
|
path: `/scrub`,
|
||||||
|
verb: 'POST'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.scrub = async function(collection, remove, limit, dryRun, skipLock) {
|
||||||
|
const $ = Self.app.models;
|
||||||
|
|
||||||
|
const env = process.env.NODE_ENV;
|
||||||
|
dryRun = dryRun || (env && env !== 'production');
|
||||||
|
|
||||||
|
const instance = await $.ImageCollection.findOne({
|
||||||
|
fields: ['id'],
|
||||||
|
where: {name: collection}
|
||||||
|
});
|
||||||
|
if (!instance)
|
||||||
|
throw new UserError('Collection does not exist');
|
||||||
|
|
||||||
|
const container = await $.ImageContainer.container(collection);
|
||||||
|
const rootPath = container.client.root;
|
||||||
|
|
||||||
|
let tx;
|
||||||
|
let opts;
|
||||||
|
const lockName = 'salix.Image.scrub';
|
||||||
|
|
||||||
|
if (!skipLock) {
|
||||||
|
tx = await Self.beginTransaction({timeout: null});
|
||||||
|
opts = {transaction: tx};
|
||||||
|
|
||||||
|
const [row] = await Self.rawSql(
|
||||||
|
`SELECT GET_LOCK(?, 10) hasLock`, [lockName], opts);
|
||||||
|
if (!row.hasLock)
|
||||||
|
throw new UserError('Cannot obtain exclusive lock');
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const now = Date.vnNew().toJSON();
|
||||||
|
const scrubDir = path.join(rootPath, '.scrub', now);
|
||||||
|
|
||||||
|
const collectionDir = path.join(rootPath, collection);
|
||||||
|
const sizes = await fs.readdir(collectionDir);
|
||||||
|
let cleanCount = 0;
|
||||||
|
|
||||||
|
mainLoop: for (const size of sizes) {
|
||||||
|
const sizeDir = path.join(collectionDir, size);
|
||||||
|
const scrubSizeDir = path.join(scrubDir, collection, size);
|
||||||
|
const images = await fs.readdir(sizeDir);
|
||||||
|
for (const image of images) {
|
||||||
|
const imageName = path.parse(image).name;
|
||||||
|
const count = await Self.count({
|
||||||
|
collectionFk: collection,
|
||||||
|
name: imageName
|
||||||
|
}, opts);
|
||||||
|
const exists = count > 0;
|
||||||
|
let scrubDirCreated = false;
|
||||||
|
if (!exists) {
|
||||||
|
const srcFile = path.join(sizeDir, image);
|
||||||
|
if (remove !== true) {
|
||||||
|
if (!scrubDirCreated) {
|
||||||
|
if (!dryRun)
|
||||||
|
await fs.mkdir(scrubSizeDir, {recursive: true});
|
||||||
|
scrubDirCreated = true;
|
||||||
|
}
|
||||||
|
const dstFile = path.join(scrubSizeDir, image);
|
||||||
|
if (!dryRun) await fs.rename(srcFile, dstFile);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
if (!dryRun) await fs.unlink(srcFile);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanCount++;
|
||||||
|
if (limit && cleanCount == limit)
|
||||||
|
break mainLoop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return cleanCount;
|
||||||
|
} finally {
|
||||||
|
if (!skipLock) {
|
||||||
|
try {
|
||||||
|
await Self.rawSql(`DO RELEASE_LOCK(?)`, [lockName], opts);
|
||||||
|
await tx.rollback();
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
|
@ -12,13 +12,13 @@ module.exports = Self => {
|
||||||
type: 'Number',
|
type: 'Number',
|
||||||
description: 'The entity id',
|
description: 'The entity id',
|
||||||
required: true
|
required: true
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
arg: 'collection',
|
arg: 'collection',
|
||||||
type: 'string',
|
type: 'string',
|
||||||
description: 'The collection name',
|
description: 'The collection name',
|
||||||
required: true
|
required: true
|
||||||
}],
|
}
|
||||||
|
],
|
||||||
returns: {
|
returns: {
|
||||||
type: 'Object',
|
type: 'Object',
|
||||||
root: true
|
root: true
|
||||||
|
|
|
@ -23,13 +23,7 @@ module.exports = Self => {
|
||||||
let models = Self.app.models;
|
let models = Self.app.models;
|
||||||
|
|
||||||
let user = await Self.findById(userId, {
|
let user = await Self.findById(userId, {
|
||||||
fields: ['id', 'name', 'nickname', 'email', 'lang'],
|
fields: ['id', 'name', 'nickname', 'email', 'lang']
|
||||||
include: {
|
|
||||||
relation: 'userConfig',
|
|
||||||
scope: {
|
|
||||||
fields: ['darkMode']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
let roles = await models.RoleMapping.find({
|
let roles = await models.RoleMapping.find({
|
||||||
|
|
|
@ -5,6 +5,7 @@ const gm = require('gm');
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
require('../methods/image/download')(Self);
|
require('../methods/image/download')(Self);
|
||||||
require('../methods/image/upload')(Self);
|
require('../methods/image/upload')(Self);
|
||||||
|
require('../methods/image/scrub')(Self);
|
||||||
|
|
||||||
Self.resize = async function({collectionName, srcFile, fileName, entityId}) {
|
Self.resize = async function({collectionName, srcFile, fileName, entityId}) {
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
|
@ -29,13 +30,14 @@ module.exports = Self => {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Insert image row
|
// Insert image row
|
||||||
|
const imageName = path.parse(fileName).name;
|
||||||
await models.Image.upsertWithWhere(
|
await models.Image.upsertWithWhere(
|
||||||
{
|
{
|
||||||
name: fileName,
|
name: imageName,
|
||||||
collectionFk: collectionName
|
collectionFk: collectionName
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: fileName,
|
name: imageName,
|
||||||
collectionFk: collectionName,
|
collectionFk: collectionName,
|
||||||
updated: Date.vnNow() / 1000,
|
updated: Date.vnNow() / 1000,
|
||||||
}
|
}
|
||||||
|
@ -49,7 +51,7 @@ module.exports = Self => {
|
||||||
if (entity) {
|
if (entity) {
|
||||||
await entity.updateAttribute(
|
await entity.updateAttribute(
|
||||||
collection.property,
|
collection.property,
|
||||||
fileName
|
imageName
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 = 30000;
|
jasmine.jasmine.DEFAULT_TIMEOUT_INTERVAL = 90000;
|
||||||
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 ;
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
FROM mariadb:10.7.3
|
FROM mariadb:10.7.5
|
||||||
|
|
||||||
ENV MYSQL_ROOT_PASSWORD root
|
ENV MYSQL_ROOT_PASSWORD root
|
||||||
ENV TZ Europe/Madrid
|
ENV TZ Europe/Madrid
|
||||||
|
ARG MOCKDATE=2001-01-01 11:00:00
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get install -y --no-install-recommends curl ca-certificates \
|
&& apt-get install -y --no-install-recommends curl ca-certificates \
|
||||||
&& curl -sL https://apt.verdnatura.es/conf/verdnatura.gpg | apt-key add - \
|
&& curl -sL https://apt.verdnatura.es/conf/verdnatura.gpg | apt-key add - \
|
||||||
|
@ -31,14 +32,15 @@ COPY \
|
||||||
import-changes.sh \
|
import-changes.sh \
|
||||||
config.ini \
|
config.ini \
|
||||||
dump/mysqlPlugins.sql \
|
dump/mysqlPlugins.sql \
|
||||||
dump/mockDate.sql \
|
|
||||||
dump/structure.sql \
|
dump/structure.sql \
|
||||||
|
dump/mockDate.sql \
|
||||||
dump/dumpedFixtures.sql \
|
dump/dumpedFixtures.sql \
|
||||||
./
|
./
|
||||||
RUN gosu mysql docker-init.sh \
|
RUN gosu mysql docker-init.sh \
|
||||||
&& docker-dump.sh mysqlPlugins \
|
&& docker-dump.sh mysqlPlugins \
|
||||||
&& docker-dump.sh mockDate \
|
|
||||||
&& docker-dump.sh structure \
|
&& docker-dump.sh structure \
|
||||||
|
&& sed -i -e 's/@mockDate/'"$MOCKDATE"'/g' mockDate.sql \
|
||||||
|
&& docker-dump.sh mockDate \
|
||||||
&& docker-dump.sh dumpedFixtures \
|
&& docker-dump.sh dumpedFixtures \
|
||||||
&& gosu mysql docker-temp-stop.sh
|
&& gosu mysql docker-temp-stop.sh
|
||||||
|
|
||||||
|
|
|
@ -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 ;
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE `vn`.`printQueueArgs` MODIFY COLUMN value varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci NULL;
|
|
@ -1,12 +1,5 @@
|
||||||
DROP TABLE IF EXISTS `vn`.`dmsRecover`;
|
DROP TABLE IF EXISTS `vn`.`dmsRecover`;
|
||||||
|
DROP PROCEDURE IF EXISTS `vn`.`route_getTickets`;
|
||||||
ALTER TABLE `vn`.`delivery` DROP COLUMN addressFk;
|
|
||||||
ALTER TABLE `vn`.`delivery` DROP CONSTRAINT delivery_ticketFk_FK;
|
|
||||||
ALTER TABLE `vn`.`delivery` DROP COLUMN ticketFk;
|
|
||||||
ALTER TABLE `vn`.`delivery` ADD ticketFk INT DEFAULT NULL;
|
|
||||||
ALTER TABLE `vn`.`delivery` ADD CONSTRAINT delivery_ticketFk_FK FOREIGN KEY (`ticketFk`) REFERENCES `vn`.`ticket`(`id`);
|
|
||||||
|
|
||||||
DROP PROCEDURE IF EXISTS vn.route_getTickets;
|
|
||||||
|
|
||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
$$
|
$$
|
||||||
|
@ -17,14 +10,14 @@ BEGIN
|
||||||
* de sus tickets.
|
* de sus tickets.
|
||||||
*
|
*
|
||||||
* @param vRouteFk
|
* @param vRouteFk
|
||||||
*
|
|
||||||
* @select Información de los tickets
|
* @select Información de los tickets
|
||||||
*/
|
*/
|
||||||
|
SELECT *
|
||||||
SELECT
|
FROM (
|
||||||
t.id Id,
|
SELECT t.id Id,
|
||||||
t.clientFk Client,
|
t.clientFk Client,
|
||||||
a.id Address,
|
a.id Address,
|
||||||
|
a.nickname ClientName,
|
||||||
t.packages Packages,
|
t.packages Packages,
|
||||||
a.street AddressName,
|
a.street AddressName,
|
||||||
a.postalCode PostalCode,
|
a.postalCode PostalCode,
|
||||||
|
@ -37,34 +30,48 @@ BEGIN
|
||||||
d.longitude Longitude,
|
d.longitude Longitude,
|
||||||
d.latitude Latitude,
|
d.latitude Latitude,
|
||||||
wm.mediaValue SalePersonPhone,
|
wm.mediaValue SalePersonPhone,
|
||||||
tob.Note Note,
|
tob.description Note,
|
||||||
t.isSigned Signed
|
t.isSigned Signed,
|
||||||
|
t.priority
|
||||||
FROM ticket t
|
FROM ticket t
|
||||||
JOIN client c ON t.clientFk = c.id
|
JOIN client c ON t.clientFk = c.id
|
||||||
JOIN address a ON t.addressFk = a.id
|
JOIN address a ON t.addressFk = a.id
|
||||||
LEFT JOIN delivery d ON t.id = d.ticketFk
|
LEFT JOIN delivery d ON d.ticketFk = t.id
|
||||||
LEFT JOIN workerMedia wm ON wm.workerFk = c.salesPersonFk
|
LEFT JOIN workerMedia wm ON wm.workerFk = c.salesPersonFk
|
||||||
LEFT JOIN
|
LEFT JOIN(
|
||||||
(SELECT tob.description Note, t.id
|
SELECT tob.description, t.id
|
||||||
FROM ticketObservation tob
|
FROM ticketObservation tob
|
||||||
JOIN ticket t ON tob.ticketFk = t.id
|
JOIN ticket t ON tob.ticketFk = t.id
|
||||||
JOIN observationType ot ON ot.id = tob.observationTypeFk
|
JOIN observationType ot ON ot.id = tob.observationTypeFk
|
||||||
WHERE t.routeFk = vRouteFk
|
WHERE t.routeFk = vRouteFk
|
||||||
AND ot.code = 'delivery'
|
AND ot.code = 'delivery'
|
||||||
)tob ON tob.id = t.id
|
)tob ON tob.id = t.id
|
||||||
LEFT JOIN
|
LEFT JOIN(
|
||||||
(SELECT sub.ticketFk,
|
SELECT sub.ticketFk,
|
||||||
CONCAT('(', GROUP_CONCAT(DISTINCT sub.itemPackingTypeFk ORDER BY sub.items DESC SEPARATOR ','), ') ') itemPackingTypeFk
|
CONCAT('(',
|
||||||
FROM (SELECT s.ticketFk , i.itemPackingTypeFk, COUNT(*) items
|
GROUP_CONCAT(DISTINCT sub.itemPackingTypeFk
|
||||||
|
ORDER BY sub.items DESC SEPARATOR ','),
|
||||||
|
') ') itemPackingTypeFk
|
||||||
|
FROM (
|
||||||
|
SELECT s.ticketFk, i.itemPackingTypeFk, COUNT(*) items
|
||||||
FROM ticket t
|
FROM ticket 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
|
||||||
WHERE t.routeFk = vRouteFk
|
WHERE t.routeFk = vRouteFk
|
||||||
GROUP BY t.id,i.itemPackingTypeFk)sub
|
GROUP BY t.id, i.itemPackingTypeFk
|
||||||
|
)sub
|
||||||
GROUP BY sub.ticketFk
|
GROUP BY sub.ticketFk
|
||||||
) sub2 ON sub2.ticketFk = t.id
|
)sub2 ON sub2.ticketFk = t.id
|
||||||
WHERE t.routeFk = vRouteFk
|
WHERE t.routeFk = vRouteFk
|
||||||
GROUP BY t.id
|
ORDER BY d.id DESC
|
||||||
ORDER BY t.priority;
|
LIMIT 10000000000000000000
|
||||||
|
)sub3
|
||||||
|
GROUP BY sub3.id
|
||||||
|
ORDER BY sub3.priority;
|
||||||
END$$
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
||||||
|
ALTER TABLE `vn`.`delivery` DROP FOREIGN KEY delivery_ticketFk_FK;
|
||||||
|
ALTER TABLE `vn`.`delivery` DROP COLUMN ticketFk;
|
||||||
|
ALTER TABLE `vn`.`delivery` ADD ticketFk INT DEFAULT NULL;
|
||||||
|
ALTER TABLE `vn`.`delivery` ADD CONSTRAINT delivery_ticketFk_FK FOREIGN KEY (`ticketFk`) REFERENCES `vn`.`ticket`(`id`);
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
UPDATE `salix`.`ACL`
|
||||||
|
SET model = 'InvoiceOut'
|
||||||
|
WHERE property IN ('negativeBases', 'negativeBasesCsv');
|
|
@ -1,21 +0,0 @@
|
||||||
create or replace definer = root@localhost view User as
|
|
||||||
select `account`.`user`.`id` AS `id`,
|
|
||||||
`account`.`user`.`realm` AS `realm`,
|
|
||||||
`account`.`user`.`name` AS `name`,
|
|
||||||
`account`.`user`.`nickname` AS `nickname`,
|
|
||||||
`account`.`user`.`bcryptPassword` AS `password`,
|
|
||||||
`account`.`user`.`role` AS `role`,
|
|
||||||
`account`.`user`.`active` AS `active`,
|
|
||||||
`account`.`user`.`email` AS `email`,
|
|
||||||
`account`.`user`.`emailVerified` AS `emailVerified`,
|
|
||||||
`account`.`user`.`verificationToken` AS `verificationToken`,
|
|
||||||
`account`.`user`.`lang` AS `lang`,
|
|
||||||
`account`.`user`.`lastPassChange` AS `lastPassChange`,
|
|
||||||
`account`.`user`.`created` AS `created`,
|
|
||||||
`account`.`user`.`updated` AS `updated`,
|
|
||||||
`account`.`user`.`image` AS `image`,
|
|
||||||
`account`.`user`.`recoverPass` AS `recoverPass`,
|
|
||||||
`account`.`user`.`sync` AS `sync`,
|
|
||||||
`account`.`user`.`hasGrant` AS `hasGrant`
|
|
||||||
from `account`.`user`;
|
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
|
||||||
|
VALUES ('ClientInforma', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('ClientInforma', '*', 'WRITE', 'ALLOW', 'ROLE', 'financial');
|
|
@ -0,0 +1,3 @@
|
||||||
|
INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
|
||||||
|
VALUES
|
||||||
|
('Receipt', 'receiptEmail', '*', 'ALLOW', 'ROLE', 'salesAssistant');
|
|
@ -0,0 +1,16 @@
|
||||||
|
ALTER TABLE `vn`.`client` ADD rating INT UNSIGNED DEFAULT NULL NULL COMMENT 'información proporcionada por Informa';
|
||||||
|
ALTER TABLE `vn`.`client` ADD recommendedCredit INT UNSIGNED DEFAULT NULL NULL COMMENT 'información proporcionada por Informa';
|
||||||
|
|
||||||
|
CREATE TABLE `vn`.`clientInforma` (
|
||||||
|
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
`clientFk` int(11) NOT NULL,
|
||||||
|
`rating` int(10) unsigned DEFAULT NULL,
|
||||||
|
`recommendedCredit` int(10) unsigned DEFAULT NULL,
|
||||||
|
`workerFk` int(10) unsigned NOT NULL,
|
||||||
|
`created` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||||
|
PRIMARY KEY (`id`),
|
||||||
|
KEY `informaWorkers_fk_idx` (`workerFk`),
|
||||||
|
KEY `informaClientFk` (`clientFk`),
|
||||||
|
CONSTRAINT `informa_ClienteFk` FOREIGN KEY (`clientFk`) REFERENCES `client` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||||
|
CONSTRAINT `informa_workers_fk` FOREIGN KEY (`workerFk`) REFERENCES `worker` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
|
||||||
|
) ENGINE=InnoDB CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci COMMENT='información proporcionada por Informa, se actualiza desde el hook de client (salix)';
|
|
@ -0,0 +1,64 @@
|
||||||
|
DELETE FROM `salix`.`ACL` WHERE id=7;
|
||||||
|
|
||||||
|
INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
|
||||||
|
VALUES
|
||||||
|
('Client', 'setRating', 'WRITE', 'ALLOW', 'ROLE', 'financial');
|
||||||
|
|
||||||
|
INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId)
|
||||||
|
VALUES
|
||||||
|
('Client', '*', 'READ', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'addressesPropagateRe', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'canBeInvoiced', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'canCreateTicket', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'consumption', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'createAddress', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'createWithUser', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'extendedListFilter', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'getAverageInvoiced', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'getCard', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'getDebt', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'getMana', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'transactions', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'hasCustomerRole', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'isValidClient', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'lastActiveTickets', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'sendSms', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'setPassword', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'summary', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'updateAddress', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'updateFiscalData', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'updateUser', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'uploadFile', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'campaignMetricsPdf', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'campaignMetricsEmail', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'clientWelcomeHtml', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'clientWelcomeEmail', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'printerSetupHtml', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'printerSetupEmail', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'sepaCoreEmail', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'letterDebtorPdf', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'letterDebtorStHtml', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'letterDebtorStEmail', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'letterDebtorNdHtml', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'letterDebtorNdEmail', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'clientDebtStatementPdf', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'clientDebtStatementHtml', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'clientDebtStatementEmail', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'creditRequestPdf', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'creditRequestHtml', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'creditRequestEmail', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'incotermsAuthorizationPdf', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'incotermsAuthorizationHtml', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'incotermsAuthorizationEmail', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'consumptionSendQueued', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'filter', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'getClientOrSupplierReference', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'upsert', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'create', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'replaceById', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'updateAttributes', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'updateAttributes', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'deleteById', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'replaceOrCreate', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'updateAll', '*', 'ALLOW', 'ROLE', 'employee'),
|
||||||
|
('Client', 'upsertWithWhere', '*', 'ALLOW', 'ROLE', 'employee');
|
|
@ -0,0 +1,2 @@
|
||||||
|
DROP PROCEDURE `vn`.`refund`;
|
||||||
|
DROP PROCEDURE `vn`.`ticket_doRefund`;
|
|
@ -0,0 +1,5 @@
|
||||||
|
DROP TRIGGER `vn`.`deviceProduction_afterInsert`;
|
||||||
|
DROP TRIGGER `vn`.`deviceProduction_afterUpdate`;
|
||||||
|
|
||||||
|
DROP TRIGGER `vn`.`deviceProductionUser_afterDelete`;
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE `vn`.`entry` DROP COLUMN `notes`;
|
|
@ -0,0 +1,9 @@
|
||||||
|
-- vn.companyI18n definition
|
||||||
|
CREATE TABLE `vn`.`companyI18n` (
|
||||||
|
`companyFk` smallint(5) unsigned NOT NULL,
|
||||||
|
`lang` char(2) CHARACTER SET utf8mb3 NOT NULL,
|
||||||
|
`footnotes` longtext COLLATE utf8mb3_unicode_ci DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`companyFk`,`lang`),
|
||||||
|
CONSTRAINT `companyI18n_FK` FOREIGN KEY (`companyFk`) REFERENCES `company` (`id`) ON UPDATE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci;
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE `vn`.`company` ADD `web` varchar(100) NULL;
|
|
@ -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);
|
|
@ -0,0 +1,12 @@
|
||||||
|
-- vn.companyL10n source
|
||||||
|
|
||||||
|
CREATE OR REPLACE
|
||||||
|
ALGORITHM = UNDEFINED VIEW `vn`.`companyL10n` AS
|
||||||
|
select
|
||||||
|
`c`.`id` AS `id`,
|
||||||
|
ifnull(`ci`.`footnotes`, `c`.`footnotes`) AS `footnotes`
|
||||||
|
from
|
||||||
|
(`vn`.`company` `c`
|
||||||
|
left join `vn`.`companyI18n` `ci` on
|
||||||
|
(`ci`.`companyFk` = `c`.`id`
|
||||||
|
and `ci`.`lang` = `util`.`LANG`()));
|
|
@ -0,0 +1,73 @@
|
||||||
|
DELIMITER $$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`clientCreate`(
|
||||||
|
vFirstname VARCHAR(50),
|
||||||
|
vSurnames VARCHAR(50),
|
||||||
|
vFi VARCHAR(9),
|
||||||
|
vAddress TEXT,
|
||||||
|
vPostcode CHAR(5),
|
||||||
|
vCity VARCHAR(25),
|
||||||
|
vProvinceFk SMALLINT(5),
|
||||||
|
vCompanyFk SMALLINT(5),
|
||||||
|
vPhone VARCHAR(11),
|
||||||
|
vEmail VARCHAR(255),
|
||||||
|
vUserFk INT)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Create new client
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
DECLARE vPayMethodFk INT DEFAULT 4;
|
||||||
|
DECLARE vDueDay INT DEFAULT 5;
|
||||||
|
DECLARE vDefaultCredit DECIMAL(10, 2) DEFAULT 300.00;
|
||||||
|
DECLARE vIsTaxDataChecked TINYINT(1) DEFAULT 1;
|
||||||
|
DECLARE vHasCoreVnl BOOLEAN DEFAULT TRUE;
|
||||||
|
DECLARE vMandateTypeFk INT DEFAULT 2;
|
||||||
|
|
||||||
|
INSERT INTO `client` (
|
||||||
|
id,
|
||||||
|
name,
|
||||||
|
street,
|
||||||
|
fi,
|
||||||
|
phone,
|
||||||
|
email,
|
||||||
|
provinceFk,
|
||||||
|
city,
|
||||||
|
postcode,
|
||||||
|
socialName,
|
||||||
|
payMethodFk,
|
||||||
|
dueDay,
|
||||||
|
credit,
|
||||||
|
isTaxDataChecked,
|
||||||
|
hasCoreVnl,
|
||||||
|
isEqualizated)
|
||||||
|
VALUES (
|
||||||
|
vUserFk,
|
||||||
|
CONCAT(vFirstname, ' ', vSurnames),
|
||||||
|
vAddress,
|
||||||
|
TRIM(vFi),
|
||||||
|
vPhone,
|
||||||
|
vEmail,
|
||||||
|
vProvinceFk,
|
||||||
|
vCity,
|
||||||
|
vPostcode,
|
||||||
|
CONCAT(vSurnames, ' ', vFirstname),
|
||||||
|
vPayMethodFk,
|
||||||
|
vDueDay,
|
||||||
|
vDefaultCredit,
|
||||||
|
vIsTaxDataChecked,
|
||||||
|
vHasCoreVnl,
|
||||||
|
FALSE
|
||||||
|
) ON duplicate key update
|
||||||
|
payMethodFk = vPayMethodFk,
|
||||||
|
dueDay = vDueDay,
|
||||||
|
credit = vDefaultCredit,
|
||||||
|
isTaxDataChecked = vIsTaxDataChecked,
|
||||||
|
hasCoreVnl = vHasCoreVnl,
|
||||||
|
isActive = TRUE;
|
||||||
|
|
||||||
|
IF (SELECT COUNT(*) FROM mandate WHERE clientFk = vUserFk AND companyFk = vCompanyFk AND mandateTypeFk = vMandateTypeFk) = 0 THEN
|
||||||
|
INSERT INTO mandate (clientFk, companyFk, mandateTypeFk)
|
||||||
|
VALUES (vUserFk, vCompanyFk, vMandateTypeFk);
|
||||||
|
END IF;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -0,0 +1,14 @@
|
||||||
|
INSERT INTO `vn`.`businessType` (`code`, `description`)
|
||||||
|
VALUES ('worker','Trabajador');
|
||||||
|
|
||||||
|
ALTER TABLE `vn`.`workerConfig` ADD businessTypeFk varchar(100) NULL
|
||||||
|
COMMENT 'Tipo de negocio por defecto al dar de alta un trabajador nuevo';
|
||||||
|
|
||||||
|
UPDATE `vn`.`workerConfig`
|
||||||
|
SET businessTypeFk = 'worker'
|
||||||
|
WHERE id = 1;
|
||||||
|
|
||||||
|
UPDATE `vn`.`client` c
|
||||||
|
JOIN `vn`.`worker` w ON w.id = c.id
|
||||||
|
SET c.name = REPLACE(c.name, 'TR ', ''),
|
||||||
|
c.businessTypeFk = 'worker';
|
|
@ -0,0 +1,254 @@
|
||||||
|
DROP PROCEDURE IF EXISTS `vn`.`invoiceOut_new`;
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
$$
|
||||||
|
CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`invoiceOut_new`(
|
||||||
|
vSerial VARCHAR(255),
|
||||||
|
vInvoiceDate DATE,
|
||||||
|
vTaxArea VARCHAR(25),
|
||||||
|
OUT vNewInvoiceId INT)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Creación de facturas emitidas.
|
||||||
|
* requiere previamente tabla tmp.ticketToInvoice(id).
|
||||||
|
*
|
||||||
|
* @param vSerial serie a la cual se hace la factura
|
||||||
|
* @param vInvoiceDate fecha de la factura
|
||||||
|
* @param vTaxArea tipo de iva en relacion a la empresa y al cliente
|
||||||
|
* @param vNewInvoiceId id de la factura que se acaba de generar
|
||||||
|
* @return vNewInvoiceId
|
||||||
|
*/
|
||||||
|
DECLARE vIsAnySaleToInvoice BOOL;
|
||||||
|
DECLARE vIsAnyServiceToInvoice BOOL;
|
||||||
|
DECLARE vNewRef VARCHAR(255);
|
||||||
|
DECLARE vWorker INT DEFAULT account.myUser_getId();
|
||||||
|
DECLARE vCompanyFk INT;
|
||||||
|
DECLARE vInterCompanyFk INT;
|
||||||
|
DECLARE vClientFk INT;
|
||||||
|
DECLARE vCplusStandardInvoiceTypeFk INT DEFAULT 1;
|
||||||
|
DECLARE vCplusCorrectingInvoiceTypeFk INT DEFAULT 6;
|
||||||
|
DECLARE vCplusSimplifiedInvoiceTypeFk INT DEFAULT 2;
|
||||||
|
DECLARE vCorrectingSerial VARCHAR(1) DEFAULT 'R';
|
||||||
|
DECLARE vSimplifiedSerial VARCHAR(1) DEFAULT 'S';
|
||||||
|
DECLARE vNewInvoiceInFk INT;
|
||||||
|
DECLARE vIsInterCompany BOOL DEFAULT FALSE;
|
||||||
|
DECLARE vIsCEESerial BOOL DEFAULT FALSE;
|
||||||
|
DECLARE vIsCorrectInvoiceDate BOOL;
|
||||||
|
DECLARE vMaxShipped DATE;
|
||||||
|
|
||||||
|
SET vInvoiceDate = IFNULL(vInvoiceDate, util.VN_CURDATE());
|
||||||
|
|
||||||
|
SELECT t.clientFk,
|
||||||
|
t.companyFk,
|
||||||
|
MAX(DATE(t.shipped)),
|
||||||
|
DATE(vInvoiceDate) >= invoiceOut_getMaxIssued(
|
||||||
|
vSerial,
|
||||||
|
t.companyFk,
|
||||||
|
YEAR(vInvoiceDate))
|
||||||
|
INTO vClientFk,
|
||||||
|
vCompanyFk,
|
||||||
|
vMaxShipped,
|
||||||
|
vIsCorrectInvoiceDate
|
||||||
|
FROM tmp.ticketToInvoice tt
|
||||||
|
JOIN ticket t ON t.id = tt.id;
|
||||||
|
|
||||||
|
IF(vMaxShipped > vInvoiceDate) THEN
|
||||||
|
CALL util.throw("Invoice date can't be less than max date");
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF NOT vIsCorrectInvoiceDate THEN
|
||||||
|
CALL util.throw('Exists an invoice with a previous date');
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Eliminem de tmp.ticketToInvoice els tickets que no han de ser facturats
|
||||||
|
DELETE ti.*
|
||||||
|
FROM tmp.ticketToInvoice ti
|
||||||
|
JOIN ticket t ON t.id = ti.id
|
||||||
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
|
JOIN item i ON i.id = s.itemFk
|
||||||
|
JOIN supplier su ON su.id = t.companyFk
|
||||||
|
JOIN client c ON c.id = t.clientFk
|
||||||
|
LEFT JOIN itemTaxCountry itc ON itc.itemFk = i.id AND itc.countryFk = su.countryFk
|
||||||
|
WHERE (YEAR(t.shipped) < 2001 AND t.isDeleted)
|
||||||
|
OR c.isTaxDataChecked = FALSE
|
||||||
|
OR t.isDeleted
|
||||||
|
OR c.hasToInvoice = FALSE
|
||||||
|
OR itc.id IS NULL;
|
||||||
|
|
||||||
|
SELECT SUM(s.quantity * s.price * (100 - s.discount)/100) <> 0
|
||||||
|
INTO vIsAnySaleToInvoice
|
||||||
|
FROM tmp.ticketToInvoice t
|
||||||
|
JOIN sale s ON s.ticketFk = t.id;
|
||||||
|
|
||||||
|
SELECT COUNT(*) > 0 INTO vIsAnyServiceToInvoice
|
||||||
|
FROM tmp.ticketToInvoice t
|
||||||
|
JOIN ticketService ts ON ts.ticketFk = t.id;
|
||||||
|
|
||||||
|
IF (vIsAnySaleToInvoice OR vIsAnyServiceToInvoice)
|
||||||
|
AND (vCorrectingSerial = vSerial OR NOT hasAnyNegativeBase())
|
||||||
|
THEN
|
||||||
|
|
||||||
|
-- el trigger añade el siguiente Id_Factura correspondiente a la vSerial
|
||||||
|
INSERT INTO invoiceOut(
|
||||||
|
ref,
|
||||||
|
serial,
|
||||||
|
issued,
|
||||||
|
clientFk,
|
||||||
|
dued,
|
||||||
|
companyFk,
|
||||||
|
cplusInvoiceType477Fk
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
1,
|
||||||
|
vSerial,
|
||||||
|
vInvoiceDate,
|
||||||
|
vClientFk,
|
||||||
|
getDueDate(vInvoiceDate, dueDay),
|
||||||
|
vCompanyFk,
|
||||||
|
IF(vSerial = vCorrectingSerial,
|
||||||
|
vCplusCorrectingInvoiceTypeFk,
|
||||||
|
IF(vSerial = vSimplifiedSerial,
|
||||||
|
vCplusSimplifiedInvoiceTypeFk,
|
||||||
|
vCplusStandardInvoiceTypeFk))
|
||||||
|
FROM client
|
||||||
|
WHERE id = vClientFk;
|
||||||
|
|
||||||
|
SET vNewInvoiceId = LAST_INSERT_ID();
|
||||||
|
|
||||||
|
SELECT `ref`
|
||||||
|
INTO vNewRef
|
||||||
|
FROM invoiceOut
|
||||||
|
WHERE id = vNewInvoiceId;
|
||||||
|
|
||||||
|
UPDATE ticket t
|
||||||
|
JOIN tmp.ticketToInvoice ti ON ti.id = t.id
|
||||||
|
SET t.refFk = vNewRef;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.updateInter;
|
||||||
|
CREATE TEMPORARY TABLE tmp.updateInter ENGINE = MEMORY
|
||||||
|
SELECT s.id,ti.id ticket_id,vWorker Id_Trabajador
|
||||||
|
FROM tmp.ticketToInvoice ti
|
||||||
|
LEFT JOIN ticketState ts ON ti.id = ts.ticket
|
||||||
|
JOIN state s
|
||||||
|
WHERE IFNULL(ts.alertLevel,0) < 3 and s.`code` = getAlert3State(ti.id);
|
||||||
|
|
||||||
|
INSERT INTO ticketTracking(stateFk,ticketFk,workerFk)
|
||||||
|
SELECT * FROM tmp.updateInter;
|
||||||
|
|
||||||
|
CALL invoiceExpenceMake(vNewInvoiceId);
|
||||||
|
CALL invoiceTaxMake(vNewInvoiceId,vTaxArea);
|
||||||
|
|
||||||
|
UPDATE invoiceOut io
|
||||||
|
JOIN (
|
||||||
|
SELECT SUM(amount) total
|
||||||
|
FROM invoiceOutExpence
|
||||||
|
WHERE invoiceOutFk = vNewInvoiceId
|
||||||
|
) base
|
||||||
|
JOIN (
|
||||||
|
SELECT SUM(vat) total
|
||||||
|
FROM invoiceOutTax
|
||||||
|
WHERE invoiceOutFk = vNewInvoiceId
|
||||||
|
) vat
|
||||||
|
SET io.amount = base.total + vat.total
|
||||||
|
WHERE io.id = vNewInvoiceId;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE tmp.updateInter;
|
||||||
|
|
||||||
|
SELECT COUNT(*), id
|
||||||
|
INTO vIsInterCompany, vInterCompanyFk
|
||||||
|
FROM company
|
||||||
|
WHERE clientFk = vClientFk;
|
||||||
|
|
||||||
|
IF (vIsInterCompany) THEN
|
||||||
|
|
||||||
|
INSERT INTO invoiceIn(supplierFk, supplierRef, issued, companyFk)
|
||||||
|
SELECT vCompanyFk, vNewRef, vInvoiceDate, vInterCompanyFk;
|
||||||
|
|
||||||
|
SET vNewInvoiceInFk = LAST_INSERT_ID();
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.ticket;
|
||||||
|
CREATE TEMPORARY TABLE tmp.ticket
|
||||||
|
(KEY (ticketFk))
|
||||||
|
ENGINE = MEMORY
|
||||||
|
SELECT id ticketFk
|
||||||
|
FROM tmp.ticketToInvoice;
|
||||||
|
|
||||||
|
CALL `ticket_getTax`('NATIONAL');
|
||||||
|
|
||||||
|
SET @vTaxableBaseServices := 0.00;
|
||||||
|
SET @vTaxCodeGeneral := NULL;
|
||||||
|
|
||||||
|
INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenceFk, taxTypeSageFk, transactionTypeSageFk)
|
||||||
|
SELECT vNewInvoiceInFk,
|
||||||
|
@vTaxableBaseServices,
|
||||||
|
sub.expenceFk,
|
||||||
|
sub.taxTypeSageFk,
|
||||||
|
sub.transactionTypeSageFk
|
||||||
|
FROM (
|
||||||
|
SELECT @vTaxableBaseServices := SUM(tst.taxableBase) taxableBase,
|
||||||
|
i.expenceFk,
|
||||||
|
i.taxTypeSageFk,
|
||||||
|
i.transactionTypeSageFk,
|
||||||
|
@vTaxCodeGeneral := i.taxClassCodeFk
|
||||||
|
FROM tmp.ticketServiceTax tst
|
||||||
|
JOIN invoiceOutTaxConfig i ON i.taxClassCodeFk = tst.code
|
||||||
|
WHERE i.isService
|
||||||
|
HAVING taxableBase
|
||||||
|
) sub;
|
||||||
|
|
||||||
|
INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenceFk, taxTypeSageFk, transactionTypeSageFk)
|
||||||
|
SELECT vNewInvoiceInFk,
|
||||||
|
SUM(tt.taxableBase) - IF(tt.code = @vTaxCodeGeneral,
|
||||||
|
@vTaxableBaseServices, 0) taxableBase,
|
||||||
|
i.expenceFk,
|
||||||
|
i.taxTypeSageFk ,
|
||||||
|
i.transactionTypeSageFk
|
||||||
|
FROM tmp.ticketTax tt
|
||||||
|
JOIN invoiceOutTaxConfig i ON i.taxClassCodeFk = tt.code
|
||||||
|
WHERE !i.isService
|
||||||
|
GROUP BY tt.pgcFk
|
||||||
|
HAVING taxableBase
|
||||||
|
ORDER BY tt.priority;
|
||||||
|
|
||||||
|
CALL invoiceInDueDay_calculate(vNewInvoiceInFk);
|
||||||
|
|
||||||
|
SELECT COUNT(*) INTO vIsCEESerial
|
||||||
|
FROM invoiceOutSerial
|
||||||
|
WHERE code = vSerial;
|
||||||
|
|
||||||
|
IF vIsCEESerial THEN
|
||||||
|
|
||||||
|
INSERT INTO invoiceInIntrastat (
|
||||||
|
invoiceInFk,
|
||||||
|
intrastatFk,
|
||||||
|
amount,
|
||||||
|
stems,
|
||||||
|
countryFk,
|
||||||
|
net)
|
||||||
|
SELECT
|
||||||
|
vNewInvoiceInFk,
|
||||||
|
i.intrastatFk,
|
||||||
|
SUM(CAST((s.quantity * s.price * (100 - s.discount) / 100 ) AS DECIMAL(10, 2))),
|
||||||
|
SUM(CAST(IFNULL(i.stems, 1) * s.quantity AS DECIMAL(10, 2))),
|
||||||
|
su.countryFk,
|
||||||
|
CAST(SUM(IFNULL(i.stems, 1)
|
||||||
|
* s.quantity
|
||||||
|
* IF(ic.grams, ic.grams, IFNULL(i.weightByPiece, 0)) / 1000) AS DECIMAL(10, 2))
|
||||||
|
FROM sale s
|
||||||
|
JOIN ticket t ON s.ticketFk = t.id
|
||||||
|
JOIN supplier su ON su.id = t.companyFk
|
||||||
|
JOIN item i ON i.id = s.itemFk
|
||||||
|
LEFT JOIN itemCost ic ON ic.itemFk = i.id AND ic.warehouseFk = t.warehouseFk
|
||||||
|
WHERE t.refFk = vNewRef
|
||||||
|
GROUP BY i.intrastatFk;
|
||||||
|
|
||||||
|
END IF;
|
||||||
|
DROP TEMPORARY TABLE tmp.ticket;
|
||||||
|
DROP TEMPORARY TABLE tmp.ticketAmount;
|
||||||
|
DROP TEMPORARY TABLE tmp.ticketTax;
|
||||||
|
DROP TEMPORARY TABLE tmp.ticketServiceTax;
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
DROP TEMPORARY TABLE `tmp`.`ticketToInvoice`;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -0,0 +1,127 @@
|
||||||
|
DELIMITER $$
|
||||||
|
$$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_canAdvance`(vDateFuture DATE, vDateToAdvance DATE, vWarehouseFk INT)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Devuelve los tickets y la cantidad de lineas de venta que se pueden adelantar.
|
||||||
|
*
|
||||||
|
* @param vDateFuture Fecha de los tickets que se quieren adelantar.
|
||||||
|
* @param vDateToAdvance Fecha a cuando se quiere adelantar.
|
||||||
|
* @param vWarehouseFk Almacén
|
||||||
|
*/
|
||||||
|
|
||||||
|
DECLARE vDateInventory DATE;
|
||||||
|
|
||||||
|
SELECT inventoried INTO vDateInventory FROM config;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.stock;
|
||||||
|
CREATE TEMPORARY TABLE tmp.stock
|
||||||
|
(itemFk INT PRIMARY KEY,
|
||||||
|
amount INT)
|
||||||
|
ENGINE = MEMORY;
|
||||||
|
|
||||||
|
INSERT INTO tmp.stock(itemFk, amount)
|
||||||
|
SELECT itemFk, SUM(quantity) amount FROM
|
||||||
|
(
|
||||||
|
SELECT itemFk, quantity
|
||||||
|
FROM itemTicketOut
|
||||||
|
WHERE shipped >= vDateInventory
|
||||||
|
AND shipped < vDateFuture
|
||||||
|
AND warehouseFk = vWarehouseFk
|
||||||
|
UNION ALL
|
||||||
|
SELECT itemFk, quantity
|
||||||
|
FROM itemEntryIn
|
||||||
|
WHERE landed >= vDateInventory
|
||||||
|
AND landed < vDateFuture
|
||||||
|
AND isVirtualStock = FALSE
|
||||||
|
AND warehouseInFk = vWarehouseFk
|
||||||
|
UNION ALL
|
||||||
|
SELECT itemFk, quantity
|
||||||
|
FROM itemEntryOut
|
||||||
|
WHERE shipped >= vDateInventory
|
||||||
|
AND shipped < vDateFuture
|
||||||
|
AND warehouseOutFk = vWarehouseFk
|
||||||
|
) t
|
||||||
|
GROUP BY itemFk HAVING amount != 0;
|
||||||
|
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.filter;
|
||||||
|
CREATE TEMPORARY TABLE tmp.filter
|
||||||
|
(INDEX (id))
|
||||||
|
SELECT
|
||||||
|
origin.ticketFk futureId,
|
||||||
|
dest.ticketFk id,
|
||||||
|
dest.state,
|
||||||
|
origin.futureState,
|
||||||
|
origin.futureIpt,
|
||||||
|
dest.ipt,
|
||||||
|
origin.workerFk,
|
||||||
|
origin.futureLiters,
|
||||||
|
origin.futureLines,
|
||||||
|
dest.shipped,
|
||||||
|
origin.shipped futureShipped,
|
||||||
|
dest.totalWithVat,
|
||||||
|
origin.totalWithVat futureTotalWithVat,
|
||||||
|
dest.agency,
|
||||||
|
origin.futureAgency,
|
||||||
|
dest.lines,
|
||||||
|
dest.liters,
|
||||||
|
origin.futureLines - origin.hasStock AS notMovableLines,
|
||||||
|
(origin.futureLines = origin.hasStock) AS isFullMovable,
|
||||||
|
origin.classColor,
|
||||||
|
dest.classColor futureClassColor
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
s.ticketFk,
|
||||||
|
t.workerFk,
|
||||||
|
t.shipped,
|
||||||
|
t.totalWithVat,
|
||||||
|
st.name futureState,
|
||||||
|
t.addressFk,
|
||||||
|
am.name futureAgency,
|
||||||
|
count(s.id) futureLines,
|
||||||
|
GROUP_CONCAT(DISTINCT ipt.code ORDER BY ipt.code) futureIpt,
|
||||||
|
CAST(SUM(litros) AS DECIMAL(10,0)) futureLiters,
|
||||||
|
SUM((s.quantity <= IFNULL(st.amount,0))) hasStock,
|
||||||
|
st.classColor
|
||||||
|
FROM ticket t
|
||||||
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
|
JOIN saleVolume sv ON sv.saleFk = s.id
|
||||||
|
JOIN item i ON i.id = s.itemFk
|
||||||
|
JOIN ticketState ts ON ts.ticketFk = t.id
|
||||||
|
JOIN state st ON st.id = ts.stateFk
|
||||||
|
JOIN agencyMode am ON t.agencyModeFk = am.id
|
||||||
|
LEFT JOIN itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
|
||||||
|
LEFT JOIN tmp.stock st ON st.itemFk = i.id
|
||||||
|
WHERE t.shipped BETWEEN vDateFuture AND util.dayend(vDateFuture)
|
||||||
|
AND t.warehouseFk = vWarehouseFk
|
||||||
|
GROUP BY t.id
|
||||||
|
) origin
|
||||||
|
JOIN (
|
||||||
|
SELECT
|
||||||
|
t.id ticketFk,
|
||||||
|
t.addressFk,
|
||||||
|
st.name state,
|
||||||
|
GROUP_CONCAT(DISTINCT ipt.code ORDER BY ipt.code) ipt,
|
||||||
|
t.shipped,
|
||||||
|
t.totalWithVat,
|
||||||
|
am.name agency,
|
||||||
|
CAST(SUM(litros) AS DECIMAL(10,0)) liters,
|
||||||
|
CAST(COUNT(*) AS DECIMAL(10,0)) `lines`,
|
||||||
|
st.classColor
|
||||||
|
FROM ticket t
|
||||||
|
JOIN sale s ON s.ticketFk = t.id
|
||||||
|
JOIN saleVolume sv ON sv.saleFk = s.id
|
||||||
|
JOIN item i ON i.id = s.itemFk
|
||||||
|
JOIN ticketState ts ON ts.ticketFk = t.id
|
||||||
|
JOIN state st ON st.id = ts.stateFk
|
||||||
|
JOIN agencyMode am ON t.agencyModeFk = am.id
|
||||||
|
LEFT JOIN itemPackingType ipt ON ipt.code = i.itemPackingTypeFk
|
||||||
|
WHERE t.shipped BETWEEN vDateToAdvance AND util.dayend(vDateToAdvance)
|
||||||
|
AND t.warehouseFk = vWarehouseFk
|
||||||
|
AND st.order <= 5
|
||||||
|
GROUP BY t.id
|
||||||
|
) dest ON dest.addressFk = origin.addressFk
|
||||||
|
WHERE origin.hasStock != 0;
|
||||||
|
DROP TEMPORARY TABLE tmp.stock;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -0,0 +1,72 @@
|
||||||
|
DELIMITER $$
|
||||||
|
$$
|
||||||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_canbePostponed`(vOriginDated DATE, vFutureDated DATE, vWarehouseFk INT)
|
||||||
|
BEGIN
|
||||||
|
/**
|
||||||
|
* Devuelve un listado de tickets susceptibles de fusionarse con otros tickets en el futuro
|
||||||
|
*
|
||||||
|
* @param vOriginDated Fecha en cuestión
|
||||||
|
* @param vFutureDated Fecha en el futuro a sondear
|
||||||
|
* @param vWarehouseFk Identificador de vn.warehouse
|
||||||
|
*/
|
||||||
|
DROP TEMPORARY TABLE IF EXISTS tmp.filter;
|
||||||
|
CREATE TEMPORARY TABLE tmp.filter
|
||||||
|
(INDEX (id))
|
||||||
|
SELECT sv.ticketFk id,
|
||||||
|
sub2.id futureId,
|
||||||
|
GROUP_CONCAT(DISTINCT i.itemPackingTypeFk ORDER BY i.itemPackingTypeFk) ipt,
|
||||||
|
CAST(sum(litros) AS DECIMAL(10,0)) liters,
|
||||||
|
CAST(count(*) AS DECIMAL(10,0)) `lines`,
|
||||||
|
st.name state,
|
||||||
|
sub2.iptd futureIpt,
|
||||||
|
sub2.state futureState,
|
||||||
|
t.clientFk,
|
||||||
|
t.warehouseFk,
|
||||||
|
ts.alertLevel,
|
||||||
|
t.shipped,
|
||||||
|
sub2.shipped futureShipped,
|
||||||
|
t.workerFk,
|
||||||
|
st.code stateCode,
|
||||||
|
sub2.code futureStateCode,
|
||||||
|
st.classColor
|
||||||
|
FROM vn.saleVolume sv
|
||||||
|
JOIN vn.sale s ON s.id = sv.saleFk
|
||||||
|
JOIN vn.item i ON i.id = s.itemFk
|
||||||
|
JOIN vn.ticket t ON t.id = sv.ticketFk
|
||||||
|
JOIN vn.address a ON a.id = t.addressFk
|
||||||
|
JOIN vn.province p ON p.id = a.provinceFk
|
||||||
|
JOIN vn.country c ON c.id = p.countryFk
|
||||||
|
JOIN vn.ticketState ts ON ts.ticketFk = t.id
|
||||||
|
JOIN vn.state st ON st.id = ts.stateFk
|
||||||
|
JOIN vn.alertLevel al ON al.id = ts.alertLevel
|
||||||
|
LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT *
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
t.addressFk,
|
||||||
|
t.id,
|
||||||
|
t.shipped,
|
||||||
|
st.name state,
|
||||||
|
st.code code,
|
||||||
|
GROUP_CONCAT(DISTINCT i.itemPackingTypeFk ORDER BY i.itemPackingTypeFk) iptd
|
||||||
|
FROM vn.ticket t
|
||||||
|
JOIN vn.ticketState ts ON ts.ticketFk = t.id
|
||||||
|
JOIN vn.state st ON st.id = ts.stateFk
|
||||||
|
JOIN vn.sale s ON s.ticketFk = t.id
|
||||||
|
JOIN vn.item i ON i.id = s.itemFk
|
||||||
|
WHERE t.shipped BETWEEN vFutureDated
|
||||||
|
AND util.dayend(vFutureDated)
|
||||||
|
AND t.warehouseFk = vWarehouseFk
|
||||||
|
GROUP BY t.id
|
||||||
|
) sub
|
||||||
|
GROUP BY sub.addressFk
|
||||||
|
) sub2 ON sub2.addressFk = t.addressFk AND t.id != sub2.id
|
||||||
|
WHERE t.shipped BETWEEN vOriginDated AND util.dayend(vOriginDated)
|
||||||
|
AND t.warehouseFk = vWarehouseFk
|
||||||
|
AND al.code = 'FREE'
|
||||||
|
AND tp.ticketFk IS NULL
|
||||||
|
GROUP BY sv.ticketFk
|
||||||
|
HAVING futureId;
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -0,0 +1,20 @@
|
||||||
|
-- vn.defaulter source
|
||||||
|
|
||||||
|
CREATE OR REPLACE
|
||||||
|
ALGORITHM = UNDEFINED VIEW `vn`.`defaulter` AS
|
||||||
|
select
|
||||||
|
`d`.`clientFk` AS `clientFk`,
|
||||||
|
`d`.`created` AS `created`,
|
||||||
|
`d`.`amount` AS `amount`,
|
||||||
|
`d`.`defaulterSinced` AS `defaulterSinced`,
|
||||||
|
`d`.`hasChanged` AS `hasChanged`,
|
||||||
|
`c`.`countryFk` AS `country`,
|
||||||
|
`c`.`payMethodFk` AS `payMethod`
|
||||||
|
from
|
||||||
|
(((`bs`.`defaulter` `d`
|
||||||
|
join `vn`.`client` `c` on
|
||||||
|
(`c`.`id` = `d`.`clientFk`))
|
||||||
|
join `vn`.`country` `co` on
|
||||||
|
(`co`.`id` = `c`.`countryFk`))
|
||||||
|
join `vn`.`payMethod` `pm` on
|
||||||
|
(`pm`.`id` = `c`.`payMethodFk`));
|
|
@ -0,0 +1,7 @@
|
||||||
|
ALTER TABLE `vn`.`workerConfig` ADD payMethodFk tinyint(3) unsigned NULL;
|
||||||
|
ALTER TABLE `vn`.`workerConfig` ADD CONSTRAINT workerConfig_FK FOREIGN KEY (roleFk) REFERENCES account.`role`(id) ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
ALTER TABLE `vn`.`workerConfig` ADD CONSTRAINT workerConfig_FK_1 FOREIGN KEY (payMethodFk) REFERENCES `vn`.`payMethod`(id) ON DELETE SET NULL ON UPDATE CASCADE;
|
||||||
|
-- Cuando se apruebe el PR quitar y poner en redmine para hacerse manualmente
|
||||||
|
UPDATE `vn`.`workerConfig`
|
||||||
|
SET payMethodFk = 4
|
||||||
|
WHERE id=1;
|
File diff suppressed because one or more lines are too long
|
@ -173,10 +173,6 @@ INSERT INTO `vn`.`sector`(`id`, `description`, `warehouseFk`, `isPreviousPrepare
|
||||||
(1, 'First sector', 1, 1, 'FIRST'),
|
(1, 'First sector', 1, 1, 'FIRST'),
|
||||||
(2, 'Second sector', 2, 0, 'SECOND');
|
(2, 'Second sector', 2, 0, 'SECOND');
|
||||||
|
|
||||||
INSERT INTO `vn`.`operator` (`workerFk`, `numberOfWagons`, `trainFk`, `itemPackingTypeFk`, `warehouseFk`, `sectorFk`, `labelerFk`)
|
|
||||||
VALUES ('1106', '1', '1', 'H', '1', '1', '1'),
|
|
||||||
('1107', '1', '1', 'V', '1', '2', '1');
|
|
||||||
|
|
||||||
INSERT INTO `vn`.`printer` (`id`, `name`, `path`, `isLabeler`, `sectorFk`, `ipAddress`)
|
INSERT INTO `vn`.`printer` (`id`, `name`, `path`, `isLabeler`, `sectorFk`, `ipAddress`)
|
||||||
VALUES
|
VALUES
|
||||||
(1, 'printer1', 'path1', 0, 1 , NULL),
|
(1, 'printer1', 'path1', 0, 1 , NULL),
|
||||||
|
@ -353,20 +349,20 @@ INSERT INTO `vn`.`contactChannel`(`id`, `name`)
|
||||||
(4, 'GCN Channel'),
|
(4, 'GCN Channel'),
|
||||||
(5, 'The Newspaper');
|
(5, 'The Newspaper');
|
||||||
|
|
||||||
INSERT INTO `vn`.`client`(`id`,`name`,`fi`,`socialName`,`contact`,`street`,`city`,`postcode`,`phone`,`mobile`,`isRelevant`,`email`,`iban`,`dueDay`,`accountingAccount`,`isEqualizated`,`provinceFk`,`hasToInvoice`,`credit`,`countryFk`,`isActive`,`gestdocFk`,`quality`,`payMethodFk`,`created`,`isToBeMailed`,`contactChannelFk`,`hasSepaVnl`,`hasCoreVnl`,`hasCoreVnh`,`riskCalculated`,`clientTypeFk`,`mailAddress`,`hasToInvoiceByAddress`,`isTaxDataChecked`,`isFreezed`,`creditInsurance`,`isCreatedAsServed`,`hasInvoiceSimplified`,`salesPersonFk`,`isVies`,`eypbc`, `businessTypeFk`)
|
INSERT INTO `vn`.`client`(`id`,`name`,`fi`,`socialName`,`contact`,`street`,`city`,`postcode`,`phone`,`mobile`,`isRelevant`,`email`,`iban`,`dueDay`,`accountingAccount`,`isEqualizated`,`provinceFk`,`hasToInvoice`,`credit`,`countryFk`,`isActive`,`gestdocFk`,`quality`,`payMethodFk`,`created`,`isToBeMailed`,`contactChannelFk`,`hasSepaVnl`,`hasCoreVnl`,`hasCoreVnh`,`riskCalculated`,`clientTypeFk`, `hasToInvoiceByAddress`,`isTaxDataChecked`,`isFreezed`,`creditInsurance`,`isCreatedAsServed`,`hasInvoiceSimplified`,`salesPersonFk`,`isVies`,`eypbc`, `businessTypeFk`)
|
||||||
VALUES
|
VALUES
|
||||||
(1101, 'Bruce Wayne', '84612325V', 'Batman', 'Alfred', '1007 Mountain Drive, Gotham', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceWayne@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
(1101, 'Bruce Wayne', '84612325V', 'Batman', 'Alfred', '1007 Mountain Drive, Gotham', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceWayne@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
||||||
(1102, 'Petter Parker', '87945234L', 'Spider man', 'Aunt May', '20 Ingram Street, Queens, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'PetterParker@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
(1102, 'Petter Parker', '87945234L', 'Spider man', 'Aunt May', '20 Ingram Street, Queens, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'PetterParker@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
||||||
(1103, 'Clark Kent', '06815934E', 'Super man', 'lois lane', '344 Clinton Street, Apartament 3-D', 'Gotham', 46460, 1111111111, 222222222, 1, 'ClarkKent@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 0, 19, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
(1103, 'Clark Kent', '06815934E', 'Super man', 'lois lane', '344 Clinton Street, Apartament 3-D', 'Gotham', 46460, 1111111111, 222222222, 1, 'ClarkKent@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 0, 19, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
||||||
(1104, 'Tony Stark', '06089160W', 'Iron man', 'Pepper Potts', '10880 Malibu Point, 90265', 'Gotham', 46460, 1111111111, 222222222, 1, 'TonyStark@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
(1104, 'Tony Stark', '06089160W', 'Iron man', 'Pepper Potts', '10880 Malibu Point, 90265', 'Gotham', 46460, 1111111111, 222222222, 1, 'TonyStark@mydomain.com', NULL, 0, 1234567890, 0, 2, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 18, 0, 1, 'florist'),
|
||||||
(1105, 'Max Eisenhardt', '251628698', 'Magneto', 'Rogue', 'Unknown Whereabouts', 'Gotham', 46460, 1111111111, 222222222, 1, 'MaxEisenhardt@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 300, 8, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 1, NULL, 0, 0, 18, 0, 1, 'florist'),
|
(1105, 'Max Eisenhardt', '251628698', 'Magneto', 'Rogue', 'Unknown Whereabouts', 'Gotham', 46460, 1111111111, 222222222, 1, 'MaxEisenhardt@mydomain.com', NULL, 0, 1234567890, 0, 3, 1, 300, 8, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, NULL, 0, 0, 18, 0, 1, 'florist'),
|
||||||
(1106, 'DavidCharlesHaller', '53136686Q', 'Legion', 'Charles Xavier', 'City of New York, New York, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'DavidCharlesHaller@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 0, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 0, NULL, 0, 0, 19, 0, 1, 'florist'),
|
(1106, 'DavidCharlesHaller', '53136686Q', 'Legion', 'Charles Xavier', 'City of New York, New York, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'DavidCharlesHaller@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 0, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, NULL, 0, 0, 19, 0, 1, 'florist'),
|
||||||
(1107, 'Hank Pym', '09854837G', 'Ant man', 'Hawk', 'Anthill, San Francisco, California', 'Gotham', 46460, 1111111111, 222222222, 1, 'HankPym@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, 0, NULL, 0, 0, 19, 0, 1, 'florist'),
|
(1107, 'Hank Pym', '09854837G', 'Ant man', 'Hawk', 'Anthill, San Francisco, California', 'Gotham', 46460, 1111111111, 222222222, 1, 'HankPym@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, 19, 0, 1, 'florist'),
|
||||||
(1108, 'Charles Xavier', '22641921P', 'Professor X', 'Beast', '3800 Victory Pkwy, Cincinnati, OH 45207, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'CharlesXavier@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, 1, NULL, 0, 0, 19, 0, 1, 'florist'),
|
(1108, 'Charles Xavier', '22641921P', 'Professor X', 'Beast', '3800 Victory Pkwy, Cincinnati, OH 45207, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'CharlesXavier@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 1, NULL, 0, 0, 19, 0, 1, 'florist'),
|
||||||
(1109, 'Bruce Banner', '16104829E', 'Hulk', 'Black widow', 'Somewhere in New York', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceBanner@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, 0, NULL, 0, 0, 9, 0, 1, 'florist'),
|
(1109, 'Bruce Banner', '16104829E', 'Hulk', 'Black widow', 'Somewhere in New York', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceBanner@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, 9, 0, 1, 'florist'),
|
||||||
(1110, 'Jessica Jones', '58282869H', 'Jessica Jones', 'Luke Cage', 'NYCC 2015 Poster', 'Gotham', 46460, 1111111111, 222222222, 1, 'JessicaJones@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, 0, 0, NULL, 0, 0, NULL, 0, 1, 'florist'),
|
(1110, 'Jessica Jones', '58282869H', 'Jessica Jones', 'Luke Cage', 'NYCC 2015 Poster', 'Gotham', 46460, 1111111111, 222222222, 1, 'JessicaJones@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, 0, NULL, 0, 0, NULL, 0, 1, 'florist'),
|
||||||
(1111, 'Missing', NULL, 'Missing man', 'Anton', 'The space, Universe far away', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 4, 1, 0, 1, 0, NULL, 1, 0, NULL, 0, 1, 'others'),
|
(1111, 'Missing', NULL, 'Missing man', 'Anton', 'The space, Universe far away', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 4, 0, 1, 0, NULL, 1, 0, NULL, 0, 1, 'others'),
|
||||||
(1112, 'Trash', NULL, 'Garbage man', 'Unknown name', 'New York city, Underground', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 4, 1, 0, 1, 0, NULL, 1, 0, NULL, 0, 1, 'others');
|
(1112, 'Trash', NULL, 'Garbage man', 'Unknown name', 'New York city, Underground', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, NULL, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 4, 0, 1, 0, NULL, 1, 0, NULL, 0, 1, 'others');
|
||||||
|
|
||||||
INSERT INTO `vn`.`client`(`id`, `name`, `fi`, `socialName`, `contact`, `street`, `city`, `postcode`, `isRelevant`, `email`, `iban`,`dueDay`,`accountingAccount`, `isEqualizated`, `provinceFk`, `hasToInvoice`, `credit`, `countryFk`, `isActive`, `gestdocFk`, `quality`, `payMethodFk`,`created`, `isTaxDataChecked`)
|
INSERT INTO `vn`.`client`(`id`, `name`, `fi`, `socialName`, `contact`, `street`, `city`, `postcode`, `isRelevant`, `email`, `iban`,`dueDay`,`accountingAccount`, `isEqualizated`, `provinceFk`, `hasToInvoice`, `credit`, `countryFk`, `isActive`, `gestdocFk`, `quality`, `payMethodFk`,`created`, `isTaxDataChecked`)
|
||||||
SELECT id, name, CONCAT(RPAD(CONCAT(id,9),8,id),'A'), CONCAT(name, 'Social'), CONCAT(name, 'Contact'), CONCAT(name, 'Street'), 'GOTHAM', 46460, 1, CONCAT(name,'@mydomain.com'), NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1,NULL, 10, 5, util.VN_CURDATE(), 1
|
SELECT id, name, CONCAT(RPAD(CONCAT(id,9),8,id),'A'), CONCAT(name, 'Social'), CONCAT(name, 'Contact'), CONCAT(name, 'Street'), 'GOTHAM', 46460, 1, CONCAT(name,'@mydomain.com'), NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1,NULL, 10, 5, util.VN_CURDATE(), 1
|
||||||
|
@ -550,7 +546,8 @@ INSERT INTO `vn`.`supplier`(`id`, `name`, `nickname`,`account`,`countryFk`,`nif`
|
||||||
VALUES
|
VALUES
|
||||||
(1, 'Plants SL', 'Plants nick', 4100000001, 1, '06089160W', 0, util.VN_CURDATE(), 1, 'supplier address 1', 'PONTEVEDRA', 1, 15214, 1, 1, 15, 4, 1, 1, 18, 'flowerPlants', 1, '400664487V'),
|
(1, 'Plants SL', 'Plants nick', 4100000001, 1, '06089160W', 0, util.VN_CURDATE(), 1, 'supplier address 1', 'PONTEVEDRA', 1, 15214, 1, 1, 15, 4, 1, 1, 18, 'flowerPlants', 1, '400664487V'),
|
||||||
(2, 'Farmer King', 'The farmer', 4000020002, 1, '87945234L', 0, util.VN_CURDATE(), 1, 'supplier address 2', 'GOTHAM', 2, 43022, 1, 2, 10, 93, 2, 8, 18, 'animals', 1, '400664487V'),
|
(2, 'Farmer King', 'The farmer', 4000020002, 1, '87945234L', 0, util.VN_CURDATE(), 1, 'supplier address 2', 'GOTHAM', 2, 43022, 1, 2, 10, 93, 2, 8, 18, 'animals', 1, '400664487V'),
|
||||||
(442, 'Verdnatura Levante SL', 'Verdnatura', 5115000442, 1, '06815934E', 0, util.VN_CURDATE(), 1, 'supplier address 3', 'GOTHAM', 1, 43022, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V');
|
(442, 'Verdnatura Levante SL', 'Verdnatura', 5115000442, 1, '06815934E', 0, util.VN_CURDATE(), 1, 'supplier address 3', 'GOTHAM', 1, 43022, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V'),
|
||||||
|
(1381, 'Ornamentales', 'Ornamentales', 7185000440, 1, '03815934E', 0, util.VN_CURDATE(), 1, 'supplier address 4', 'GOTHAM', 1, 43022, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V');
|
||||||
|
|
||||||
INSERT INTO `vn`.`supplierContact`(`id`, `supplierFk`, `phone`, `mobile`, `email`, `observation`, `name`)
|
INSERT INTO `vn`.`supplierContact`(`id`, `supplierFk`, `phone`, `mobile`, `email`, `observation`, `name`)
|
||||||
VALUES
|
VALUES
|
||||||
|
@ -710,7 +707,7 @@ INSERT INTO `vn`.`ticket`(`id`, `priority`, `agencyModeFk`,`warehouseFk`,`routeF
|
||||||
(15, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1105, 'An incredibly long alias for testing purposes', 125, NULL, 0, 3, 5, 1, util.VN_CURDATE()),
|
(15, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1105, 'An incredibly long alias for testing purposes', 125, NULL, 0, 3, 5, 1, util.VN_CURDATE()),
|
||||||
(16, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1106, 'Many Places', 126, NULL, 0, 3, 5, 1, util.VN_CURDATE()),
|
(16, 1, 7, 1, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1106, 'Many Places', 126, NULL, 0, 3, 5, 1, util.VN_CURDATE()),
|
||||||
(17, 1, 7, 2, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1106, 'Many Places', 126, NULL, 0, 3, 5, 1, util.VN_CURDATE()),
|
(17, 1, 7, 2, 6, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1106, 'Many Places', 126, NULL, 0, 3, 5, 1, util.VN_CURDATE()),
|
||||||
(18, 1, 4, 4, 4, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1108, 'Cerebro', 128, NULL, 0, 12, 5, 1, util.VN_CURDATE()),
|
(18, 1, 4, 4, 4, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1108, 'Cerebro', 128, NULL, 0, 12, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +12 HOUR)),
|
||||||
(19, 1, 5, 5, NULL, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1109, 'Somewhere in Thailand', 129, NULL, 1, NULL, 5, 1, util.VN_CURDATE()),
|
(19, 1, 5, 5, NULL, util.VN_CURDATE(), DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), 1109, 'Somewhere in Thailand', 129, NULL, 1, NULL, 5, 1, util.VN_CURDATE()),
|
||||||
(20, 1, 5, 5, 3, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Thailand', 129, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)),
|
(20, 1, 5, 5, 3, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Thailand', 129, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)),
|
||||||
(21, NULL, 5, 5, 5, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Holland', 102, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)),
|
(21, NULL, 5, 5, 5, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH), DATE_ADD(DATE_ADD(util.VN_CURDATE(),INTERVAL +1 MONTH), INTERVAL +1 DAY), 1109, 'Somewhere in Holland', 102, NULL, 0, 13, 5, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL +1 MONTH)),
|
||||||
|
@ -1200,6 +1197,11 @@ INSERT INTO `vn`.`train`(`id`, `name`)
|
||||||
(1, 'Train1'),
|
(1, 'Train1'),
|
||||||
(2, 'Train2');
|
(2, 'Train2');
|
||||||
|
|
||||||
|
INSERT INTO `vn`.`operator` (`workerFk`, `numberOfWagons`, `trainFk`, `itemPackingTypeFk`, `warehouseFk`, `sectorFk`, `labelerFk`)
|
||||||
|
VALUES
|
||||||
|
('1106', '1', '1', 'H', '1', '1', '1'),
|
||||||
|
('1107', '1', '1', 'V', '1', '1', '1');
|
||||||
|
|
||||||
INSERT INTO `vn`.`collection`(`id`, `workerFk`, `stateFk`, `created`, `trainFk`)
|
INSERT INTO `vn`.`collection`(`id`, `workerFk`, `stateFk`, `created`, `trainFk`)
|
||||||
VALUES
|
VALUES
|
||||||
(1, 1106, 5, DATE_ADD(util.VN_CURDATE(),INTERVAL +1 DAY), 1),
|
(1, 1106, 5, DATE_ADD(util.VN_CURDATE(),INTERVAL +1 DAY), 1),
|
||||||
|
@ -1407,16 +1409,16 @@ INSERT INTO `vn`.`travel`(`id`,`shipped`, `landed`, `warehouseInFk`, `warehouseO
|
||||||
(7, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 4, 1, 50.00, 500, 'seventh travel', 2, 1),
|
(7, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 4, 1, 50.00, 500, 'seventh travel', 2, 1),
|
||||||
(8, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 1, 1, 50.00, 500, 'eight travel', 1, 2);
|
(8, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 1, 1, 50.00, 500, 'eight travel', 1, 2);
|
||||||
|
|
||||||
INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `invoiceNumber`, `reference`, `isExcludedFromAvailable`, `isRaid`, `notes`, `evaNotes`)
|
INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `invoiceNumber`, `reference`, `isExcludedFromAvailable`, `isRaid`, `evaNotes`)
|
||||||
VALUES
|
VALUES
|
||||||
(1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 1, 442, 'IN2001', 'Movement 1', 0, 0, '', ''),
|
(1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 1, 442, 'IN2001', 'Movement 1', 0, 0, ''),
|
||||||
(2, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 442, 'IN2002', 'Movement 2', 0, 0, 'this is the note two', 'observation two'),
|
(2, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 442, 'IN2002', 'Movement 2', 0, 0, 'observation two'),
|
||||||
(3, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 0, 442, 'IN2003', 'Movement 3', 0, 0, 'this is the note three', 'observation three'),
|
(3, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 0, 442, 'IN2003', 'Movement 3', 0, 0, 'observation three'),
|
||||||
(4, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 69, 'IN2004', 'Movement 4', 0, 0, 'this is the note four', 'observation four'),
|
(4, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 69, 'IN2004', 'Movement 4', 0, 0, 'observation four'),
|
||||||
(5, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 0, 442, 'IN2005', 'Movement 5', 0, 0, 'this is the note five', 'observation five'),
|
(5, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 0, 442, 'IN2005', 'Movement 5', 0, 0, 'observation five'),
|
||||||
(6, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 6, 0, 442, 'IN2006', 'Movement 6', 0, 0, 'this is the note six', 'observation six'),
|
(6, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 6, 0, 442, 'IN2006', 'Movement 6', 0, 0, 'observation six'),
|
||||||
(7, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2007', 'Movement 7', 0, 0, 'this is the note seven', 'observation seven'),
|
(7, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2007', 'Movement 7', 0, 0, 'observation seven'),
|
||||||
(8, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2008', 'Movement 8', 1, 1, '', '');
|
(8, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2008', 'Movement 8', 1, 1, '');
|
||||||
|
|
||||||
INSERT INTO `bs`.`waste`(`buyer`, `year`, `week`, `family`, `itemFk`, `itemTypeFk`, `saleTotal`, `saleWaste`, `rate`)
|
INSERT INTO `bs`.`waste`(`buyer`, `year`, `week`, `family`, `itemFk`, `itemTypeFk`, `saleTotal`, `saleWaste`, `rate`)
|
||||||
VALUES
|
VALUES
|
||||||
|
@ -1938,6 +1940,16 @@ INSERT INTO `pbx`.`sip`(`user_id`, `extension`)
|
||||||
(5, 1102),
|
(5, 1102),
|
||||||
(9, 1201);
|
(9, 1201);
|
||||||
|
|
||||||
|
INSERT INTO `vn`.`professionalCategory` (`id`, `name`, `level`, `dayBreak`)
|
||||||
|
VALUES
|
||||||
|
(1, 'employee', NULL, NULL),
|
||||||
|
(2, 'florist', NULL, NULL);
|
||||||
|
|
||||||
|
INSERT INTO `vn`.`calendarType` (`id`, `description`, `hoursWeek`, `isPartial`)
|
||||||
|
VALUES
|
||||||
|
(1, 'General schedule', 40, 0);
|
||||||
|
|
||||||
|
|
||||||
DROP TEMPORARY TABLE IF EXISTS tmp.worker;
|
DROP TEMPORARY TABLE IF EXISTS tmp.worker;
|
||||||
CREATE TEMPORARY TABLE tmp.worker
|
CREATE TEMPORARY TABLE tmp.worker
|
||||||
(PRIMARY KEY (id))
|
(PRIMARY KEY (id))
|
||||||
|
@ -1966,7 +1978,7 @@ UPDATE `vn`.`business`
|
||||||
WHERE `id`= 1106;
|
WHERE `id`= 1106;
|
||||||
|
|
||||||
UPDATE `vn`.`business` b
|
UPDATE `vn`.`business` b
|
||||||
SET b.`workerBusinessProfessionalCategoryFk` = 31
|
SET b.`workerBusinessProfessionalCategoryFk` = 2
|
||||||
WHERE b.`workerFk` = 1110;
|
WHERE b.`workerFk` = 1110;
|
||||||
|
|
||||||
UPDATE `vn`.`business` b
|
UPDATE `vn`.`business` b
|
||||||
|
@ -2773,6 +2785,19 @@ INSERT INTO `vn`.`ticketLog` (`originFk`, userFk, `action`, changedModel, oldIns
|
||||||
(7, 18, 'update', 'Sale', '{"price":3}', '{"price":5}', 1, NULL),
|
(7, 18, 'update', 'Sale', '{"price":3}', '{"price":5}', 1, NULL),
|
||||||
(7, 18, 'update', NULL, NULL, NULL, NULL, "Cambio cantidad Melee weapon heavy shield 1x0.5m de '5' a '10'");
|
(7, 18, 'update', NULL, NULL, NULL, NULL, "Cambio cantidad Melee weapon heavy shield 1x0.5m de '5' a '10'");
|
||||||
|
|
||||||
|
INSERT INTO `vn`.`ticketLog` (originFk, userFk, `action`, creationDate, changedModel, changedModelId, changedModelValue, oldInstance, newInstance, description)
|
||||||
|
VALUES
|
||||||
|
(1, NULL, 'delete', '2001-06-09 11:00:04', 'Ticket', 45, 'Spider Man' , NULL, NULL, NULL),
|
||||||
|
(1, 18, 'select', '2001-06-09 11:00:03', 'Ticket', 45, 'Spider Man' , NULL, NULL, NULL),
|
||||||
|
(1, NULL, 'update', '2001-05-09 10:00:02', 'Sale', 69854, 'Armor' , '{"isPicked": false}','{"isPicked": true}', NULL),
|
||||||
|
(1, 18, 'update', '2001-01-01 10:05:01', 'Sale', 69854, 'Armor' , NULL, NULL, 'Armor quantity changed from ''15'' to ''10'''),
|
||||||
|
(1, NULL, 'delete', '2001-01-01 10:00:10', 'Sale', 5689, 'Shield' , '{"quantity":10,"concept":"Shield"}', NULL, NULL),
|
||||||
|
(1, 18, 'insert', '2000-12-31 15:00:05', 'Sale', 69854, 'Armor' , NULL,'{"quantity":15,"concept":"Armor", "price": 345.99, "itemFk": 2}', NULL),
|
||||||
|
(1, 18, 'update', '2000-12-28 08:40:45', 'Ticket', 45, 'Spider Man' , '{"warehouseFk":60,"shipped":"2023-05-16T22:00:00.000Z","nickname":"Super Man","isSigned":true,"isLabeled":true,"isPrinted":true,"packages":0,"hour":0,"isBlocked":false,"hasPriority":false,"companyFk":442,"landed":"2023-05-17T22:00:00.000Z","isBoxed":true,"isDeleted":true,"zoneFk":713,"zonePrice":13,"zoneBonus":0}','{"warehouseFk":61,"shipped":"2023-05-17T22:00:00.000Z","nickname":"Spider Man","isSigned":false,"isLabeled":false,"isPrinted":false,"packages":1,"hour":0,"isBlocked":true,"hasPriority":true,"companyFk":443,"landed":"2023-05-18T22:00:00.000Z","isBoxed":false,"isDeleted":false,"zoneFk":713,"zonePrice":13,"zoneBonus":1}', NULL),
|
||||||
|
(1, 18, 'select', '2000-12-27 03:40:30', 'Ticket', 45, NULL , NULL, NULL, NULL),
|
||||||
|
(1, 18, 'insert', '2000-04-10 09:40:15', 'Sale', 5689, 'Shield' , NULL, '{"quantity":10,"concept":"Shield", "price": 10.5, "itemFk": 1}', NULL),
|
||||||
|
(1, 18, 'insert', '1999-05-09 10:00:00', 'Ticket', 45, 'Super Man' , NULL, '{"id":45,"clientFk":8608,"warehouseFk":60,"shipped":"2023-05-16T22:00:00.000Z","nickname":"Super Man","addressFk":48637,"isSigned":true,"isLabeled":true,"isPrinted":true,"packages":0,"hour":0,"created":"2023-05-16T11:42:56.000Z","isBlocked":false,"hasPriority":false,"companyFk":442,"agencyModeFk":639,"landed":"2023-05-17T22:00:00.000Z","isBoxed":true,"isDeleted":true,"zoneFk":713,"zonePrice":13,"zoneBonus":0}', NULL);
|
||||||
|
|
||||||
INSERT INTO `vn`.`osTicketConfig` (`id`, `host`, `user`, `password`, `oldStatus`, `newStatusId`, `day`, `comment`, `hostDb`, `userDb`, `passwordDb`, `portDb`, `responseType`, `fromEmailId`, `replyTo`)
|
INSERT INTO `vn`.`osTicketConfig` (`id`, `host`, `user`, `password`, `oldStatus`, `newStatusId`, `day`, `comment`, `hostDb`, `userDb`, `passwordDb`, `portDb`, `responseType`, `fromEmailId`, `replyTo`)
|
||||||
VALUES
|
VALUES
|
||||||
(0, 'http://localhost:56596/scp', 'ostadmin', 'Admin1', '1,6', 3, 60, 'Este CAU se ha cerrado automáticamente. Si el problema persiste responda a este mensaje.', 'localhost', 'osticket', 'osticket', 40003, 'reply', 1, 'all');
|
(0, 'http://localhost:56596/scp', 'ostadmin', 'Admin1', '1,6', 3, 60, 'Este CAU se ha cerrado automáticamente. Si el problema persiste responda a este mensaje.', 'localhost', 'osticket', 'osticket', 40003, 'reply', 1, 'all');
|
||||||
|
@ -2788,7 +2813,7 @@ INSERT INTO `vn`.`profileType` (`id`, `name`)
|
||||||
|
|
||||||
INSERT INTO `salix`.`url` (`appName`, `environment`, `url`)
|
INSERT INTO `salix`.`url` (`appName`, `environment`, `url`)
|
||||||
VALUES
|
VALUES
|
||||||
('lilium', 'dev', 'http://localhost:8080/#/'),
|
('lilium', 'dev', 'http://localhost:9000/#/'),
|
||||||
('salix', 'dev', 'http://localhost:5000/#!/');
|
('salix', 'dev', 'http://localhost:5000/#!/');
|
||||||
|
|
||||||
INSERT INTO `vn`.`report` (`id`, `name`, `paperSizeFk`, `method`)
|
INSERT INTO `vn`.`report` (`id`, `name`, `paperSizeFk`, `method`)
|
||||||
|
@ -2799,9 +2824,9 @@ INSERT INTO `vn`.`payDemDetail` (`id`, `detail`)
|
||||||
VALUES
|
VALUES
|
||||||
(1, 1);
|
(1, 1);
|
||||||
|
|
||||||
INSERT INTO `vn`.`workerConfig` (`id`, `businessUpdated`, `roleFk`)
|
INSERT INTO `vn`.`workerConfig` (`id`, `businessUpdated`, `roleFk`, `payMethodFk`, `businessTypeFk`)
|
||||||
VALUES
|
VALUES
|
||||||
(1, NULL, 1);
|
(1, NULL, 1, 4, 'worker');
|
||||||
|
|
||||||
INSERT INTO `vn`.`ticketRefund`(`refundTicketFk`, `originalTicketFk`)
|
INSERT INTO `vn`.`ticketRefund`(`refundTicketFk`, `originalTicketFk`)
|
||||||
VALUES
|
VALUES
|
||||||
|
|
|
@ -1,42 +1,33 @@
|
||||||
CREATE SCHEMA IF NOT EXISTS `util`;
|
DROP FUNCTION IF EXISTS `util`.`mockTime`;
|
||||||
USE `util`;
|
|
||||||
|
|
||||||
DELIMITER ;;
|
DELIMITER $$
|
||||||
DROP FUNCTION IF EXISTS `util`.`mockedDate`;
|
$$
|
||||||
CREATE FUNCTION `util`.`mockedDate`()
|
CREATE DEFINER=`root`@`localhost` FUNCTION `util`.`mockTime`() RETURNS datetime
|
||||||
RETURNS DATETIME
|
DETERMINISTIC
|
||||||
DETERMINISTIC
|
|
||||||
BEGIN
|
BEGIN
|
||||||
RETURN CONVERT_TZ('2001-01-01 11:00:00', 'utc', 'Europe/Madrid');
|
RETURN CONVERT_TZ('@mockDate', 'utc', 'Europe/Madrid');
|
||||||
END ;;
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
||||||
DELIMITER ;;
|
DROP FUNCTION IF EXISTS `util`.`mockUtcTime`;
|
||||||
DROP FUNCTION IF EXISTS `util`.`VN_CURDATE`;
|
|
||||||
CREATE FUNCTION `util`.`VN_CURDATE`()
|
DELIMITER $$
|
||||||
RETURNS DATE
|
$$
|
||||||
DETERMINISTIC
|
CREATE DEFINER=`root`@`localhost` FUNCTION `util`.`mockUtcTime`() RETURNS datetime
|
||||||
|
DETERMINISTIC
|
||||||
BEGIN
|
BEGIN
|
||||||
RETURN DATE(mockedDate());
|
RETURN CONVERT_TZ('@mockDate', 'utc', 'Europe/Madrid');
|
||||||
END ;;
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
||||||
DELIMITER ;;
|
DROP FUNCTION IF EXISTS `util`.`mockTimeBase`;
|
||||||
DROP FUNCTION IF EXISTS `util`.`VN_CURTIME`;
|
|
||||||
CREATE FUNCTION `util`.`VN_CURTIME`()
|
DELIMITER $$
|
||||||
RETURNS TIME
|
$$
|
||||||
DETERMINISTIC
|
CREATE DEFINER=`root`@`localhost` FUNCTION `util`.`mockTimeBase`(vIsUtc BOOL) RETURNS datetime
|
||||||
|
DETERMINISTIC
|
||||||
BEGIN
|
BEGIN
|
||||||
RETURN TIME(mockedDate());
|
RETURN CONVERT_TZ('@mockDate', 'utc', 'Europe/Madrid');
|
||||||
END ;;
|
END$$
|
||||||
DELIMITER ;
|
DELIMITER ;
|
||||||
|
|
||||||
DELIMITER ;;
|
|
||||||
DROP FUNCTION IF EXISTS `util`.`VN_NOW`;
|
|
||||||
CREATE FUNCTION `util`.`VN_NOW`()
|
|
||||||
RETURNS DATETIME
|
|
||||||
DETERMINISTIC
|
|
||||||
BEGIN
|
|
||||||
RETURN mockedDate();
|
|
||||||
END ;;
|
|
||||||
DELIMITER ;
|
|
||||||
|
|
12010
db/dump/structure.sql
12010
db/dump/structure.sql
File diff suppressed because it is too large
Load Diff
|
@ -68,6 +68,7 @@ TABLES=(
|
||||||
time
|
time
|
||||||
volumeConfig
|
volumeConfig
|
||||||
workCenter
|
workCenter
|
||||||
|
companyI18n
|
||||||
)
|
)
|
||||||
dump_tables ${TABLES[@]}
|
dump_tables ${TABLES[@]}
|
||||||
|
|
||||||
|
@ -99,11 +100,8 @@ dump_tables ${TABLES[@]}
|
||||||
|
|
||||||
TABLES=(
|
TABLES=(
|
||||||
postgresql
|
postgresql
|
||||||
calendar_labour_type
|
|
||||||
labour_agreement
|
labour_agreement
|
||||||
media_type
|
media_type
|
||||||
professional_category
|
|
||||||
profile_type
|
|
||||||
)
|
)
|
||||||
dump_tables ${TABLES[@]}
|
dump_tables ${TABLES[@]}
|
||||||
|
|
||||||
|
|
|
@ -93,12 +93,5 @@ mysqldump \
|
||||||
--databases \
|
--databases \
|
||||||
${SCHEMAS[@]} \
|
${SCHEMAS[@]} \
|
||||||
${IGNORETABLES[@]} \
|
${IGNORETABLES[@]} \
|
||||||
| sed 's/\bCURDATE\b/util.VN_CURDATE/ig'\
|
|
||||||
| sed 's/\bCURTIME\b/util.VN_CURTIME/ig' \
|
|
||||||
| sed 's/\bNOW\b/util.VN_NOW/ig' \
|
|
||||||
| sed 's/\bCURRENT_DATE\b/util.VN_CURDATE/ig' \
|
|
||||||
| sed 's/\bCURRENT_TIME\b/util.VN_CURTIME/ig' \
|
|
||||||
| sed 's/\bLOCALTIME\b/util.VN_NOW/ig' \
|
|
||||||
| sed 's/\bLOCALTIMESTAMP\b/util.VN_NOW/ig' \
|
|
||||||
| sed 's/ AUTO_INCREMENT=[0-9]* //g' \
|
| sed 's/ AUTO_INCREMENT=[0-9]* //g' \
|
||||||
> dump/structure.sql
|
> dump/structure.sql
|
||||||
|
|
|
@ -156,14 +156,14 @@ let actions = {
|
||||||
await this.waitForSpinnerLoad();
|
await this.waitForSpinnerLoad();
|
||||||
},
|
},
|
||||||
|
|
||||||
accessToSection: async function(state) {
|
accessToSection: async function(state, name = 'Others') {
|
||||||
await this.waitForSelector('vn-left-menu');
|
await this.waitForSelector('vn-left-menu');
|
||||||
let nested = await this.evaluate(state => {
|
let nested = await this.evaluate(state => {
|
||||||
return document.querySelector(`vn-left-menu li li > a[ui-sref="${state}"]`) != null;
|
return document.querySelector(`vn-left-menu li li > a[ui-sref="${state}"]`) != null;
|
||||||
}, state);
|
}, state);
|
||||||
|
|
||||||
if (nested) {
|
if (nested) {
|
||||||
let selector = 'vn-left-menu vn-item-section > vn-icon[icon=keyboard_arrow_down]';
|
let selector = `vn-left-menu li[name="${name}"]`;
|
||||||
await this.evaluate(selector => {
|
await this.evaluate(selector => {
|
||||||
document.querySelector(selector).scrollIntoViewIfNeeded();
|
document.querySelector(selector).scrollIntoViewIfNeeded();
|
||||||
}, selector);
|
}, selector);
|
||||||
|
@ -414,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
|
||||||
|
@ -431,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;
|
||||||
},
|
},
|
||||||
|
@ -466,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);
|
||||||
|
|
||||||
|
@ -519,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:
|
||||||
|
@ -529,7 +508,6 @@ let actions = {
|
||||||
default:
|
default:
|
||||||
return 'unchecked';
|
return 'unchecked';
|
||||||
}
|
}
|
||||||
}, selector);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
isDisabled: async function(selector) {
|
isDisabled: async function(selector) {
|
||||||
|
@ -622,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();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -629,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',
|
||||||
|
@ -283,12 +262,6 @@ export default {
|
||||||
cancelEditAddressButton: 'vn-client-address-edit > form > vn-button-bar > vn-button > button',
|
cancelEditAddressButton: 'vn-client-address-edit > form > vn-button-bar > vn-button > button',
|
||||||
watcher: 'vn-client-address-edit vn-watcher'
|
watcher: 'vn-client-address-edit vn-watcher'
|
||||||
},
|
},
|
||||||
clientWebAccess: {
|
|
||||||
enableWebAccessCheckbox: 'vn-check[label="Enable web access"]',
|
|
||||||
userName: 'vn-client-web-access vn-textfield[ng-model="$ctrl.account.name"]',
|
|
||||||
email: 'vn-client-web-access vn-textfield[ng-model="$ctrl.account.email"]',
|
|
||||||
saveButton: 'button[type=submit]'
|
|
||||||
},
|
|
||||||
clientNotes: {
|
clientNotes: {
|
||||||
addNoteFloatButton: 'vn-float-button',
|
addNoteFloatButton: 'vn-float-button',
|
||||||
note: 'vn-textarea[ng-model="$ctrl.note.text"]',
|
note: 'vn-textarea[ng-model="$ctrl.note.text"]',
|
||||||
|
@ -312,30 +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'
|
||||||
},
|
},
|
||||||
clientLog: {
|
|
||||||
lastModificationPreviousValue: 'vn-client-log vn-tr table tr td.before',
|
|
||||||
lastModificationCurrentValue: 'vn-client-log vn-tr table tr td.after',
|
|
||||||
namePreviousValue: 'vn-client-log vn-tr table tr:nth-child(1) td.before',
|
|
||||||
nameCurrentValue: 'vn-client-log vn-tr table tr:nth-child(1) td.after',
|
|
||||||
activePreviousValue: 'vn-client-log vn-tr:nth-child(2) table tr:nth-child(2) td.before',
|
|
||||||
activeCurrentValue: 'vn-client-log vn-tr:nth-child(2) table tr:nth-child(2) td.after'
|
|
||||||
|
|
||||||
},
|
|
||||||
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"]'
|
||||||
|
@ -364,7 +313,7 @@ export default {
|
||||||
anyClient: 'vn-client-defaulter tbody > tr',
|
anyClient: 'vn-client-defaulter tbody > tr',
|
||||||
firstClientName: 'vn-client-defaulter tbody > tr:nth-child(1) > td:nth-child(2) > span',
|
firstClientName: 'vn-client-defaulter tbody > tr:nth-child(1) > td:nth-child(2) > span',
|
||||||
firstSalesPersonName: 'vn-client-defaulter tbody > tr:nth-child(1) > td:nth-child(3) > span',
|
firstSalesPersonName: 'vn-client-defaulter tbody > tr:nth-child(1) > td:nth-child(3) > span',
|
||||||
firstObservation: 'vn-client-defaulter tbody > tr:nth-child(1) > td:nth-child(6) > vn-textarea[ng-model="defaulter.observation"]',
|
firstObservation: 'vn-client-defaulter tbody > tr:nth-child(1) > td:nth-child(8) > vn-textarea[ng-model="defaulter.observation"]',
|
||||||
allDefaulterCheckbox: 'vn-client-defaulter thead vn-multi-check',
|
allDefaulterCheckbox: 'vn-client-defaulter thead vn-multi-check',
|
||||||
addObservationButton: 'vn-client-defaulter vn-button[icon="icon-notes"]',
|
addObservationButton: 'vn-client-defaulter vn-button[icon="icon-notes"]',
|
||||||
observation: '.vn-dialog.shown vn-textarea[ng-model="$ctrl.defaulter.observation"]',
|
observation: '.vn-dialog.shown vn-textarea[ng-model="$ctrl.defaulter.observation"]',
|
||||||
|
@ -481,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: {
|
||||||
|
@ -637,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',
|
||||||
|
@ -755,6 +693,7 @@ export default {
|
||||||
anyDocument: 'vn-ticket-dms-index > vn-data-viewer vn-tbody vn-tr'
|
anyDocument: 'vn-ticket-dms-index > vn-data-viewer vn-tbody vn-tr'
|
||||||
},
|
},
|
||||||
ticketFuture: {
|
ticketFuture: {
|
||||||
|
searchResult: 'vn-ticket-future tbody tr',
|
||||||
openAdvancedSearchButton: 'vn-searchbar .append vn-icon[icon="arrow_drop_down"]',
|
openAdvancedSearchButton: 'vn-searchbar .append vn-icon[icon="arrow_drop_down"]',
|
||||||
originDated: 'vn-date-picker[label="Origin date"]',
|
originDated: 'vn-date-picker[label="Origin date"]',
|
||||||
futureDated: 'vn-date-picker[label="Destination date"]',
|
futureDated: 'vn-date-picker[label="Destination date"]',
|
||||||
|
@ -770,7 +709,6 @@ export default {
|
||||||
problems: 'vn-check[label="With problems"]',
|
problems: 'vn-check[label="With problems"]',
|
||||||
tableButtonSearch: 'vn-button[vn-tooltip="Search"]',
|
tableButtonSearch: 'vn-button[vn-tooltip="Search"]',
|
||||||
moveButton: 'vn-button[vn-tooltip="Future tickets"]',
|
moveButton: 'vn-button[vn-tooltip="Future tickets"]',
|
||||||
acceptButton: '.vn-confirm.shown button[response="accept"]',
|
|
||||||
firstCheck: 'tbody > tr:nth-child(1) > td > vn-check',
|
firstCheck: 'tbody > tr:nth-child(1) > td > vn-check',
|
||||||
multiCheck: 'vn-multi-check',
|
multiCheck: 'vn-multi-check',
|
||||||
tableId: 'vn-textfield[name="id"]',
|
tableId: 'vn-textfield[name="id"]',
|
||||||
|
@ -888,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"]',
|
||||||
|
@ -914,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"]',
|
||||||
|
@ -961,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',
|
||||||
|
@ -1255,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',
|
||||||
|
@ -1361,18 +1256,6 @@ export default {
|
||||||
notes: 'vn-supplier-basic-data vn-textarea[ng-model="$ctrl.supplier.note"]',
|
notes: 'vn-supplier-basic-data vn-textarea[ng-model="$ctrl.supplier.note"]',
|
||||||
saveButton: 'vn-supplier-basic-data button[type="submit"]',
|
saveButton: 'vn-supplier-basic-data button[type="submit"]',
|
||||||
},
|
},
|
||||||
supplierFiscalData: {
|
|
||||||
socialName: 'vn-supplier-fiscal-data vn-textfield[ng-model="$ctrl.supplier.name"]',
|
|
||||||
taxNumber: 'vn-supplier-fiscal-data vn-textfield[ng-model="$ctrl.supplier.nif"]',
|
|
||||||
account: 'vn-supplier-fiscal-data vn-textfield[ng-model="$ctrl.supplier.account"]',
|
|
||||||
sageTaxType: 'vn-supplier-fiscal-data vn-autocomplete[ng-model="$ctrl.supplier.sageTaxTypeFk"]',
|
|
||||||
sageWihholding: 'vn-supplier-fiscal-data vn-autocomplete[ng-model="$ctrl.supplier.sageWithholdingFk"]',
|
|
||||||
postCode: 'vn-supplier-fiscal-data vn-datalist[ng-model="$ctrl.supplier.postCode"]',
|
|
||||||
city: 'vn-supplier-fiscal-data vn-datalist[ng-model="$ctrl.supplier.city"]',
|
|
||||||
province: 'vn-supplier-fiscal-data vn-autocomplete[ng-model="$ctrl.supplier.provinceFk"]',
|
|
||||||
country: 'vn-supplier-fiscal-data vn-autocomplete[ng-model="$ctrl.supplier.countryFk"]',
|
|
||||||
saveButton: 'vn-supplier-fiscal-data button[type="submit"]',
|
|
||||||
},
|
|
||||||
supplierBillingData: {
|
supplierBillingData: {
|
||||||
payMethod: 'vn-supplier-billing-data vn-autocomplete[ng-model="$ctrl.supplier.payMethodFk"]',
|
payMethod: 'vn-supplier-billing-data vn-autocomplete[ng-model="$ctrl.supplier.payMethodFk"]',
|
||||||
payDem: 'vn-supplier-billing-data vn-autocomplete[ng-model="$ctrl.supplier.payDemFk"]',
|
payDem: 'vn-supplier-billing-data vn-autocomplete[ng-model="$ctrl.supplier.payDemFk"]',
|
||||||
|
|
|
@ -15,91 +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.doSearch();
|
await page.keyboard.press('Enter');
|
||||||
|
|
||||||
const result = await page.waitToGetProperty(selectors.itemFixedPrice.firstItemID, 'value');
|
await page.waitForTextInField(selectors.itemFixedPrice.firstItemID, '1');
|
||||||
|
|
||||||
expect(result).toEqual('1');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should order by last id', async() => {
|
|
||||||
await page.waitToClick(selectors.itemFixedPrice.orderColumnId);
|
await page.waitToClick(selectors.itemFixedPrice.orderColumnId);
|
||||||
const result = await page.waitToGetProperty(selectors.itemFixedPrice.firstItemID, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('3');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reload page and have same order', async() => {
|
|
||||||
await page.reload({
|
await page.reload({
|
||||||
waitUntil: 'networkidle2'
|
waitUntil: 'networkidle2'
|
||||||
});
|
});
|
||||||
const result = await page.waitToGetProperty(selectors.itemFixedPrice.firstItemID, 'value');
|
await page.waitForTextInField(selectors.itemFixedPrice.firstItemID, '13');
|
||||||
|
|
||||||
expect(result).toEqual('3');
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -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');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,88 +1,56 @@
|
||||||
/* eslint max-len: ["error", { "code": 150 }]*/
|
|
||||||
import selectors from '../../helpers/selectors';
|
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
describe('Client Edit web access path', () => {
|
const $ = {
|
||||||
|
enableWebAccess: 'vn-client-web-access vn-check[label="Enable web access"]',
|
||||||
|
userName: 'vn-client-web-access vn-textfield[ng-model="$ctrl.account.name"]',
|
||||||
|
email: 'vn-client-web-access vn-textfield[ng-model="$ctrl.account.email"]',
|
||||||
|
saveButton: 'vn-client-web-access button[type=submit]',
|
||||||
|
nameValue: 'vn-client-log .change:nth-child(1) .basic-json:nth-child(2) vn-json-value',
|
||||||
|
activeValue: 'vn-client-log .change:nth-child(2) .basic-json:nth-child(1) vn-json-value'
|
||||||
|
};
|
||||||
|
|
||||||
|
describe('Client web access 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('salesPerson', 'client');
|
await page.loginAndModule('salesPerson', 'client');
|
||||||
await page.accessToSearchResult('max');
|
await page.accessToSearchResult('max');
|
||||||
await page.accessToSection('client.card.webAccess');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async() => {
|
afterAll(async() => {
|
||||||
await browser.close();
|
await browser.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should uncheck the Enable web access checkbox', async() => {
|
it('should modify and save web access attributes', async() => {
|
||||||
await page.waitToClick(selectors.clientWebAccess.enableWebAccessCheckbox);
|
await page.accessToSection('client.card.webAccess');
|
||||||
await page.waitToClick(selectors.clientWebAccess.saveButton);
|
await page.click($.enableWebAccess);
|
||||||
const message = await page.waitForSnackbar();
|
await page.click($.saveButton);
|
||||||
|
const enableMessage = await page.waitForSnackbar();
|
||||||
|
await page.overwrite($.userName, 'Legion');
|
||||||
|
await page.overwrite($.email, 'legion@marvel.com');
|
||||||
|
await page.click($.saveButton);
|
||||||
|
const modifyMessage = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should update the name`, async() => {
|
|
||||||
await page.clearInput(selectors.clientWebAccess.userName);
|
|
||||||
await page.write(selectors.clientWebAccess.userName, 'Legion');
|
|
||||||
await page.waitToClick(selectors.clientWebAccess.saveButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should update the email`, async() => {
|
|
||||||
await page.clearInput(selectors.clientWebAccess.email);
|
|
||||||
await page.write(selectors.clientWebAccess.email, 'legion@marvel.com');
|
|
||||||
await page.waitToClick(selectors.clientWebAccess.saveButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reload the section and confirm web access is now unchecked', async() => {
|
|
||||||
await page.reloadSection('client.card.webAccess');
|
await page.reloadSection('client.card.webAccess');
|
||||||
const result = await page.checkboxState(selectors.clientWebAccess.enableWebAccessCheckbox);
|
const hasAccess = await page.checkboxState($.enableWebAccess);
|
||||||
|
const userName = await page.getValue($.userName);
|
||||||
|
const email = await page.getValue($.email);
|
||||||
|
|
||||||
expect(result).toBe('unchecked');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm web access name have been updated', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.clientWebAccess.userName, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('Legion');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm web access email have been updated', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.clientWebAccess.email, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('legion@marvel.com');
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should navigate to the log section`, async() => {
|
|
||||||
await page.accessToSection('client.card.log');
|
await page.accessToSection('client.card.log');
|
||||||
});
|
const logName = await page.innerText($.nameValue);
|
||||||
|
const logActive = await page.innerText($.activeValue);
|
||||||
|
|
||||||
it(`should confirm the last log shows the updated client name and no modifications on active checkbox`, async() => {
|
expect(enableMessage.type).toBe('success');
|
||||||
let namePreviousValue = await page
|
expect(modifyMessage.type).toBe('success');
|
||||||
.waitToGetProperty(selectors.clientLog.namePreviousValue, 'innerText');
|
|
||||||
let nameCurrentValue = await page
|
|
||||||
.waitToGetProperty(selectors.clientLog.nameCurrentValue, 'innerText');
|
|
||||||
|
|
||||||
expect(namePreviousValue).toEqual('MaxEisenhardt');
|
expect(hasAccess).toBe('unchecked');
|
||||||
expect(nameCurrentValue).toEqual('Legion');
|
expect(userName).toEqual('Legion');
|
||||||
});
|
expect(email).toEqual('legion@marvel.com');
|
||||||
|
|
||||||
it(`should confirm the penultimate log shows the updated active and no modifications on client name`, async() => {
|
expect(logName).toEqual('Legion');
|
||||||
let activePreviousValue = await page
|
expect(logActive).toEqual('✗');
|
||||||
.waitToGetProperty(selectors.clientLog.activePreviousValue, 'innerText');
|
|
||||||
let activeCurrentValue = await page
|
|
||||||
.waitToGetProperty(selectors.clientLog.activeCurrentValue, 'innerText');
|
|
||||||
|
|
||||||
expect(activePreviousValue).toEqual('✓');
|
|
||||||
expect(activeCurrentValue).toEqual('✗');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -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,43 @@ 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.waitForSelector($.intrastatForm);
|
||||||
|
await page.fillForm($.intrastatForm, {
|
||||||
expect(result).toEqual('Anthurium');
|
id: '588420239',
|
||||||
|
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');
|
||||||
});
|
});
|
||||||
|
|
|
@ -246,10 +246,12 @@ describe('Ticket Edit sale path', () => {
|
||||||
it('should select the third sale and create a claim of it', async() => {
|
it('should select the third sale and create a claim of it', async() => {
|
||||||
await page.accessToSearchResult('16');
|
await page.accessToSearchResult('16');
|
||||||
await page.accessToSection('ticket.card.sale');
|
await page.accessToSection('ticket.card.sale');
|
||||||
|
await page.waitToClick(selectors.ticketSales.firstSaleCheckbox);
|
||||||
await page.waitToClick(selectors.ticketSales.thirdSaleCheckbox);
|
await page.waitToClick(selectors.ticketSales.thirdSaleCheckbox);
|
||||||
await page.waitToClick(selectors.ticketSales.moreMenu);
|
await page.waitToClick(selectors.ticketSales.moreMenu);
|
||||||
await page.waitToClick(selectors.ticketSales.moreMenuCreateClaim);
|
await page.waitToClick(selectors.ticketSales.moreMenuCreateClaim);
|
||||||
await page.waitToClick(selectors.globalItems.acceptButton);
|
await page.waitToClick(selectors.globalItems.acceptButton);
|
||||||
|
await page.waitToClick(selectors.globalItems.acceptButton);
|
||||||
await page.waitForState('claim.card.basicData');
|
await page.waitForState('claim.card.basicData');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -315,7 +317,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() => {
|
||||||
|
@ -424,20 +426,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,94 +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.waitToClick(selectors.ticketFuture.multiCheck);
|
|
||||||
await page.waitToClick(selectors.ticketFuture.firstCheck);
|
|
||||||
await page.waitToClick(selectors.ticketFuture.moveButton);
|
|
||||||
await page.waitToClick(selectors.ticketFuture.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() => {
|
||||||
|
|
|
@ -35,7 +35,7 @@ describe('InvoiceIn serial path', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should go to index and check if the search-panel has the correct params', async() => {
|
it('should go to index and check if the search-panel has the correct params', async() => {
|
||||||
await page.click(selectors.invoiceInSerial.goToIndex);
|
await page.waitToClick(selectors.invoiceInSerial.goToIndex);
|
||||||
const params = await page.$$(selectors.invoiceInIndex.topbarSearchParams);
|
const params = await page.$$(selectors.invoiceInIndex.topbarSearchParams);
|
||||||
const serial = await params[0].getProperty('title');
|
const serial = await params[0].getProperty('title');
|
||||||
const isBooked = await params[1].getProperty('title');
|
const isBooked = await params[1].getProperty('title');
|
||||||
|
|
|
@ -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');
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import getBrowser from '../../helpers/puppeteer';
|
import getBrowser from '../../helpers/puppeteer';
|
||||||
|
|
||||||
describe('InvoiceIn negative bases path', () => {
|
describe('InvoiceOut negative bases path', () => {
|
||||||
let browser;
|
let browser;
|
||||||
let page;
|
let page;
|
||||||
const httpRequests = [];
|
const httpRequests = [];
|
||||||
|
@ -9,11 +9,11 @@ describe('InvoiceIn negative bases path', () => {
|
||||||
browser = await getBrowser();
|
browser = await getBrowser();
|
||||||
page = browser.page;
|
page = browser.page;
|
||||||
page.on('request', req => {
|
page.on('request', req => {
|
||||||
if (req.url().includes(`InvoiceIns/negativeBases`))
|
if (req.url().includes(`InvoiceOuts/negativeBases`))
|
||||||
httpRequests.push(req.url());
|
httpRequests.push(req.url());
|
||||||
});
|
});
|
||||||
await page.loginAndModule('administrative', 'invoiceIn');
|
await page.loginAndModule('administrative', 'invoiceOut');
|
||||||
await page.accessToSection('invoiceIn.negative-bases');
|
await page.accessToSection('invoiceOut.negative-bases');
|
||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async() => {
|
afterAll(async() => {
|
|
@ -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,105 +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.notes, 'new notes');
|
await page.write($.observations, ' edited');
|
||||||
await page.write(selectors.entryBasicData.observations, ' edited');
|
await page.autocompleteSearch($.supplier, 'Plants nick');
|
||||||
await page.autocompleteSearch(selectors.entryBasicData.supplier, 'Plants nick');
|
await page.autocompleteSearch($.currency, 'eur');
|
||||||
await page.autocompleteSearch(selectors.entryBasicData.currency, 'eur');
|
await page.clearInput($.commission);
|
||||||
await page.clearInput(selectors.entryBasicData.commission);
|
await page.write($.commission, '100');
|
||||||
await page.write(selectors.entryBasicData.commission, '100');
|
await page.autocompleteSearch($.company, 'CCs');
|
||||||
await page.autocompleteSearch(selectors.entryBasicData.company, 'CCs');
|
await page.waitToClick($.ordered);
|
||||||
await page.waitToClick(selectors.entryBasicData.ordered);
|
await page.waitToClick($.confirmed);
|
||||||
await page.waitToClick(selectors.entryBasicData.confirmed);
|
await page.waitToClick($.inventory);
|
||||||
await page.waitToClick(selectors.entryBasicData.inventory);
|
await page.waitToClick($.raid);
|
||||||
await page.waitToClick(selectors.entryBasicData.raid);
|
await page.waitToClick($.booked);
|
||||||
await page.waitToClick(selectors.entryBasicData.booked);
|
await page.waitToClick($.save);
|
||||||
await page.waitToClick(selectors.entryBasicData.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 note was edited', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.entryBasicData.notes, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('new notes');
|
|
||||||
});
|
|
||||||
|
|
||||||
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,6 +1,20 @@
|
||||||
import selectors from '../../helpers/selectors.js';
|
|
||||||
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;
|
||||||
|
@ -10,102 +24,48 @@ describe('Supplier fiscal data path', () => {
|
||||||
page = browser.page;
|
page = browser.page;
|
||||||
await page.loginAndModule('administrative', 'supplier');
|
await page.loginAndModule('administrative', 'supplier');
|
||||||
await page.accessToSearchResult('2');
|
await page.accessToSearchResult('2');
|
||||||
await page.accessToSection('supplier.card.fiscalData');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
afterAll(async() => {
|
afterAll(async() => {
|
||||||
await browser.close();
|
await browser.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should attempt to edit the fiscal data but fail as the tax number is invalid', async() => {
|
it('should attempt to edit the fiscal data and check data is saved', async() => {
|
||||||
await page.clearInput(selectors.supplierFiscalData.city);
|
await page.accessToSection('supplier.card.fiscalData');
|
||||||
await page.clearInput(selectors.supplierFiscalData.province);
|
|
||||||
await page.clearInput(selectors.supplierFiscalData.country);
|
|
||||||
await page.clearInput(selectors.supplierFiscalData.postCode);
|
|
||||||
await page.write(selectors.supplierFiscalData.city, 'Valencia');
|
|
||||||
await page.waitForTimeout(1000); // must repeat this action twice or fails. also #2699 may be a cool solution to this.
|
|
||||||
await page.clearInput(selectors.supplierFiscalData.city);
|
|
||||||
await page.write(selectors.supplierFiscalData.city, 'Valencia');
|
|
||||||
await page.clearInput(selectors.supplierFiscalData.socialName);
|
|
||||||
await page.write(selectors.supplierFiscalData.socialName, 'Farmer King SL');
|
|
||||||
await page.clearInput(selectors.supplierFiscalData.taxNumber);
|
|
||||||
await page.write(selectors.supplierFiscalData.taxNumber, 'Wrong tax number');
|
|
||||||
await page.clearInput(selectors.supplierFiscalData.account);
|
|
||||||
await page.write(selectors.supplierFiscalData.account, '0123456789');
|
|
||||||
await page.autocompleteSearch(selectors.supplierFiscalData.sageWihholding, 'retencion estimacion objetiva');
|
|
||||||
await page.autocompleteSearch(selectors.supplierFiscalData.sageTaxType, 'operaciones no sujetas');
|
|
||||||
|
|
||||||
await page.waitToClick(selectors.supplierFiscalData.saveButton);
|
const form = 'vn-supplier-fiscal-data form';
|
||||||
const message = await page.waitForSnackbar();
|
const values = {
|
||||||
|
province: null,
|
||||||
|
country: null,
|
||||||
|
postcode: null,
|
||||||
|
city: 'Valencia',
|
||||||
|
socialName: 'Farmer King SL',
|
||||||
|
taxNumber: 'Wrong tax number',
|
||||||
|
account: '0123456789',
|
||||||
|
sageWithholding: 'retencion estimacion objetiva',
|
||||||
|
sageTaxType: 'operaciones no sujetas'
|
||||||
|
};
|
||||||
|
|
||||||
expect(message.text).toContain('Invalid Tax number');
|
const errorMessage = await page.sendForm(form, values);
|
||||||
|
const message = await page.sendForm(form, {
|
||||||
|
taxNumber: '12345678Z'
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should save the changes as the tax number is valid this time', async() => {
|
|
||||||
await page.clearInput(selectors.supplierFiscalData.taxNumber);
|
|
||||||
await page.write(selectors.supplierFiscalData.taxNumber, '12345678Z');
|
|
||||||
|
|
||||||
await page.waitToClick(selectors.supplierFiscalData.saveButton);
|
|
||||||
const message = await page.waitForSnackbar();
|
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should reload the section', async() => {
|
|
||||||
await page.reloadSection('supplier.card.fiscalData');
|
await page.reloadSection('supplier.card.fiscalData');
|
||||||
|
const formValues = await page.fetchForm(form, Object.keys(values));
|
||||||
|
|
||||||
|
expect(errorMessage.text).toContain('Invalid Tax number');
|
||||||
|
expect(message.isSuccess).toBeTrue();
|
||||||
|
expect(formValues).toEqual({
|
||||||
|
province: 'Province one',
|
||||||
|
country: 'España',
|
||||||
|
postcode: '46000',
|
||||||
|
city: 'Valencia',
|
||||||
|
socialName: 'Farmer King SL',
|
||||||
|
taxNumber: '12345678Z',
|
||||||
|
account: '0123456789',
|
||||||
|
sageWithholding: 'RETENCION ESTIMACION OBJETIVA',
|
||||||
|
sageTaxType: 'Operaciones no sujetas'
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should check the socialName was edited', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.supplierFiscalData.socialName, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('Farmer King SL');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the taxNumber was edited', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.supplierFiscalData.taxNumber, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('12345678Z');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the account was edited', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.supplierFiscalData.account, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('0123456789');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the sageWihholding was edited', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.supplierFiscalData.sageWihholding, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('RETENCION ESTIMACION OBJETIVA');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the sageTaxType was edited', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.supplierFiscalData.sageTaxType, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('Operaciones no sujetas');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the postCode was edited', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.supplierFiscalData.postCode, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('46000');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the city was edited', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.supplierFiscalData.city, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('Valencia');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the province was edited', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.supplierFiscalData.province, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('Province one (España)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should check the country was edited', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.supplierFiscalData.country, 'value');
|
|
||||||
|
|
||||||
expect(result).toEqual('España');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -174,7 +174,6 @@ export default class Autocomplete extends Field {
|
||||||
|
|
||||||
refreshDisplayed() {
|
refreshDisplayed() {
|
||||||
let display = '';
|
let display = '';
|
||||||
let hasTemplate = this.$transclude && this.$transclude.isSlotFilled('tplItem');
|
|
||||||
|
|
||||||
if (this._selection && this.showField) {
|
if (this._selection && this.showField) {
|
||||||
if (this.multiple && Array.isArray(this._selection)) {
|
if (this.multiple && Array.isArray(this._selection)) {
|
||||||
|
@ -182,19 +181,8 @@ export default class Autocomplete extends Field {
|
||||||
if (display.length > 0) display += ', ';
|
if (display.length > 0) display += ', ';
|
||||||
display += item[this.showField];
|
display += item[this.showField];
|
||||||
}
|
}
|
||||||
} else {
|
} else
|
||||||
display = this._selection[this.showField];
|
display = this._selection[this.showField];
|
||||||
if (hasTemplate) {
|
|
||||||
let template = this.$transclude(() => {}, null, 'tplItem');
|
|
||||||
const element = template[0];
|
|
||||||
const description = element.querySelector('.text-secondary');
|
|
||||||
if (description) description.remove();
|
|
||||||
|
|
||||||
const displayElement = angular.element(element);
|
|
||||||
const displayText = displayElement.text();
|
|
||||||
display = this.$interpolate(displayText)(this._selection);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.input.value = display;
|
this.input.value = display;
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
<div class="letter">
|
||||||
|
{{::$ctrl.val && $ctrl.val.charAt(0).toUpperCase()}}
|
||||||
|
</div>
|
||||||
|
<div class="image" ng-transclude>
|
||||||
|
</div>
|
|
@ -0,0 +1,33 @@
|
||||||
|
import ngModule from '../../module';
|
||||||
|
import Component from 'core/lib/component';
|
||||||
|
import {hashToColor} from '../../lib/string';
|
||||||
|
import './style.scss';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays colored avatar based on value.
|
||||||
|
*
|
||||||
|
* @property {*} val The value
|
||||||
|
*/
|
||||||
|
export default class Avatar extends Component {
|
||||||
|
get val() {
|
||||||
|
return this._val;
|
||||||
|
}
|
||||||
|
|
||||||
|
set val(value) {
|
||||||
|
this._val = value;
|
||||||
|
|
||||||
|
const val = value || '';
|
||||||
|
const el = this.element;
|
||||||
|
el.style.backgroundColor = hashToColor(val);
|
||||||
|
el.title = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ngModule.vnComponent('vnAvatar', {
|
||||||
|
template: require('./index.html'),
|
||||||
|
controller: Avatar,
|
||||||
|
bindings: {
|
||||||
|
val: '@?'
|
||||||
|
},
|
||||||
|
transclude: true
|
||||||
|
});
|
|
@ -0,0 +1,32 @@
|
||||||
|
@import "variables";
|
||||||
|
|
||||||
|
vn-avatar {
|
||||||
|
display: block;
|
||||||
|
border-radius: 50%;
|
||||||
|
overflow: hidden;
|
||||||
|
height: 36px;
|
||||||
|
width: 36px;
|
||||||
|
font-size: 22px;
|
||||||
|
background-color: $color-main;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
& > * {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
& > .letter {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
& > .image {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
|
||||||
|
& > img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,11 +7,10 @@ export default class DataViewer {
|
||||||
}
|
}
|
||||||
|
|
||||||
get status() {
|
get status() {
|
||||||
if (this.model)
|
|
||||||
return this.model.status;
|
|
||||||
|
|
||||||
if (this.isLoading)
|
if (this.isLoading)
|
||||||
return 'loading';
|
return 'loading';
|
||||||
|
if (this.model)
|
||||||
|
return this.model.status;
|
||||||
if (!this.data)
|
if (!this.data)
|
||||||
return 'clear';
|
return 'clear';
|
||||||
if (this.data.length)
|
if (this.data.length)
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,7 +166,7 @@ export default class Field extends FormInput {
|
||||||
if (event.defaultPrevented) return;
|
if (event.defaultPrevented) return;
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
this.field = null;
|
this.field = null;
|
||||||
this.input.dispatchEvent(new Event('change'));
|
this.element.dispatchEvent(new Event('change'));
|
||||||
}
|
}
|
||||||
|
|
||||||
buildInput(type) {
|
buildInput(type) {
|
||||||
|
|
|
@ -17,6 +17,7 @@ import './pagination/pagination';
|
||||||
import './searchbar/searchbar';
|
import './searchbar/searchbar';
|
||||||
import './scroll-up/scroll-up';
|
import './scroll-up/scroll-up';
|
||||||
import './autocomplete';
|
import './autocomplete';
|
||||||
|
import './avatar';
|
||||||
import './button';
|
import './button';
|
||||||
import './button-menu';
|
import './button-menu';
|
||||||
import './calendar';
|
import './calendar';
|
||||||
|
@ -32,6 +33,7 @@ import './float-button';
|
||||||
import './icon-menu';
|
import './icon-menu';
|
||||||
import './icon-button';
|
import './icon-button';
|
||||||
import './input-number';
|
import './input-number';
|
||||||
|
import './json-value';
|
||||||
import './label-value';
|
import './label-value';
|
||||||
import './range';
|
import './range';
|
||||||
import './input-time';
|
import './input-time';
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
import ngModule from '../../module';
|
||||||
|
import Component from 'core/lib/component';
|
||||||
|
import './style.scss';
|
||||||
|
|
||||||
|
const maxStrLen = 512;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays pretty JSON value.
|
||||||
|
*
|
||||||
|
* @property {*} value The value
|
||||||
|
*/
|
||||||
|
export default class Controller extends Component {
|
||||||
|
get value() {
|
||||||
|
return this._value;
|
||||||
|
}
|
||||||
|
|
||||||
|
set value(value) {
|
||||||
|
const wasEmpty = this._value === undefined;
|
||||||
|
this._value = value;
|
||||||
|
|
||||||
|
let text;
|
||||||
|
let cssClass;
|
||||||
|
const type = typeof value;
|
||||||
|
|
||||||
|
if (value == null) {
|
||||||
|
text = '∅';
|
||||||
|
cssClass = 'null';
|
||||||
|
} else {
|
||||||
|
cssClass = type;
|
||||||
|
switch (type) {
|
||||||
|
case 'number':
|
||||||
|
if (Number.isInteger(value))
|
||||||
|
text = value;
|
||||||
|
else
|
||||||
|
text = Math.round((value + Number.EPSILON) * 1000) / 1000;
|
||||||
|
break;
|
||||||
|
case 'boolean':
|
||||||
|
text = value ? '✓' : '✗';
|
||||||
|
cssClass = value ? 'true' : 'false';
|
||||||
|
break;
|
||||||
|
case 'string':
|
||||||
|
text = value.length <= maxStrLen
|
||||||
|
? value
|
||||||
|
: value.substring(0, maxStrLen) + '...';
|
||||||
|
break;
|
||||||
|
case 'object':
|
||||||
|
if (value instanceof Date) {
|
||||||
|
const hasZeroTime =
|
||||||
|
value.getHours() === 0 &&
|
||||||
|
value.getMinutes() === 0 &&
|
||||||
|
value.getSeconds() === 0;
|
||||||
|
const format = hasZeroTime ? 'dd/MM/yyyy' : 'dd/MM/yyyy HH:mm:ss';
|
||||||
|
text = this.$filter('date')(value, format);
|
||||||
|
} else
|
||||||
|
text = value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
text = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const el = this.element;
|
||||||
|
el.textContent = text;
|
||||||
|
el.title = type == 'string' && value.length > maxStrLen ? value : '';
|
||||||
|
|
||||||
|
cssClass = `json-${cssClass}`;
|
||||||
|
if (wasEmpty)
|
||||||
|
el.classList.add(cssClass);
|
||||||
|
else
|
||||||
|
el.classList.replace(this.className, cssClass);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ngModule.vnComponent('vnJsonValue', {
|
||||||
|
controller: Controller,
|
||||||
|
bindings: {
|
||||||
|
value: '<?'
|
||||||
|
}
|
||||||
|
});
|
|
@ -0,0 +1,93 @@
|
||||||
|
import './index';
|
||||||
|
|
||||||
|
describe('Component vnJsonValue', () => {
|
||||||
|
let controller;
|
||||||
|
let $scope;
|
||||||
|
let $element;
|
||||||
|
let el;
|
||||||
|
|
||||||
|
beforeEach(ngModule('vnCore'));
|
||||||
|
|
||||||
|
beforeEach(inject(($componentController, $rootScope) => {
|
||||||
|
$scope = $rootScope.$new();
|
||||||
|
$element = angular.element('<vn-json-value></vn-json-value>');
|
||||||
|
controller = $componentController('vnJsonValue', {$element, $scope});
|
||||||
|
el = controller.element;
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe('set value()', () => {
|
||||||
|
it('should display null symbol when value is null equivalent', () => {
|
||||||
|
controller.value = null;
|
||||||
|
|
||||||
|
expect(el.textContent).toEqual('∅');
|
||||||
|
expect(el.className).toContain('json-null');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should display ballot when value is false', () => {
|
||||||
|
controller.value = false;
|
||||||
|
|
||||||
|
expect(el.textContent).toEqual('✗');
|
||||||
|
expect(el.className).toContain('json-false');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should display check when value is true', () => {
|
||||||
|
controller.value = true;
|
||||||
|
|
||||||
|
expect(el.textContent).toEqual('✓');
|
||||||
|
expect(el.className).toContain('json-true');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should display string when value is an string', () => {
|
||||||
|
controller.value = 'Foo';
|
||||||
|
|
||||||
|
expect(el.textContent).toEqual('Foo');
|
||||||
|
expect(el.className).toContain('json-string');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should display only date when value is date with time set to zero', () => {
|
||||||
|
const date = Date.vnNew();
|
||||||
|
date.setHours(0, 0, 0, 0);
|
||||||
|
controller.value = date;
|
||||||
|
|
||||||
|
expect(el.textContent).toEqual('01/01/2001');
|
||||||
|
expect(el.className).toContain('json-object');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should display full date without time when value is date with time', () => {
|
||||||
|
const date = Date.vnNew();
|
||||||
|
date.setHours(15, 45);
|
||||||
|
controller.value = date;
|
||||||
|
|
||||||
|
expect(el.textContent).toEqual('01/01/2001 15:45:00');
|
||||||
|
expect(el.className).toContain('json-object');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should display object when value is an object', () => {
|
||||||
|
controller.value = {foo: 'bar'};
|
||||||
|
|
||||||
|
expect(el.textContent).toEqual('[object Object]');
|
||||||
|
expect(el.className).toContain('json-object');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should display number when value is a number', () => {
|
||||||
|
controller.value = 2050;
|
||||||
|
|
||||||
|
expect(el.textContent).toEqual('2050');
|
||||||
|
expect(el.className).toContain('json-number');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should display number when value is decimal', () => {
|
||||||
|
controller.value = 10.1;
|
||||||
|
|
||||||
|
expect(el.textContent).toEqual('10.1');
|
||||||
|
expect(el.className).toContain('json-number');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should display rounded number when value is decimal with lot of decimals', () => {
|
||||||
|
controller.value = 10.124323234;
|
||||||
|
|
||||||
|
expect(el.textContent).toEqual('10.124');
|
||||||
|
expect(el.className).toContain('json-number');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -0,0 +1,23 @@
|
||||||
|
vn-json-value {
|
||||||
|
display: inline;
|
||||||
|
|
||||||
|
&.json-string {
|
||||||
|
color: #d172cc;
|
||||||
|
}
|
||||||
|
&.json-object {
|
||||||
|
color: #d1a572;
|
||||||
|
}
|
||||||
|
&.json-number {
|
||||||
|
color: #85d0ff;
|
||||||
|
}
|
||||||
|
&.json-true {
|
||||||
|
color: #7dc489;
|
||||||
|
}
|
||||||
|
&.json-false {
|
||||||
|
color: #c74949;
|
||||||
|
}
|
||||||
|
&.json-null {
|
||||||
|
color: #cd7c7c;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,3 +1,3 @@
|
||||||
SelectAllRows: Seleccionar las {{rows}} fila(s)
|
SelectAllRows: Seleccionar las {{rows}} fila(s)
|
||||||
All: Se han seleccionado
|
Have been selected: Se han seleccionado
|
||||||
row(s) have been selected.: fila(s).
|
row(s) have been selected.: fila(s).
|
|
@ -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()', () => {
|
||||||
|
|
|
@ -203,7 +203,7 @@ export default class Searchbar extends Component {
|
||||||
|
|
||||||
doSearch(filter, source) {
|
doSearch(filter, source) {
|
||||||
if (filter === this.filter && !this.isIndex) return;
|
if (filter === this.filter && !this.isIndex) return;
|
||||||
let promise = this.onSearch({$params: filter});
|
let promise = this.onSearch({$params: filter}, source);
|
||||||
promise = promise || this.$q.resolve();
|
promise = promise || this.$q.resolve();
|
||||||
promise.then(data => this.onFilter(filter, source, data));
|
promise.then(data => this.onFilter(filter, source, data));
|
||||||
this.toBar(filter);
|
this.toBar(filter);
|
||||||
|
@ -259,12 +259,6 @@ export default class Searchbar extends Component {
|
||||||
|
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
|
|
||||||
if (source == 'removeBar') {
|
|
||||||
delete params[this.toRemove];
|
|
||||||
delete this.model.userParams[this.toRemove];
|
|
||||||
this.model.refresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!filter && this.model)
|
if (!filter && this.model)
|
||||||
this.model.clear();
|
this.model.clear();
|
||||||
if (source != 'state')
|
if (source != 'state')
|
||||||
|
@ -279,7 +273,7 @@ export default class Searchbar extends Component {
|
||||||
return {id: params.$row.id};
|
return {id: params.$row.id};
|
||||||
}
|
}
|
||||||
|
|
||||||
onSearch(args) {
|
onSearch(args, source) {
|
||||||
if (!this.model) return;
|
if (!this.model) return;
|
||||||
let filter = args.$params;
|
let filter = args.$params;
|
||||||
|
|
||||||
|
@ -325,6 +319,12 @@ export default class Searchbar extends Component {
|
||||||
for (let param in stateFilter.tableQ)
|
for (let param in stateFilter.tableQ)
|
||||||
params[param] = stateFilter.tableQ[param];
|
params[param] = stateFilter.tableQ[param];
|
||||||
|
|
||||||
|
if (source == 'removeBar') {
|
||||||
|
delete params[this.toRemove];
|
||||||
|
delete this.model.userParams[this.toRemove];
|
||||||
|
delete stateFilter[this.toRemove];
|
||||||
|
}
|
||||||
|
|
||||||
const newParams = Object.assign(stateFilter, params);
|
const newParams = Object.assign(stateFilter, params);
|
||||||
return this.model.applyParams(newParams)
|
return this.model.applyParams(newParams)
|
||||||
.then(() => this.model.data);
|
.then(() => this.model.data);
|
||||||
|
|
|
@ -197,7 +197,7 @@ describe('Component vnSearchbar', () => {
|
||||||
controller.doSearch(filter, 'any');
|
controller.doSearch(filter, 'any');
|
||||||
$scope.$apply();
|
$scope.$apply();
|
||||||
|
|
||||||
expect(controller.onSearch).toHaveBeenCalledWith({$params: filter});
|
expect(controller.onSearch).toHaveBeenCalledWith({$params: filter}, 'any');
|
||||||
expect(controller.onFilter).toHaveBeenCalledWith(filter, 'any', undefined);
|
expect(controller.onFilter).toHaveBeenCalledWith(filter, 'any', undefined);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -41,10 +41,15 @@ vn-table {
|
||||||
display: table-row;
|
display: table-row;
|
||||||
height: 48px;
|
height: 48px;
|
||||||
}
|
}
|
||||||
vn-thead, .vn-thead,
|
& > thead,
|
||||||
vn-tbody, .vn-tbody,
|
& > tbody,
|
||||||
vn-tfoot, .vn-tfoot,
|
& > tfoot,
|
||||||
thead, tbody, tfoot {
|
& > vn-thead,
|
||||||
|
& > vn-tbody,
|
||||||
|
& > vn-tfoot,
|
||||||
|
& > .vn-thead,
|
||||||
|
& > .vn-tbody,
|
||||||
|
& > .vn-tfoot {
|
||||||
& > * {
|
& > * {
|
||||||
display: table-row;
|
display: table-row;
|
||||||
|
|
||||||
|
@ -111,14 +116,14 @@ vn-table {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
a.vn-tbody {
|
& > a.vn-tbody {
|
||||||
&.clickable {
|
&.clickable {
|
||||||
@extend %clickable;
|
@extend %clickable;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vn-tbody > *,
|
& > vn-tbody > *,
|
||||||
.vn-tbody > *,
|
& > .vn-tbody > *,
|
||||||
tbody > * {
|
& > tbody > * {
|
||||||
border-bottom: $border-thin;
|
border-bottom: $border-thin;
|
||||||
|
|
||||||
&:last-child {
|
&:last-child {
|
||||||
|
|
|
@ -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';
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue