Merge branch 'dev' into 5137-aviso-impresora
gitea/salix/pipeline/head This commit looks good
Details
gitea/salix/pipeline/head This commit looks good
Details
This commit is contained in:
commit
f72c162ca7
|
@ -30,6 +30,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- (Ticket -> Boxing) Arreglado selección de horas
|
- (Ticket -> Boxing) Arreglado selección de horas
|
||||||
|
- (Cesta -> Índice) Optimizada búsqueda
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
CREATE OR REPLACE
|
||||||
|
ALGORITHM = UNDEFINED VIEW `vn`.`zoneEstimatedDelivery` AS
|
||||||
|
select
|
||||||
|
`t`.`zoneFk` AS `zoneFk`,
|
||||||
|
cast(`util`.`VN_CURDATE`() + interval hour(ifnull(`zc`.`hour`, `z`.`hour`)) * 60 + minute(ifnull(`zc`.`hour`, `z`.`hour`)) minute as time) AS `hourTheoretical`,
|
||||||
|
cast(sum(`sv`.`volume`) as decimal(5, 1)) AS `totalVolume`,
|
||||||
|
cast(sum(if(`s`.`alertLevel` < 2, `sv`.`volume`, 0)) as decimal(5, 1)) AS `remainingVolume`,
|
||||||
|
greatest(
|
||||||
|
ifnull(`lhp`.`m3`, 0),
|
||||||
|
ifnull(`dl`.`minSpeed`, 0)
|
||||||
|
) AS `speed`,
|
||||||
|
cast(`zc`.`hour` + interval -sum(if(`s`.`alertLevel` < 2, `sv`.`volume`, 0)) * 60 / greatest(ifnull(`lhp`.`m3`, 0), ifnull(`dl`.`minSpeed`, 0)) minute as time) AS `hourEffective`,
|
||||||
|
floor(-sum(if(`s`.`alertLevel` < 2, `sv`.`volume`, 0)) * 60 / greatest(ifnull(`lhp`.`m3`, 0), ifnull(`dl`.`minSpeed`, 0))) AS `minutesLess`,
|
||||||
|
cast(`zc`.`hour` + interval -sum(if(`s`.`alertLevel` < 2, `sv`.`volume`, 0)) * 60 / greatest(ifnull(`lhp`.`m3`, 0), ifnull(`dl`.`minSpeed`, 0)) minute as time) AS `etc`
|
||||||
|
from
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(
|
||||||
|
`vn`.`ticket` `t`
|
||||||
|
join `vn`.`ticketStateToday` `tst` on
|
||||||
|
(
|
||||||
|
`tst`.`ticket` = `t`.`id`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
join `vn`.`state` `s` on
|
||||||
|
(
|
||||||
|
`s`.`id` = `tst`.`state`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
join `vn`.`saleVolume` `sv` on
|
||||||
|
(
|
||||||
|
`sv`.`ticketFk` = `t`.`id`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
left join `vn`.`lastHourProduction` `lhp` on
|
||||||
|
(
|
||||||
|
`lhp`.`warehouseFk` = `t`.`warehouseFk`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
join `vn`.`warehouse` `w` on
|
||||||
|
(
|
||||||
|
`w`.`id` = `t`.`warehouseFk`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
join `vn`.`warehouseAlias` `wa` on
|
||||||
|
(
|
||||||
|
`wa`.`id` = `w`.`aliasFk`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
straight_join `vn`.`zone` `z` on
|
||||||
|
(
|
||||||
|
`z`.`id` = `t`.`zoneFk`
|
||||||
|
)
|
||||||
|
)
|
||||||
|
left join `vn`.`zoneClosure` `zc` on
|
||||||
|
(
|
||||||
|
`zc`.`zoneFk` = `t`.`zoneFk`
|
||||||
|
and `zc`.`dated` = `util`.`VN_CURDATE`()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
left join `cache`.`departure_limit` `dl` on
|
||||||
|
(
|
||||||
|
`dl`.`warehouse_id` = `t`.`warehouseFk`
|
||||||
|
and `dl`.`fecha` = `util`.`VN_CURDATE`()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
where
|
||||||
|
`w`.`hasProduction` <> 0
|
||||||
|
and cast(`t`.`shipped` as date) = `util`.`VN_CURDATE`()
|
||||||
|
group by
|
||||||
|
`t`.`zoneFk`;
|
|
@ -1 +1 @@
|
||||||
ALTER TABLE `vn`.`ticketConfig` ADD daysForWarningClaim INT DEFAULT 2 NOT NULL COMMENT 'dias restantes hasta que salte el aviso de reclamación fuerade plazo';
|
ALTER TABLE `vn`.`ticketConfig` ADD daysForWarningClaim INT DEFAULT 2 NOT NULL COMMENT 'dias restantes hasta que salte el aviso de reclamación fuera de plazo';
|
|
@ -29,19 +29,16 @@ describe('Client Add greuge path', () => {
|
||||||
expect(message.text).toContain('Some fields are invalid');
|
expect(message.text).toContain('Some fields are invalid');
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should create a new greuge with all its data`, async() => {
|
it(`should create a new greuge with all its data and confirm the greuge was added to the list`, async() => {
|
||||||
await page.write(selectors.clientGreuge.amount, '999');
|
await page.write(selectors.clientGreuge.amount, '999');
|
||||||
await page.waitForTextInField(selectors.clientGreuge.amount, '999');
|
await page.waitForTextInField(selectors.clientGreuge.amount, '999');
|
||||||
await page.write(selectors.clientGreuge.description, 'new armor for Batman!');
|
await page.write(selectors.clientGreuge.description, 'new armor for Batman!');
|
||||||
await page.waitToClick(selectors.clientGreuge.saveButton);
|
await page.waitToClick(selectors.clientGreuge.saveButton);
|
||||||
const message = await page.waitForSnackbar();
|
const message = await page.waitForSnackbar();
|
||||||
|
|
||||||
expect(message.text).toContain('Data saved!');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should confirm the greuge was added to the list', async() => {
|
|
||||||
const result = await page.waitToGetProperty(selectors.clientGreuge.firstGreugeText, 'innerText');
|
const result = await page.waitToGetProperty(selectors.clientGreuge.firstGreugeText, 'innerText');
|
||||||
|
|
||||||
|
expect(message.text).toContain('Data saved!');
|
||||||
expect(result).toContain(999);
|
expect(result).toContain(999);
|
||||||
expect(result).toContain('new armor for Batman!');
|
expect(result).toContain('new armor for Batman!');
|
||||||
expect(result).toContain('Diff');
|
expect(result).toContain('Diff');
|
||||||
|
|
|
@ -139,7 +139,7 @@ export default class CrudModel extends ModelProxy {
|
||||||
filter.limit = this.page * this.limit;
|
filter.limit = this.page * this.limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.sendRequest(filter, append);
|
return this.sendRequest(filter, append, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
clear() {
|
clear() {
|
||||||
|
@ -231,12 +231,12 @@ export default class CrudModel extends ModelProxy {
|
||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
|
|
||||||
sendRequest(filter, append) {
|
sendRequest(filter, append, loadMore) {
|
||||||
this.cancelRequest();
|
this.cancelRequest();
|
||||||
this.canceler = this.$q.defer();
|
this.canceler = this.$q.defer();
|
||||||
this.isPaging = append;
|
this.isPaging = append;
|
||||||
|
|
||||||
if (!append && this.status != 'ready')
|
if (!loadMore)
|
||||||
this.status = 'loading';
|
this.status = 'loading';
|
||||||
|
|
||||||
let params = Object.assign(
|
let params = Object.assign(
|
||||||
|
|
|
@ -150,7 +150,7 @@ describe('Component vnCrudModel', () => {
|
||||||
|
|
||||||
controller.loadMore(true);
|
controller.loadMore(true);
|
||||||
|
|
||||||
expect(controller.sendRequest).toHaveBeenCalledWith({'skip': 2}, true);
|
expect(controller.sendRequest).toHaveBeenCalledWith({'skip': 2}, true, true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -8,18 +8,8 @@ export default class Th {
|
||||||
$element.on('click', () => this.onToggleOrder());
|
$element.on('click', () => this.onToggleOrder());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Changes the order if the cell has a field and defaultOrder property
|
|
||||||
*/
|
|
||||||
$onInit() {
|
$onInit() {
|
||||||
if (!this.field) return;
|
if (!this.field) return;
|
||||||
|
|
||||||
if (this.defaultOrder) {
|
|
||||||
this.order = this.defaultOrder;
|
|
||||||
this.table.applyOrder(this.field, this.order);
|
|
||||||
this.updateArrow();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.updateArrow();
|
this.updateArrow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,9 +72,6 @@ ngModule.vnComponent('vnTh', {
|
||||||
template: require('./index.html'),
|
template: require('./index.html'),
|
||||||
transclude: true,
|
transclude: true,
|
||||||
controller: Th,
|
controller: Th,
|
||||||
bindings: {
|
|
||||||
defaultOrder: '@?'
|
|
||||||
},
|
|
||||||
require: {
|
require: {
|
||||||
table: '^^vnTable'
|
table: '^^vnTable'
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,17 +17,6 @@ describe('Component vnTh', () => {
|
||||||
controller.column.setAttribute('field', 'MyField');
|
controller.column.setAttribute('field', 'MyField');
|
||||||
}));
|
}));
|
||||||
|
|
||||||
describe('onInit()', () => {
|
|
||||||
it(`should define controllers order as per defaultOrder then call setOrder()`, () => {
|
|
||||||
controller.defaultOrder = 'DESC';
|
|
||||||
jest.spyOn(controller.table, 'setOrder');
|
|
||||||
controller.$onInit();
|
|
||||||
|
|
||||||
expect(controller.order).toEqual('DESC');
|
|
||||||
expect(controller.table.setOrder).toHaveBeenCalledWith('MyField', 'DESC');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('toggleOrder()', () => {
|
describe('toggleOrder()', () => {
|
||||||
it(`should change the ordenation to DESC (descendant) if it was ASC (ascendant)`, () => {
|
it(`should change the ordenation to DESC (descendant) if it was ASC (ascendant)`, () => {
|
||||||
controller.order = 'ASC';
|
controller.order = 'ASC';
|
||||||
|
@ -61,7 +50,7 @@ describe('Component vnTh', () => {
|
||||||
expect(controller.updateArrow).not.toHaveBeenCalledWith();
|
expect(controller.updateArrow).not.toHaveBeenCalledWith();
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should call toggleOrder() method if field property and
|
it(`should call toggleOrder() method if field property and
|
||||||
table field property equals and then call updateArrow()`, () => {
|
table field property equals and then call updateArrow()`, () => {
|
||||||
controller.table.field = 'MyField';
|
controller.table.field = 'MyField';
|
||||||
jest.spyOn(controller, 'toggleOrder');
|
jest.spyOn(controller, 'toggleOrder');
|
||||||
|
@ -73,7 +62,7 @@ describe('Component vnTh', () => {
|
||||||
expect(controller.updateArrow).toHaveBeenCalledWith();
|
expect(controller.updateArrow).toHaveBeenCalledWith();
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should call setOrder() method if field property and
|
it(`should call setOrder() method if field property and
|
||||||
table field property doesn't equals and then call updateArrow()`, () => {
|
table field property doesn't equals and then call updateArrow()`, () => {
|
||||||
controller.table.field = 'MyField2';
|
controller.table.field = 'MyField2';
|
||||||
jest.spyOn(controller.table, 'setOrder');
|
jest.spyOn(controller.table, 'setOrder');
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
data="greuges"
|
data="greuges"
|
||||||
auto-load="true">
|
auto-load="true">
|
||||||
</vn-crud-model>
|
</vn-crud-model>
|
||||||
<mg-ajax
|
<mg-ajax
|
||||||
path="greuges/{{$ctrl.$params.id}}/sumAmount"
|
path="greuges/{{$ctrl.$params.id}}/sumAmount"
|
||||||
options="mgEdit">
|
options="mgEdit">
|
||||||
</mg-ajax>
|
</mg-ajax>
|
||||||
<vn-data-viewer
|
<vn-data-viewer
|
||||||
|
@ -19,7 +19,7 @@
|
||||||
style="text-align: right;"
|
style="text-align: right;"
|
||||||
class="vn-mb-md vn-pa-lg">
|
class="vn-mb-md vn-pa-lg">
|
||||||
<vn-label-value
|
<vn-label-value
|
||||||
label="Total"
|
label="Total"
|
||||||
value="{{edit.model.sumAmount | currency: 'EUR': 2}}">
|
value="{{edit.model.sumAmount | currency: 'EUR': 2}}">
|
||||||
</vn-label-value>
|
</vn-label-value>
|
||||||
</vn-card>
|
</vn-card>
|
||||||
|
@ -28,7 +28,7 @@
|
||||||
<vn-table model="model" auto-load="false">
|
<vn-table model="model" auto-load="false">
|
||||||
<vn-thead>
|
<vn-thead>
|
||||||
<vn-tr>
|
<vn-tr>
|
||||||
<vn-th field="shipped" default-order="DESC" expand>Date</vn-th>
|
<vn-th field="shipped" expand>Date</vn-th>
|
||||||
<vn-th field="userFk">Created by</vn-thfield></vn-th>
|
<vn-th field="userFk">Created by</vn-thfield></vn-th>
|
||||||
<vn-th field="description">Comment</vn-th>
|
<vn-th field="description">Comment</vn-th>
|
||||||
<vn-th field="greugeTypeFk">Type</vn-th>
|
<vn-th field="greugeTypeFk">Type</vn-th>
|
||||||
|
@ -53,11 +53,11 @@
|
||||||
</vn-data-viewer>
|
</vn-data-viewer>
|
||||||
<vn-float-button
|
<vn-float-button
|
||||||
icon="add"
|
icon="add"
|
||||||
ui-sref="client.card.greuge.create"
|
ui-sref="client.card.greuge.create"
|
||||||
vn-tooltip="New greuge"
|
vn-tooltip="New greuge"
|
||||||
vn-acl="salesAssistant,claimManager"
|
vn-acl="salesAssistant,claimManager"
|
||||||
vn-acl-action="remove"
|
vn-acl-action="remove"
|
||||||
vn-bind="+"
|
vn-bind="+"
|
||||||
fixed-bottom-right>
|
fixed-bottom-right>
|
||||||
</vn-float-button>
|
</vn-float-button>
|
||||||
<vn-worker-descriptor-popover vn-id="workerDescriptor"></vn-worker-descriptor-popover>
|
<vn-worker-descriptor-popover vn-id="workerDescriptor"></vn-worker-descriptor-popover>
|
||||||
|
|
|
@ -11,8 +11,7 @@ class Controller extends Section {
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'name']
|
fields: ['id', 'name']
|
||||||
},
|
},
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
relation: 'user',
|
relation: 'user',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'name']
|
fields: ['id', 'name']
|
||||||
|
@ -24,8 +23,6 @@ class Controller extends Section {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Controller.$inject = ['$element', '$scope'];
|
|
||||||
|
|
||||||
ngModule.vnComponent('vnClientGreugeIndex', {
|
ngModule.vnComponent('vnClientGreugeIndex', {
|
||||||
template: require('./index.html'),
|
template: require('./index.html'),
|
||||||
controller: Controller
|
controller: Controller
|
||||||
|
|
|
@ -141,7 +141,7 @@ module.exports = Self => {
|
||||||
let stmt;
|
let stmt;
|
||||||
|
|
||||||
stmt = new ParameterizedSQL(
|
stmt = new ParameterizedSQL(
|
||||||
`CREATE TEMPORARY TABLE tmp.filter
|
`CREATE OR REPLACE TEMPORARY TABLE tmp.filter
|
||||||
(INDEX (id))
|
(INDEX (id))
|
||||||
ENGINE = MEMORY
|
ENGINE = MEMORY
|
||||||
SELECT
|
SELECT
|
||||||
|
|
|
@ -12,11 +12,11 @@
|
||||||
<vn-data-viewer model="model" class="header vn-w-lg">
|
<vn-data-viewer model="model" class="header vn-w-lg">
|
||||||
<vn-card class="vn-pa-lg">
|
<vn-card class="vn-pa-lg">
|
||||||
<vn-label-value
|
<vn-label-value
|
||||||
label="Total"
|
label="Total"
|
||||||
value="{{::edit.model.totalVolume}} M³">
|
value="{{::edit.model.totalVolume}} M³">
|
||||||
</vn-label-value>
|
</vn-label-value>
|
||||||
<vn-label-value
|
<vn-label-value
|
||||||
label="Cajas"
|
label="Cajas"
|
||||||
value="{{::edit.model.totalBoxes | dashIfEmpty}} U">
|
value="{{::edit.model.totalBoxes | dashIfEmpty}} U">
|
||||||
</vn-label-value>
|
</vn-label-value>
|
||||||
</vn-card>
|
</vn-card>
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
<vn-table model="model">
|
<vn-table model="model">
|
||||||
<vn-thead>
|
<vn-thead>
|
||||||
<vn-tr>
|
<vn-tr>
|
||||||
<vn-th shrink field="itemFk" default-order="ASC" number>Item</vn-th>
|
<vn-th shrink field="itemFk" number>Item</vn-th>
|
||||||
<vn-th>Description</vn-th>
|
<vn-th>Description</vn-th>
|
||||||
<vn-th shrink field="quantity" number>Quantity</vn-th>
|
<vn-th shrink field="quantity" number>Quantity</vn-th>
|
||||||
<vn-th shrink number>m³ per quantity</vn-th>
|
<vn-th shrink number>m³ per quantity</vn-th>
|
||||||
|
|
|
@ -6,9 +6,10 @@ class Controller extends Section {
|
||||||
constructor($element, $) {
|
constructor($element, $) {
|
||||||
super($element, $);
|
super($element, $);
|
||||||
this.filter = {
|
this.filter = {
|
||||||
include: [{
|
include: {
|
||||||
relation: 'item'
|
relation: 'item'
|
||||||
}]
|
},
|
||||||
|
order: 'itemFk'
|
||||||
};
|
};
|
||||||
this.order = {};
|
this.order = {};
|
||||||
this.ticketVolumes = [];
|
this.ticketVolumes = [];
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
<vn-crud-model auto-load="false"
|
<vn-crud-model
|
||||||
|
auto-load="true"
|
||||||
vn-id="model"
|
vn-id="model"
|
||||||
url="sales"
|
url="sales"
|
||||||
filter="::$ctrl.filter"
|
filter="::$ctrl.filter"
|
||||||
|
@ -10,10 +11,10 @@
|
||||||
<vn-card class="vn-pa-lg">
|
<vn-card class="vn-pa-lg">
|
||||||
<vn-horizontal>
|
<vn-horizontal>
|
||||||
<div class="totalBox" ng-repeat="packingType in $ctrl.packingTypeVolume">
|
<div class="totalBox" ng-repeat="packingType in $ctrl.packingTypeVolume">
|
||||||
<vn-label-value label="Tipo"
|
<vn-label-value label="Tipo"
|
||||||
value="{{::packingType.description}}">
|
value="{{::packingType.description}}">
|
||||||
</vn-label-value>
|
</vn-label-value>
|
||||||
<vn-label-value label="Volumen"
|
<vn-label-value label="Volumen"
|
||||||
value="{{::packingType.volume}}">
|
value="{{::packingType.volume}}">
|
||||||
</vn-label-value>
|
</vn-label-value>
|
||||||
</div>
|
</div>
|
||||||
|
@ -23,7 +24,7 @@
|
||||||
<vn-thead>
|
<vn-thead>
|
||||||
<vn-tr>
|
<vn-tr>
|
||||||
<vn-th field="itemFk" number>Item</vn-th>
|
<vn-th field="itemFk" number>Item</vn-th>
|
||||||
<vn-th field="concept" default-order="ASC">Description</vn-th>
|
<vn-th field="concept">Description</vn-th>
|
||||||
<vn-th field="itemPackingTypeFk" number>Packing type</vn-th>
|
<vn-th field="itemPackingTypeFk" number>Packing type</vn-th>
|
||||||
<vn-th field="quantity" number>Quantity</vn-th>
|
<vn-th field="quantity" number>Quantity</vn-th>
|
||||||
<vn-th number>m³ per quantity</vn-th>
|
<vn-th number>m³ per quantity</vn-th>
|
||||||
|
|
|
@ -5,9 +5,10 @@ class Controller extends Section {
|
||||||
constructor($element, $) {
|
constructor($element, $) {
|
||||||
super($element, $);
|
super($element, $);
|
||||||
this.filter = {
|
this.filter = {
|
||||||
include: [{
|
include: {
|
||||||
relation: 'item'
|
relation: 'item'
|
||||||
}]
|
},
|
||||||
|
order: 'concept'
|
||||||
};
|
};
|
||||||
|
|
||||||
this.ticketVolumes = [];
|
this.ticketVolumes = [];
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
subject: Weekly time log
|
subject: Weekly time log
|
||||||
title: Record of hours week {0} year {1}
|
title: Record of hours week {0} year {1}
|
||||||
dear: Dear worker
|
dear: Dear worker
|
||||||
description: Access the following link:<br/><br/>
|
Acceda al siguiente enlace: Access the following link:<br/>
|
||||||
{0} <br/><br/>
|
description:
|
||||||
Click 'SATISFIED' if you agree with the hours worked. Otherwise, press 'NOT SATISFIED', detailing the cause of the disagreement.
|
Click 'SATISFIED' if you agree with the hours worked. Otherwise, press 'NOT SATISFIED', detailing the cause of the disagreement.
|
||||||
|
Hours: Hours
|
|
@ -1,6 +1,7 @@
|
||||||
subject: Registro de horas semanal
|
subject: Registro de horas semanal
|
||||||
title: Registro de horas semana {0} año {1}
|
title: Registro de horas semana {0} año {1}
|
||||||
dear: Estimado trabajador
|
dear: Estimado trabajador
|
||||||
description: Acceda al siguiente enlace:<br/><br/>
|
toaccess: Acceda al siguiente enlace:<br/>
|
||||||
{0} <br/><br/>
|
description:
|
||||||
Pulse 'CONFORME' si esta de acuerdo con las horas trabajadas. En caso contrario pulse 'NO CONFORME', detallando la causa de la disconformidad.
|
Pulse 'CONFORME' si esta de acuerdo con las horas trabajadas. En caso contrario pulse 'NO CONFORME', detallando la causa de la disconformidad.
|
||||||
|
Hours: Horas
|
|
@ -3,7 +3,9 @@
|
||||||
<div class="grid-block vn-pa-ml">
|
<div class="grid-block vn-pa-ml">
|
||||||
<h1>{{ $t('title', [week, year]) }}</h1>
|
<h1>{{ $t('title', [week, year]) }}</h1>
|
||||||
<p>{{$t('dear')}},</p>
|
<p>{{$t('dear')}},</p>
|
||||||
<p v-html="$t('description', [url])"></p>
|
<p v-html="$t('toaccess')"></p>
|
||||||
|
<a :href="url"><button>{{$t('Hours')}}</button></a>
|
||||||
|
<p>{{$t('description')}}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</email-body>
|
</email-body>
|
||||||
|
|
Loading…
Reference in New Issue