diff --git a/Jenkinsfile b/Jenkinsfile index b1706d802..5f329ee61 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -52,6 +52,7 @@ pipeline { }}} environment { NODE_ENV = "" + TZ = 'Europe/Madrid' } parallel { stage('Frontend') { diff --git a/back/locale/account/en.yml b/back/locale/account/en.yml new file mode 100644 index 000000000..0d6c5db80 --- /dev/null +++ b/back/locale/account/en.yml @@ -0,0 +1,17 @@ +name: account +columns: + id: id + name: name + roleFk: role + nickname: nickname + lang: lang + password: password + bcryptPassword: bcrypt password + active: active + email: email + emailVerified: email verified + created: created + updated: updated + image: image + hasGrant: has grant + userFk: user diff --git a/back/locale/account/es.yml b/back/locale/account/es.yml new file mode 100644 index 000000000..79e8a8cc6 --- /dev/null +++ b/back/locale/account/es.yml @@ -0,0 +1,17 @@ +name: cuenta +columns: + id: id + name: nombre + roleFk: rol + nickname: apodo + lang: idioma + password: contraseña + bcryptPassword: contraseña bcrypt + active: activo + email: email + emailVerified: email verificado + created: creado + updated: actualizado + image: imagen + hasGrant: tiene permiso + userFk: usuario diff --git a/db/.archive/225201/00-invoiceOut_new.sql b/db/.archive/225201/00-invoiceOut_new.sql index 10a42d40d..4c60b50bc 100644 --- a/db/.archive/225201/00-invoiceOut_new.sql +++ b/db/.archive/225201/00-invoiceOut_new.sql @@ -8,7 +8,7 @@ CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`invoiceOut_new`( BEGIN /** * 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 vInvoiceDate fecha de la factura @@ -36,13 +36,13 @@ BEGIN SELECT t.clientFk, t.companyFk INTO vClient, vCompany - FROM ticketToInvoice tt + FROM tmp.ticketToInvoice tt JOIN ticket t ON t.id = tt.id 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.* - FROM ticketToInvoice 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 @@ -57,7 +57,7 @@ BEGIN SELECT SUM(s.quantity * s.price * (100 - s.discount)/100), ts.id INTO vIsAnySaleToInvoice, vIsAnyServiceToInvoice - FROM ticketToInvoice t + FROM tmp.ticketToInvoice t LEFT JOIN sale s ON s.ticketFk = t.id LEFT JOIN ticketService ts ON ts.ticketFk = t.id; @@ -100,13 +100,13 @@ BEGIN WHERE id = vNewInvoiceId; UPDATE ticket t - JOIN ticketToInvoice ti ON ti.id = t.id + 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 ticketToInvoice ti + 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); @@ -116,7 +116,7 @@ BEGIN INSERT INTO ticketLog (action, userFk, originFk, description) SELECT 'UPDATE', account.myUser_getId(), ti.id, CONCAT('Crea factura ', vNewRef) - FROM ticketToInvoice ti; + FROM tmp.ticketToInvoice ti; CALL invoiceExpenceMake(vNewInvoiceId); CALL invoiceTaxMake(vNewInvoiceId,vTaxArea); @@ -159,7 +159,7 @@ BEGIN (KEY (ticketFk)) ENGINE = MEMORY SELECT id ticketFk - FROM ticketToInvoice; + FROM tmp.ticketToInvoice; CALL `ticket_getTax`('NATIONAL'); @@ -220,6 +220,6 @@ BEGIN END IF; - DROP TEMPORARY TABLE `ticketToInvoice`; + DROP TEMPORARY TABLE `tmp`.`ticketToInvoice`; END$$ DELIMITER ; diff --git a/db/changes/231001/02-invoiceOut_new.sql b/db/changes/231001/02-invoiceOut_new.sql index 0fd91ef58..d2b96eff7 100644 --- a/db/changes/231001/02-invoiceOut_new.sql +++ b/db/changes/231001/02-invoiceOut_new.sql @@ -10,14 +10,14 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`invoiceOut_new`( BEGIN /** * 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 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); @@ -37,32 +37,32 @@ BEGIN DECLARE vMaxShipped DATE; SET vInvoiceDate = IFNULL(vInvoiceDate, util.CURDATE()); - - SELECT t.clientFk, - t.companyFk, + + SELECT t.clientFk, + t.companyFk, MAX(DATE(t.shipped)), DATE(vInvoiceDate) >= invoiceOut_getMaxIssued( - vSerial, - t.companyFk, + vSerial, + t.companyFk, YEAR(vInvoiceDate)) - INTO vClientFk, + INTO vClientFk, vCompanyFk, vMaxShipped, vIsCorrectInvoiceDate - FROM ticketToInvoice tt + FROM tmp.ticketToInvoice tt JOIN ticket t ON t.id = tt.id; - IF(vMaxShipped > vInvoiceDate) THEN + 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 ticketToInvoice els tickets que no han de ser facturats + + -- Eliminem de tmp.ticketToInvoice els tickets que no han de ser facturats DELETE ti.* - FROM ticketToInvoice 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 @@ -77,11 +77,11 @@ BEGIN SELECT SUM(s.quantity * s.price * (100 - s.discount)/100) <> 0 INTO vIsAnySaleToInvoice - FROM ticketToInvoice t + FROM tmp.ticketToInvoice t JOIN sale s ON s.ticketFk = t.id; SELECT COUNT(*) > 0 INTO vIsAnyServiceToInvoice - FROM ticketToInvoice t + FROM tmp.ticketToInvoice t JOIN ticketService ts ON ts.ticketFk = t.id; IF (vIsAnySaleToInvoice OR vIsAnyServiceToInvoice) @@ -121,13 +121,13 @@ BEGIN WHERE id = vNewInvoiceId; UPDATE ticket t - JOIN ticketToInvoice ti ON ti.id = t.id + 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 ticketToInvoice ti + 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); @@ -137,7 +137,7 @@ BEGIN INSERT INTO ticketLog (action, userFk, originFk, description) SELECT 'UPDATE', account.myUser_getId(), ti.id, CONCAT('Crea factura ', vNewRef) - FROM ticketToInvoice ti; + FROM tmp.ticketToInvoice ti; CALL invoiceExpenceMake(vNewInvoiceId); CALL invoiceTaxMake(vNewInvoiceId,vTaxArea); @@ -157,12 +157,12 @@ BEGIN WHERE io.id = vNewInvoiceId; DROP TEMPORARY TABLE tmp.updateInter; - - SELECT COUNT(*), id + + SELECT COUNT(*), id INTO vIsInterCompany, vInterCompanyFk - FROM company + FROM company WHERE clientFk = vClientFk; - + IF (vIsInterCompany) THEN INSERT INTO invoiceIn(supplierFk, supplierRef, issued, companyFk) @@ -175,7 +175,7 @@ BEGIN (KEY (ticketFk)) ENGINE = MEMORY SELECT id ticketFk - FROM ticketToInvoice; + FROM tmp.ticketToInvoice; CALL `ticket_getTax`('NATIONAL'); @@ -201,7 +201,7 @@ BEGIN ) sub; INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenceFk, taxTypeSageFk, transactionTypeSageFk) - SELECT vNewInvoiceInFk, + SELECT vNewInvoiceInFk, SUM(tt.taxableBase) - IF(tt.code = @vTaxCodeGeneral, @vTaxableBaseServices, 0) taxableBase, i.expenceFk, @@ -215,13 +215,13 @@ BEGIN ORDER BY tt.priority; CALL invoiceInDueDay_calculate(vNewInvoiceInFk); - - SELECT COUNT(*) INTO vIsCEESerial + + SELECT COUNT(*) INTO vIsCEESerial FROM invoiceOutSerial WHERE code = vSerial; IF vIsCEESerial THEN - + INSERT INTO invoiceInIntrastat ( invoiceInFk, intrastatFk, @@ -253,6 +253,6 @@ BEGIN DROP TEMPORARY TABLE tmp.ticketServiceTax; END IF; END IF; - DROP TEMPORARY TABLE `ticketToInvoice`; + DROP TEMPORARY TABLE tmp.`ticketToInvoice`; END$$ -DELIMITER ; \ No newline at end of file +DELIMITER ; diff --git a/db/changes/231601/00-User.sql b/db/changes/231601/00-User.sql deleted file mode 100644 index 6c80d2c2d..000000000 --- a/db/changes/231601/00-User.sql +++ /dev/null @@ -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`; - diff --git a/db/changes/231601/00-deleteProcs_refund.sql b/db/changes/231601/00-deleteProcs_refund.sql new file mode 100644 index 000000000..8bf8982f4 --- /dev/null +++ b/db/changes/231601/00-deleteProcs_refund.sql @@ -0,0 +1,2 @@ +DROP PROCEDURE `vn`.`refund`; +DROP PROCEDURE `vn`.`ticket_doRefund`; diff --git a/db/changes/231601/00-insertI18n.sql b/db/changes/231601/00-insertI18n.sql deleted file mode 100644 index f86cb6a73..000000000 --- a/db/changes/231601/00-insertI18n.sql +++ /dev/null @@ -1,5 +0,0 @@ -INSERT INTO `vn`.`companyI18n` (`companyFk`, `lang`, `footnotes`) -VALUES (442, 'en', 'In compliance with the provisions of Organic Law 15/1999, on the Protection of Personal Data, we inform you that the personal data you provide will be included in automated files of VERDNATURA LEVANTE SL, being able at all times to exercise the rights of access, rectification, cancellation and opposition, communicating it in writing to the registered office of the entity. The purpose of the file is administrative management, accounting, and billing.'), - (442, 'es', 'En cumplimiento de lo dispuesto en la Ley Orgánica 15/1999, de Protección de Datos de Carácter Personal, le comunicamos que los datos personales que facilite se incluirán en ficheros automatizados de VERDNATURA LEVANTE S.L., pudiendo en todo momento ejercitar los derechos de acceso, rectificación, cancelación y oposición, comunicándolo por escrito al domicilio social de la entidad. La finalidad del fichero es la gestión administrativa, contabilidad, y facturación.'), - (442, 'fr', 'Conformément aux dispositions de la loi organique 15/1999 sur la protection des données personnelles, nous vous informons que les données personnelles que vous fournissez seront incluses dans des dossiers. VERDNATURA LEVANTE S.L., vous pouvez à tout moment, exercer les droits d``accès, de rectification, d``annulation et d``opposition, en communiquant par écrit au siège social de la société. Le dossier a pour objet la gestion administrative, la comptabilité et la facturation.'), - (442, 'pt', 'Em cumprimento do disposto na lei Orgânica 15/1999, de Protecção de Dados de Carácter Pessoal, comunicamos que os dados pessoais que facilite se incluirão nos ficheiros automatizados de VERDNATURA LEVANTE S.L., podendo em todo momento exercer os direitos de acesso, rectificação, cancelação e oposição, comunicando por escrito ao domicílio social da entidade. A finalidade do ficheiro é a gestão administrativa, contabilidade e facturação.'); diff --git a/db/changes/231601/00-kkearEntryNotes.sql b/db/changes/231601/00-kkearEntryNotes.sql new file mode 100644 index 000000000..ff5c7ce29 --- /dev/null +++ b/db/changes/231601/00-kkearEntryNotes.sql @@ -0,0 +1 @@ +ALTER TABLE `vn`.`entry` DROP COLUMN `notes`; \ No newline at end of file diff --git a/db/changes/231601/00-updateIsVies.sql b/db/changes/231601/00-updateIsVies.sql new file mode 100644 index 000000000..83fde7352 --- /dev/null +++ b/db/changes/231601/00-updateIsVies.sql @@ -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); \ No newline at end of file diff --git a/db/changes/231601/00-updateisViesClient.sql b/db/changes/231601/00-updateisViesClient.sql new file mode 100644 index 000000000..bdf62d7a8 --- /dev/null +++ b/db/changes/231601/00-updateisViesClient.sql @@ -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); \ No newline at end of file diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index 15ccece35..e69974d08 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -1409,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), (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 - (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'), - (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'), - (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'), - (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'), - (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'), - (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'), - (8, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2008', 'Movement 8', 1, 1, '', ''); + (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, 'observation two'), + (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, 'observation four'), + (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, 'observation six'), + (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, ''); INSERT INTO `bs`.`waste`(`buyer`, `year`, `week`, `family`, `itemFk`, `itemTypeFk`, `saleTotal`, `saleWaste`, `rate`) VALUES diff --git a/db/dump/structure.sql b/db/dump/structure.sql index 90e4c4bc9..3256ecdca 100644 --- a/db/dump/structure.sql +++ b/db/dump/structure.sql @@ -42776,7 +42776,7 @@ CREATE DEFINER=`root`@`localhost` FUNCTION `hasAnyNegativeBase`() RETURNS tinyin BEGIN /* Calcula si existe alguna base imponible negativa -* Requiere la tabla temporal vn.ticketToInvoice(id) +* Requiere la tabla temporal tmp.ticketToInvoice(id) * * returns BOOLEAN */ @@ -42787,7 +42787,7 @@ BEGIN (KEY (ticketFk)) ENGINE = MEMORY SELECT id ticketFk - FROM ticketToInvoice; + FROM tmp.ticketToInvoice; CALL ticket_getTax(NULL); @@ -55223,7 +55223,7 @@ DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceExpenceMake`(IN vInvoice INT) BEGIN /* Inserta las partidas de gasto correspondientes a la factura - * REQUIERE tabla ticketToInvoice + * REQUIERE tabla tmp.ticketToInvoice * @param vInvoice Numero de factura */ DELETE FROM invoiceOutExpence @@ -55233,7 +55233,7 @@ BEGIN SELECT vInvoice, expenceFk, SUM(ROUND(quantity * price * (100 - discount)/100,2)) amount - FROM ticketToInvoice t + FROM tmp.ticketToInvoice t JOIN sale s ON s.ticketFk = t.id JOIN item i ON i.id = s.itemFk GROUP BY i.expenceFk @@ -55243,7 +55243,7 @@ BEGIN SELECT vInvoice, tst.expenceFk, SUM(ROUND(ts.quantity * ts.price ,2)) amount - FROM ticketToInvoice t + FROM tmp.ticketToInvoice t JOIN ticketService ts ON ts.ticketFk = t.id JOIN ticketServiceType tst ON tst.id = ts.ticketServiceTypeFk HAVING amount != 0; @@ -55270,9 +55270,9 @@ BEGIN SET vMaxTicketDate = vn2008.DAYEND(vMaxTicketDate); - DROP TEMPORARY TABLE IF EXISTS `ticketToInvoice`; + DROP TEMPORARY TABLE IF EXISTS `tmp`.`ticketToInvoice`; - CREATE TEMPORARY TABLE `ticketToInvoice` + CREATE TEMPORARY TABLE `tmp`.`ticketToInvoice` (PRIMARY KEY (`id`)) ENGINE = MEMORY SELECT Id_Ticket id FROM vn2008.Tickets WHERE (Fecha BETWEEN vMinDateTicket @@ -55305,8 +55305,8 @@ BEGIN SET vMinTicketDate = util.firstDayOfYear(vMaxTicketDate - INTERVAL 1 YEAR); SET vMaxTicketDate = util.dayend(vMaxTicketDate); - DROP TEMPORARY TABLE IF EXISTS `ticketToInvoice`; - CREATE TEMPORARY TABLE `ticketToInvoice` + DROP TEMPORARY TABLE IF EXISTS `tmp`.`ticketToInvoice`; + CREATE TEMPORARY TABLE `tmp`.`ticketToInvoice` (PRIMARY KEY (`id`)) ENGINE = MEMORY SELECT id FROM ticket t @@ -55333,9 +55333,9 @@ DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceFromTicket`(IN vTicket INT) BEGIN - DROP TEMPORARY TABLE IF EXISTS `ticketToInvoice`; + DROP TEMPORARY TABLE IF EXISTS `tmp`.`ticketToInvoice`; - CREATE TEMPORARY TABLE `ticketToInvoice` + CREATE TEMPORARY TABLE `tmp`.`ticketToInvoice` (PRIMARY KEY (`id`)) ENGINE = MEMORY SELECT id FROM vn.ticket @@ -55931,9 +55931,9 @@ BEGIN JOIN invoiceOut io ON io.companyFk = s.id WHERE io.id = vInvoiceFk; - DROP TEMPORARY TABLE IF EXISTS ticketToInvoice; + DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice; - CREATE TEMPORARY TABLE ticketToInvoice + CREATE TEMPORARY TABLE tmp.ticketToInvoice SELECT id FROM ticket WHERE refFk = vInvoiceRef; @@ -56408,9 +56408,9 @@ BEGIN JOIN client c ON c.id = io.clientFk WHERE io.id = vInvoice; - DROP TEMPORARY TABLE IF EXISTS ticketToInvoice; + DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice; - CREATE TEMPORARY TABLE ticketToInvoice + CREATE TEMPORARY TABLE tmp.ticketToInvoice SELECT id FROM ticket WHERE refFk = vInvoiceRef; @@ -56456,7 +56456,7 @@ CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceOut_exportationFromClient`( vCompanyFk INT) BEGIN /** - * Genera tabla temporal ticketToInvoice necesaría para el proceso de facturación + * Genera tabla temporal tmp.ticketToInvoice necesaría para el proceso de facturación * Los abonos quedan excluidos en las exportaciones * * @param vMaxTicketDate Fecha hasta la cual cogerá tickets para facturar @@ -56467,8 +56467,8 @@ BEGIN SET vMinTicketDate = util.firstDayOfYear(vMaxTicketDate - INTERVAL 1 YEAR); SET vMaxTicketDate = util.dayend(vMaxTicketDate); - DROP TEMPORARY TABLE IF EXISTS `ticketToInvoice`; - CREATE TEMPORARY TABLE `ticketToInvoice` + DROP TEMPORARY TABLE IF EXISTS `tmp`.`ticketToInvoice`; + CREATE TEMPORARY TABLE `tmp`.`ticketToInvoice` (PRIMARY KEY (`id`)) ENGINE = MEMORY SELECT t.id @@ -56503,7 +56503,7 @@ CREATE DEFINER=`root`@`localhost` PROCEDURE `invoiceOut_new`( BEGIN /** * 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 vInvoiceDate fecha de la factura @@ -56531,13 +56531,13 @@ BEGIN SELECT t.clientFk, t.companyFk INTO vClientFk, vCompanyFk - FROM ticketToInvoice tt + FROM tmp.ticketToInvoice tt JOIN ticket t ON t.id = tt.id 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.* - FROM ticketToInvoice 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 @@ -56552,7 +56552,7 @@ BEGIN SELECT SUM(s.quantity * s.price * (100 - s.discount)/100), ts.id INTO vIsAnySaleToInvoice, vIsAnyServiceToInvoice - FROM ticketToInvoice t + FROM tmp.ticketToInvoice t LEFT JOIN sale s ON s.ticketFk = t.id LEFT JOIN ticketService ts ON ts.ticketFk = t.id; @@ -56593,13 +56593,13 @@ BEGIN WHERE id = vNewInvoiceId; UPDATE ticket t - JOIN ticketToInvoice ti ON ti.id = t.id + 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 ticketToInvoice ti + 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); @@ -56609,7 +56609,7 @@ BEGIN INSERT INTO ticketLog (action, userFk, originFk, description) SELECT 'UPDATE', account.myUser_getId(), ti.id, CONCAT('Crea factura ', vNewRef) - FROM ticketToInvoice ti; + FROM tmp.ticketToInvoice ti; CALL invoiceExpenceMake(vNewInvoiceId); CALL invoiceTaxMake(vNewInvoiceId,vTaxArea); @@ -56647,7 +56647,7 @@ BEGIN (KEY (ticketFk)) ENGINE = MEMORY SELECT id ticketFk - FROM ticketToInvoice; + FROM tmp.ticketToInvoice; CALL `ticket_getTax`('NATIONAL'); @@ -56725,7 +56725,7 @@ BEGIN DROP TEMPORARY TABLE tmp.ticketServiceTax; END IF; END IF; - DROP TEMPORARY TABLE `ticketToInvoice`; + DROP TEMPORARY TABLE `tmp`.`ticketToInvoice`; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -56876,7 +56876,7 @@ BEGIN (KEY (ticketFk)) ENGINE = MEMORY SELECT id ticketFk - FROM ticketToInvoice; + FROM tmp.ticketToInvoice; CALL ticket_getTax(vTaxArea); @@ -68689,7 +68689,7 @@ DELIMITER ; /*!50003 SET character_set_client = @saved_cs_client */ ; /*!50003 SET character_set_results = @saved_cs_results */ ; /*!50003 SET collation_connection = @saved_col_connection */ ; -/*!50003 DROP PROCEDURE IF EXISTS `ticketToInvoiceByAddress` */; +/*!50003 DROP PROCEDURE IF EXISTS `tmp`.`ticketToInvoiceByAddress` */; /*!50003 SET @saved_cs_client = @@character_set_client */ ; /*!50003 SET @saved_cs_results = @@character_set_results */ ; /*!50003 SET @saved_col_connection = @@collation_connection */ ; @@ -68709,9 +68709,9 @@ BEGIN SET vEnded = util.dayEnd(vEnded); - DROP TEMPORARY TABLE IF EXISTS vn.ticketToInvoice; + DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice; - CREATE TEMPORARY TABLE vn.ticketToInvoice + CREATE TEMPORARY TABLE tmp.ticketToInvoice SELECT id FROM vn.ticket WHERE addressFk = vAddress @@ -68745,9 +68745,9 @@ BEGIN SET vEnded = util.dayEnd(vEnded); - DROP TEMPORARY TABLE IF EXISTS vn.ticketToInvoice; + DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice; - CREATE TEMPORARY TABLE vn.ticketToInvoice + CREATE TEMPORARY TABLE tmp.ticketToInvoice SELECT id FROM vn.ticket WHERE clientFk = vClient @@ -68808,9 +68808,9 @@ BEGIN JOIN vn.client c ON c.id = io.clientFk WHERE io.id = vInvoice; - DROP TEMPORARY TABLE IF EXISTS vn.ticketToInvoice; + DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice; - CREATE TEMPORARY TABLE vn.ticketToInvoice + CREATE TEMPORARY TABLE tmp.ticketToInvoice SELECT id FROM vn.ticket WHERE refFk = vInvoiceRef; diff --git a/db/export-data.sh b/db/export-data.sh index bdf8049e0..11358e64c 100755 --- a/db/export-data.sh +++ b/db/export-data.sh @@ -68,6 +68,7 @@ TABLES=( time volumeConfig workCenter + companyI18n ) dump_tables ${TABLES[@]} diff --git a/e2e/helpers/extensions.js b/e2e/helpers/extensions.js index 1fcbfd616..b54afe5a7 100644 --- a/e2e/helpers/extensions.js +++ b/e2e/helpers/extensions.js @@ -218,6 +218,23 @@ let actions = { return handle.jsonValue(); }, + getValue: async function(selector) { + return await this.waitToGetProperty(selector, 'value'); + }, + + getValues: async function(selectorMap) { + const values = {}; + for (const key in selectorMap) + values[key] = await this.waitToGetProperty(selectorMap[key], 'value'); + return values; + }, + + innerText: async function(selector) { + const element = await this.$(selector); + const handle = await element.getProperty('innerText'); + return handle.jsonValue(); + }, + waitPropertyLength: async function(selector, property, minLength) { await this.waitForFunction((selector, property, minLength) => { const element = document.querySelector(selector); diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index 7e8b91fa1..1740db7ca 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -283,12 +283,6 @@ export default { cancelEditAddressButton: 'vn-client-address-edit > form > vn-button-bar > vn-button > button', 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: { addNoteFloatButton: 'vn-float-button', note: 'vn-textarea[ng-model="$ctrl.note.text"]', @@ -312,15 +306,6 @@ export default { clientMandate: { 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`, @@ -755,6 +740,7 @@ export default { anyDocument: 'vn-ticket-dms-index > vn-data-viewer vn-tbody vn-tr' }, ticketFuture: { + searchResult: 'vn-ticket-future tbody tr', openAdvancedSearchButton: 'vn-searchbar .append vn-icon[icon="arrow_drop_down"]', originDated: 'vn-date-picker[label="Origin date"]', futureDated: 'vn-date-picker[label="Destination date"]', @@ -770,7 +756,6 @@ export default { problems: 'vn-check[label="With problems"]', tableButtonSearch: 'vn-button[vn-tooltip="Search"]', moveButton: 'vn-button[vn-tooltip="Future tickets"]', - acceptButton: '.vn-confirm.shown button[response="accept"]', firstCheck: 'tbody > tr:nth-child(1) > td > vn-check', multiCheck: 'vn-multi-check', tableId: 'vn-textfield[name="id"]', @@ -1361,18 +1346,6 @@ export default { notes: 'vn-supplier-basic-data vn-textarea[ng-model="$ctrl.supplier.note"]', 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: { payMethod: 'vn-supplier-billing-data vn-autocomplete[ng-model="$ctrl.supplier.payMethodFk"]', payDem: 'vn-supplier-billing-data vn-autocomplete[ng-model="$ctrl.supplier.payDemFk"]', diff --git a/e2e/paths/01-salix/03_smartTable_searchBar_integrations.spec.js b/e2e/paths/01-salix/03_smartTable_searchBar_integrations.spec.js index 25735e50a..f9844d5f7 100644 --- a/e2e/paths/01-salix/03_smartTable_searchBar_integrations.spec.js +++ b/e2e/paths/01-salix/03_smartTable_searchBar_integrations.spec.js @@ -81,9 +81,7 @@ describe('SmartTable SearchBar integration', () => { await page.accessToSection('item.fixedPrice'); await page.keyboard.press('Enter'); - const result = await page.waitToGetProperty(selectors.itemFixedPrice.firstItemID, 'value'); - - expect(result).toEqual('1'); + await page.waitForTextInField(selectors.itemFixedPrice.firstItemID, '1'); }); it('should order by last id, reload page and have same order', async() => { @@ -91,9 +89,7 @@ describe('SmartTable SearchBar integration', () => { await page.reload({ waitUntil: 'networkidle2' }); - const result = await page.waitToGetProperty(selectors.itemFixedPrice.firstItemID, 'value'); - - expect(result).toEqual('13'); + await page.waitForTextInField(selectors.itemFixedPrice.firstItemID, '13'); }); }); }); diff --git a/e2e/paths/02-client/07_edit_web_access.spec.js b/e2e/paths/02-client/07_edit_web_access.spec.js index 29b39f788..26b4c4e27 100644 --- a/e2e/paths/02-client/07_edit_web_access.spec.js +++ b/e2e/paths/02-client/07_edit_web_access.spec.js @@ -1,88 +1,56 @@ -/* eslint max-len: ["error", { "code": 150 }]*/ -import selectors from '../../helpers/selectors'; 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(1) vn-json-value', + activeValue: 'vn-client-log .change:nth-child(2) .basic-json:nth-child(2) vn-json-value' +}; + +describe('Client web access path', () => { let browser; let page; + beforeAll(async() => { browser = await getBrowser(); page = browser.page; await page.loginAndModule('salesPerson', 'client'); await page.accessToSearchResult('max'); - await page.accessToSection('client.card.webAccess'); }); afterAll(async() => { await browser.close(); }); - it('should uncheck the Enable web access checkbox', async() => { - await page.waitToClick(selectors.clientWebAccess.enableWebAccessCheckbox); - await page.waitToClick(selectors.clientWebAccess.saveButton); - const message = await page.waitForSnackbar(); + it('should modify and save web access attributes', async() => { + await page.accessToSection('client.card.webAccess'); + await page.click($.enableWebAccess); + 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'); - 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'); - }); + 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() => { - let namePreviousValue = await page - .waitToGetProperty(selectors.clientLog.namePreviousValue, 'innerText'); - let nameCurrentValue = await page - .waitToGetProperty(selectors.clientLog.nameCurrentValue, 'innerText'); + expect(enableMessage.type).toBe('success'); + expect(modifyMessage.type).toBe('success'); - expect(namePreviousValue).toEqual('MaxEisenhardt'); - expect(nameCurrentValue).toEqual('Legion'); - }); + expect(hasAccess).toBe('unchecked'); + 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() => { - let activePreviousValue = await page - .waitToGetProperty(selectors.clientLog.activePreviousValue, 'innerText'); - let activeCurrentValue = await page - .waitToGetProperty(selectors.clientLog.activeCurrentValue, 'innerText'); - - expect(activePreviousValue).toEqual('✓'); - expect(activeCurrentValue).toEqual('✗'); + expect(logName).toEqual('Legion'); + expect(logActive).toEqual('✗'); }); }); diff --git a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js index 323646d29..1b3204046 100644 --- a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js +++ b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js @@ -246,6 +246,7 @@ describe('Ticket Edit sale path', () => { it('should select the third sale and create a claim of it', async() => { await page.accessToSearchResult('16'); await page.accessToSection('ticket.card.sale'); + await page.waitToClick(selectors.ticketSales.firstSaleCheckbox); await page.waitToClick(selectors.ticketSales.thirdSaleCheckbox); await page.waitToClick(selectors.ticketSales.moreMenu); await page.waitToClick(selectors.ticketSales.moreMenuCreateClaim); diff --git a/e2e/paths/05-ticket/21_future.spec.js b/e2e/paths/05-ticket/21_future.spec.js index 626056958..783b0c9b2 100644 --- a/e2e/paths/05-ticket/21_future.spec.js +++ b/e2e/paths/05-ticket/21_future.spec.js @@ -126,10 +126,11 @@ describe('Ticket Future path', () => { }); it('should check the three last tickets and move to the future', async() => { + await page.waitForNumberOfElements(selectors.ticketFuture.searchResult, 4); await page.waitToClick(selectors.ticketFuture.multiCheck); await page.waitToClick(selectors.ticketFuture.firstCheck); await page.waitToClick(selectors.ticketFuture.moveButton); - await page.waitToClick(selectors.ticketFuture.acceptButton); + await page.waitToClick(selectors.globalItems.acceptButton); const message = await page.waitForSnackbar(); expect(message.text).toContain('Tickets moved successfully!'); diff --git a/e2e/paths/09-invoice-in/05_serial.spec.js b/e2e/paths/09-invoice-in/05_serial.spec.js index 3aa94f48c..8be5660da 100644 --- a/e2e/paths/09-invoice-in/05_serial.spec.js +++ b/e2e/paths/09-invoice-in/05_serial.spec.js @@ -35,7 +35,7 @@ describe('InvoiceIn serial path', () => { }); 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 serial = await params[0].getProperty('title'); const isBooked = await params[1].getProperty('title'); diff --git a/e2e/paths/12-entry/05_basicData.spec.js b/e2e/paths/12-entry/05_basicData.spec.js index 3b5f40c35..0272446d9 100644 --- a/e2e/paths/12-entry/05_basicData.spec.js +++ b/e2e/paths/12-entry/05_basicData.spec.js @@ -20,7 +20,6 @@ describe('Entry basic data path', () => { it('should edit the basic data', async() => { await page.write(selectors.entryBasicData.reference, 'new movement 8'); await page.write(selectors.entryBasicData.invoiceNumber, 'new movement 8'); - await page.write(selectors.entryBasicData.notes, 'new notes'); await page.write(selectors.entryBasicData.observations, ' edited'); await page.autocompleteSearch(selectors.entryBasicData.supplier, 'Plants nick'); await page.autocompleteSearch(selectors.entryBasicData.currency, 'eur'); @@ -53,12 +52,6 @@ describe('Entry basic data path', () => { 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'); diff --git a/e2e/paths/13-supplier/03_fiscal_data.spec.js b/e2e/paths/13-supplier/03_fiscal_data.spec.js index 4f9581e32..170a8d05a 100644 --- a/e2e/paths/13-supplier/03_fiscal_data.spec.js +++ b/e2e/paths/13-supplier/03_fiscal_data.spec.js @@ -1,6 +1,20 @@ -import selectors from '../../helpers/selectors.js'; 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', () => { let browser; let page; @@ -10,102 +24,44 @@ describe('Supplier fiscal data path', () => { page = browser.page; await page.loginAndModule('administrative', 'supplier'); await page.accessToSearchResult('2'); - await page.accessToSection('supplier.card.fiscalData'); }); afterAll(async() => { await browser.close(); }); - it('should attempt to edit the fiscal data but fail as the tax number is invalid', async() => { - await page.clearInput(selectors.supplierFiscalData.city); - 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'); + it('should attempt to edit the fiscal data and check data is saved', async() => { + await page.accessToSection('supplier.card.fiscalData'); + await page.clearInput($inputs.province); + await page.clearInput($inputs.country); + await page.clearInput($inputs.postcode); + await page.overwrite($inputs.city, 'Valencia'); + await page.overwrite($inputs.socialName, 'Farmer King SL'); + await page.overwrite($inputs.taxNumber, 'Wrong tax number'); + await page.overwrite($inputs.account, '0123456789'); + await page.autocompleteSearch($inputs.sageWithholding, 'retencion estimacion objetiva'); + await page.autocompleteSearch($inputs.sageTaxType, 'operaciones no sujetas'); + await page.click($.saveButton); + const errorMessage = await page.waitForSnackbar(); + await page.overwrite($inputs.taxNumber, '12345678Z'); + await page.click($.saveButton); + const successMessage = await page.waitForSnackbar(); - await page.waitToClick(selectors.supplierFiscalData.saveButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Invalid Tax number'); - }); - - 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'); - }); + const values = await page.getValues($inputs); - 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'); + expect(errorMessage.text).toContain('Invalid Tax number'); + expect(successMessage.type).toBe('success'); + expect(values).toEqual({ + province: 'Province one (España)', + country: 'España', + postcode: '46000', + city: 'Valencia', + socialName: 'Farmer King SL', + taxNumber: '12345678Z', + account: '0123456789', + sageWithholding: 'RETENCION ESTIMACION OBJETIVA', + sageTaxType: 'Operaciones no sujetas' + }); }); }); diff --git a/front/core/components/autocomplete/index.js b/front/core/components/autocomplete/index.js index 52491f7e0..2539c4ef4 100755 --- a/front/core/components/autocomplete/index.js +++ b/front/core/components/autocomplete/index.js @@ -174,7 +174,6 @@ export default class Autocomplete extends Field { refreshDisplayed() { let display = ''; - let hasTemplate = this.$transclude && this.$transclude.isSlotFilled('tplItem'); if (this._selection && this.showField) { if (this.multiple && Array.isArray(this._selection)) { @@ -182,19 +181,8 @@ export default class Autocomplete extends Field { if (display.length > 0) display += ', '; display += item[this.showField]; } - } else { + } else 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; diff --git a/front/core/components/avatar/index.html b/front/core/components/avatar/index.html new file mode 100644 index 000000000..2819e1d50 --- /dev/null +++ b/front/core/components/avatar/index.html @@ -0,0 +1,5 @@ +
+ {{::$ctrl.val && $ctrl.val.charAt(0).toUpperCase()}} +
+
+
diff --git a/front/core/components/avatar/index.js b/front/core/components/avatar/index.js new file mode 100644 index 000000000..e1aede6be --- /dev/null +++ b/front/core/components/avatar/index.js @@ -0,0 +1,63 @@ +import ngModule from '../../module'; +import Component from 'core/lib/component'; +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 || ''; + let hash = 0; + for (let i = 0; i < val.length; i++) + hash += val.charCodeAt(i); + const color = '#' + colors[hash % colors.length]; + + const el = this.element; + el.style.backgroundColor = color; + el.title = val; + } +} + +ngModule.vnComponent('vnAvatar', { + template: require('./index.html'), + controller: Avatar, + bindings: { + val: '@?' + }, + transclude: true +}); + +const colors = [ + 'e2553d', // Coral + 'FFA07A', // Salmon + 'FFDAB9', // Peach + 'a17077', // Pink + 'bf0e99', // Pink light + '52a500', // Green chartreuse + '00aeae', // Cian + 'b754cf', // Purple middle + '8a69cd', // Blue lavender + '1fa8a1', // Green ocean + 'DC143C', // Red crimson + '5681cf', // Blue steel + 'FF1493', // Ping intense + '02ba02', // Green lime + '1E90FF', // Blue sky + '8B008B', // Purple dark + 'cc7000', // Orange bright + '00b5b8', // Turquoise + '8B0000', // Red dark + '008080', // Green bluish + '2F4F4F', // Gray board + '7e7e7e', // Gray + '5d5d5d', // Gray dark +]; diff --git a/front/core/components/avatar/style.scss b/front/core/components/avatar/style.scss new file mode 100644 index 000000000..272930821 --- /dev/null +++ b/front/core/components/avatar/style.scss @@ -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%; + } + } +} diff --git a/front/core/components/field/index.js b/front/core/components/field/index.js index 40ea01e47..e89a042a5 100644 --- a/front/core/components/field/index.js +++ b/front/core/components/field/index.js @@ -166,7 +166,7 @@ export default class Field extends FormInput { if (event.defaultPrevented) return; event.preventDefault(); this.field = null; - this.input.dispatchEvent(new Event('change')); + this.element.dispatchEvent(new Event('change')); } buildInput(type) { diff --git a/front/core/components/index.js b/front/core/components/index.js index 86ab89212..45d182121 100644 --- a/front/core/components/index.js +++ b/front/core/components/index.js @@ -17,6 +17,7 @@ import './pagination/pagination'; import './searchbar/searchbar'; import './scroll-up/scroll-up'; import './autocomplete'; +import './avatar'; import './button'; import './button-menu'; import './calendar'; @@ -32,6 +33,7 @@ import './float-button'; import './icon-menu'; import './icon-button'; import './input-number'; +import './json-value'; import './label-value'; import './range'; import './input-time'; diff --git a/front/core/components/json-value/index.js b/front/core/components/json-value/index.js new file mode 100644 index 000000000..6bf0ae4aa --- /dev/null +++ b/front/core/components/json-value/index.js @@ -0,0 +1,73 @@ +import ngModule from '../../module'; +import Component from 'core/lib/component'; +import './style.scss'; + +const maxStrLen = 50; + +/** + * 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 '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: ' { + let controller; + let $scope; + let $element; + let el; + + beforeEach(ngModule('vnCore')); + + beforeEach(inject(($componentController, $rootScope) => { + $scope = $rootScope.$new(); + $element = angular.element(''); + 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'); + }); + }); +}); diff --git a/front/core/components/json-value/style.scss b/front/core/components/json-value/style.scss new file mode 100644 index 000000000..009a13d40 --- /dev/null +++ b/front/core/components/json-value/style.scss @@ -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; + } +} diff --git a/front/core/components/table/style.scss b/front/core/components/table/style.scss index 557268661..2e5d225fd 100644 --- a/front/core/components/table/style.scss +++ b/front/core/components/table/style.scss @@ -41,10 +41,15 @@ vn-table { display: table-row; height: 48px; } - vn-thead, .vn-thead, - vn-tbody, .vn-tbody, - vn-tfoot, .vn-tfoot, - thead, tbody, tfoot { + & > thead, + & > tbody, + & > tfoot, + & > vn-thead, + & > vn-tbody, + & > vn-tfoot, + & > .vn-thead, + & > .vn-tbody, + & > .vn-tfoot { & > * { display: table-row; @@ -111,14 +116,14 @@ vn-table { color: inherit; } } - a.vn-tbody { + & > a.vn-tbody { &.clickable { @extend %clickable; } } - vn-tbody > *, - .vn-tbody > *, - tbody > * { + & > vn-tbody > *, + & > .vn-tbody > *, + & > tbody > * { border-bottom: $border-thin; &:last-child { diff --git a/front/core/styles/variables.scss b/front/core/styles/variables.scss index c280838ca..bcc9fab66 100644 --- a/front/core/styles/variables.scss +++ b/front/core/styles/variables.scss @@ -2,7 +2,6 @@ $font-size: 11pt; $menu-width: 256px; -$right-menu-width: 318px; $topbar-height: 56px; $mobile-width: 800px; $float-spacing: 20px; diff --git a/front/salix/components/layout/style.scss b/front/salix/components/layout/style.scss index 6697bb1b0..612366228 100644 --- a/front/salix/components/layout/style.scss +++ b/front/salix/components/layout/style.scss @@ -88,13 +88,13 @@ vn-layout { } &.right-menu { & > vn-topbar > .end { - width: 80px + $right-menu-width; + width: 80px + $menu-width; } & > .main-view { - padding-right: $right-menu-width; + padding-right: $menu-width; } [fixed-bottom-right] { - right: $right-menu-width; + right: $menu-width; } } & > .main-view { diff --git a/front/salix/components/log/index.html b/front/salix/components/log/index.html index 05abe84c0..b7697a1fd 100644 --- a/front/salix/components/log/index.html +++ b/front/salix/components/log/index.html @@ -3,70 +3,212 @@ url="{{$ctrl.url}}" filter="$ctrl.filter" link="{originFk: $ctrl.originId}" - where="{changedModel: $ctrl.changedModel, - changedModelId: $ctrl.changedModelId}" + where="{changedModel: $ctrl.changedModel, changedModelId: $ctrl.changedModelId}" data="$ctrl.logs" - limit="20" + order="creationDate DESC, id DESC" + limit="20"> + + - - - - - - Date - User - Model - Action - Name - Changes - - - - - - {{::log.creationDate | date:'dd/MM/yyyy HH:mm'}} - - - {{::log.user.name || 'System' | translate}} + +
+
+ + + + +
+
+
+ +
+
+ {{::$ctrl.relativeDate(log.creationDate)}} +
+ + {{::$ctrl.actionsText[log.action]}} + +
+
+ + {{::log.changedModelI18n}} + + + #{{::log.changedModelId}} + + + {{::log.changedModelValue}} + +
+
+ + + + +
+ + + + {{::prop.nameI18n}}: + + , - - - {{::log.changedModel}} - - - {{::$ctrl.actionsText[log.action]}} - - - {{::log.changedModelValue}} - - - - - - - - - - - - - - - - - -
FieldBeforeAfter
{{prop.name}}{{prop.old}}{{prop.new}}
-
- {{::log.description}} +
+
+ + {{::prop.nameI18n}}: + + + + ← + +
- - - - - + + + {{::log.description}} + + + No changes + +
+ +
+
+ +
+ + + + + + + + + +
+ + +
+ + + + +
+
{{::nickname}}
+
{{::name}}
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/front/salix/components/log/index.js b/front/salix/components/log/index.js index 1c54aa9b8..ba7c5bc55 100644 --- a/front/salix/components/log/index.js +++ b/front/salix/components/log/index.js @@ -13,11 +13,17 @@ export default class Controller extends Section { delete: 'Deletes', select: 'Views' }; + this.actionsClass = { + insert: 'success', + update: 'warning', + delete: 'alert', + select: 'notice' + }; this.filter = { include: [{ relation: 'user', scope: { - fields: ['name'], + fields: ['nickname', 'name', 'image'], include: { relation: 'worker', scope: { @@ -27,6 +33,20 @@ export default class Controller extends Section { }, }], }; + + this.dateFilter = this.$filter('date'); + this.lang = this.$translate.use(); + this.today = Date.vnNew(); + this.today.setHours(0, 0, 0, 0); + } + + $postLink() { + this.resetFilter(); + this.$.$watch( + () => this.$.filter, + () => this.applyFilter(), + true + ); } get logs() { @@ -42,6 +62,7 @@ export default class Controller extends Section { const oldValues = log.oldInstance || empty; const newValues = log.newInstance || empty; const locale = validations[log.changedModel]?.locale || empty; + log.changedModelI18n = locale.name || log.changedModel; let props = Object.keys(oldValues).concat(Object.keys(newValues)); props = [...new Set(props)]; @@ -49,9 +70,10 @@ export default class Controller extends Section { log.props = []; for (const prop of props) { log.props.push({ - name: locale[prop] || prop, - old: this.formatValue(oldValues[prop]), - new: this.formatValue(newValues[prop]) + name: prop, + nameI18n: locale.columns?.[prop] || prop, + old: this.castJsonValue(oldValues[prop]), + new: this.castJsonValue(newValues[prop]) }); } } @@ -61,36 +83,112 @@ export default class Controller extends Section { return !(this.changedModel && this.changedModelId); } - formatValue(value) { - let type = typeof value; + castJsonValue(value) { + return typeof value === 'string' && validDate.test(value) + ? new Date(value) + : value; + } - if (type === 'string' && validDate.test(value)) { - value = new Date(value); - type = typeof value; + mainVal(prop, action) { + return action == 'delete' ? prop.old : prop.new; + } + + toggleAttributes(log, changesEl, force) { + log.expand = force; + changesEl.classList.toggle('expanded', force); + } + + relativeDate(dateVal) { + if (dateVal == null) return ''; + const date = new Date(dateVal); + const dateZeroTime = new Date(dateVal); + dateZeroTime.setHours(0, 0, 0, 0); + const diff = Math.trunc((this.today.getTime() - dateZeroTime.getTime()) / (1000 * 3600 * 24)); + + let format; + if (diff == 0) + format = `'${this.$t('today')}'`; + else if (diff == 1) + format = `'${this.$t('yesterday')}'`; + else if (diff > 1 && diff < 7) + format = `'${date.toLocaleDateString(this.lang, {weekday: 'short'})}'`; + else if (this.today.getFullYear() == date.getFullYear()) + format = `d '${date.toLocaleDateString(this.lang, {month: 'short'})}'`; + else + format = `dd/MM/yyyy`; + + return this.dateFilter(date, `${format} HH:mm`); + } + + resetFilter() { + this.$.filter = {who: 'all'}; + } + + applyFilter() { + const filter = this.$.filter; + + function getParam(prop, value) { + if (value == null || value == '') return null; + switch (prop) { + case 'changedModelValue': + return {[prop]: {like: `%${value}%`}}; + case 'who': + switch (value) { + case 'all': + return null; + case 'user': + return {userFk: {neq: null}}; + case 'system': + return {userFk: null}; + } + case 'actions': + const inq = []; + for (const action in value) { + if (value[action]) + inq.push(action); + } + return inq.length ? {action: {inq}} : null; + case 'from': + if (filter.to) { + return {creationDate: {gte: value}}; + } else { + const to = new Date(value); + to.setHours(23, 59, 59, 999); + return {creationDate: {between: [value, to]}}; + } + case 'to': + const to = new Date(value); + to.setHours(23, 59, 59, 999); + return {creationDate: {lte: to}}; + default: + return {[prop]: value}; + } } - switch (type) { - case 'boolean': - return value ? '✓' : '✗'; - 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'; - return this.$filter('date')(value, format); - } - else - return value; - default: - return value; + const and = []; + for (const prop in filter) { + const param = getParam(prop, filter[prop]); + if (param) and.push(param); + } + + const lbFilter = and.length ? {where: {and}} : null; + return this.$.model.applyFilter(lbFilter); + } + + searchUser(search) { + if (/^[0-9]+$/.test(search)) { + return {id: search}; + } else { + return {or: [ + {name: search}, + {nickname: {like: `%${search}%`}} + ]} } } - showWorkerDescriptor(event, workerId) { - if (!workerId) return; - this.$.workerDescriptor.show(event.target, workerId); + showWorkerDescriptor(event, log) { + if (log.user?.worker) + this.$.workerDescriptor.show(event.target, log.userFk); } } diff --git a/front/salix/components/log/index.spec.js b/front/salix/components/log/index.spec.js new file mode 100644 index 000000000..d01a08967 --- /dev/null +++ b/front/salix/components/log/index.spec.js @@ -0,0 +1,97 @@ +import './index'; + +describe('Salix Component vnLog', () => { + let controller; + let $scope; + let $element; + + beforeEach(ngModule('salix')); + + beforeEach(inject(($componentController, $rootScope) => { + $scope = $rootScope.$new(); + $element = angular.element(''); + controller = $componentController('vnLog', {$element, $scope}); + })); + + describe('relativeDate()', () => { + let date; + + beforeEach(() => { + date = Date.vnNew(); + }); + + it('should return empty string when date is null', () => { + const ret = controller.relativeDate(null); + + expect(ret).toEqual(''); + }); + + it('should return empty string when date is undefined', () => { + const ret = controller.relativeDate(undefined); + + expect(ret).toEqual(''); + }); + + it('should return today and time when date is today', () => { + const ret = controller.relativeDate(date); + + expect(ret).toEqual('today 12:00'); + }); + + it('should return yesterday and time when date is yesterday', () => { + date.setDate(date.getDate() - 1); + const ret = controller.relativeDate(date); + + expect(ret).toEqual('yesterday 12:00'); + }); + + it('should return abreviated weekday name and time when date is on past week', () => { + date.setDate(date.getDate() - 3); + const ret = controller.relativeDate(date); + + expect(ret).toEqual('Fri 12:00'); + }); + + it('should return abreviated month name, day number and time when date is on this year', () => { + date.setDate(date.getDate() + 20); + const ret = controller.relativeDate(date); + + expect(ret).toEqual('21 Jan 12:00'); + }); + + it('should return abreviated month name, day number, year and time when date is on different year', () => { + date.setDate(date.getDate() - 20); + const ret = controller.relativeDate(date); + + expect(ret).toEqual('12/12/2000 12:00'); + }); + + it('should convert to date and return string when date is not a Date class instance', () => { + const ret = controller.relativeDate(date.toJSON()); + + expect(ret).toEqual('today 12:00'); + }); + }); + + describe('castJsonValue()', () => { + it('should return date when string has valid JSON date format', () => { + const now = Date.vnNew(); + + const ret = controller.castJsonValue(now.toJSON()); + + expect(ret).toBeInstanceOf(Date); + }); + + it('should return same value when is string with invalid JSON date format', () => { + const ret = controller.castJsonValue('Foo'); + + expect(ret).toEqual('Foo'); + }); + + it('should return same value when is not an string', () => { + const ret = controller.castJsonValue(1001); + + expect(ret).toEqual(1001); + }); + }); +}); diff --git a/front/salix/components/log/locale/es.yml b/front/salix/components/log/locale/es.yml index d341095d8..385b42147 100644 --- a/front/salix/components/log/locale/es.yml +++ b/front/salix/components/log/locale/es.yml @@ -13,3 +13,6 @@ Views: Visualiza System: Sistema note: nota Changes: Cambios +No changes: No hay cambios +today: hoy +yesterday: ayer diff --git a/front/salix/components/log/style.scss b/front/salix/components/log/style.scss index 68cd5a047..b78dc3824 100644 --- a/front/salix/components/log/style.scss +++ b/front/salix/components/log/style.scss @@ -1,66 +1,152 @@ @import "variables"; vn-log { - vn-td { - vertical-align: initial !important; - } - .changes { - display: none; - } - .label { - color: $color-font-secondary; - } - .value { - color: $color-font; - } + .change { + display: flex; - @media screen and (max-width: 1570px) { - vn-table .expendable { + & > .user-wrapper { + position: relative; + padding-right: 10px; + + & > vn-avatar { + cursor: pointer; + + &.system { + background-color: $color-main !important; + } + } + & > .arrow { + height: 8px; + width: 8px; + position: absolute; + transform: rotateY(0deg) rotate(45deg); + top: 18px; + right: -4px; + z-index: 1; + } + & > .line { + position: absolute; + background-color: $color-main; + width: 2px; + left: 17px; + z-index: -1; + top: 44px; + bottom: -8px; + } + } + &:last-child > .user-wrapper > .line { display: none; } - .changes { - padding-top: 10px; - display: block; + .detail { + position: relative; + flex-grow: 1; + width: 100%; + border-radius: 2px; + overflow: hidden; + + & > .header { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + & > .chip { + padding: 2px 4px; + border-radius: 4px; + display: inline-block; + color: $color-font-bg; + + &.notice { + background-color: $color-notice-medium; + } + &.success { + background-color: $color-success-medium; + } + &.warning { + background-color: $color-main-medium; + } + &.alert { + background-color: lighten($color-alert, 5%); + } + } + .date { + float: right; + } + } + & > .model { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + & > .model-name { + text-transform: capitalize; + } + & > .model-value { + font-style: italic; + color: #c7bd2b; + } + & > .model-id { + color: $color-font-secondary; + font-size: .9em; + } + } } } - .attributes { - width: 100%; + .changes { + overflow: hidden; + background-color: rgba(255, 255, 255, .05); + border-radius: 4px; + color: $color-font-secondary; + transition: max-height 150ms ease-in-out; + max-height: 28px; + position: relative; - tr { - height: 10px; + & > .expand-button, + & > .shrink-button { + display: none; + } + &.props { + padding-right: 24px; - & > td { - padding: 2px; + & > .expand-button, + & > .shrink-button { + position: absolute; + top: 6px; + right: 8px; + font-size: inherit; + float: right; + cursor: pointer; } - & > td.field, - & > th.field { - width: 20%; - color: gray; + & > .expand-button { + display: block; } - & > td.before, - & > th.before, - & > td.after, - & > th.after { - width: 40%; - white-space: pre-line; + &.expanded { + max-height: 500px; + padding-right: 0; + + & > .changes-wrapper { + text-overflow: initial; + white-space: initial; + } + & > .shrink-button { + display: block; + } + & > .expand-button { + display: none; + } + } + } + & > .changes-wrapper { + padding: 4px 6px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + & > .no-changes { + font-style: italic; + } + .json-field { + text-transform: capitalize; } } } } -.ellipsis { - white-space: nowrap; - overflow: hidden; - max-width: 400px; - text-overflow: ellipsis; - display: inline-block; -} -.no-ellipsize, -[no-ellipsize] { - text-overflow: ''; - white-space: normal; - overflow: auto; -} -.alignSpan { - overflow: hidden; - display: inline-block; -} diff --git a/loopback/common/methods/log/editors.js b/loopback/common/methods/log/editors.js new file mode 100644 index 000000000..4c0b6d2d5 --- /dev/null +++ b/loopback/common/methods/log/editors.js @@ -0,0 +1,40 @@ +const mergeFilters = require('vn-loopback/util/filter').mergeFilters; + +module.exports = Self => { + Self.remoteMethod('editors', { + description: 'Get the list of entity editors', + accepts: [ + { + arg: 'id', + type: 'integer', + description: 'The model id', + required: true + }, { + arg: 'filter', + type: 'Object', + description: 'The user filter object' + } + ], + returns: { + type: [Self], + root: true + }, + http: { + path: `/:id/editors`, + verb: 'GET' + } + }); + + Self.editors = async(id, filter) => { + const res = await Self.find({ + fields: ['userFk'], + where: {originFk: id} + }); + const userIds = new Set(res.map(x => x.userFk)); + + filter = mergeFilters(filter, { + where: {id: {inq: [...userIds]}} + }); + return await Self.app.models.VnUser.find(filter); + }; +}; diff --git a/loopback/common/methods/log/models.js b/loopback/common/methods/log/models.js new file mode 100644 index 000000000..ec3eac1ad --- /dev/null +++ b/loopback/common/methods/log/models.js @@ -0,0 +1,44 @@ +const mergeFilters = require('vn-loopback/util/filter').mergeFilters; + +module.exports = Self => { + Self.remoteMethod('models', { + description: 'Get the list of entity models', + accepts: [ + { + arg: 'id', + type: 'integer', + description: 'The model id', + required: true + }, { + arg: 'filter', + type: 'Object', + description: 'The filter object' + } + ], + returns: { + type: [Self], + root: true + }, + http: { + path: `/:id/models`, + verb: 'GET' + } + }); + + Self.models = async(id, filter) => { + filter = mergeFilters(filter, { + fields: ['changedModel'], + where: { + originFk: id, + changedModel: {neq: null} + } + }); + const res = await Self.find(filter); + + const set = new Set(); + return res.filter(x => set.has(x.changedModel) + ? false + : set.add(x.changedModel) + ); + }; +}; diff --git a/loopback/common/models/log.js b/loopback/common/models/log.js new file mode 100644 index 000000000..0622431a6 --- /dev/null +++ b/loopback/common/models/log.js @@ -0,0 +1,10 @@ + +module.exports = function(Self) { + Object.assign(Self, { + setup() { + Self.super_.setup.call(this); + require('../methods/log/editors')(this); + require('../methods/log/models')(this); + } + }); +}; diff --git a/loopback/common/models/log.json b/loopback/common/models/log.json new file mode 100644 index 000000000..54046f072 --- /dev/null +++ b/loopback/common/models/log.json @@ -0,0 +1,4 @@ +{ + "name": "Log", + "base": "VnModel" +} diff --git a/loopback/common/models/vn-model.js b/loopback/common/models/vn-model.js index f57fb3c30..f469e893a 100644 --- a/loopback/common/models/vn-model.js +++ b/loopback/common/models/vn-model.js @@ -28,12 +28,14 @@ module.exports = function(Self) { }); // Register field ACL validation - /* this.beforeRemote('prototype.patchAttributes', ctx => this.checkUpdateAcls(ctx)); + /* + this.beforeRemote('prototype.patchAttributes', ctx => this.checkUpdateAcls(ctx)); this.beforeRemote('updateAll', ctx => this.checkUpdateAcls(ctx)); this.beforeRemote('patchOrCreate', ctx => this.checkInsertAcls(ctx)); this.beforeRemote('create', ctx => this.checkInsertAcls(ctx)); this.beforeRemote('replaceById', ctx => this.checkInsertAcls(ctx)); - this.beforeRemote('replaceOrCreate', ctx => this.checkInsertAcls(ctx)); */ + this.beforeRemote('replaceOrCreate', ctx => this.checkInsertAcls(ctx)); + */ this.remoteMethod('crud', { description: `Create, update or/and delete instances from model with a single request`, diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 5767632ee..ae0da8170 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -156,18 +156,19 @@ "Component cost not set": "Componente coste no está estabecido", "Tickets with associated refunds can't be deleted. This ticket is associated with refund Nº 2": "Tickets with associated refunds can't be deleted. This ticket is associated with refund Nº 2", "Description cannot be blank": "Description cannot be blank", - "company": "Company", - "country": "Country", - "clientId": "Id client", - "clientSocialName": "Client", - "amount": "Amount", - "taxableBase": "Taxable base", - "ticketFk": "Id ticket", - "isActive": "Active", - "hasToInvoice": "Invoice", - "isTaxDataChecked": "Data checked", - "comercialId": "Id Comercial", - "comercialName": "Comercial", + "company": "Company", + "country": "Country", + "clientId": "Id client", + "clientSocialName": "Client", + "amount": "Amount", + "taxableBase": "Taxable base", + "ticketFk": "Id ticket", + "isActive": "Active", + "hasToInvoice": "Invoice", + "isTaxDataChecked": "Data checked", + "comercialId": "Id Comercial", + "comercialName": "Comercial", "Added observation": "Added observation", - "Comment added to client": "Comment added to client" -} + "Comment added to client": "Comment added to client", + "This ticket is already a refund": "This ticket is already a refund" +} \ No newline at end of file diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 3ef3c4a22..45993bdd5 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -279,15 +279,16 @@ "Comment added to client": "Observación añadida al cliente {{clientFk}}", "Cannot create a new claimBeginning from a different ticket": "No se puede crear una línea de reclamación de un ticket diferente al origen", "company": "Compañía", - "country": "País", - "clientId": "Id cliente", - "clientSocialName": "Cliente", - "amount": "Importe", - "taxableBase": "Base", - "ticketFk": "Id ticket", - "isActive": "Activo", - "hasToInvoice": "Facturar", - "isTaxDataChecked": "Datos comprobados", - "comercialId": "Id comercial", - "comercialName": "Comercial" -} + "country": "País", + "clientId": "Id cliente", + "clientSocialName": "Cliente", + "amount": "Importe", + "taxableBase": "Base", + "ticketFk": "Id ticket", + "isActive": "Activo", + "hasToInvoice": "Facturar", + "isTaxDataChecked": "Datos comprobados", + "comercialId": "Id comercial", + "comercialName": "Comercial", + "Invalid NIF for VIES": "Invalid NIF for VIES" +} \ No newline at end of file diff --git a/modules/account/back/locale/mail/en.yml b/modules/account/back/locale/mail/en.yml new file mode 100644 index 000000000..b492ea640 --- /dev/null +++ b/modules/account/back/locale/mail/en.yml @@ -0,0 +1,7 @@ +name: mail +columns: + id: id + receiver: receiver + replyTo: reply to + subject: subject + body: body diff --git a/modules/account/back/locale/mail/es.yml b/modules/account/back/locale/mail/es.yml new file mode 100644 index 000000000..a0b02b45f --- /dev/null +++ b/modules/account/back/locale/mail/es.yml @@ -0,0 +1,7 @@ +name: mail +columns: + id: id + receiver: receptor + replyTo: responder a + subject: asunto + body: cuerpo diff --git a/modules/account/back/models/role-log.json b/modules/account/back/models/role-log.json index b4fc3daf9..510e98b68 100644 --- a/modules/account/back/models/role-log.json +++ b/modules/account/back/models/role-log.json @@ -1,6 +1,6 @@ { "name": "RoleLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "account.roleLog" diff --git a/modules/account/back/models/user-log.json b/modules/account/back/models/user-log.json index 01acb0176..c5aa08e05 100644 --- a/modules/account/back/models/user-log.json +++ b/modules/account/back/models/user-log.json @@ -1,6 +1,6 @@ { "name": "UserLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "account.userLog" diff --git a/modules/account/front/main/index.html b/modules/account/front/main/index.html index dd3489e9f..5872a328d 100644 --- a/modules/account/front/main/index.html +++ b/modules/account/front/main/index.html @@ -6,6 +6,7 @@ - \ No newline at end of file + diff --git a/modules/claim/back/locale/claim-beginning/en.yml b/modules/claim/back/locale/claim-beginning/en.yml new file mode 100644 index 000000000..47cc29c69 --- /dev/null +++ b/modules/claim/back/locale/claim-beginning/en.yml @@ -0,0 +1,6 @@ +name: claim beginning +columns: + id: id + quantity: quantity + claimFk: claim + saleFk: sale diff --git a/modules/claim/back/locale/claim-beginning/es.yml b/modules/claim/back/locale/claim-beginning/es.yml new file mode 100644 index 000000000..5e898c25e --- /dev/null +++ b/modules/claim/back/locale/claim-beginning/es.yml @@ -0,0 +1,6 @@ +name: comienzo reclamación +columns: + id: id + quantity: cantidad + claimFk: reclamación + saleFk: línea diff --git a/modules/claim/back/locale/claim-development/en.yml b/modules/claim/back/locale/claim-development/en.yml new file mode 100644 index 000000000..054381e67 --- /dev/null +++ b/modules/claim/back/locale/claim-development/en.yml @@ -0,0 +1,9 @@ +name: claim development +columns: + id: id + claimFk: claim + claimResponsibleFk: responsible + claimReasonFk: reason + claimResultFk: result + claimRedeliveryFk: redelivery + workerFk: worker diff --git a/modules/claim/back/locale/claim-development/es.yml b/modules/claim/back/locale/claim-development/es.yml new file mode 100644 index 000000000..d5223e755 --- /dev/null +++ b/modules/claim/back/locale/claim-development/es.yml @@ -0,0 +1,9 @@ +name: desarrollo reclamación +columns: + id: id + claimFk: reclamación + claimResponsibleFk: responsable + claimReasonFk: motivo + claimResultFk: resultado + claimRedeliveryFk: reenvío + workerFk: trabajador diff --git a/modules/claim/back/locale/claim-dms/en.yml b/modules/claim/back/locale/claim-dms/en.yml new file mode 100644 index 000000000..c76c364e7 --- /dev/null +++ b/modules/claim/back/locale/claim-dms/en.yml @@ -0,0 +1,4 @@ +name: claim dms +columns: + dmsFk: dms + claimFk: claim diff --git a/modules/claim/back/locale/claim-dms/es.yml b/modules/claim/back/locale/claim-dms/es.yml new file mode 100644 index 000000000..949e20a36 --- /dev/null +++ b/modules/claim/back/locale/claim-dms/es.yml @@ -0,0 +1,4 @@ +name: documento reclamación +columns: + dmsFk: dms + claimFk: reclamación diff --git a/modules/claim/back/locale/claim-end/en.yml b/modules/claim/back/locale/claim-end/en.yml new file mode 100644 index 000000000..f9e736d76 --- /dev/null +++ b/modules/claim/back/locale/claim-end/en.yml @@ -0,0 +1,7 @@ +name: claim end +columns: + id: id + claimFk: claim + saleFk: sale + workerFk: worker + claimDestinationFk: destination diff --git a/modules/claim/back/locale/claim-end/es.yml b/modules/claim/back/locale/claim-end/es.yml new file mode 100644 index 000000000..9855eca03 --- /dev/null +++ b/modules/claim/back/locale/claim-end/es.yml @@ -0,0 +1,7 @@ +name: final reclamación +columns: + id: id + claimFk: reclamación + saleFk: línea + workerFk: trabajador + claimDestinationFk: destino diff --git a/modules/claim/back/locale/claim-observation/en.yml b/modules/claim/back/locale/claim-observation/en.yml new file mode 100644 index 000000000..772ea038c --- /dev/null +++ b/modules/claim/back/locale/claim-observation/en.yml @@ -0,0 +1,7 @@ +name: claim observation +columns: + id: id + claimFk: claim + text: text + created: created + workerFk: worker diff --git a/modules/claim/back/locale/claim-observation/es.yml b/modules/claim/back/locale/claim-observation/es.yml new file mode 100644 index 000000000..fae3a1ae9 --- /dev/null +++ b/modules/claim/back/locale/claim-observation/es.yml @@ -0,0 +1,7 @@ +name: observación reclamación +columns: + id: id + claimFk: reclamación + text: texto + created: creado + workerFk: tabajador diff --git a/modules/claim/back/locale/claim/en.yml b/modules/claim/back/locale/claim/en.yml new file mode 100644 index 000000000..7c3ee7555 --- /dev/null +++ b/modules/claim/back/locale/claim/en.yml @@ -0,0 +1,16 @@ +name: claim +columns: + id: id + observation: observation + ticketCreated: ticket created + isChargedToMana: charged to mana + created: created + responsibility: responsibility + hasToPickUp: has to pickUp + ticketFk: ticket + claimStateFk: claim state + workerFk: worker + packages: packages + rma: rma + clientFk: client + claimFk: claim diff --git a/modules/claim/back/locale/claim/es.yml b/modules/claim/back/locale/claim/es.yml new file mode 100644 index 000000000..27fd76ceb --- /dev/null +++ b/modules/claim/back/locale/claim/es.yml @@ -0,0 +1,16 @@ +name: reclamación +columns: + id: id + observation: observación + ticketCreated: ticket creado + isChargedToMana: cargado al maná + created: creado + responsibility: responsabilidad + hasToPickUp: es recogida + ticketFk: ticket + claimStateFk: estado reclamación + workerFk: trabajador + packages: paquetes + rma: rma + clientFk: cliente + claimFk: reclamación diff --git a/modules/claim/back/methods/claim-beginning/importToNewRefundTicket.js b/modules/claim/back/methods/claim-beginning/importToNewRefundTicket.js index f0686ffa6..83043f012 100644 --- a/modules/claim/back/methods/claim-beginning/importToNewRefundTicket.js +++ b/modules/claim/back/methods/claim-beginning/importToNewRefundTicket.js @@ -109,6 +109,11 @@ module.exports = Self => { zoneFk: zone.id }, myOptions); + await models.TicketRefund.create({ + refundTicketFk: newRefundTicket.id, + originalTicketFk: claim.ticket().id + }, myOptions); + await saveObservation({ description: `Reclama ticket: ${claim.ticketFk}`, ticketFk: newRefundTicket.id, diff --git a/modules/claim/back/models/claim-log.json b/modules/claim/back/models/claim-log.json index bb6af02b4..9f28af63e 100644 --- a/modules/claim/back/models/claim-log.json +++ b/modules/claim/back/models/claim-log.json @@ -1,6 +1,6 @@ { "name": "ClaimLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "claimLog" @@ -50,7 +50,7 @@ "type": "belongsTo", "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/claim/front/action/index.html b/modules/claim/front/action/index.html index 81b14d3a7..9da51b8de 100644 --- a/modules/claim/front/action/index.html +++ b/modules/claim/front/action/index.html @@ -16,7 +16,7 @@ value="{{$ctrl.claimedTotal | currency: 'EUR':2}}">
- + - + label="Change destination" + disabled="$ctrl.checked.length == 0" + ng-click="changeDestination.show()"> + + + - - - + diff --git a/modules/client/back/locale/address/en.yml b/modules/client/back/locale/address/en.yml new file mode 100644 index 000000000..3d090ba89 --- /dev/null +++ b/modules/client/back/locale/address/en.yml @@ -0,0 +1,20 @@ +name: address +columns: + id: id + nickname: nickname + street: street + city: city + postalCode: postal code + phone: phone + mobile: mobile + isActive: active + longitude: longitude + latitude: latitude + isEqualizated: equalizated + isLogifloraAllowed: logiflora allowed + provinceFk: province + clientFk: client + agencyModeFk: agency + addressFk: address + incotermsFk: incoterms + customsAgentFk: customs agent diff --git a/modules/client/back/locale/address/es.yml b/modules/client/back/locale/address/es.yml new file mode 100644 index 000000000..1379f75a4 --- /dev/null +++ b/modules/client/back/locale/address/es.yml @@ -0,0 +1,20 @@ +name: dirección +columns: + id: id + nickname: apodo + street: calle + city: ciudad + postalCode: código postal + phone: teléfono + mobile: móvil + isActive: activo + longitude: longitud + latitude: latitud + isEqualizated: igualado + isLogifloraAllowed: logiflora permitido + provinceFk: provincia + clientFk: cliente + agencyModeFk: agencia + addressFk: dirección + incotermsFk: incoterms + customsAgentFk: agente adunanas diff --git a/modules/client/back/locale/client-contact/en.yml b/modules/client/back/locale/client-contact/en.yml new file mode 100644 index 000000000..5bd6e25db --- /dev/null +++ b/modules/client/back/locale/client-contact/en.yml @@ -0,0 +1,6 @@ +name: client contact +columns: + id: id + name: name + phone: phone + clientFk: client diff --git a/modules/client/back/locale/client-contact/es.yml b/modules/client/back/locale/client-contact/es.yml new file mode 100644 index 000000000..5802c0dde --- /dev/null +++ b/modules/client/back/locale/client-contact/es.yml @@ -0,0 +1,6 @@ +name: contacto cliente +columns: + id: id + name: nombre + phone: teléfono + clientFk: cliente diff --git a/modules/client/back/locale/client-dms/en.yml b/modules/client/back/locale/client-dms/en.yml new file mode 100644 index 000000000..c8ad68635 --- /dev/null +++ b/modules/client/back/locale/client-dms/en.yml @@ -0,0 +1,4 @@ +name: client dms +columns: + dmsFk: dms + clientFk: client diff --git a/modules/client/back/locale/client-dms/es.yml b/modules/client/back/locale/client-dms/es.yml new file mode 100644 index 000000000..c683f4764 --- /dev/null +++ b/modules/client/back/locale/client-dms/es.yml @@ -0,0 +1,4 @@ +name: documento cliente +columns: + dmsFk: dms + clientFk: client diff --git a/modules/client/back/locale/client-observation/en.yml b/modules/client/back/locale/client-observation/en.yml new file mode 100644 index 000000000..2dd8393ae --- /dev/null +++ b/modules/client/back/locale/client-observation/en.yml @@ -0,0 +1,7 @@ +name: client observation +columns: + id: id + clientFk: client + text: text + created: created + workerFk: worker diff --git a/modules/client/back/locale/client-observation/es.yml b/modules/client/back/locale/client-observation/es.yml new file mode 100644 index 000000000..0fc6bbf04 --- /dev/null +++ b/modules/client/back/locale/client-observation/es.yml @@ -0,0 +1,7 @@ +name: observación cliente +columns: + id: id + clientFk: cliente + text: texto + created: creado + workerFk: trabajador diff --git a/modules/client/back/locale/client-sample/en.yml b/modules/client/back/locale/client-sample/en.yml new file mode 100644 index 000000000..77639fbb4 --- /dev/null +++ b/modules/client/back/locale/client-sample/en.yml @@ -0,0 +1,8 @@ +name: client sample +columns: + id: id + created: created + clientFk: client + typeFk: type + userFk: user + companyFk: company diff --git a/modules/client/back/locale/client-sample/es.yml b/modules/client/back/locale/client-sample/es.yml new file mode 100644 index 000000000..6311eb25a --- /dev/null +++ b/modules/client/back/locale/client-sample/es.yml @@ -0,0 +1,8 @@ +name: muestra cliente +columns: + id: id + created: creado + clientFk: cliente + typeFk: tipo + userFk: usuario + companyFk: compañia diff --git a/modules/client/back/locale/client/en.yml b/modules/client/back/locale/client/en.yml new file mode 100644 index 000000000..71048f657 --- /dev/null +++ b/modules/client/back/locale/client/en.yml @@ -0,0 +1,50 @@ +name: client +columns: + id: id + name: name + fi: fi + socialName: socialName + contact: contact + street: street + city: city + postcode: postcode + email: email + phone: phone + mobile: mobile + isActive: active + credit: credit + creditInsurance: credit insurance + iban: iban + dueDay: due day + isEqualizated: equalizated + isFreezed: freezed + hasToInvoiceByAddress: invoice by address + hasToInvoice: has to invoice + isToBeMailed: be mailed + hasSepaVnl: sepa nnl + hasLcr: lcr + hasCoreVnl: core vnl + hasCoreVnh: core vnh + hasIncoterms: incoterms + isTaxDataChecked: tax data checked + eypbc: eypbc + quality: quality + isVies: vies + isRelevant: relevant + accountingAccount: accounting account + created: created + sageTaxTypeFk: sage tax type + sageTransactionTypeFk: sage transaction type + businessTypeFk: business type + salesPersonFk: sales person + hasElectronicInvoice: electronic invoice + payMethodFk: pay method + provinceFk: province + countryFk: country + contactChannelFk: contact channel + clientTypeFk: client type + clientFk: client + defaultAddressFk: default address + bankEntityFk: bank entity + transferorFk: transferor + diff --git a/modules/client/back/locale/client/es.yml b/modules/client/back/locale/client/es.yml new file mode 100644 index 000000000..04e391af0 --- /dev/null +++ b/modules/client/back/locale/client/es.yml @@ -0,0 +1,50 @@ +name: cliente +columns: + id: id + name: nombre + fi: fi + socialName: nombre social + contact: contacto + street: calle + city: ciudad + postcode: código postal + email: email + phone: teléfono + mobile: móvil + isActive: activo + credit: crédito + creditInsurance: seguro crédito + iban: iban + dueDay: día vencimiento + isEqualizated: igualado + isFreezed: congelado + hasToInvoiceByAddress: factura por dirección + hasToInvoice: tiene que facturar + isToBeMailed: envío por email + hasSepaVnl: sepa nnl + hasLcr: lcr + hasCoreVnl: centro vnl + hasCoreVnh: cenrto vnh + hasIncoterms: incoterms + isTaxDataChecked: datos fiscales comprobados + eypbc: eypbc + quality: calidad + isVies: vies + isRelevant: importante + accountingAccount: cuenta contable + created: creado + sageTaxTypeFk: tipo impuesto sage + sageTransactionTypeFk: tipo transacción sage + businessTypeFk: tipo negocio + salesPersonFk: comercial + hasElectronicInvoice: factura electrónica + payMethodFk: método pago + provinceFk: provincia + countryFk: país + contactChannelFk: canal de contacto + clientTypeFk: tipo de cliente + clientFk: cliente + defaultAddressFk: dirección predeterminada + bankEntityFk: entidad bancaria + transferorFk: cedente + diff --git a/modules/client/back/locale/greuge/en.yml b/modules/client/back/locale/greuge/en.yml new file mode 100644 index 000000000..5c84ef4ee --- /dev/null +++ b/modules/client/back/locale/greuge/en.yml @@ -0,0 +1,11 @@ +name: greuge +columns: + id: id + description: description + amount: amount + shipped: shipped + created: created + greugeTypeFk: greuge type + clientFk: client + ticketFk: ticket + userFk: user diff --git a/modules/client/back/locale/greuge/es.yml b/modules/client/back/locale/greuge/es.yml new file mode 100644 index 000000000..ffb29eb61 --- /dev/null +++ b/modules/client/back/locale/greuge/es.yml @@ -0,0 +1,11 @@ +name: greuge +columns: + id: id + description: descripción + amount: cantidad + shipped: enviado + created: creado + greugeTypeFk: tipo de greuge + clientFk: cliente + ticketFk: ticket + userFk: usuario diff --git a/modules/client/back/locale/recovery/en.yml b/modules/client/back/locale/recovery/en.yml new file mode 100644 index 000000000..ba02df7c2 --- /dev/null +++ b/modules/client/back/locale/recovery/en.yml @@ -0,0 +1,8 @@ +name: recovery +columns: + id: id + started: started + finished: finished + amount: amount + period: period + clientFk: client diff --git a/modules/client/back/locale/recovery/es.yml b/modules/client/back/locale/recovery/es.yml new file mode 100644 index 000000000..6d84b00da --- /dev/null +++ b/modules/client/back/locale/recovery/es.yml @@ -0,0 +1,8 @@ +name: recuperación +columns: + id: id + started: comenzado + finished: terminado + amount: cantidad + period: período + clientFk: cliente diff --git a/modules/client/back/locale/tpv-transaction/en.yml b/modules/client/back/locale/tpv-transaction/en.yml new file mode 100644 index 000000000..fbe1bbadc --- /dev/null +++ b/modules/client/back/locale/tpv-transaction/en.yml @@ -0,0 +1,15 @@ +name: tpv transaction +columns: + id: id + merchantFk: merchant + clientFk: client + receiptFk: receipt + amount: amount + response: response + errorCode: error code + status: status + created: created + merchantParameters: merchant parameters + signature: signature + signatureVersion: signature version + responseError: response error diff --git a/modules/client/back/locale/tpv-transaction/es.yml b/modules/client/back/locale/tpv-transaction/es.yml new file mode 100644 index 000000000..c751b354d --- /dev/null +++ b/modules/client/back/locale/tpv-transaction/es.yml @@ -0,0 +1,15 @@ +name: transacción tpv +columns: + id: id + merchantFk: comerciante + clientFk: cliente + receiptFk: recibo + amount: cantidad + response: respuesta + errorCode: código error + status: estado + created: creado + merchantParameters: parámetros comerciante + signature: firma + signatureVersion: versión firma + responseError: error de respuesta diff --git a/modules/client/back/methods/client/getCard.js b/modules/client/back/methods/client/getCard.js index a2365ee25..414cbe058 100644 --- a/modules/client/back/methods/client/getCard.js +++ b/modules/client/back/methods/client/getCard.js @@ -76,7 +76,7 @@ module.exports = function(Self) { const date = Date.vnNew(); date.setHours(0, 0, 0, 0); - const query = `SELECT vn.clientGetDebt(?, ?) AS debt`; + const query = `SELECT vn.client_getDebt(?, ?) AS debt`; const data = await Self.rawSql(query, [id, date], myOptions); client.debt = data[0].debt; diff --git a/modules/client/back/methods/client/getDebt.js b/modules/client/back/methods/client/getDebt.js index 5f8a8c569..859746083 100644 --- a/modules/client/back/methods/client/getDebt.js +++ b/modules/client/back/methods/client/getDebt.js @@ -27,7 +27,7 @@ module.exports = Self => { const date = Date.vnNew(); date.setHours(0, 0, 0, 0); - const query = `SELECT vn.clientGetDebt(?, ?) AS debt`; + const query = `SELECT vn.client_getDebt(?, ?) AS debt`; const [debt] = await Self.rawSql(query, [clientFk, date], myOptions); return debt; diff --git a/modules/client/back/models/client-log.json b/modules/client/back/models/client-log.json index 28b767b2a..316dbe972 100644 --- a/modules/client/back/models/client-log.json +++ b/modules/client/back/models/client-log.json @@ -1,6 +1,6 @@ { "name": "ClientLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "clientLog" @@ -50,7 +50,7 @@ "type": "belongsTo", "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/client/back/models/client.js b/modules/client/back/models/client.js index a86a782e4..56adc8b03 100644 --- a/modules/client/back/models/client.js +++ b/modules/client/back/models/client.js @@ -14,7 +14,7 @@ module.exports = Self => { Self.validatesPresenceOf('street', { message: 'Street cannot be empty' }); - + Self.validatesPresenceOf('city', { message: 'City cannot be empty' }); @@ -89,8 +89,9 @@ module.exports = Self => { }; const country = await Self.app.models.Country.findOne(filter); const code = country ? country.code.toLowerCase() : null; + const countryCode = this.fi.toLowerCase().substring(0, 2); - if (!this.fi || !validateTin(this.fi, code)) + if (!this.fi || !validateTin(this.fi, code) || (this.isVies && countryCode == code)) err(); done(); } diff --git a/modules/client/front/fiscal-data/index.html b/modules/client/front/fiscal-data/index.html index 88586cff7..4b1219f31 100644 --- a/modules/client/front/fiscal-data/index.html +++ b/modules/client/front/fiscal-data/index.html @@ -72,7 +72,9 @@ - + diff --git a/modules/client/front/fiscal-data/locale/es.yml b/modules/client/front/fiscal-data/locale/es.yml index 7624c86bd..61a91828f 100644 --- a/modules/client/front/fiscal-data/locale/es.yml +++ b/modules/client/front/fiscal-data/locale/es.yml @@ -12,3 +12,5 @@ Previous client: Cliente anterior In case of a company succession, specify the grantor company: En el caso de que haya habido una sucesión de empresa, indicar la empresa cedente Incoterms authorization: Autorización incoterms Electronic invoice: Factura electrónica +When activating it, do not enter the country code in the IF.: Al activarlo, no informar el código del país en el campo IF +The first two values are letters: Los dos primeros valores son letras \ No newline at end of file diff --git a/modules/entry/back/locale/buy/en.yml b/modules/entry/back/locale/buy/en.yml new file mode 100644 index 000000000..2db7c7be5 --- /dev/null +++ b/modules/entry/back/locale/buy/en.yml @@ -0,0 +1,18 @@ +name: buy +columns: + id: id + quantity: quantity + buyingValue: buying value + freightValue: freight value + packing: packing + grouping: grouping + stickers: stickers + groupingMode: grouping mode + comissionValue: comission value + packageValue: package value + price2: price2 + price3: price3 + weight: weight + entryFk: entry + itemFk: item + packageFk: package diff --git a/modules/entry/back/locale/buy/es.yml b/modules/entry/back/locale/buy/es.yml new file mode 100644 index 000000000..666bf7640 --- /dev/null +++ b/modules/entry/back/locale/buy/es.yml @@ -0,0 +1,18 @@ +name: compra +columns: + id: id + quantity: cantidad + buyingValue: valor compra + freightValue: valor flete + packing: embalaje + grouping: agrupación + stickers: pegatinas + groupingMode: modo agrupación + comissionValue: valor comisión + packageValue: valor paquete + price2: precio2 + price3: precio3 + weight: peso + entryFk: entrada + itemFk: artículo + packageFk: paquete diff --git a/modules/entry/back/locale/entry-observation/en.yml b/modules/entry/back/locale/entry-observation/en.yml new file mode 100644 index 000000000..efe908c9f --- /dev/null +++ b/modules/entry/back/locale/entry-observation/en.yml @@ -0,0 +1,6 @@ +name: entry observation +columns: + id: id + description: description + entryFk: entry + observationTypeFk: observation type diff --git a/modules/entry/back/locale/entry-observation/es.yml b/modules/entry/back/locale/entry-observation/es.yml new file mode 100644 index 000000000..43799ae00 --- /dev/null +++ b/modules/entry/back/locale/entry-observation/es.yml @@ -0,0 +1,6 @@ +name: observación entrada +columns: + id: id + description: descripción + entryFk: entrada + observationTypeFk: tipo observación diff --git a/modules/entry/back/locale/entry/en.yml b/modules/entry/back/locale/entry/en.yml new file mode 100644 index 000000000..6bc2333e6 --- /dev/null +++ b/modules/entry/back/locale/entry/en.yml @@ -0,0 +1,23 @@ +name: entry +columns: + id: id + dated: dated + reference: reference + invoiceNumber: invoice number + isBooked: booked + isExcludedFromAvailable: excluded from available + notes: notes + isConfirmed: confirmed + isVirtual: virtual + isRaid: raid + commission: commission + isOrdered: price3 + created: created + observation: observation + isBlocked: blocked + loadPriority: load priority + supplierFk: supplier + travelFk: travel + companyFk: company + observationEditorFk: observation editor + currencyFk: currency diff --git a/modules/entry/back/locale/entry/es.yml b/modules/entry/back/locale/entry/es.yml new file mode 100644 index 000000000..3a0c3d9c1 --- /dev/null +++ b/modules/entry/back/locale/entry/es.yml @@ -0,0 +1,23 @@ +name: entrada +columns: + id: id + dated: fecha + reference: referencia + invoiceNumber: número factura + isBooked: reservado + isExcludedFromAvailable: excluido del disponible + notes: notas + isConfirmed: confirmado + isVirtual: virtual + isRaid: incursión + commission: comisión + isOrdered: precio3 + created: creado + observation: observación + isBlocked: bloqueado + loadPriority: prioridad de carga + supplierFk: proveedor + travelFk: envío + companyFk: empresa + observationEditorFk: editor observación + currencyFk: moneda diff --git a/modules/entry/back/methods/entry/filter.js b/modules/entry/back/methods/entry/filter.js index e90043074..1cd12b737 100644 --- a/modules/entry/back/methods/entry/filter.js +++ b/modules/entry/back/methods/entry/filter.js @@ -158,7 +158,6 @@ module.exports = Self => { e.invoiceNumber, e.isBooked, e.isExcludedFromAvailable, - e.notes, e.evaNotes AS observation, e.isConfirmed, e.isOrdered, diff --git a/modules/entry/back/models/entry-log.json b/modules/entry/back/models/entry-log.json index 7415a3efe..b4370e3bc 100644 --- a/modules/entry/back/models/entry-log.json +++ b/modules/entry/back/models/entry-log.json @@ -1,6 +1,6 @@ { "name": "EntryLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "entryLog" @@ -55,4 +55,4 @@ "scope": { "order": ["creationDate DESC", "id DESC"] } -} \ No newline at end of file +} diff --git a/modules/entry/back/models/entry.json b/modules/entry/back/models/entry.json index 3933f6a34..a7508b4e8 100644 --- a/modules/entry/back/models/entry.json +++ b/modules/entry/back/models/entry.json @@ -27,9 +27,6 @@ "isExcludedFromAvailable": { "type": "boolean" }, - "notes": { - "type": "string" - }, "isConfirmed": { "type": "boolean" }, diff --git a/modules/entry/front/basic-data/index.html b/modules/entry/front/basic-data/index.html index 68a65e890..4e4631a3c 100644 --- a/modules/entry/front/basic-data/index.html +++ b/modules/entry/front/basic-data/index.html @@ -52,13 +52,6 @@ rule vn-focus> - - - - diff --git a/modules/invoiceIn/back/models/invoice-in-log.json b/modules/invoiceIn/back/models/invoice-in-log.json index b5c5afea9..70892d0f9 100644 --- a/modules/invoiceIn/back/models/invoice-in-log.json +++ b/modules/invoiceIn/back/models/invoice-in-log.json @@ -1,6 +1,6 @@ { "name": "InvoiceInLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "invoiceInLog" @@ -58,4 +58,4 @@ "id DESC" ] } -} \ No newline at end of file +} diff --git a/modules/invoiceOut/back/methods/invoiceOut/refund.js b/modules/invoiceOut/back/methods/invoiceOut/refund.js index ba1fdfedd..ad480dc7d 100644 --- a/modules/invoiceOut/back/methods/invoiceOut/refund.js +++ b/modules/invoiceOut/back/methods/invoiceOut/refund.js @@ -35,7 +35,7 @@ module.exports = Self => { const tickets = await models.Ticket.find(filter, myOptions); const ticketsIds = tickets.map(ticket => ticket.id); - const refundedTickets = await models.Ticket.refund(ticketsIds, true, myOptions); + const refundedTickets = await models.Ticket.refund(ticketsIds, myOptions); if (tx) await tx.commit(); diff --git a/modules/invoiceOut/back/methods/invoiceOut/specs/refund.spec.js b/modules/invoiceOut/back/methods/invoiceOut/specs/refund.spec.js index c5a1ac603..35f2b4023 100644 --- a/modules/invoiceOut/back/methods/invoiceOut/specs/refund.spec.js +++ b/modules/invoiceOut/back/methods/invoiceOut/specs/refund.spec.js @@ -17,7 +17,7 @@ describe('InvoiceOut refund()', () => { try { const result = await models.InvoiceOut.refund('T1111111', options); - expect(result.length).toEqual(1); + expect(result).toBeDefined(); await tx.rollback(); } catch (e) { diff --git a/modules/invoiceOut/front/descriptor-menu/index.js b/modules/invoiceOut/front/descriptor-menu/index.js index 456939119..57ea653a8 100644 --- a/modules/invoiceOut/front/descriptor-menu/index.js +++ b/modules/invoiceOut/front/descriptor-menu/index.js @@ -118,8 +118,11 @@ class Controller extends Section { const query = 'InvoiceOuts/refund'; const params = {ref: this.invoiceOut.ref}; this.$http.post(query, params).then(res => { - const ticketIds = res.data.map(ticket => ticket.id).join(', '); - this.vnApp.showSuccess(this.$t('The following refund tickets have been created', {ticketIds})); + const refundTicket = res.data; + this.vnApp.showSuccess(this.$t('The following refund ticket have been created', { + ticketId: refundTicket.id + })); + this.$state.go('ticket.card.sale', {id: refundTicket.id}); }); } } diff --git a/modules/item/back/locale/item-barcode/en.yml b/modules/item/back/locale/item-barcode/en.yml new file mode 100644 index 000000000..c1b20855f --- /dev/null +++ b/modules/item/back/locale/item-barcode/en.yml @@ -0,0 +1,5 @@ +name: item barcode +columns: + id: id + code: code + itemFk: item diff --git a/modules/item/back/locale/item-barcode/es.yml b/modules/item/back/locale/item-barcode/es.yml new file mode 100644 index 000000000..c1557f6d8 --- /dev/null +++ b/modules/item/back/locale/item-barcode/es.yml @@ -0,0 +1,5 @@ +name: código barras artículo +columns: + id: id + code: código + itemFk: artículo diff --git a/modules/item/back/locale/item-botanical/en.yml b/modules/item/back/locale/item-botanical/en.yml new file mode 100644 index 000000000..f5a9e4c5a --- /dev/null +++ b/modules/item/back/locale/item-botanical/en.yml @@ -0,0 +1,5 @@ +name: item botanical +columns: + itemFk: item + genusFk: genus + specieFk: specie diff --git a/modules/item/back/locale/item-botanical/es.yml b/modules/item/back/locale/item-botanical/es.yml new file mode 100644 index 000000000..8e0a45491 --- /dev/null +++ b/modules/item/back/locale/item-botanical/es.yml @@ -0,0 +1,5 @@ +name: artículo botánico +columns: + itemFk: artículo + genusFk: género + specieFk: especie diff --git a/modules/item/back/locale/item-tag/en.yml b/modules/item/back/locale/item-tag/en.yml new file mode 100644 index 000000000..fee588b4c --- /dev/null +++ b/modules/item/back/locale/item-tag/en.yml @@ -0,0 +1,7 @@ +name: item tag +columns: + id: id + value: value + itemFk: item + tagFk: tag + priority: priority diff --git a/modules/item/back/locale/item-tag/es.yml b/modules/item/back/locale/item-tag/es.yml new file mode 100644 index 000000000..3e1d1a9cf --- /dev/null +++ b/modules/item/back/locale/item-tag/es.yml @@ -0,0 +1,7 @@ +name: etiqueta artículo +columns: + id: id + value: valor + itemFk: artículo + tagFk: etiqueta + priority: prioridad diff --git a/modules/item/back/locale/item-tax-country/en.yml b/modules/item/back/locale/item-tax-country/en.yml new file mode 100644 index 000000000..060ad9910 --- /dev/null +++ b/modules/item/back/locale/item-tax-country/en.yml @@ -0,0 +1,7 @@ +name: item tax country +columns: + id: id + effectived: effectived + itemFk: item + countryFk: country + taxClassFk: tax class diff --git a/modules/item/back/locale/item-tax-country/es.yml b/modules/item/back/locale/item-tax-country/es.yml new file mode 100644 index 000000000..2a0e6b5e2 --- /dev/null +++ b/modules/item/back/locale/item-tax-country/es.yml @@ -0,0 +1,7 @@ +name: impuesto país del artículo +columns: + id: id + effectived: efectivo + itemFk: artículo + countryFk: país + taxClassFk: clase impuestos diff --git a/modules/item/back/locale/item/en.yml b/modules/item/back/locale/item/en.yml new file mode 100644 index 000000000..d63c95c70 --- /dev/null +++ b/modules/item/back/locale/item/en.yml @@ -0,0 +1,47 @@ +name: item +columns: + id: id + name: name + quantity: quantity + size: size + category: category + typeFk: type + stems: stems + description: description + isActive: active + relevancy: relevancy + weightByPiece: weight by piece + stemMultiplier: stem multiplier + image: image + longName: long name + subName: sub name + tag5: tag5 + value5: value5 + tag6: tag6 + value6: value6 + tag7: tag7 + value7: value7 + tag8: tag8 + value8: value8 + tag9: tag9 + value9: value9 + tag10: tag10 + value10: value10 + itemPackingTypeFk: item packing type + hasKgPrice: has kg price + family: family + expenseFk: expense + minPrice: min price + packingOut: packing out + hasMinPrice: has min price + isFragile: fragile + isFloramondo: is floramondo + packingShelve: packing shelve + isLaid: laid + inkFk: ink + originFk: origin + producerFk: producer + intrastatFk: intrastat + genericFk: generic + itemFk: item + diff --git a/modules/item/back/locale/item/es.yml b/modules/item/back/locale/item/es.yml new file mode 100644 index 000000000..d65288954 --- /dev/null +++ b/modules/item/back/locale/item/es.yml @@ -0,0 +1,47 @@ +name: artículo +columns: + id: id + name: nombre + quantity: cantidad + size: tamaño + category: categoría + typeFk: tipo + stems: tallos + description: descripción + isActive: activo + relevancy: relevancia + weightByPiece: peso por pieza + stemMultiplier: multiplicador de tallo + image: imagen + longName: nombre largo + subName: subnombre + tag5: etiqueta5 + value5: valor5 + tag6: etiqueta6 + value6: valor6 + tag7: etiqueta7 + value7: valor7 + tag8: etiqueta8 + value8: valor8 + tag9: etiqueta9 + value9: valor9 + tag10: etiqueta10 + value10: valor10 + itemPackingTypeFk: embalaje del artículo + hasKgPrice: tiene precio kg + family: familia + expenseFk: gasto + minPrice: precio mínimo + packingOut: empaquetar + hasMinPrice: tiene precio mínimo + isFragile: frágil + isFloramondo: es floramondo + packingShelve: estantería embalaje + isLaid: puesto + inkFk: tinta + originFk: origen + producerFk: productor + intrastatFk: intrastat + genericFk: genérico + itemFk: artículo + diff --git a/modules/item/back/models/item-log.json b/modules/item/back/models/item-log.json index 5bab2af86..19c132187 100644 --- a/modules/item/back/models/item-log.json +++ b/modules/item/back/models/item-log.json @@ -1,6 +1,6 @@ { "name": "ItemLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "itemLog" @@ -12,7 +12,7 @@ "type": "number", "forceId": false }, - "originFk": { + "originFk": { "type": "number", "required": true }, @@ -50,7 +50,7 @@ "type": "belongsTo", "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/item/front/fixed-price-search-panel/style.scss b/modules/item/front/fixed-price-search-panel/style.scss index a63f84f3b..e386033dd 100644 --- a/modules/item/front/fixed-price-search-panel/style.scss +++ b/modules/item/front/fixed-price-search-panel/style.scss @@ -2,7 +2,7 @@ vn-fixed-price-search-panel vn-side-menu { .menu { - min-width: $right-menu-width; + min-width: $menu-width; } & > div { .input { diff --git a/modules/monitor/back/methods/sales-monitor/salesFilter.js b/modules/monitor/back/methods/sales-monitor/salesFilter.js index 8f7b336ab..4f9edd11c 100644 --- a/modules/monitor/back/methods/sales-monitor/salesFilter.js +++ b/modules/monitor/back/methods/sales-monitor/salesFilter.js @@ -238,7 +238,7 @@ module.exports = Self => { ENGINE = MEMORY SELECT DISTINCT clientFk FROM tmp.filter`); - stmt = new ParameterizedSQL('CALL clientGetDebt(?)', [args.to]); + stmt = new ParameterizedSQL('CALL client_getDebt(?)', [args.to]); stmts.push(stmt); stmts.push('DROP TEMPORARY TABLE tmp.clientGetDebt'); diff --git a/modules/route/back/locale/route/en.yml b/modules/route/back/locale/route/en.yml new file mode 100644 index 000000000..96aaddb72 --- /dev/null +++ b/modules/route/back/locale/route/en.yml @@ -0,0 +1,19 @@ +name: route +columns: + id: id + created: created + time: time + kmStart: km start + kmEnd: km end + started: started + finished: finished + gestdoc: gestdoc + cost: cost + m3: m3 + description: description + isOk: ok + workerFk: worker + vehicleFk: vehicle + agencyModeFk: agency + routeFk: route + zoneFk: zone diff --git a/modules/route/back/locale/route/es.yml b/modules/route/back/locale/route/es.yml new file mode 100644 index 000000000..d1e38ff7e --- /dev/null +++ b/modules/route/back/locale/route/es.yml @@ -0,0 +1,19 @@ +name: ruta +columns: + id: id + created: creado + time: tiempo + kmStart: km inicio + kmEnd: km fin + started: comenzado + finished: terminado + gestdoc: gestdoc + cost: costo + m3: m3 + description: descripción + isOk: ok + workerFk: trabajador + vehicleFk: vehículo + agencyModeFk: agencia + routeFk: ruta + zoneFk: zona diff --git a/modules/route/back/models/route-log.json b/modules/route/back/models/route-log.json index c8b7b5e9b..93f570593 100644 --- a/modules/route/back/models/route-log.json +++ b/modules/route/back/models/route-log.json @@ -1,6 +1,6 @@ { "name": "RouteLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "routeLog" @@ -50,7 +50,7 @@ "type": "belongsTo", "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/shelving/back/models/shelving-log.json b/modules/shelving/back/models/shelving-log.json index d47058b8b..e8245f770 100644 --- a/modules/shelving/back/models/shelving-log.json +++ b/modules/shelving/back/models/shelving-log.json @@ -1,6 +1,6 @@ { "name": "ShelvingLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "shelvingLog" @@ -50,7 +50,7 @@ "type": "belongsTo", "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/supplier/back/locale/supplier-account/en.yml b/modules/supplier/back/locale/supplier-account/en.yml new file mode 100644 index 000000000..bc2add833 --- /dev/null +++ b/modules/supplier/back/locale/supplier-account/en.yml @@ -0,0 +1,7 @@ +name: supplier account +columns: + id: id + iban: iban + beneficiary: beneficiary + supplierFk: supplier + bankEntityFk: bank entity diff --git a/modules/supplier/back/locale/supplier-account/es.yml b/modules/supplier/back/locale/supplier-account/es.yml new file mode 100644 index 000000000..0d751b387 --- /dev/null +++ b/modules/supplier/back/locale/supplier-account/es.yml @@ -0,0 +1,7 @@ +name: cuenta proveedor +columns: + id: id + iban: iban + beneficiary: beneficiario + supplierFk: proveedor + bankEntityFk: entidad bancaria diff --git a/modules/supplier/back/locale/supplier-contact/en.yml b/modules/supplier/back/locale/supplier-contact/en.yml new file mode 100644 index 000000000..62f923293 --- /dev/null +++ b/modules/supplier/back/locale/supplier-contact/en.yml @@ -0,0 +1,9 @@ +name: supplier contact +columns: + id: id + supplierFk: supplier + phone: phone + mobile: mobile + email: email + observation: observation + name: name diff --git a/modules/supplier/back/locale/supplier-contact/es.yml b/modules/supplier/back/locale/supplier-contact/es.yml new file mode 100644 index 000000000..d35f0bf2e --- /dev/null +++ b/modules/supplier/back/locale/supplier-contact/es.yml @@ -0,0 +1,9 @@ +name: contacto proveedor +columns: + id: id + supplierFk: proveedor + phone: teléfono + mobile: móvil + email: email + observation: observación + name: nombre diff --git a/modules/supplier/back/locale/supplier/en.yml b/modules/supplier/back/locale/supplier/en.yml new file mode 100644 index 000000000..1be941a70 --- /dev/null +++ b/modules/supplier/back/locale/supplier/en.yml @@ -0,0 +1,36 @@ +name: supplier +columns: + id: id + name: name + account: account + countryFk: country + nif: nif + phone: phone + retAccount: ret account + commission: commission + postcodeFk: postcode + isActive: active + isOfficial: official + isSerious: serious + isTrucker: trucker + note: note + street: street + city: city + provinceFk: province + postCode: postcode + payMethodFk: pay method + payDemFk: pay dem + payDay: pay day + nickname: nickname + workerFk: worker + sageTaxTypeFk: sage tax type + taxTypeSageFk: sage tax type + sageTransactionTypeFk: sage transaction type + transactionTypeSageFk: sage transaction type + sageWithholdingFk: sage with holding + withholdingSageFk: sage with holding + isPayMethodChecked: pay method checked + supplierActivityFk: supplier activity + healthRegister: health register + isVies: vies + supplierFk: supplier diff --git a/modules/supplier/back/locale/supplier/es.yml b/modules/supplier/back/locale/supplier/es.yml new file mode 100644 index 000000000..6ac8379f5 --- /dev/null +++ b/modules/supplier/back/locale/supplier/es.yml @@ -0,0 +1,36 @@ +name: proveedor +columns: + id: id + name: nombre + account: cuenta + countryFk: país + nif: nif + phone: teléfono + retAccount: cuenta ret + commission: comisión + postcodeFk: código postal + isActive: activo + isOfficial: oficial + isSerious: serio + isTrucker: camionero + note: nota + street: calle + city: ciudad + provinceFk: provincia + postCode: código postal + payMethodFk: método pago + payDemFk: pagar dem + payDay: día pago + nickname: apodo + workerFk: trabajador + sageTaxTypeFk: tipo de impuesto sage + taxTypeSageFk: tipo de impuesto sage + sageTransactionTypeFk: tipo de transacción sage + transactionTypeSageFk: tipo de transacción sage + sageWithholdingFk: sage con tenencia + withholdingSageFk: sage con tenencia + isPayMethodChecked: método pago verificado + supplierActivityFk: actividad del proveedor + healthRegister: registro sanitario + isVies: vies + supplierFk: proveedor diff --git a/modules/supplier/back/methods/supplier/specs/newSupplier.spec.js b/modules/supplier/back/methods/supplier/specs/newSupplier.spec.js index d4479d00b..c368ec1b8 100644 --- a/modules/supplier/back/methods/supplier/specs/newSupplier.spec.js +++ b/modules/supplier/back/methods/supplier/specs/newSupplier.spec.js @@ -19,13 +19,14 @@ describe('Supplier newSupplier()', () => { }); }); - it('should create a new supplier containing only the name', async() => { + it('should create a new supplier containing only the name and the nif', async() => { const tx = await models.Supplier.beginTransaction({}); try { const options = {transaction: tx}; ctx.args = { - name: 'newSupplier' + name: 'newSupplier', + nif: '12345678Z' }; const result = await models.Supplier.newSupplier(ctx, options); diff --git a/modules/supplier/back/models/supplier-log.json b/modules/supplier/back/models/supplier-log.json index b88266988..86fa2e54a 100644 --- a/modules/supplier/back/models/supplier-log.json +++ b/modules/supplier/back/models/supplier-log.json @@ -1,6 +1,6 @@ { "name": "SupplierLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "supplierLog" @@ -55,4 +55,4 @@ "scope": { "order": ["creationDate DESC", "id DESC"] } -} \ No newline at end of file +} diff --git a/modules/supplier/back/models/supplier.js b/modules/supplier/back/models/supplier.js index c4ce0c517..ae3eb4bcc 100644 --- a/modules/supplier/back/models/supplier.js +++ b/modules/supplier/back/models/supplier.js @@ -67,8 +67,9 @@ module.exports = Self => { }; const country = await Self.app.models.Country.findOne(filter); const code = country ? country.code.toLowerCase() : null; + const countryCode = this.nif.toLowerCase().substring(0, 2); - if (!this.nif || !validateTin(this.nif, code)) + if (!this.nif || !validateTin(this.nif, code) || (this.isVies && countryCode == code)) err(); done(); } diff --git a/modules/supplier/front/fiscal-data/index.html b/modules/supplier/front/fiscal-data/index.html index ccbd5b0d9..3a0aefbf2 100644 --- a/modules/supplier/front/fiscal-data/index.html +++ b/modules/supplier/front/fiscal-data/index.html @@ -42,6 +42,7 @@ vn-two vn-focus label="Social name" + name="socialName" ng-model="$ctrl.supplier.name" info="Only letters, numbers and spaces can be used" required="true" @@ -50,44 +51,53 @@ + rule + > - - - @@ -95,12 +105,14 @@ - - - - - @@ -188,7 +211,9 @@ + info="When activating it, do not enter the country code in the ID field." + ng-model="$ctrl.supplier.isVies" + > diff --git a/modules/supplier/front/fiscal-data/locale/es.yml b/modules/supplier/front/fiscal-data/locale/es.yml index 5232dd95d..ee641231f 100644 --- a/modules/supplier/front/fiscal-data/locale/es.yml +++ b/modules/supplier/front/fiscal-data/locale/es.yml @@ -3,4 +3,6 @@ Sage transaction type: Tipo de transacción Sage Sage withholding: Retención Sage Supplier activity: Actividad proveedor Healt register: Pasaporte sanitario -Trucker: Transportista \ No newline at end of file +Trucker: Transportista +When activating it, do not enter the country code in the ID field.: Al activarlo, no informar el código del país en el campo nif +The first two values are letters.: Los dos primeros valores son letras \ No newline at end of file diff --git a/modules/supplier/front/locale/es.yml b/modules/supplier/front/locale/es.yml index abb6a9775..a2b6dd04d 100644 --- a/modules/supplier/front/locale/es.yml +++ b/modules/supplier/front/locale/es.yml @@ -1 +1,2 @@ -Accounts: Cuentas \ No newline at end of file +Accounts: Cuentas +Invalid NIF for VIES: NIF no valido por VIES \ No newline at end of file diff --git a/modules/ticket/back/locale/expedition/en.yml b/modules/ticket/back/locale/expedition/en.yml new file mode 100644 index 000000000..1834984ea --- /dev/null +++ b/modules/ticket/back/locale/expedition/en.yml @@ -0,0 +1,10 @@ +name: expedition +columns: + id: id + freightItemFk: freight item + created: created + counter: counter + ticketFk: ticket + agencyModeFk: agency + workerFk: worker + packagingFk: packaging diff --git a/modules/ticket/back/locale/expedition/es.yml b/modules/ticket/back/locale/expedition/es.yml new file mode 100644 index 000000000..32f72b943 --- /dev/null +++ b/modules/ticket/back/locale/expedition/es.yml @@ -0,0 +1,10 @@ +name: expedición +columns: + id: id + freightItemFk: artículo de carga + created: creado + counter: contador + ticketFk: ticket + agencyModeFk: agencia + workerFk: trabajador + packagingFk: embalaje diff --git a/modules/ticket/back/locale/sale/en.yml b/modules/ticket/back/locale/sale/en.yml index ae8f67d5e..f844bf0c5 100644 --- a/modules/ticket/back/locale/sale/en.yml +++ b/modules/ticket/back/locale/sale/en.yml @@ -1,11 +1,13 @@ -concept: concept -quantity: quantity -price: price -discount: discount -reserved: reserved -isPicked: is picked -created: created -originalQuantity: original quantity -itemFk: item -ticketFk: ticket -saleFk: sale +name: sale +columns: + concept: concept + quantity: quantity + price: price + discount: discount + reserved: reserved + isPicked: is picked + created: created + originalQuantity: original quantity + itemFk: item + ticketFk: ticket + saleFk: sale diff --git a/modules/ticket/back/locale/sale/es.yml b/modules/ticket/back/locale/sale/es.yml index ff8cc5466..8196a089c 100644 --- a/modules/ticket/back/locale/sale/es.yml +++ b/modules/ticket/back/locale/sale/es.yml @@ -1,11 +1,13 @@ -concept: concepto -quantity: cantidad -price: precio -discount: descuento -reserved: reservado -isPicked: esta seleccionado -created: creado -originalQuantity: cantidad original -itemFk: artículo -ticketFk: ticket -saleFk: línea +name: línea +columns: + concept: concepto + quantity: cantidad + price: precio + discount: descuento + reserved: reservado + isPicked: esta seleccionado + created: creado + originalQuantity: cantidad original + itemFk: artículo + ticketFk: ticket + saleFk: línea diff --git a/modules/ticket/back/locale/ticket-dms/en.yml b/modules/ticket/back/locale/ticket-dms/en.yml new file mode 100644 index 000000000..771e4daf3 --- /dev/null +++ b/modules/ticket/back/locale/ticket-dms/en.yml @@ -0,0 +1,4 @@ +name: ticket dms +columns: + dmsFk: dms + ticketFk: ticket diff --git a/modules/ticket/back/locale/ticket-dms/es.yml b/modules/ticket/back/locale/ticket-dms/es.yml new file mode 100644 index 000000000..360268428 --- /dev/null +++ b/modules/ticket/back/locale/ticket-dms/es.yml @@ -0,0 +1,4 @@ +name: documento ticket +columns: + dmsFk: dms + ticketFk: ticket diff --git a/modules/ticket/back/locale/ticket-observation/en.yml b/modules/ticket/back/locale/ticket-observation/en.yml new file mode 100644 index 000000000..40bd567bf --- /dev/null +++ b/modules/ticket/back/locale/ticket-observation/en.yml @@ -0,0 +1,6 @@ +name: ticket observation +columns: + id: id + description: description + ticketFk: ticket + observationTypeFk: observation type diff --git a/modules/ticket/back/locale/ticket-observation/es.yml b/modules/ticket/back/locale/ticket-observation/es.yml new file mode 100644 index 000000000..155eb58e2 --- /dev/null +++ b/modules/ticket/back/locale/ticket-observation/es.yml @@ -0,0 +1,6 @@ +name: observación ticket +columns: + id: id + description: descripción + ticketFk: ticket + observationTypeFk: tipo observación diff --git a/modules/ticket/back/locale/ticket-packaging/en.yml b/modules/ticket/back/locale/ticket-packaging/en.yml new file mode 100644 index 000000000..4dd018524 --- /dev/null +++ b/modules/ticket/back/locale/ticket-packaging/en.yml @@ -0,0 +1,8 @@ +name: ticket packaging +columns: + id: id + quantity: quantity + created: created + pvp: pvp + ticketFk: ticket + packagingFk: packaging diff --git a/modules/ticket/back/locale/ticket-packaging/es.yml b/modules/ticket/back/locale/ticket-packaging/es.yml new file mode 100644 index 000000000..a31a8c097 --- /dev/null +++ b/modules/ticket/back/locale/ticket-packaging/es.yml @@ -0,0 +1,8 @@ +name: embalaje ticket +columns: + id: id + quantity: cantidad + created: creado + pvp: pvp + ticketFk: ticket + packagingFk: embalaje diff --git a/modules/ticket/back/locale/ticket-refund/en.yml b/modules/ticket/back/locale/ticket-refund/en.yml new file mode 100644 index 000000000..961b5c8c3 --- /dev/null +++ b/modules/ticket/back/locale/ticket-refund/en.yml @@ -0,0 +1,5 @@ +name: ticket refund +columns: + id: id + refundTicketFk: refund ticket + originalTicketFk: original ticket diff --git a/modules/ticket/back/locale/ticket-refund/es.yml b/modules/ticket/back/locale/ticket-refund/es.yml new file mode 100644 index 000000000..8826ef949 --- /dev/null +++ b/modules/ticket/back/locale/ticket-refund/es.yml @@ -0,0 +1,5 @@ +name: ticket abono +columns: + id: id + refundTicketFk: ticket abono + originalTicketFk: ticket original diff --git a/modules/ticket/back/locale/ticket-request/en.yml b/modules/ticket/back/locale/ticket-request/en.yml new file mode 100644 index 000000000..498a933ac --- /dev/null +++ b/modules/ticket/back/locale/ticket-request/en.yml @@ -0,0 +1,15 @@ +name: ticket request +columns: + id: id + description: description + created: created + quantity: quantity + price: price + isOk: ok + response: response + saleFk: sale + ticketFk: ticket + attenderFk: attender + requesterFk: requester + itemFk: item + diff --git a/modules/ticket/back/locale/ticket-request/es.yml b/modules/ticket/back/locale/ticket-request/es.yml new file mode 100644 index 000000000..b2871e737 --- /dev/null +++ b/modules/ticket/back/locale/ticket-request/es.yml @@ -0,0 +1,15 @@ +name: peticiones ticket +columns: + id: id + description: descripción + created: creado + quantity: cantidad + price: precio + isOk: ok + response: respuesta + saleFk: línea + ticketFk: ticket + attenderFk: asistente + requesterFk: solicitante + itemFk: artículo + diff --git a/modules/ticket/back/locale/ticket-service/en.yml b/modules/ticket/back/locale/ticket-service/en.yml new file mode 100644 index 000000000..cf4e6f43f --- /dev/null +++ b/modules/ticket/back/locale/ticket-service/en.yml @@ -0,0 +1,10 @@ +name: ticket service +columns: + id: id + ticketFk: ticket + description: description + quantity: quantity + price: price + taxClassFk: tax class + ticketServiceTypeFk: ticket service type + diff --git a/modules/ticket/back/locale/ticket-service/es.yml b/modules/ticket/back/locale/ticket-service/es.yml new file mode 100644 index 000000000..ee07c13d3 --- /dev/null +++ b/modules/ticket/back/locale/ticket-service/es.yml @@ -0,0 +1,10 @@ +name: servicios ticket +columns: + id: id + ticketFk: ticket + description: descripción + quantity: cantidad + price: precio + taxClassFk: tipo impuestos + ticketServiceTypeFk: tipo servicio ticket + diff --git a/modules/ticket/back/locale/ticket-tracking/en.yml b/modules/ticket/back/locale/ticket-tracking/en.yml new file mode 100644 index 000000000..15505a763 --- /dev/null +++ b/modules/ticket/back/locale/ticket-tracking/en.yml @@ -0,0 +1,7 @@ +name: ticket tracking +columns: + id: id + created: created + ticketFk: ticket + stateFk: state + workerFk: worker diff --git a/modules/ticket/back/locale/ticket-tracking/es.yml b/modules/ticket/back/locale/ticket-tracking/es.yml new file mode 100644 index 000000000..3459ab367 --- /dev/null +++ b/modules/ticket/back/locale/ticket-tracking/es.yml @@ -0,0 +1,7 @@ +name: seguimiento ticket +columns: + id: id + created: creado + ticketFk: ticket + stateFk: estado + workerFk: trabajador diff --git a/modules/ticket/back/locale/ticket-weekly/en.yml b/modules/ticket/back/locale/ticket-weekly/en.yml new file mode 100644 index 000000000..af1c94dc9 --- /dev/null +++ b/modules/ticket/back/locale/ticket-weekly/en.yml @@ -0,0 +1,5 @@ +name: ticket weekly +columns: + ticketFk: ticket + weekDay: week day + agencyModeFk: agency diff --git a/modules/ticket/back/locale/ticket-weekly/es.yml b/modules/ticket/back/locale/ticket-weekly/es.yml new file mode 100644 index 000000000..597d9d46a --- /dev/null +++ b/modules/ticket/back/locale/ticket-weekly/es.yml @@ -0,0 +1,5 @@ +name: ticket semanal +columns: + ticketFk: ticket + weekDay: día semana + agencyModeFk: agencia diff --git a/modules/ticket/back/locale/ticket/en.yml b/modules/ticket/back/locale/ticket/en.yml index c4ad84232..2481c42f8 100644 --- a/modules/ticket/back/locale/ticket/en.yml +++ b/modules/ticket/back/locale/ticket/en.yml @@ -1,23 +1,25 @@ -shipped: shipped -landed: landed -nickname: nickname -location: location -solution: solution -packages: packages -updated: updated -isDeleted: is deleted -priority: priority -zoneFk: zone -zonePrice: zone price -zoneBonus: zone bonus -totalWithVat: total with vat -totalWithoutVat: total without vat -clientFk: client -warehouseFk: warehouse -refFk: reference -addressFk: address -routeFk: route -companyFk: company -agencyModeFk: agency -ticketFk: ticket -mergedTicket: merged ticket +name: ticket +columns: + shipped: shipped + landed: landed + nickname: nickname + location: location + solution: solution + packages: packages + updated: updated + isDeleted: is deleted + priority: priority + zoneFk: zone + zonePrice: zone price + zoneBonus: zone bonus + totalWithVat: total with vat + totalWithoutVat: total without vat + clientFk: client + warehouseFk: warehouse + refFk: reference + addressFk: address + routeFk: route + companyFk: company + agencyModeFk: agency + ticketFk: ticket + mergedTicket: merged ticket diff --git a/modules/ticket/back/locale/ticket/es.yml b/modules/ticket/back/locale/ticket/es.yml index 15b5a39bf..558378612 100644 --- a/modules/ticket/back/locale/ticket/es.yml +++ b/modules/ticket/back/locale/ticket/es.yml @@ -1,25 +1,27 @@ -shipped: fecha salida -landed: fecha entrega -nickname: alias -location: ubicación -solution: solución -packages: embalajes -updated: fecha última actualización -isDeleted: esta eliminado -priority: prioridad -zoneFk: zona -zonePrice: precio zona -zoneBonus: bonus zona -totalWithVat: total con IVA -totalWithoutVat: total sin IVA -clientFk: cliente -warehouseFk: almacén -refFk: referencia -addressFk: dirección -routeFk: ruta -companyFk: empresa -agencyModeFk: agencia -ticketFk: ticket -mergedTicket: ticket fusionado -withWarningAccept: aviso negativos -isWithoutNegatives: sin negativos +name: ticket +columns: + shipped: salida + landed: entrega + nickname: alias + location: ubicación + solution: solución + packages: embalajes + updated: última actualización + isDeleted: eliminado + priority: prioridad + zoneFk: zona + zonePrice: precio zona + zoneBonus: bonus zona + totalWithVat: total con IVA + totalWithoutVat: total sin IVA + clientFk: cliente + warehouseFk: almacén + refFk: referencia + addressFk: dirección + routeFk: ruta + companyFk: empresa + agencyModeFk: agencia + ticketFk: ticket + mergedTicket: ticket fusionado + withWarningAccept: aviso negativos + isWithoutNegatives: sin negativos diff --git a/modules/ticket/back/methods/boxing/getVideoList.js b/modules/ticket/back/methods/boxing/getVideoList.js index 3d45a720d..ba989936e 100644 --- a/modules/ticket/back/methods/boxing/getVideoList.js +++ b/modules/ticket/back/methods/boxing/getVideoList.js @@ -53,7 +53,7 @@ module.exports = Self => { let start = new Date(expedition.created); let end = new Date(start.getTime() + (packingSiteConfig.avgBoxingTime * 1000)); - if (from && to) { + if (from != undefined && to != undefined) { start.setHours(from, 0, 0); end.setHours(to, 0, 0); } diff --git a/modules/ticket/back/methods/sale/refund.js b/modules/ticket/back/methods/sale/refund.js index 7b63fd66e..af58a6286 100644 --- a/modules/ticket/back/methods/sale/refund.js +++ b/modules/ticket/back/methods/sale/refund.js @@ -11,11 +11,6 @@ module.exports = Self => { { arg: 'servicesIds', type: ['number'] - }, - { - arg: 'createSingleTicket', - type: 'boolean', - required: false } ], returns: { @@ -28,7 +23,7 @@ module.exports = Self => { } }); - Self.refund = async(salesIds, servicesIds, createSingleTicket = false, options) => { + Self.refund = async(salesIds, servicesIds, options) => { const models = Self.app.models; const myOptions = {}; let tx; @@ -67,40 +62,14 @@ module.exports = Self => { const sales = await models.Sale.find(salesFilter, myOptions); const ticketsIds = [...new Set(sales.map(sale => sale.ticketFk))]; - const refundTickets = []; - const mappedTickets = new Map(); const now = Date.vnNew(); - const [firstTicketId] = ticketsIds; - if (createSingleTicket) { - await createTicketRefund( - firstTicketId, - refundTickets, - mappedTickets, - now, - refundAgencyMode, - refoundZoneId, - myOptions - ); - } else { - for (let ticketId of ticketsIds) { - await createTicketRefund( - ticketId, - refundTickets, - mappedTickets, - now, - refundAgencyMode, - refoundZoneId, - myOptions - ); - } - } + + const refundTicket = await createTicketRefund(firstTicketId, now, refundAgencyMode, refoundZoneId, myOptions); for (const sale of sales) { - const refundTicketId = await getTicketRefundId(createSingleTicket, sale.ticketFk, refundTickets, mappedTickets); - const createdSale = await models.Sale.create({ - ticketFk: refundTicketId, + ticketFk: refundTicket.id, itemFk: sale.itemFk, quantity: - sale.quantity, concept: sale.concept, @@ -120,16 +89,13 @@ module.exports = Self => { where: {id: {inq: servicesIds}} }; const services = await models.TicketService.find(servicesFilter, myOptions); - for (const service of services) { - const refundTicketId = await getTicketRefundId(createSingleTicket, service.ticketFk, refundTickets, mappedTickets); - await models.TicketService.create({ description: service.description, quantity: - service.quantity, price: service.price, taxClassFk: service.taxClassFk, - ticketFk: refundTicketId, + ticketFk: refundTicket.id, ticketServiceTypeFk: service.ticketServiceTypeFk, }, myOptions); } @@ -137,22 +103,14 @@ module.exports = Self => { if (tx) await tx.commit(); - return refundTickets; + return refundTicket; } catch (e) { if (tx) await tx.rollback(); throw e; } }; - async function createTicketRefund( - ticketId, - refundTickets, - mappedTickets, - now, - refundAgencyMode, - refoundZoneId, - myOptions - ) { + async function createTicketRefund(ticketId, now, refundAgencyMode, refoundZoneId, myOptions) { const models = Self.app.models; const filter = {include: {relation: 'address'}}; @@ -170,20 +128,11 @@ module.exports = Self => { zoneFk: refoundZoneId }, myOptions); - refundTickets.push(refundTicket); - - mappedTickets.set(ticketId, refundTicket.id); - await models.TicketRefund.create({ refundTicketFk: refundTicket.id, originalTicketFk: ticket.id, }, myOptions); - } - async function getTicketRefundId(createSingleTicket, ticketId, refundTickets, mappedTickets) { - if (createSingleTicket) { - const [firstRefundTicket] = refundTickets; - return firstRefundTicket.id; - } else return mappedTickets.get(ticketId); + return refundTicket; } }; diff --git a/modules/ticket/back/methods/sale/specs/refund.spec.js b/modules/ticket/back/methods/sale/specs/refund.spec.js index 403b4b477..83b3755e2 100644 --- a/modules/ticket/back/methods/sale/specs/refund.spec.js +++ b/modules/ticket/back/methods/sale/specs/refund.spec.js @@ -22,9 +22,9 @@ describe('Sale refund()', () => { try { const options = {transaction: tx}; - const response = await models.Sale.refund(salesIds, servicesIds, false, options); + const refundedTicket = await models.Sale.refund(salesIds, servicesIds, options); - expect(response.length).toBeGreaterThanOrEqual(1); + expect(refundedTicket).toBeDefined(); await tx.rollback(); } catch (e) { @@ -33,23 +33,18 @@ describe('Sale refund()', () => { } }); - it('should create a ticket for each unique ticketFk in the sales', async() => { + it('should create one ticket for each unique ticketFk in the sales', async() => { const tx = await models.Sale.beginTransaction({}); const salesIds = [6, 7]; try { const options = {transaction: tx}; - const createSingleTicket = false; - const tickets = await models.Sale.refund(salesIds, servicesIds, createSingleTicket, options); + const ticket = await models.Sale.refund(salesIds, servicesIds, options); - const ticketsIds = tickets.map(ticket => ticket.id); - - const refundedTickets = await models.Ticket.find({ + const refundedTicket = await models.Ticket.findOne({ where: { - id: { - inq: ticketsIds - } + id: ticket.id }, include: [ { @@ -66,16 +61,12 @@ describe('Sale refund()', () => { ] }, options); - const firstRefoundedTicket = refundedTickets[0]; - const secondRefoundedTicket = refundedTickets[1]; - const salesLength = firstRefoundedTicket.ticketSales().length; - const componentsLength = firstRefoundedTicket.ticketSales()[0].components().length; - const servicesLength = secondRefoundedTicket.ticketServices().length; + const salesLength = refundedTicket.ticketSales().length; + const componentsLength = refundedTicket.ticketSales()[0].components().length; - expect(refundedTickets.length).toEqual(2); - expect(salesLength).toEqual(1); + expect(refundedTicket).toBeDefined(); + expect(salesLength).toEqual(2); expect(componentsLength).toEqual(4); - expect(servicesLength).toBeGreaterThanOrEqual(1); await tx.rollback(); } catch (e) { diff --git a/modules/ticket/back/methods/ticket/makeInvoice.js b/modules/ticket/back/methods/ticket/makeInvoice.js index 9739f5985..bd899ef7b 100644 --- a/modules/ticket/back/methods/ticket/makeInvoice.js +++ b/modules/ticket/back/methods/ticket/makeInvoice.js @@ -75,8 +75,8 @@ module.exports = function(Self) { serial = result.serial; await Self.rawSql(` - DROP TEMPORARY TABLE IF EXISTS ticketToInvoice; - CREATE TEMPORARY TABLE ticketToInvoice + DROP TEMPORARY TABLE IF EXISTS tmp.ticketToInvoice; + CREATE TEMPORARY TABLE tmp.ticketToInvoice (PRIMARY KEY (id)) ENGINE = MEMORY SELECT id FROM vn.ticket diff --git a/modules/ticket/back/methods/ticket/refund.js b/modules/ticket/back/methods/ticket/refund.js index 1f0021316..91f48cfd6 100644 --- a/modules/ticket/back/methods/ticket/refund.js +++ b/modules/ticket/back/methods/ticket/refund.js @@ -7,11 +7,6 @@ module.exports = Self => { arg: 'ticketsIds', type: ['number'], required: true - }, - { - arg: 'createSingleTicket', - type: 'boolean', - required: false } ], returns: { @@ -24,7 +19,7 @@ module.exports = Self => { } }); - Self.refund = async(ticketsIds, createSingleTicket = false, options) => { + Self.refund = async(ticketsIds, options) => { const models = Self.app.models; const myOptions = {}; let tx; @@ -46,7 +41,7 @@ module.exports = Self => { const services = await models.TicketService.find(filter, myOptions); const servicesIds = services.map(service => service.id); - const refundedTickets = await models.Sale.refund(salesIds, servicesIds, createSingleTicket, myOptions); + const refundedTickets = await models.Sale.refund(salesIds, servicesIds, myOptions); if (tx) await tx.commit(); diff --git a/modules/ticket/back/models/ticket-log.json b/modules/ticket/back/models/ticket-log.json index 516ea506c..df04348da 100644 --- a/modules/ticket/back/models/ticket-log.json +++ b/modules/ticket/back/models/ticket-log.json @@ -1,6 +1,6 @@ { "name": "TicketLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "ticketLog" @@ -50,7 +50,7 @@ "type": "belongsTo", "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/ticket/front/descriptor-menu/index.js b/modules/ticket/front/descriptor-menu/index.js index 1a88b00d5..e32363f09 100644 --- a/modules/ticket/front/descriptor-menu/index.js +++ b/modules/ticket/front/descriptor-menu/index.js @@ -300,7 +300,7 @@ class Controller extends Section { const params = {ticketsIds: [this.id]}; const query = 'Tickets/refund'; return this.$http.post(query, params).then(res => { - const [refundTicket] = res.data; + const refundTicket = res.data; this.vnApp.showSuccess(this.$t('The following refund ticket have been created', { ticketId: refundTicket.id })); diff --git a/modules/ticket/front/descriptor-menu/index.spec.js b/modules/ticket/front/descriptor-menu/index.spec.js index babc22038..48998325a 100644 --- a/modules/ticket/front/descriptor-menu/index.spec.js +++ b/modules/ticket/front/descriptor-menu/index.spec.js @@ -250,7 +250,7 @@ describe('Ticket Component vnTicketDescriptorMenu', () => { const params = { ticketsIds: [16] }; - $httpBackend.expectPOST('Tickets/refund', params).respond([{id: 99}]); + $httpBackend.expectPOST('Tickets/refund', params).respond({id: 99}); controller.refund(); $httpBackend.flush(); diff --git a/modules/ticket/front/sale/index.js b/modules/ticket/front/sale/index.js index 20739b619..24b077476 100644 --- a/modules/ticket/front/sale/index.js +++ b/modules/ticket/front/sale/index.js @@ -516,7 +516,7 @@ class Controller extends Section { const params = {salesIds: salesIds}; const query = 'Sales/refund'; this.$http.post(query, params).then(res => { - const [refundTicket] = res.data; + const refundTicket = res.data; this.vnApp.showSuccess(this.$t('The following refund ticket have been created', { ticketId: refundTicket.id })); diff --git a/modules/ticket/front/sale/index.spec.js b/modules/ticket/front/sale/index.spec.js index c35ed3d9a..5fb3b3df3 100644 --- a/modules/ticket/front/sale/index.spec.js +++ b/modules/ticket/front/sale/index.spec.js @@ -726,8 +726,7 @@ describe('Ticket', () => { salesIds: [1, 4], }; const refundTicket = {id: 99}; - const createdTickets = [refundTicket]; - $httpBackend.expect('POST', 'Sales/refund', params).respond(200, createdTickets); + $httpBackend.expect('POST', 'Sales/refund', params).respond(200, refundTicket); controller.createRefund(); $httpBackend.flush(); diff --git a/modules/travel/back/locale/travel-thermograph/en.yml b/modules/travel/back/locale/travel-thermograph/en.yml new file mode 100644 index 000000000..92acee896 --- /dev/null +++ b/modules/travel/back/locale/travel-thermograph/en.yml @@ -0,0 +1,10 @@ +name: travel thermograph +columns: + id: id + created: created + temperatureFk: temperature + result: result + warehouseFk: warehouse + travelFk: travel + dmsFk: dms + thermographFk: thermograph diff --git a/modules/travel/back/locale/travel-thermograph/es.yml b/modules/travel/back/locale/travel-thermograph/es.yml new file mode 100644 index 000000000..0d08863b6 --- /dev/null +++ b/modules/travel/back/locale/travel-thermograph/es.yml @@ -0,0 +1,10 @@ +name: travel thermograph +columns: + id: id + created: creado + temperatureFk: temperatura + result: resultado + warehouseFk: almacén + travelFk: envío + dmsFk: dms + thermographFk: termógrafo diff --git a/modules/travel/back/locale/travel/en.yml b/modules/travel/back/locale/travel/en.yml new file mode 100644 index 000000000..f3bab57d1 --- /dev/null +++ b/modules/travel/back/locale/travel/en.yml @@ -0,0 +1,15 @@ +name: travel +columns: + id: id + shipped: shipped + landed: landed + isDelivered: delivered + isReceived: received + ref: ref + totalEntries: total entries + m3: m3 + kg: kg + cargoSupplierFk: cargo supplier + agencyModeFk: agency + warehouseInFk: warehouse in + warehouseOutFk: warehouse out diff --git a/modules/travel/back/locale/travel/es.yml b/modules/travel/back/locale/travel/es.yml new file mode 100644 index 000000000..ac86c003d --- /dev/null +++ b/modules/travel/back/locale/travel/es.yml @@ -0,0 +1,15 @@ +name: envío +columns: + id: id + shipped: enviado + landed: entregado + isDelivered: está entregado + isReceived: está recibido + ref: referencia + totalEntries: entradas totales + m3: m3 + kg: kg + cargoSupplierFk: proveedor carga + agencyModeFk: agencia + warehouseInFk: almacén entrega + warehouseOutFk: almacén salida diff --git a/modules/travel/back/methods/travel/extraCommunityFilter.js b/modules/travel/back/methods/travel/extraCommunityFilter.js index 5ee51de8e..388ba52a1 100644 --- a/modules/travel/back/methods/travel/extraCommunityFilter.js +++ b/modules/travel/back/methods/travel/extraCommunityFilter.js @@ -167,7 +167,6 @@ module.exports = Self => { s.name AS supplierName, SUM(b.stickers) AS stickers, e.evaNotes, - e.notes, e.invoiceAmount, CAST(SUM(b.weight * b.stickers) AS DECIMAL(10,0)) as loadedkg, CAST(SUM(vc.aerealVolumetricDensity * b.stickers * IF(pkg.volume, pkg.volume, pkg.width * pkg.depth * pkg.height) / 1000000) AS DECIMAL(10,0)) as volumeKg diff --git a/modules/travel/back/methods/travel/getEntries.js b/modules/travel/back/methods/travel/getEntries.js index 5ca12f7a1..71bb0d8fb 100644 --- a/modules/travel/back/methods/travel/getEntries.js +++ b/modules/travel/back/methods/travel/getEntries.js @@ -31,7 +31,6 @@ module.exports = Self => { e.isConfirmed, e.invoiceNumber, e.reference, - e.notes, e.evaNotes AS observation, s.name AS supplierName, CAST((SUM(IF(p.volume > 0,p.volume,p.width * p.depth * IF(p.height, p.height, i.size + pconfig.upperGap)) diff --git a/modules/travel/back/models/travel-log.json b/modules/travel/back/models/travel-log.json index a72d9e0a5..e781c2948 100644 --- a/modules/travel/back/models/travel-log.json +++ b/modules/travel/back/models/travel-log.json @@ -1,6 +1,6 @@ { "name": "TravelLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "travelLog" @@ -50,7 +50,7 @@ "type": "belongsTo", "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/travel/front/search-panel/style.scss b/modules/travel/front/search-panel/style.scss index 94fe7b239..0da52408a 100644 --- a/modules/travel/front/search-panel/style.scss +++ b/modules/travel/front/search-panel/style.scss @@ -2,7 +2,7 @@ vn-travel-search-panel vn-side-menu { .menu { - min-width: $right-menu-width; + min-width: $menu-width; } & > div { .input { diff --git a/modules/travel/front/summary/index.html b/modules/travel/front/summary/index.html index 113128e0e..5d38ed08f 100644 --- a/modules/travel/front/summary/index.html +++ b/modules/travel/front/summary/index.html @@ -100,12 +100,6 @@ {{entry.pallet}}{{entry.m3}} - - { client = await models.Client.findById( user.id, - {fields: ['id', 'name', 'socialName', 'street', 'city', 'iban', 'bankEntityFk', 'defaultAddressFk']}, + {fields: ['id', 'name', 'socialName', 'street', 'city', 'iban', 'bankEntityFk', 'defaultAddressFk', 'fi']}, myOptions ); diff --git a/modules/worker/back/models/device-production-log.json b/modules/worker/back/models/device-production-log.json index c935398fc..71c54a9c1 100644 --- a/modules/worker/back/models/device-production-log.json +++ b/modules/worker/back/models/device-production-log.json @@ -1,6 +1,6 @@ { "name": "DeviceProductionLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "deviceProductionLog" diff --git a/modules/worker/back/models/worker-log.json b/modules/worker/back/models/worker-log.json index 3cd5f9010..6eb8b75be 100644 --- a/modules/worker/back/models/worker-log.json +++ b/modules/worker/back/models/worker-log.json @@ -1,6 +1,6 @@ { "name": "WorkerLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "workerLog" @@ -50,7 +50,7 @@ "type": "belongsTo", "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/modules/zone/back/locale/zone-event/en.yml b/modules/zone/back/locale/zone-event/en.yml new file mode 100644 index 000000000..2d6ef39ab --- /dev/null +++ b/modules/zone/back/locale/zone-event/en.yml @@ -0,0 +1,14 @@ +name: zone event +columns: + id: id + zoneFk: zone + type: type + dated: dated + started: started + ended: ended + weekDays: week days + hour: hour + travelingDays: traveling days + price: price + bonus: bonus + m3Max: max m3 diff --git a/modules/zone/back/locale/zone-event/es.yml b/modules/zone/back/locale/zone-event/es.yml new file mode 100644 index 000000000..9bc8db9fe --- /dev/null +++ b/modules/zone/back/locale/zone-event/es.yml @@ -0,0 +1,14 @@ +name: evento zona +columns: + id: id + zoneFk: zona + type: tipo + dated: fecha + started: comenzado + ended: terminado + weekDays: días semana + hour: hora + travelingDays: días de viaje + price: precio + bonus: bono + m3Max: máx. m3 diff --git a/modules/zone/back/locale/zone-exclusion/en.yml b/modules/zone/back/locale/zone-exclusion/en.yml new file mode 100644 index 000000000..4389d8b93 --- /dev/null +++ b/modules/zone/back/locale/zone-exclusion/en.yml @@ -0,0 +1,5 @@ +name: zone exclusion +columns: + id: id + dated: dated + zoneFk: zone diff --git a/modules/zone/back/locale/zone-exclusion/es.yml b/modules/zone/back/locale/zone-exclusion/es.yml new file mode 100644 index 000000000..4e59cba46 --- /dev/null +++ b/modules/zone/back/locale/zone-exclusion/es.yml @@ -0,0 +1,5 @@ +name: zone exclusion +columns: + id: id + dated: fecha + zoneFk: zona diff --git a/modules/zone/back/locale/zone-included/en.yml b/modules/zone/back/locale/zone-included/en.yml new file mode 100644 index 000000000..0e44989e9 --- /dev/null +++ b/modules/zone/back/locale/zone-included/en.yml @@ -0,0 +1,5 @@ +name: zone included +columns: + id: id + dated: dated + zoneFk: zone diff --git a/modules/zone/back/locale/zone-included/es.yml b/modules/zone/back/locale/zone-included/es.yml new file mode 100644 index 000000000..30a89373a --- /dev/null +++ b/modules/zone/back/locale/zone-included/es.yml @@ -0,0 +1,5 @@ +name: zona incluida +columns: + id: id + dated: fecha + zoneFk: zona diff --git a/modules/zone/back/locale/zone-warehouse/en.yml b/modules/zone/back/locale/zone-warehouse/en.yml new file mode 100644 index 000000000..b9c4f7609 --- /dev/null +++ b/modules/zone/back/locale/zone-warehouse/en.yml @@ -0,0 +1,5 @@ +name: zone warehouse +columns: + id: id + warehouseFk: warehouse + zoneFk: zone diff --git a/modules/zone/back/locale/zone-warehouse/es.yml b/modules/zone/back/locale/zone-warehouse/es.yml new file mode 100644 index 000000000..ec8dec2dd --- /dev/null +++ b/modules/zone/back/locale/zone-warehouse/es.yml @@ -0,0 +1,5 @@ +name: almacén zona +columns: + id: id + warehouseFk: almacén + zoneFk: zona diff --git a/modules/zone/back/locale/zone/en.yml b/modules/zone/back/locale/zone/en.yml new file mode 100644 index 000000000..649631faa --- /dev/null +++ b/modules/zone/back/locale/zone/en.yml @@ -0,0 +1,14 @@ +name: zone +columns: + id: id + name: name + hour: hour + travelingDays: traveling days + price: price + bonus: bonus + isVolumetric: volumetric + inflation: inflation + m3Max: max m3 + itemMaxSize: item max size + agencyModeFk: agency + zoneFk: zone diff --git a/modules/zone/back/locale/zone/es.yml b/modules/zone/back/locale/zone/es.yml new file mode 100644 index 000000000..3534c2e12 --- /dev/null +++ b/modules/zone/back/locale/zone/es.yml @@ -0,0 +1,14 @@ +name: zona +columns: + id: id + name: nombre + hour: hora + travelingDays: días viaje + price: precio + bonus: bono + isVolumetric: volumétrico + inflation: inflación + m3Max: máx. m3 + itemMaxSize: tamaño máximo artículo + agencyModeFk: agencia + zoneFk: zona diff --git a/modules/zone/back/models/zone-log.json b/modules/zone/back/models/zone-log.json index e84153467..72dd305b2 100644 --- a/modules/zone/back/models/zone-log.json +++ b/modules/zone/back/models/zone-log.json @@ -1,6 +1,6 @@ { "name": "ZoneLog", - "base": "VnModel", + "base": "Log", "options": { "mysql": { "table": "zoneLog" @@ -50,7 +50,7 @@ "type": "belongsTo", "model": "VnUser", "foreignKey": "userFk" - } + } }, "scope": { "order": ["creationDate DESC", "id DESC"] diff --git a/print/templates/reports/entry-order/entry-order.html b/print/templates/reports/entry-order/entry-order.html index 5d362dea9..ddf0e9b5d 100644 --- a/print/templates/reports/entry-order/entry-order.html +++ b/print/templates/reports/entry-order/entry-order.html @@ -77,16 +77,6 @@
-
-
-
-
-

{{$t('notes')}}

-
{{entry.notes}}
-
-
-
-