diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql
index d0d215900..36fcc00d4 100644
--- a/db/dump/fixtures.sql
+++ b/db/dump/fixtures.sql
@@ -2348,4 +2348,25 @@ INSERT INTO `vn`.`zoneAgencyMode`(`id`, `agencyModeFk`, `zoneFk`)
(1, 1, 1),
(2, 1, 2),
(3, 6, 5),
- (4, 7, 1);
\ No newline at end of file
+ (4, 7, 1);
+
+INSERT INTO `vn`.`expeditionTruck` (`id`, `ETD`, `description`)
+ VALUES
+ (1, CONCAT(YEAR(DATE_ADD(CURDATE(), INTERVAL +3 YEAR))), 'Best truck in fleet');
+
+INSERT INTO `vn`.`expeditionPallet` (`id`, `truckFk`, `built`, `position`, `isPrint`)
+ VALUES
+ (1, 1, CURDATE(), 1, 1);
+
+INSERT INTO `vn`.`expeditionScan` (`id`, `expeditionFk`, `scanned`, `palletFk`)
+ VALUES
+ (1, 1, CURDATE(), 1),
+ (2, 2, CURDATE(), 1),
+ (3, 3, CURDATE(), 1),
+ (4, 4, CURDATE(), 1),
+ (5, 5, CURDATE(), 1),
+ (6, 6, CURDATE(), 1),
+ (7, 7, CURDATE(), 1),
+ (8, 8, CURDATE(), 1),
+ (9, 9, CURDATE(), 1),
+ (10, 10, CURDATE(), 1);
\ No newline at end of file
diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js
index 5060a8921..850a8c3fb 100644
--- a/e2e/helpers/selectors.js
+++ b/e2e/helpers/selectors.js
@@ -474,7 +474,7 @@ export default {
advancedSearchDaysOnward: 'vn-ticket-search-panel vn-input-number[ng-model="filter.scopeDays"]',
advancedSearchClient: 'vn-ticket-search-panel vn-textfield[ng-model="filter.clientFk"]',
advancedSearchButton: 'vn-ticket-search-panel button[type=submit]',
- newTicketButton: 'vn-ticket-index a[ui-sref="ticket.create"]',
+ newTicketButton: 'vn-ticket-index vn-button[icon="add"]',
searchResult: 'vn-ticket-index vn-card > vn-table > div > vn-tbody > a.vn-tr',
firstTicketCheckbox: 'vn-ticket-index vn-tbody > a:nth-child(1) > vn-td:nth-child(1) > vn-check',
secondTicketCheckbox: 'vn-ticket-index vn-tbody > a:nth-child(2) > vn-td:nth-child(1) > vn-check',
@@ -888,7 +888,7 @@ export default {
},
workerCalendar: {
year: 'vn-worker-calendar vn-autocomplete[ng-model="$ctrl.year"]',
- totalHolidaysUsed: 'vn-worker-calendar div.totalBox > div',
+ totalHolidaysUsed: 'vn-worker-calendar div.totalBox:first-child > div',
penultimateMondayOfJanuary: 'vn-worker-calendar vn-calendar:nth-child(2) section:nth-child(22) > div',
lastMondayOfMarch: 'vn-worker-calendar vn-calendar:nth-child(4) section:nth-child(29) > div',
fistMondayOfMay: 'vn-worker-calendar vn-calendar:nth-child(6) section:nth-child(8) > div',
@@ -896,11 +896,11 @@ export default {
secondTuesdayOfMay: 'vn-worker-calendar vn-calendar:nth-child(6) section:nth-child(16) > div',
secondWednesdayOfMay: 'vn-worker-calendar vn-calendar:nth-child(6) section:nth-child(17) > div',
secondThursdayOfMay: 'vn-worker-calendar vn-calendar:nth-child(6) section:nth-child(18) > div',
- holidays: 'vn-worker-calendar > vn-side-menu div:nth-child(3) > vn-chip:nth-child(1)',
- absence: 'vn-worker-calendar > vn-side-menu div:nth-child(3) > vn-chip:nth-child(2)',
- halfHoliday: 'vn-worker-calendar > vn-side-menu div:nth-child(3) > vn-chip:nth-child(3)',
- furlough: 'vn-worker-calendar > vn-side-menu div:nth-child(3) > vn-chip:nth-child(4)',
- halfFurlough: 'vn-worker-calendar > vn-side-menu div:nth-child(3) > vn-chip:nth-child(5)',
+ holidays: 'vn-worker-calendar > vn-side-menu [name="absenceTypes"] > vn-chip:nth-child(1)',
+ absence: 'vn-worker-calendar > vn-side-menu [name="absenceTypes"] > vn-chip:nth-child(2)',
+ halfHoliday: 'vn-worker-calendar > vn-side-menu [name="absenceTypes"] > vn-chip:nth-child(3)',
+ furlough: 'vn-worker-calendar > vn-side-menu [name="absenceTypes"] > vn-chip:nth-child(4)',
+ halfFurlough: 'vn-worker-calendar > vn-side-menu [name="absenceTypes"] > vn-chip:nth-child(5)',
},
invoiceOutIndex: {
topbarSearch: 'vn-searchbar',
diff --git a/e2e/paths/10-travel/01_create.spec.js b/e2e/paths/10-travel/01_create.spec.js
index 6f5956377..e5d812ebd 100644
--- a/e2e/paths/10-travel/01_create.spec.js
+++ b/e2e/paths/10-travel/01_create.spec.js
@@ -26,7 +26,8 @@ describe('Travel create path', () => {
it('should fill the reference, agency and ship date then save the form', async() => {
await page.write(selectors.travelIndex.reference, 'Testing reference');
await page.autocompleteSearch(selectors.travelIndex.agency, 'inhouse pickup');
- await page.pickDate(selectors.travelIndex.shipDate, date);
+ await page.pickDate(selectors.travelIndex.shipDate, date); // this line autocompletes another 3 fields
+ await page.waitForTimeout(1000);
await page.waitToClick(selectors.travelIndex.save);
const message = await page.waitForSnackbar();
@@ -35,8 +36,6 @@ describe('Travel create path', () => {
});
it('should check the user was redirected to the travel basic data upon creation', async() => {
- // backup code for further intermitences still on track.
- // await page.screenshot({path: 'e2e/paths/10-travel/error.jpeg', type: 'jpeg'});
await page.waitForState('travel.card.basicData');
});
diff --git a/front/core/components/autocomplete/index.js b/front/core/components/autocomplete/index.js
index 56b30667e..52491f7e0 100755
--- a/front/core/components/autocomplete/index.js
+++ b/front/core/components/autocomplete/index.js
@@ -11,7 +11,7 @@ import './style.scss';
* @property {String} valueField The data field name that should be used as value
* @property {Array} data Static data for the autocomplete
* @property {Object} intialData An initial data to avoid the server request used to get the selection
- * @property {Boolean} multiple Wether to allow multiple selection
+ * @property {Boolean} multiple Whether to allow multiple selection
* @property {Object} selection Current object selected
*
* @event change Thrown when value is changed
diff --git a/front/core/components/popup/index.js b/front/core/components/popup/index.js
index 2a2433770..3743b9f41 100644
--- a/front/core/components/popup/index.js
+++ b/front/core/components/popup/index.js
@@ -17,7 +17,7 @@ export default class Popup extends Component {
}
/**
- * @type {Boolean} Wether to show or hide the popup.
+ * @type {Boolean} Whether to show or hide the popup.
*/
get shown() {
return this._shown;
diff --git a/front/core/components/table/style.scss b/front/core/components/table/style.scss
index 7da20fe82..dea26a462 100644
--- a/front/core/components/table/style.scss
+++ b/front/core/components/table/style.scss
@@ -102,7 +102,7 @@ vn-table {
& > vn-one {
overflow: hidden;
text-overflow: ellipsis;
- font-size: 0.75rem;
+ font-size: 1rem;
}
& > vn-one:nth-child(2) h3 {
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index 89e301fca..e2194b8ad 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -180,5 +180,6 @@
"This genus already exist": "Este genus ya existe",
"This specie already exist": "Esta especie ya existe",
"Client assignment has changed": "He cambiado el comercial ~*\"<{{previousWorkerName}}>\"*~ por *\"<{{currentWorkerName}}>\"* del cliente [{{clientName}} ({{clientId}})]({{{url}}})",
- "None": "Ninguno"
+ "None": "Ninguno",
+ "The contract was not active during the selected date": "El contrato no estaba activo durante la fecha seleccionada"
}
\ No newline at end of file
diff --git a/modules/entry/back/methods/entry/addBuy.js b/modules/entry/back/methods/entry/addBuy.js
index a7d2f4646..f21c1650c 100644
--- a/modules/entry/back/methods/entry/addBuy.js
+++ b/modules/entry/back/methods/entry/addBuy.js
@@ -89,7 +89,7 @@ module.exports = Self => {
const newBuy = await models.Buy.create(ctx.args, myOptions);
- let filter = {
+ const filter = {
fields: [
'id',
'itemFk',
@@ -136,7 +136,7 @@ module.exports = Self => {
}
};
- let stmts = [];
+ const stmts = [];
let stmt;
stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.buyRecalc');
diff --git a/modules/entry/back/methods/entry/deleteBuys.js b/modules/entry/back/methods/entry/deleteBuys.js
index de038d66e..951abfd4c 100644
--- a/modules/entry/back/methods/entry/deleteBuys.js
+++ b/modules/entry/back/methods/entry/deleteBuys.js
@@ -32,7 +32,7 @@ module.exports = Self => {
}
try {
- let promises = [];
+ const promises = [];
for (let buy of ctx.args.buys) {
const buysToDelete = models.Buy.destroyById(buy.id, myOptions);
promises.push(buysToDelete);
diff --git a/modules/entry/back/methods/entry/editLatestBuys.js b/modules/entry/back/methods/entry/editLatestBuys.js
index bd5358e31..be379b0a3 100644
--- a/modules/entry/back/methods/entry/editLatestBuys.js
+++ b/modules/entry/back/methods/entry/editLatestBuys.js
@@ -30,7 +30,18 @@ module.exports = Self => {
}
});
- Self.editLatestBuys = async(field, newValue, lines) => {
+ Self.editLatestBuys = async(field, newValue, lines, options) => {
+ let tx;
+ let myOptions = {};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ if (!myOptions.transaction) {
+ tx = await Self.beginTransaction({});
+ myOptions.transaction = tx;
+ }
+
let modelName;
let identifier;
@@ -60,28 +71,27 @@ module.exports = Self => {
const models = Self.app.models;
const model = models[modelName];
- let tx = await model.beginTransaction({});
-
try {
let promises = [];
- let options = {transaction: tx};
- let targets = lines.map(line => {
+ const targets = lines.map(line => {
return line[identifier];
});
- let value = {};
+ const value = {};
value[field] = newValue;
- // intentarlo con updateAll
for (let target of targets)
- promises.push(model.upsertWithWhere({id: target}, value, options));
+ promises.push(model.upsertWithWhere({id: target}, value, myOptions));
- await Promise.all(promises);
- await tx.commit();
- } catch (error) {
- await tx.rollback();
- throw error;
+ const result = await Promise.all(promises, myOptions);
+
+ if (tx) await tx.commit();
+
+ return result;
+ } catch (e) {
+ if (tx) await tx.rollback();
+ throw e;
}
};
};
diff --git a/modules/entry/back/methods/entry/filter.js b/modules/entry/back/methods/entry/filter.js
index 0148d866d..24c518de8 100644
--- a/modules/entry/back/methods/entry/filter.js
+++ b/modules/entry/back/methods/entry/filter.js
@@ -13,71 +13,85 @@ module.exports = Self => {
type: 'object',
description: 'Filter defining where, order, offset, and limit - must be a JSON-encoded string',
http: {source: 'query'}
- }, {
+ },
+ {
arg: 'search',
type: 'string',
description: 'Searchs the entry by id',
http: {source: 'query'}
- }, {
+ },
+ {
arg: 'id',
type: 'integer',
description: 'The entry id',
http: {source: 'query'}
- }, {
+ },
+ {
arg: 'created',
type: 'date',
description: 'The created date to filter',
http: {source: 'query'}
- }, {
+ },
+ {
arg: 'travelFk',
type: 'number',
description: 'The travel id to filter',
http: {source: 'query'}
- }, {
+ },
+ {
arg: 'companyFk',
type: 'number',
description: 'The company to filter',
http: {source: 'query'}
- }, {
+ },
+ {
arg: 'isBooked',
type: 'boolean',
description: 'The isBokked filter',
http: {source: 'query'}
- }, {
+ },
+ {
arg: 'isConfirmed',
type: 'boolean',
description: 'The isConfirmed filter',
http: {source: 'query'}
- }, {
+ },
+ {
arg: 'isOrdered',
type: 'boolean',
description: 'The isOrdered filter',
http: {source: 'query'}
- }, {
+ },
+ {
arg: 'ref',
type: 'string',
description: 'The ref filter',
http: {source: 'query'}
- }, {
+ },
+ {
arg: 'supplierFk',
type: 'number',
description: 'The supplier id to filter',
http: {source: 'query'}
- }, {
+ },
+ {
arg: 'invoiceInFk',
type: 'number',
description: 'The invoiceIn id to filter',
http: {source: 'query'}
- }, {
+ },
+ {
arg: 'currencyFk',
type: 'number',
description: 'The currency id to filter',
http: {source: 'query'}
- }, {
+ },
+ {
arg: 'from',
type: 'date',
description: `The from date filter`
- }, {
+ },
+ {
arg: 'to',
type: 'date',
description: `The to date filter`
@@ -93,9 +107,14 @@ module.exports = Self => {
}
});
- Self.filter = async(ctx, filter) => {
- let conn = Self.dataSource.connector;
- let where = buildFilter(ctx.args, (param, value) => {
+ Self.filter = async(ctx, filter, options) => {
+ let myOptions = {};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ const conn = Self.dataSource.connector;
+ const where = buildFilter(ctx.args, (param, value) => {
switch (param) {
case 'search':
return /^\d+$/.test(value)
@@ -128,7 +147,7 @@ module.exports = Self => {
});
filter = mergeFilters(ctx.args.filter, {where});
- let stmts = [];
+ const stmts = [];
let stmt;
stmt = new ParameterizedSQL(
`SELECT
@@ -163,10 +182,10 @@ module.exports = Self => {
);
stmt.merge(conn.makeSuffix(filter));
- let itemsIndex = stmts.push(stmt) - 1;
+ const itemsIndex = stmts.push(stmt) - 1;
- let sql = ParameterizedSQL.join(stmts, ';');
- let result = await conn.executeStmt(sql);
+ const sql = ParameterizedSQL.join(stmts, ';');
+ const result = await conn.executeStmt(sql, myOptions);
return itemsIndex === 0 ? result : result[itemsIndex];
};
};
diff --git a/modules/entry/back/methods/entry/getBuys.js b/modules/entry/back/methods/entry/getBuys.js
index 1b05ec483..0f09f06d5 100644
--- a/modules/entry/back/methods/entry/getBuys.js
+++ b/modules/entry/back/methods/entry/getBuys.js
@@ -1,14 +1,22 @@
+const mergeFilters = require('vn-loopback/util/filter').mergeFilters;
+
module.exports = Self => {
Self.remoteMethod('getBuys', {
description: 'Returns buys for one entry',
accessType: 'READ',
- accepts: {
+ accepts: [{
arg: 'id',
type: 'number',
required: true,
description: 'The entry id',
http: {source: 'path'}
},
+ {
+ arg: 'filter',
+ type: 'object',
+ description: 'Filter defining where, order, offset, and limit - must be a JSON-encoded string'
+ }
+ ],
returns: {
type: ['Object'],
root: true
@@ -19,8 +27,14 @@ module.exports = Self => {
}
});
- Self.getBuys = async id => {
- let filter = {
+ Self.getBuys = async(id, filter, options) => {
+ const models = Self.app.models;
+ let myOptions = {};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ let defaultFilter = {
where: {entryFk: id},
fields: [
'id',
@@ -68,7 +82,8 @@ module.exports = Self => {
}
};
- let buys = await Self.app.models.Buy.find(filter);
- return buys;
+ defaultFilter = mergeFilters(defaultFilter, filter);
+
+ return models.Buy.find(defaultFilter, myOptions);
};
};
diff --git a/modules/entry/back/methods/entry/getEntry.js b/modules/entry/back/methods/entry/getEntry.js
index 008ee8148..c14ca800a 100644
--- a/modules/entry/back/methods/entry/getEntry.js
+++ b/modules/entry/back/methods/entry/getEntry.js
@@ -19,8 +19,14 @@ module.exports = Self => {
}
});
- Self.getEntry = async id => {
- let filter = {
+ Self.getEntry = async(id, options) => {
+ const models = Self.app.models;
+ let myOptions = {};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ const filter = {
where: {id: id},
include: [
{
@@ -70,7 +76,6 @@ module.exports = Self => {
],
};
- let entry = await Self.app.models.Entry.findOne(filter);
- return entry;
+ return models.Entry.findOne(filter, myOptions);
};
};
diff --git a/modules/entry/back/methods/entry/importBuys.js b/modules/entry/back/methods/entry/importBuys.js
index 10871f4ad..325fe4d22 100644
--- a/modules/entry/back/methods/entry/importBuys.js
+++ b/modules/entry/back/methods/entry/importBuys.js
@@ -45,8 +45,8 @@ module.exports = Self => {
const conn = Self.dataSource.connector;
const args = ctx.args;
const models = Self.app.models;
-
let tx;
+
if (!options.transaction) {
tx = await Self.beginTransaction({});
options.transaction = tx;
@@ -76,7 +76,7 @@ module.exports = Self => {
const createdBuys = await models.Buy.create(buys, options);
const buyIds = createdBuys.map(buy => buy.id);
- let stmts = [];
+ const stmts = [];
let stmt;
stmts.push('DROP TEMPORARY TABLE IF EXISTS tmp.buyRecalc');
diff --git a/modules/entry/back/methods/entry/importBuysPreview.js b/modules/entry/back/methods/entry/importBuysPreview.js
index 9d6662327..9ba2b58ed 100644
--- a/modules/entry/back/methods/entry/importBuysPreview.js
+++ b/modules/entry/back/methods/entry/importBuysPreview.js
@@ -24,14 +24,19 @@ module.exports = Self => {
}
});
- Self.importBuysPreview = async(id, buys) => {
+ Self.importBuysPreview = async(id, buys, options) => {
const models = Self.app.models;
+ let myOptions = {};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
for (let buy of buys) {
const packaging = await models.Packaging.findOne({
fields: ['id'],
where: {volume: {gte: buy.volume}},
order: 'volume ASC'
- });
+ }, myOptions);
buy.packageFk = packaging.id;
}
diff --git a/modules/entry/back/methods/entry/latestBuysFilter.js b/modules/entry/back/methods/entry/latestBuysFilter.js
index 4c3536b8d..68abc9c03 100644
--- a/modules/entry/back/methods/entry/latestBuysFilter.js
+++ b/modules/entry/back/methods/entry/latestBuysFilter.js
@@ -17,36 +17,44 @@ module.exports = Self => {
arg: 'search',
type: 'String',
description: `If it's and integer searchs by id, otherwise it searchs by name`,
- }, {
+ },
+ {
arg: 'id',
type: 'Integer',
description: 'Item id',
- }, {
+ },
+ {
arg: 'tags',
type: ['Object'],
description: 'List of tags to filter with',
http: {source: 'query'}
- }, {
+ },
+ {
arg: 'description',
type: 'String',
description: 'The item description',
- }, {
+ },
+ {
arg: 'salesPersonFk',
type: 'Integer',
description: 'The buyer of the item',
- }, {
+ },
+ {
arg: 'active',
type: 'Boolean',
description: 'Whether the item is or not active',
- }, {
+ },
+ {
arg: 'visible',
type: 'Boolean',
description: 'Whether the item is or not visible',
- }, {
+ },
+ {
arg: 'typeFk',
type: 'Integer',
description: 'Type id',
- }, {
+ },
+ {
arg: 'categoryFk',
type: 'Integer',
description: 'Category id',
@@ -62,9 +70,14 @@ module.exports = Self => {
}
});
- Self.latestBuysFilter = async(ctx, filter) => {
- let conn = Self.dataSource.connector;
- let where = buildFilter(ctx.args, (param, value) => {
+ Self.latestBuysFilter = async(ctx, filter, options) => {
+ let myOptions = {};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ const conn = Self.dataSource.connector;
+ const where = buildFilter(ctx.args, (param, value) => {
switch (param) {
case 'search':
return /^\d+$/.test(value)
@@ -93,7 +106,7 @@ module.exports = Self => {
});
filter = mergeFilters(ctx.args.filter, {where});
- let stmts = [];
+ const stmts = [];
let stmt;
stmts.push('CALL cache.last_buy_refresh(FALSE)');
@@ -179,10 +192,10 @@ module.exports = Self => {
}
stmt.merge(conn.makeSuffix(filter));
- let buysIndex = stmts.push(stmt) - 1;
+ const buysIndex = stmts.push(stmt) - 1;
- let sql = ParameterizedSQL.join(stmts, ';');
- let result = await conn.executeStmt(sql);
+ const sql = ParameterizedSQL.join(stmts, ';');
+ const result = await conn.executeStmt(sql, myOptions);
return buysIndex === 0 ? result : result[buysIndex];
};
};
diff --git a/modules/entry/back/methods/entry/specs/editLatestBuys.spec.js b/modules/entry/back/methods/entry/specs/editLatestBuys.spec.js
index 5d1bd5a0d..40be5f70e 100644
--- a/modules/entry/back/methods/entry/specs/editLatestBuys.spec.js
+++ b/modules/entry/back/methods/entry/specs/editLatestBuys.spec.js
@@ -3,29 +3,32 @@ const model = app.models.Buy;
describe('Buy editLatestsBuys()', () => {
it('should change the value of a given column for the selected buys', async() => {
- let ctx = {
- args: {
- search: 'Ranged weapon longbow 2m'
- }
- };
+ const tx = await app.models.Entry.beginTransaction({});
+ const options = {transaction: tx};
- let [original] = await model.latestBuysFilter(ctx);
+ try {
+ let ctx = {
+ args: {
+ search: 'Ranged weapon longbow 2m'
+ }
+ };
- const field = 'size';
- let newValue = 99;
- const lines = [{itemFk: original.itemFk, id: original.id}];
+ const [original] = await model.latestBuysFilter(ctx, null, options);
- await model.editLatestBuys(field, newValue, lines);
+ const field = 'size';
+ const newValue = 99;
+ const lines = [{itemFk: original.itemFk, id: original.id}];
- let [result] = await model.latestBuysFilter(ctx);
+ await model.editLatestBuys(field, newValue, lines, options);
- expect(result.size).toEqual(99);
+ const [result] = await model.latestBuysFilter(ctx, null, options);
- newValue = original.size;
- await model.editLatestBuys(field, newValue, lines);
+ expect(result[field]).toEqual(newValue);
- let [restoredFixture] = await model.latestBuysFilter(ctx);
-
- expect(restoredFixture.size).toEqual(original.size);
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
});
});
diff --git a/modules/entry/front/index/locale/es.yml b/modules/entry/front/index/locale/es.yml
index 2770ccfe9..519f8e39a 100644
--- a/modules/entry/front/index/locale/es.yml
+++ b/modules/entry/front/index/locale/es.yml
@@ -10,7 +10,7 @@ Commission: Comisión
Landed: F. entrega
Reference: Referencia
Created: Creado
-Booked: Facturado
+Booked: Contabilizada
Is inventory: Inventario
Notes: Notas
Status: Estado
diff --git a/modules/entry/front/summary/index.html b/modules/entry/front/summary/index.html
index e4ad6ba31..3f91ddc26 100644
--- a/modules/entry/front/summary/index.html
+++ b/modules/entry/front/summary/index.html
@@ -1,3 +1,10 @@
+
Packing price
-
+
+ {{::line.quantity}}
{{::line.stickers | dashIfEmpty}}
@@ -156,6 +163,10 @@