diff --git a/CHANGELOG.md b/CHANGELOG.md
index 91f332178..e64b0a400 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,21 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## [2318.01] - 2023-05-04
+## [2320.01] - 2023-05-25
+
+### Added
+- (Tickets -> Crear Factura) Al facturar se envia automáticamente el pdf al cliente
+
+
+### Changed
+- (Trabajadores -> Nuevo trabajador) Los clientes se crean sin 'TR' pero se añade tipo de negocio 'Trabajador'
+
+### Fixed
+-
+
+
+
+## [2318.01] - 2023-05-08
### Added
- (Usuarios -> Histórico) Nueva sección
diff --git a/back/tests.js b/back/tests.js
index a377011d3..97e548d33 100644
--- a/back/tests.js
+++ b/back/tests.js
@@ -34,6 +34,8 @@ async function test() {
app.boot(bootOptions,
err => err ? reject(err) : resolve());
});
+ // FIXME: Workaround to wait for loopback to be ready
+ await app.models.Application.status();
const Jasmine = require('jasmine');
const jasmine = new Jasmine();
diff --git a/db/changes/232001/.gitkeep b/db/changes/232001/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/db/changes/232001/00-clientWorkerName.sql b/db/changes/232001/00-clientWorkerName.sql
new file mode 100644
index 000000000..676d26691
--- /dev/null
+++ b/db/changes/232001/00-clientWorkerName.sql
@@ -0,0 +1,73 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`clientCreate`(
+ vFirstname VARCHAR(50),
+ vSurnames VARCHAR(50),
+ vFi VARCHAR(9),
+ vAddress TEXT,
+ vPostcode CHAR(5),
+ vCity VARCHAR(25),
+ vProvinceFk SMALLINT(5),
+ vCompanyFk SMALLINT(5),
+ vPhone VARCHAR(11),
+ vEmail VARCHAR(255),
+ vUserFk INT)
+BEGIN
+/**
+ * Create new client
+ *
+ */
+ DECLARE vPayMethodFk INT DEFAULT 4;
+ DECLARE vDueDay INT DEFAULT 5;
+ DECLARE vDefaultCredit DECIMAL(10, 2) DEFAULT 300.00;
+ DECLARE vIsTaxDataChecked TINYINT(1) DEFAULT 1;
+ DECLARE vHasCoreVnl BOOLEAN DEFAULT TRUE;
+ DECLARE vMandateTypeFk INT DEFAULT 2;
+
+ INSERT INTO `client` (
+ id,
+ name,
+ street,
+ fi,
+ phone,
+ email,
+ provinceFk,
+ city,
+ postcode,
+ socialName,
+ payMethodFk,
+ dueDay,
+ credit,
+ isTaxDataChecked,
+ hasCoreVnl,
+ isEqualizated)
+ VALUES (
+ vUserFk,
+ CONCAT(vFirstname, ' ', vSurnames),
+ vAddress,
+ TRIM(vFi),
+ vPhone,
+ vEmail,
+ vProvinceFk,
+ vCity,
+ vPostcode,
+ CONCAT(vSurnames, ' ', vFirstname),
+ vPayMethodFk,
+ vDueDay,
+ vDefaultCredit,
+ vIsTaxDataChecked,
+ vHasCoreVnl,
+ FALSE
+ ) ON duplicate key update
+ payMethodFk = vPayMethodFk,
+ dueDay = vDueDay,
+ credit = vDefaultCredit,
+ isTaxDataChecked = vIsTaxDataChecked,
+ hasCoreVnl = vHasCoreVnl,
+ isActive = TRUE;
+
+ IF (SELECT COUNT(*) FROM mandate WHERE clientFk = vUserFk AND companyFk = vCompanyFk AND mandateTypeFk = vMandateTypeFk) = 0 THEN
+ INSERT INTO mandate (clientFk, companyFk, mandateTypeFk)
+ VALUES (vUserFk, vCompanyFk, vMandateTypeFk);
+ END IF;
+END$$
+DELIMITER ;
\ No newline at end of file
diff --git a/db/changes/232001/00-createWorker.sql b/db/changes/232001/00-createWorker.sql
new file mode 100644
index 000000000..0ea7ecbe8
--- /dev/null
+++ b/db/changes/232001/00-createWorker.sql
@@ -0,0 +1,14 @@
+INSERT INTO `vn`.`businessType` (`code`, `description`)
+ VALUES ('worker','Trabajador');
+
+ALTER TABLE `vn`.`workerConfig` ADD businessTypeFk varchar(100) NULL
+ COMMENT 'Tipo de negocio por defecto al dar de alta un trabajador nuevo';
+
+UPDATE `vn`.`workerConfig`
+ SET businessTypeFk = 'worker'
+ WHERE id = 1;
+
+ UPDATE `vn`.`client` c
+ JOIN `vn`.`worker` w ON w.id = c.id
+ SET c.name = REPLACE(c.name, 'TR ', ''),
+ c.businessTypeFk = 'worker';
diff --git a/db/changes/232001/00-invoiceOut_new.sql b/db/changes/232001/00-invoiceOut_new.sql
new file mode 100644
index 000000000..b4fc5c824
--- /dev/null
+++ b/db/changes/232001/00-invoiceOut_new.sql
@@ -0,0 +1,254 @@
+DROP PROCEDURE IF EXISTS `vn`.`invoiceOut_new`;
+
+DELIMITER $$
+$$
+CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`invoiceOut_new`(
+ vSerial VARCHAR(255),
+ vInvoiceDate DATE,
+ vTaxArea VARCHAR(25),
+ OUT vNewInvoiceId INT)
+BEGIN
+/**
+ * Creación de facturas emitidas.
+ * requiere previamente tabla tmp.ticketToInvoice(id).
+ *
+ * @param vSerial serie a la cual se hace la factura
+ * @param vInvoiceDate fecha de la factura
+ * @param vTaxArea tipo de iva en relacion a la empresa y al cliente
+ * @param vNewInvoiceId id de la factura que se acaba de generar
+ * @return vNewInvoiceId
+ */
+ DECLARE vIsAnySaleToInvoice BOOL;
+ DECLARE vIsAnyServiceToInvoice BOOL;
+ DECLARE vNewRef VARCHAR(255);
+ DECLARE vWorker INT DEFAULT account.myUser_getId();
+ DECLARE vCompanyFk INT;
+ DECLARE vInterCompanyFk INT;
+ DECLARE vClientFk INT;
+ DECLARE vCplusStandardInvoiceTypeFk INT DEFAULT 1;
+ DECLARE vCplusCorrectingInvoiceTypeFk INT DEFAULT 6;
+ DECLARE vCplusSimplifiedInvoiceTypeFk INT DEFAULT 2;
+ DECLARE vCorrectingSerial VARCHAR(1) DEFAULT 'R';
+ DECLARE vSimplifiedSerial VARCHAR(1) DEFAULT 'S';
+ DECLARE vNewInvoiceInFk INT;
+ DECLARE vIsInterCompany BOOL DEFAULT FALSE;
+ DECLARE vIsCEESerial BOOL DEFAULT FALSE;
+ DECLARE vIsCorrectInvoiceDate BOOL;
+ DECLARE vMaxShipped DATE;
+
+ SET vInvoiceDate = IFNULL(vInvoiceDate, util.VN_CURDATE());
+
+ SELECT t.clientFk,
+ t.companyFk,
+ MAX(DATE(t.shipped)),
+ DATE(vInvoiceDate) >= invoiceOut_getMaxIssued(
+ vSerial,
+ t.companyFk,
+ YEAR(vInvoiceDate))
+ INTO vClientFk,
+ vCompanyFk,
+ vMaxShipped,
+ vIsCorrectInvoiceDate
+ FROM tmp.ticketToInvoice tt
+ JOIN ticket t ON t.id = tt.id;
+
+ IF(vMaxShipped > vInvoiceDate) THEN
+ CALL util.throw("Invoice date can't be less than max date");
+ END IF;
+
+ IF NOT vIsCorrectInvoiceDate THEN
+ CALL util.throw('Exists an invoice with a previous date');
+ END IF;
+
+ -- Eliminem de tmp.ticketToInvoice els tickets que no han de ser facturats
+ DELETE ti.*
+ FROM tmp.ticketToInvoice ti
+ JOIN ticket t ON t.id = ti.id
+ JOIN sale s ON s.ticketFk = t.id
+ JOIN item i ON i.id = s.itemFk
+ JOIN supplier su ON su.id = t.companyFk
+ JOIN client c ON c.id = t.clientFk
+ LEFT JOIN itemTaxCountry itc ON itc.itemFk = i.id AND itc.countryFk = su.countryFk
+ WHERE (YEAR(t.shipped) < 2001 AND t.isDeleted)
+ OR c.isTaxDataChecked = FALSE
+ OR t.isDeleted
+ OR c.hasToInvoice = FALSE
+ OR itc.id IS NULL;
+
+ SELECT SUM(s.quantity * s.price * (100 - s.discount)/100) <> 0
+ INTO vIsAnySaleToInvoice
+ FROM tmp.ticketToInvoice t
+ JOIN sale s ON s.ticketFk = t.id;
+
+ SELECT COUNT(*) > 0 INTO vIsAnyServiceToInvoice
+ FROM tmp.ticketToInvoice t
+ JOIN ticketService ts ON ts.ticketFk = t.id;
+
+ IF (vIsAnySaleToInvoice OR vIsAnyServiceToInvoice)
+ AND (vCorrectingSerial = vSerial OR NOT hasAnyNegativeBase())
+ THEN
+
+ -- el trigger añade el siguiente Id_Factura correspondiente a la vSerial
+ INSERT INTO invoiceOut(
+ ref,
+ serial,
+ issued,
+ clientFk,
+ dued,
+ companyFk,
+ cplusInvoiceType477Fk
+ )
+ SELECT
+ 1,
+ vSerial,
+ vInvoiceDate,
+ vClientFk,
+ getDueDate(vInvoiceDate, dueDay),
+ vCompanyFk,
+ IF(vSerial = vCorrectingSerial,
+ vCplusCorrectingInvoiceTypeFk,
+ IF(vSerial = vSimplifiedSerial,
+ vCplusSimplifiedInvoiceTypeFk,
+ vCplusStandardInvoiceTypeFk))
+ FROM client
+ WHERE id = vClientFk;
+
+ SET vNewInvoiceId = LAST_INSERT_ID();
+
+ SELECT `ref`
+ INTO vNewRef
+ FROM invoiceOut
+ WHERE id = vNewInvoiceId;
+
+ UPDATE ticket t
+ JOIN tmp.ticketToInvoice ti ON ti.id = t.id
+ SET t.refFk = vNewRef;
+
+ DROP TEMPORARY TABLE IF EXISTS tmp.updateInter;
+ CREATE TEMPORARY TABLE tmp.updateInter ENGINE = MEMORY
+ SELECT s.id,ti.id ticket_id,vWorker Id_Trabajador
+ FROM tmp.ticketToInvoice ti
+ LEFT JOIN ticketState ts ON ti.id = ts.ticket
+ JOIN state s
+ WHERE IFNULL(ts.alertLevel,0) < 3 and s.`code` = getAlert3State(ti.id);
+
+ INSERT INTO ticketTracking(stateFk,ticketFk,workerFk)
+ SELECT * FROM tmp.updateInter;
+
+ CALL invoiceExpenceMake(vNewInvoiceId);
+ CALL invoiceTaxMake(vNewInvoiceId,vTaxArea);
+
+ UPDATE invoiceOut io
+ JOIN (
+ SELECT SUM(amount) total
+ FROM invoiceOutExpence
+ WHERE invoiceOutFk = vNewInvoiceId
+ ) base
+ JOIN (
+ SELECT SUM(vat) total
+ FROM invoiceOutTax
+ WHERE invoiceOutFk = vNewInvoiceId
+ ) vat
+ SET io.amount = base.total + vat.total
+ WHERE io.id = vNewInvoiceId;
+
+ DROP TEMPORARY TABLE tmp.updateInter;
+
+ SELECT COUNT(*), id
+ INTO vIsInterCompany, vInterCompanyFk
+ FROM company
+ WHERE clientFk = vClientFk;
+
+ IF (vIsInterCompany) THEN
+
+ INSERT INTO invoiceIn(supplierFk, supplierRef, issued, companyFk)
+ SELECT vCompanyFk, vNewRef, vInvoiceDate, vInterCompanyFk;
+
+ SET vNewInvoiceInFk = LAST_INSERT_ID();
+
+ DROP TEMPORARY TABLE IF EXISTS tmp.ticket;
+ CREATE TEMPORARY TABLE tmp.ticket
+ (KEY (ticketFk))
+ ENGINE = MEMORY
+ SELECT id ticketFk
+ FROM tmp.ticketToInvoice;
+
+ CALL `ticket_getTax`('NATIONAL');
+
+ SET @vTaxableBaseServices := 0.00;
+ SET @vTaxCodeGeneral := NULL;
+
+ INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenceFk, taxTypeSageFk, transactionTypeSageFk)
+ SELECT vNewInvoiceInFk,
+ @vTaxableBaseServices,
+ sub.expenceFk,
+ sub.taxTypeSageFk,
+ sub.transactionTypeSageFk
+ FROM (
+ SELECT @vTaxableBaseServices := SUM(tst.taxableBase) taxableBase,
+ i.expenceFk,
+ i.taxTypeSageFk,
+ i.transactionTypeSageFk,
+ @vTaxCodeGeneral := i.taxClassCodeFk
+ FROM tmp.ticketServiceTax tst
+ JOIN invoiceOutTaxConfig i ON i.taxClassCodeFk = tst.code
+ WHERE i.isService
+ HAVING taxableBase
+ ) sub;
+
+ INSERT INTO invoiceInTax(invoiceInFk, taxableBase, expenceFk, taxTypeSageFk, transactionTypeSageFk)
+ SELECT vNewInvoiceInFk,
+ SUM(tt.taxableBase) - IF(tt.code = @vTaxCodeGeneral,
+ @vTaxableBaseServices, 0) taxableBase,
+ i.expenceFk,
+ i.taxTypeSageFk ,
+ i.transactionTypeSageFk
+ FROM tmp.ticketTax tt
+ JOIN invoiceOutTaxConfig i ON i.taxClassCodeFk = tt.code
+ WHERE !i.isService
+ GROUP BY tt.pgcFk
+ HAVING taxableBase
+ ORDER BY tt.priority;
+
+ CALL invoiceInDueDay_calculate(vNewInvoiceInFk);
+
+ SELECT COUNT(*) INTO vIsCEESerial
+ FROM invoiceOutSerial
+ WHERE code = vSerial;
+
+ IF vIsCEESerial THEN
+
+ INSERT INTO invoiceInIntrastat (
+ invoiceInFk,
+ intrastatFk,
+ amount,
+ stems,
+ countryFk,
+ net)
+ SELECT
+ vNewInvoiceInFk,
+ i.intrastatFk,
+ SUM(CAST((s.quantity * s.price * (100 - s.discount) / 100 ) AS DECIMAL(10, 2))),
+ SUM(CAST(IFNULL(i.stems, 1) * s.quantity AS DECIMAL(10, 2))),
+ su.countryFk,
+ CAST(SUM(IFNULL(i.stems, 1)
+ * s.quantity
+ * IF(ic.grams, ic.grams, IFNULL(i.weightByPiece, 0)) / 1000) AS DECIMAL(10, 2))
+ FROM sale s
+ JOIN ticket t ON s.ticketFk = t.id
+ JOIN supplier su ON su.id = t.companyFk
+ JOIN item i ON i.id = s.itemFk
+ LEFT JOIN itemCost ic ON ic.itemFk = i.id AND ic.warehouseFk = t.warehouseFk
+ WHERE t.refFk = vNewRef
+ GROUP BY i.intrastatFk;
+
+ END IF;
+ DROP TEMPORARY TABLE tmp.ticket;
+ DROP TEMPORARY TABLE tmp.ticketAmount;
+ DROP TEMPORARY TABLE tmp.ticketTax;
+ DROP TEMPORARY TABLE tmp.ticketServiceTax;
+ END IF;
+ END IF;
+ DROP TEMPORARY TABLE `tmp`.`ticketToInvoice`;
+END$$
+DELIMITER ;
diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql
index e69974d08..1dc608e05 100644
--- a/db/dump/fixtures.sql
+++ b/db/dump/fixtures.sql
@@ -2801,9 +2801,9 @@ INSERT INTO `vn`.`payDemDetail` (`id`, `detail`)
VALUES
(1, 1);
-INSERT INTO `vn`.`workerConfig` (`id`, `businessUpdated`, `roleFk`)
+INSERT INTO `vn`.`workerConfig` (`id`, `businessUpdated`, `roleFk`, `businessTypeFk`)
VALUES
- (1, NULL, 1);
+ (1, NULL, 1, 'worker');
INSERT INTO `vn`.`ticketRefund`(`refundTicketFk`, `originalTicketFk`)
VALUES
diff --git a/modules/client/back/methods/client/summary.js b/modules/client/back/methods/client/summary.js
index caa3d8033..7dab1f68b 100644
--- a/modules/client/back/methods/client/summary.js
+++ b/modules/client/back/methods/client/summary.js
@@ -27,7 +27,6 @@ module.exports = Self => {
Object.assign(myOptions, options);
const summaryObj = await getSummary(models.Client, clientFk, myOptions);
-
summaryObj.mana = await models.Client.getMana(clientFk, myOptions);
summaryObj.debt = await models.Client.getDebt(clientFk, myOptions);
summaryObj.averageInvoiced = await models.Client.getAverageInvoiced(clientFk, myOptions);
@@ -115,6 +114,12 @@ module.exports = Self => {
fields: ['claimingRate', 'priceIncreasing'],
limit: 1
}
+ },
+ {
+ relation: 'businessType',
+ scope: {
+ fields: ['description']
+ }
}
],
where: {id: clientId}
diff --git a/modules/client/front/summary/index.html b/modules/client/front/summary/index.html
index 1b58d42cc..a0d4b918a 100644
--- a/modules/client/front/summary/index.html
+++ b/modules/client/front/summary/index.html
@@ -64,6 +64,9 @@
+
+
diff --git a/modules/client/front/summary/locale/es.yml b/modules/client/front/summary/locale/es.yml
index ca6e96fef..c1fde0c17 100644
--- a/modules/client/front/summary/locale/es.yml
+++ b/modules/client/front/summary/locale/es.yml
@@ -23,3 +23,4 @@ Latest tickets: Últimos tickets
Rating: Clasificación
Value from 1 to 20. The higher the better value: Valor del 1 al 20. Cuanto más alto mejor valoración
Go to grafana: Ir a grafana
+Business type: Tipo de negocio
\ No newline at end of file
diff --git a/modules/ticket/back/methods/ticket/makeInvoice.js b/modules/ticket/back/methods/ticket/makeInvoice.js
index bd899ef7b..d8ec5eb9a 100644
--- a/modules/ticket/back/methods/ticket/makeInvoice.js
+++ b/modules/ticket/back/methods/ticket/makeInvoice.js
@@ -24,7 +24,6 @@ module.exports = function(Self) {
});
Self.makeInvoice = async(ctx, ticketsIds, options) => {
- const userId = ctx.req.accessToken.userId;
const models = Self.app.models;
const date = Date.vnNew();
date.setHours(0, 0, 0, 0);
@@ -42,6 +41,7 @@ module.exports = function(Self) {
let serial;
let invoiceId;
+ let invoiceOut;
try {
const tickets = await models.Ticket.find({
where: {
@@ -89,24 +89,14 @@ module.exports = function(Self) {
invoiceId = resultInvoice.id;
- for (let ticket of tickets) {
- const ticketInvoice = await models.Ticket.findById(ticket.id, {
- fields: ['refFk']
- }, myOptions);
-
- await models.TicketLog.create({
- originFk: ticket.id,
- userFk: userId,
- action: 'insert',
- changedModel: 'Ticket',
- changedModelId: ticket.id,
- newInstance: ticketInvoice
- }, myOptions);
- }
-
if (serial != 'R' && invoiceId)
await Self.rawSql('CALL invoiceOutBooking(?)', [invoiceId], myOptions);
+ invoiceOut = await models.InvoiceOut.findById(invoiceId, {
+ include: {
+ relation: 'client'
+ }
+ }, myOptions);
if (tx) await tx.commit();
} catch (e) {
if (tx) await tx.rollback();
@@ -116,6 +106,15 @@ module.exports = function(Self) {
if (serial != 'R' && invoiceId)
await models.InvoiceOut.createPdf(ctx, invoiceId);
+ if (invoiceId) {
+ ctx.args = {
+ reference: invoiceOut.ref,
+ recipientId: invoiceOut.clientFk,
+ recipient: invoiceOut.client().email
+ };
+ await models.InvoiceOut.invoiceEmail(ctx, invoiceOut.ref);
+ }
+
return {invoiceFk: invoiceId, serial: serial};
};
};
diff --git a/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js b/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js
index 24d4a48ba..270ba5c93 100644
--- a/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js
+++ b/modules/ticket/back/methods/ticket/specs/makeInvoice.spec.js
@@ -6,6 +6,9 @@ describe('ticket makeInvoice()', () => {
const ticketId = 11;
const clientId = 1102;
const activeCtx = {
+ getLocale: () => {
+ return 'en';
+ },
accessToken: {userId: userId},
headers: {origin: 'http://localhost:5000'},
};
@@ -67,6 +70,7 @@ describe('ticket makeInvoice()', () => {
it('should invoice a ticket, then try again to fail', async() => {
const invoiceOutModel = models.InvoiceOut;
spyOn(invoiceOutModel, 'createPdf');
+ spyOn(invoiceOutModel, 'invoiceEmail');
const tx = await models.Ticket.beginTransaction({});
@@ -90,6 +94,7 @@ describe('ticket makeInvoice()', () => {
it('should success to invoice a ticket', async() => {
const invoiceOutModel = models.InvoiceOut;
spyOn(invoiceOutModel, 'createPdf');
+ spyOn(invoiceOutModel, 'invoiceEmail');
const tx = await models.Ticket.beginTransaction({});
diff --git a/modules/worker/back/methods/worker/new.js b/modules/worker/back/methods/worker/new.js
index 5ff7135a7..cec7524c6 100644
--- a/modules/worker/back/methods/worker/new.js
+++ b/modules/worker/back/methods/worker/new.js
@@ -1,4 +1,4 @@
-/* eslint max-len: ["error", { "code": 130 }]*/
+/* eslint max-len: ["error", { "code": 150 }]*/
const UserError = require('vn-loopback/util/user-error');
module.exports = Self => {
@@ -139,7 +139,7 @@ module.exports = Self => {
if (!client) {
const nickname = args.firstName.concat(' ', args.lastNames);
- const workerConfig = await models.WorkerConfig.findOne({fields: ['roleFk']});
+ const workerConfig = await models.WorkerConfig.findOne({fields: ['roleFk', 'businessTypeFk']});
const [randomPassword] = await models.Worker.rawSql(
'SELECT account.passwordGenerate() as password;'
);
@@ -196,7 +196,7 @@ module.exports = Self => {
client = await models.Client.findById(
user.id,
- {fields: ['id', 'name', 'socialName', 'street', 'city', 'iban', 'bankEntityFk', 'defaultAddressFk', 'fi']},
+ {fields: ['id', 'name', 'socialName', 'street', 'city', 'iban', 'bankEntityFk', 'defaultAddressFk', 'businessTypeFk', 'fi']},
myOptions
);
@@ -205,6 +205,7 @@ module.exports = Self => {
iban: args.iban,
bankEntityFk: args.bankEntityFk,
defaultAddressFk: address.id,
+ businessTypeFk: workerConfig.businessTypeFk,
},
myOptions
);
diff --git a/modules/worker/back/models/worker-config.json b/modules/worker/back/models/worker-config.json
index 05cdfef42..bcee74067 100644
--- a/modules/worker/back/models/worker-config.json
+++ b/modules/worker/back/models/worker-config.json
@@ -14,6 +14,9 @@
},
"roleFk": {
"type": "number"
+ },
+ "businessTypeFk": {
+ "type": "string"
}
},
"acls": [
diff --git a/package.json b/package.json
index fee164f44..4b4f552ac 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "salix-back",
- "version": "23.18.01",
+ "version": "23.20.01",
"author": "Verdnatura Levante SL",
"description": "Salix backend",
"license": "GPL-3.0",
diff --git a/print/templates/email/weekly-hour-record/locale/en.yml b/print/templates/email/weekly-hour-record/locale/en.yml
index 817e5451e..b76372fb9 100644
--- a/print/templates/email/weekly-hour-record/locale/en.yml
+++ b/print/templates/email/weekly-hour-record/locale/en.yml
@@ -1,6 +1,7 @@
subject: Weekly time log
title: Record of hours week {0} year {1}
dear: Dear worker
-description: Access the following link:
- {0}
+Acceda al siguiente enlace: Access the following link:
+description:
Click 'SATISFIED' if you agree with the hours worked. Otherwise, press 'NOT SATISFIED', detailing the cause of the disagreement.
+Hours: Hours
\ No newline at end of file
diff --git a/print/templates/email/weekly-hour-record/locale/es.yml b/print/templates/email/weekly-hour-record/locale/es.yml
index b70862f16..95466addb 100644
--- a/print/templates/email/weekly-hour-record/locale/es.yml
+++ b/print/templates/email/weekly-hour-record/locale/es.yml
@@ -1,6 +1,7 @@
subject: Registro de horas semanal
title: Registro de horas semana {0} año {1}
dear: Estimado trabajador
-description: Acceda al siguiente enlace:
- {0}
+toaccess: Acceda al siguiente enlace:
+description:
Pulse 'CONFORME' si esta de acuerdo con las horas trabajadas. En caso contrario pulse 'NO CONFORME', detallando la causa de la disconformidad.
+Hours: Horas
\ No newline at end of file
diff --git a/print/templates/email/weekly-hour-record/weekly-hour-record.html b/print/templates/email/weekly-hour-record/weekly-hour-record.html
index 84abb4c61..b1eb4e0b3 100644
--- a/print/templates/email/weekly-hour-record/weekly-hour-record.html
+++ b/print/templates/email/weekly-hour-record/weekly-hour-record.html
@@ -3,7 +3,9 @@
{{ $t('title', [week, year]) }}
{{$t('dear')}},
-
+
+
{{$t('Hours')}}
+
{{$t('description')}}