@@ -125,19 +124,18 @@
{{::line.packageFk | dashIfEmpty}} |
{{::line.weight}} |
-
+
{{::line.packing | dashIfEmpty}}
|
-
+
{{::line.grouping | dashIfEmpty}}
{{::line.buyingValue | currency: 'EUR':2}} |
{{::line.quantity * line.buyingValue | currency: 'EUR':2}} |
- {{::line.price2 | currency: 'EUR':2}} |
- {{::line.price3 | currency: 'EUR':2}} |
+ {{::line.price2 | currency: 'EUR':2 | dashIfEmpty}} / {{::line.price3 | currency: 'EUR':2 | dashIfEmpty}} |
@@ -195,7 +193,7 @@
vn-id="item-descriptor"
warehouse-fk="$ctrl.vnConfig.warehouseFk">
-
diff --git a/modules/item/back/methods/tag/onSubmit.js b/modules/item/back/methods/tag/onSubmit.js
new file mode 100644
index 0000000000..7abbe60d40
--- /dev/null
+++ b/modules/item/back/methods/tag/onSubmit.js
@@ -0,0 +1,81 @@
+
+module.exports = function(Self) {
+ Self.remoteMethodCtx('onSubmit', {
+ description: 'Save model changes',
+ accessType: 'WRITE',
+ accepts: [
+ {
+ arg: 'creates',
+ type: ['object'],
+ description: 'The itemTags records to create'
+ }, {
+ arg: 'deletes',
+ type: ['number'],
+ description: 'The itemTags ids to delete'
+ }, {
+ arg: 'updates',
+ type: ['object'],
+ description: 'The itemTags records to update'
+ }, {
+ arg: 'maxPriority',
+ type: 'number',
+ description: 'The maxPriority value'
+ }
+ ],
+ returns: {
+ root: true,
+ type: 'object'
+ },
+ http: {
+ verb: 'PATCH',
+ path: '/onSubmit'
+ }
+ });
+
+ Self.onSubmit = async(ctx, options) => {
+ const models = Self.app.models;
+ const args = ctx.args;
+ let tx;
+ const myOptions = {};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ if (!myOptions.transaction) {
+ tx = await Self.beginTransaction({});
+ myOptions.transaction = tx;
+ }
+
+ try {
+ if (args.deletes) {
+ for (const itemTagId of args.deletes)
+ await models.ItemTag.destroyById(itemTagId, myOptions);
+ }
+
+ if (args.updates) {
+ for (const row of args.updates) {
+ if (row.data.priority) {
+ const itemTag = await models.ItemTag.findById(row.where.id, null, myOptions);
+ await itemTag.updateAttributes({
+ priority: row.data.priority + args.maxPriority
+ }, myOptions);
+ }
+ }
+ for (const row of args.updates) {
+ const itemTag = await models.ItemTag.findById(row.where.id, null, myOptions);
+ await itemTag.updateAttributes(row.data, myOptions);
+ }
+ }
+
+ if (args.creates) {
+ for (const itemTag of args.creates)
+ await models.ItemTag.create(itemTag, myOptions);
+ }
+
+ if (tx) await tx.commit();
+ } catch (e) {
+ if (tx) await tx.rollback();
+ throw e;
+ }
+ };
+};
diff --git a/modules/item/back/methods/tag/specs/onSubmit.spec.js b/modules/item/back/methods/tag/specs/onSubmit.spec.js
new file mode 100644
index 0000000000..f24aad7e48
--- /dev/null
+++ b/modules/item/back/methods/tag/specs/onSubmit.spec.js
@@ -0,0 +1,96 @@
+const models = require('vn-loopback/server/server').models;
+
+describe('tag onSubmit()', () => {
+ it('should delete a tag', async() => {
+ const tx = await models.Item.beginTransaction({});
+ const options = {transaction: tx};
+
+ try {
+ const deletes = [40];
+ const ctx = {
+ args: {
+ deletes: deletes
+ }
+ };
+ await models.Tag.onSubmit(ctx, options);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+
+ it('should update a tag', async() => {
+ const tx = await models.Item.beginTransaction({});
+ const options = {transaction: tx};
+
+ try {
+ const updates = [{data: {value: 'Container Test'}, where: {id: 36}}];
+ const ctx = {
+ args: {
+ updates: updates
+ }
+ };
+ await models.Tag.onSubmit(ctx, options);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+
+ it('should create a tag', async() => {
+ const tx = await models.Item.beginTransaction({});
+ const options = {transaction: tx};
+
+ try {
+ const creates = [{
+ 'itemFk': '6',
+ 'priority': 8,
+ '$orgIndex': null,
+ '$oldData': null,
+ '$isNew': true,
+ 'tagFk': 3,
+ 'value': 'madera'
+ }];
+ const ctx = {
+ args: {
+ creates: creates
+ }
+ };
+ await models.Tag.onSubmit(ctx, options);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+
+ it('should swap priority for two tags', async() => {
+ const tx = await models.Item.beginTransaction({});
+ const options = {transaction: tx};
+
+ try {
+ const updates = [
+ {data: {priority: 2}, where: {id: 36}},
+ {data: {priority: 1}, where: {id: 37}}
+ ];
+ const ctx = {
+ args: {
+ updates: updates,
+ maxPriority: 7,
+
+ }
+ };
+ await models.Tag.onSubmit(ctx, options);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+ });
+});
diff --git a/modules/item/back/models/tag.js b/modules/item/back/models/tag.js
index 43fbc0db32..92760e34f2 100644
--- a/modules/item/back/models/tag.js
+++ b/modules/item/back/models/tag.js
@@ -1,3 +1,4 @@
module.exports = Self => {
require('../methods/tag/filterValue')(Self);
+ require('../methods/tag/onSubmit')(Self);
};
diff --git a/modules/item/front/last-entries/index.html b/modules/item/front/last-entries/index.html
index 0348d4f667..1c2db10a57 100644
--- a/modules/item/front/last-entries/index.html
+++ b/modules/item/front/last-entries/index.html
@@ -9,15 +9,15 @@
-
+
@@ -35,8 +35,7 @@
Warehouse
Landed
Entry
- P.P.U
- P.P.P
+ PVP
Label
Packing
Grouping
@@ -51,7 +50,7 @@
-
@@ -65,30 +64,31 @@
{{::entry.entryFk | dashIfEmpty}}
- {{::entry.price2 | dashIfEmpty}}
- {{::entry.price3 | dashIfEmpty}}
+
+ {{::entry.price2 | currency: 'EUR':2 | dashIfEmpty}} / {{::entry.price3 | currency: 'EUR':2 | dashIfEmpty}}
+
{{entry.stickers | dashIfEmpty}}
-
+
{{::entry.packing | dashIfEmpty}}
-
+
{{::entry.grouping | dashIfEmpty}}
{{::entry.stems | dashIfEmpty}}
{{::entry.quantity}}
-
- {{::entry.cost | dashIfEmpty}}
+ {{::$ctrl.$t('Cost')}}: {{::entry.buyingValue | currency: 'EUR':2 | dashIfEmpty}}
+ {{::$ctrl.$t('Package')}}: {{::entry.packageValue | currency: 'EUR':2 | dashIfEmpty}}
+ {{::$ctrl.$t('Freight')}}: {{::entry.freightValue | currency: 'EUR':2 | dashIfEmpty}}
+ {{::$ctrl.$t('Comission')}}: {{::entry.comissionValue | currency: 'EUR':2 | dashIfEmpty}}">
+ {{::entry.cost | currency: 'EUR':2 | dashIfEmpty}}
{{::entry.weight | dashIfEmpty}}
@@ -113,24 +113,24 @@
ng-click="contextmenu.filterBySelection()">
Filter by selection
-
Exclude selection
-
Remove filter
-
Remove all filters
-
Copy value
-
\ No newline at end of file
+
diff --git a/modules/item/front/tags/index.html b/modules/item/front/tags/index.html
index c040b99849..f9b5370fa7 100644
--- a/modules/item/front/tags/index.html
+++ b/modules/item/front/tags/index.html
@@ -19,7 +19,7 @@
data="tags"
auto-load="true">
-
\ No newline at end of file
+
diff --git a/modules/item/front/tags/index.js b/modules/item/front/tags/index.js
index 3b3cd58efd..bfa1f3f469 100644
--- a/modules/item/front/tags/index.js
+++ b/modules/item/front/tags/index.js
@@ -29,11 +29,17 @@ class Controller extends Section {
}
onSubmit() {
- this.$.watcher.check();
- this.$.model.save().then(() => {
+ const changes = this.$.model.getChanges();
+ const data = {
+ creates: changes.creates,
+ deletes: changes.deletes,
+ updates: changes.updates,
+ maxPriority: this.getHighestPriority()
+ };
+ this.$http.patch(`Tags/onSubmit`, data).then(() => {
+ this.$.model.refresh();
this.$.watcher.notifySaved();
this.$.watcher.updateOriginalData();
- this.card.reload();
});
}
}
diff --git a/modules/order/front/catalog/index.js b/modules/order/front/catalog/index.js
index 5fdd2e2388..c0777ebc94 100644
--- a/modules/order/front/catalog/index.js
+++ b/modules/order/front/catalog/index.js
@@ -157,7 +157,7 @@ class Controller extends Section {
* Apply order to model
*/
applyOrder() {
- if (this.typeId || this.tagGroups.length > 0)
+ if (this.typeId || this.tagGroups.length > 0 || this.itemName)
this.$.model.addFilter(null, {orderBy: this.getOrderBy()});
}
diff --git a/modules/route/back/methods/route/downloadZip.js b/modules/route/back/methods/route/downloadZip.js
new file mode 100644
index 0000000000..597f1d1f6b
--- /dev/null
+++ b/modules/route/back/methods/route/downloadZip.js
@@ -0,0 +1,62 @@
+const JSZip = require('jszip');
+
+module.exports = Self => {
+ Self.remoteMethodCtx('downloadZip', {
+ description: 'Download a zip file with multiple routes pdfs',
+ accessType: 'READ',
+ accepts: [
+ {
+ arg: 'id',
+ type: 'string',
+ description: 'The routes ids',
+ }
+ ],
+ returns: [
+ {
+ arg: 'body',
+ type: 'file',
+ root: true
+ }, {
+ arg: 'Content-Type',
+ type: 'string',
+ http: {target: 'header'}
+ }, {
+ arg: 'Content-Disposition',
+ type: 'string',
+ http: {target: 'header'}
+ }
+ ],
+ http: {
+ path: '/downloadZip',
+ verb: 'GET'
+ }
+ });
+
+ Self.downloadZip = async function(ctx, id, options) {
+ const models = Self.app.models;
+ const myOptions = {};
+ const zip = new JSZip();
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ const ids = id.split(',');
+ for (let id of ids) {
+ ctx.args.id = id;
+ const routePdf = await models.Route.driverRoutePdf(ctx, id);
+ const fileName = extractFileName(routePdf[2]);
+ const body = routePdf[0];
+
+ zip.file(fileName, body);
+ }
+
+ const stream = zip.generateNodeStream({streamFiles: true});
+
+ return [stream, 'application/zip', `filename="download.zip"`];
+ };
+
+ function extractFileName(str) {
+ const matches = str.match(/"(.*?)"/);
+ return matches ? matches[1] : str;
+ }
+};
diff --git a/modules/route/back/models/route.js b/modules/route/back/models/route.js
index 08cabd30eb..883f4597e4 100644
--- a/modules/route/back/models/route.js
+++ b/modules/route/back/models/route.js
@@ -13,6 +13,7 @@ module.exports = Self => {
require('../methods/route/driverRoutePdf')(Self);
require('../methods/route/driverRouteEmail')(Self);
require('../methods/route/sendSms')(Self);
+ require('../methods/route/downloadZip')(Self);
Self.validate('kmStart', validateDistance, {
message: 'Distance must be lesser than 1000'
diff --git a/modules/route/front/index/index.js b/modules/route/front/index/index.js
index 9258c8fac4..94f6db09ce 100644
--- a/modules/route/front/index/index.js
+++ b/modules/route/front/index/index.js
@@ -34,12 +34,22 @@ export default class Controller extends Section {
}
showRouteReport() {
- const routes = [];
+ const routesIds = [];
for (let route of this.checked)
- routes.push(route.id);
- const routesId = routes.join(',');
+ routesIds.push(route.id);
+ const stringRoutesIds = routesIds.join(',');
- this.vnReport.show(`Routes/${routesId}/driver-route-pdf`);
+ if (this.checked.length <= 1) {
+ const url = `api/Routes/${stringRoutesIds}/driver-route-pdf?access_token=${this.vnToken.token}`;
+ window.open(url, '_blank');
+ } else {
+ const serializedParams = this.$httpParamSerializer({
+ access_token: this.vnToken.token,
+ id: stringRoutesIds
+ });
+ const url = `api/Routes/downloadZip?${serializedParams}`;
+ window.open(url, '_blank');
+ }
}
openClonationDialog() {
diff --git a/modules/route/front/index/index.spec.js b/modules/route/front/index/index.spec.js
index 05dd564336..c1f414d5e3 100644
--- a/modules/route/front/index/index.spec.js
+++ b/modules/route/front/index/index.spec.js
@@ -44,17 +44,15 @@ describe('Component vnRouteIndex', () => {
describe('showRouteReport()', () => {
it('should call to the vnReport show method', () => {
- controller.vnReport.show = jest.fn();
+ jest.spyOn(window, 'open').mockReturnThis();
const data = controller.$.model.data;
data[0].checked = true;
data[2].checked = true;
- const routeIds = '1,3';
-
controller.showRouteReport();
- expect(controller.vnReport.show).toHaveBeenCalledWith(`Routes/${routeIds}/driver-route-pdf`);
+ expect(window.open).toHaveBeenCalled();
});
});
diff --git a/modules/shelving/front/routes.json b/modules/shelving/front/routes.json
index 09a8e389ba..4059e50956 100644
--- a/modules/shelving/front/routes.json
+++ b/modules/shelving/front/routes.json
@@ -1,12 +1,12 @@
{
"module": "shelving",
"name": "Shelvings",
- "icon" : "contact_support",
+ "icon" : "icon-inventory",
"dependencies": ["worker"],
"validations" : true,
"menus": {
"main": [
- {"state": "shelving.index", "icon": "contact_support"}
+ {"state": "shelving.index", "icon": "icon-inventory"}
],
"card": [
{"state": "shelving.card.basicData", "icon": "settings"},
@@ -20,7 +20,7 @@
"abstract": true,
"component": "vn-shelving",
"description": "Shelvings"
- },
+ },
{
"url": "/index?q",
"state": "shelving.index",
@@ -32,13 +32,13 @@
"state": "shelving.create",
"component": "vn-shelving-create",
"description": "New shelving"
- },
+ },
{
"url": "/:id",
"state": "shelving.card",
"abstract": true,
"component": "vn-shelving-card"
- },
+ },
{
"url": "/summary",
"state": "shelving.card.summary",
@@ -47,7 +47,7 @@
"params": {
"shelving": "$ctrl.shelving"
}
- },
+ },
{
"url": "/basic-data",
"state": "shelving.card.basicData",
@@ -56,7 +56,7 @@
"params": {
"shelving": "$ctrl.shelving"
}
- },
+ },
{
"url" : "/log",
"state": "shelving.card.log",
@@ -64,4 +64,4 @@
"description": "Log"
}
]
-}
\ No newline at end of file
+}
diff --git a/modules/supplier/front/agency-term/index/index.html b/modules/supplier/front/agency-term/index/index.html
index 9d53226c57..44c6deba92 100644
--- a/modules/supplier/front/agency-term/index/index.html
+++ b/modules/supplier/front/agency-term/index/index.html
@@ -24,36 +24,42 @@
diff --git a/modules/ticket/back/methods/sale-tracking/listSaleTracking.js b/modules/ticket/back/methods/sale-tracking/listSaleTracking.js
index c0d63ef626..98743d8ccb 100644
--- a/modules/ticket/back/methods/sale-tracking/listSaleTracking.js
+++ b/modules/ticket/back/methods/sale-tracking/listSaleTracking.js
@@ -36,7 +36,7 @@ module.exports = Self => {
st.originalQuantity,
st.created,
st.workerFk,
- u.nickname userNickname,
+ u.name,
ste.name AS state
FROM saleTracking st
JOIN sale s ON s.id = st.saleFk
@@ -48,24 +48,6 @@ module.exports = Self => {
const trackings = await Self.rawStmt(stmt, myOptions);
- const salesFilter = {
- include: [
- {
- relation: 'item'
- }
- ],
- where: {ticketFk: filter.where.ticketFk}
- };
-
- const sales = await Self.app.models.Sale.find(salesFilter, myOptions);
-
- for (const tracking of trackings) {
- for (const sale of sales) {
- if (tracking.itemFk == sale.itemFk)
- tracking.item = sale.item();
- }
- }
-
return trackings;
};
};
diff --git a/modules/ticket/back/methods/sale/canEdit.js b/modules/ticket/back/methods/sale/canEdit.js
index f44bd67438..3091ebca7c 100644
--- a/modules/ticket/back/methods/sale/canEdit.js
+++ b/modules/ticket/back/methods/sale/canEdit.js
@@ -56,6 +56,13 @@ module.exports = Self => {
const shouldEditCloned = canEditCloned || !hasSaleCloned;
const shouldEditFloramondo = canEditFloramondo || !hasSaleFloramondo;
- return shouldEditTracked && shouldEditCloned && shouldEditFloramondo;
+ if (!shouldEditTracked)
+ throw new UserError('It is not possible to modify tracked sales');
+ if (!shouldEditCloned)
+ throw new UserError('It is not possible to modify cloned sales');
+ if (!shouldEditFloramondo)
+ throw new UserError('It is not possible to modify sales that their articles are from Floramondo');
+
+ return true;
};
};
diff --git a/modules/ticket/back/methods/sale/deleteSales.js b/modules/ticket/back/methods/sale/deleteSales.js
index c045b91971..5d1463a666 100644
--- a/modules/ticket/back/methods/sale/deleteSales.js
+++ b/modules/ticket/back/methods/sale/deleteSales.js
@@ -43,9 +43,7 @@ module.exports = Self => {
try {
const saleIds = sales.map(sale => sale.id);
- const canEditSales = await models.Sale.canEdit(ctx, saleIds, myOptions);
- if (!canEditSales)
- throw new UserError(`Sale(s) blocked, please contact production`);
+ await models.Sale.canEdit(ctx, saleIds, myOptions);
const ticket = await models.Ticket.findById(ticketId, {
include: {
diff --git a/modules/ticket/back/methods/sale/recalculatePrice.js b/modules/ticket/back/methods/sale/recalculatePrice.js
index 38c68d7f62..2c8e6768bc 100644
--- a/modules/ticket/back/methods/sale/recalculatePrice.js
+++ b/modules/ticket/back/methods/sale/recalculatePrice.js
@@ -37,9 +37,7 @@ module.exports = Self => {
try {
const salesIds = sales.map(sale => sale.id);
- const canEditSale = await models.Sale.canEdit(ctx, salesIds, myOptions);
- if (!canEditSale)
- throw new UserError(`Sale(s) blocked, please contact production`);
+ await models.Sale.canEdit(ctx, salesIds, myOptions);
const query = `
DROP TEMPORARY TABLE IF EXISTS tmp.recalculateSales;
diff --git a/modules/ticket/back/methods/sale/reserve.js b/modules/ticket/back/methods/sale/reserve.js
index 648e6de237..2dc368af69 100644
--- a/modules/ticket/back/methods/sale/reserve.js
+++ b/modules/ticket/back/methods/sale/reserve.js
@@ -51,9 +51,7 @@ module.exports = Self => {
try {
const salesIds = sales.map(sale => sale.id);
- const canEditSale = await models.Sale.canEdit(ctx, salesIds, myOptions);
- if (!canEditSale)
- throw new UserError(`Sale(s) blocked, please contact production`);
+ await models.Sale.canEdit(ctx, salesIds, myOptions);
let changesMade = '';
const promises = [];
diff --git a/modules/ticket/back/methods/sale/specs/canEdit.spec.js b/modules/ticket/back/methods/sale/specs/canEdit.spec.js
index 2aa873df56..58d8f06358 100644
--- a/modules/ticket/back/methods/sale/specs/canEdit.spec.js
+++ b/modules/ticket/back/methods/sale/specs/canEdit.spec.js
@@ -50,7 +50,7 @@ describe('sale canEdit()', () => {
it('should return false if any of the sales has a saleTracking record', async() => {
const tx = await models.Sale.beginTransaction({});
-
+ let error;
try {
const options = {transaction: tx};
@@ -59,15 +59,15 @@ describe('sale canEdit()', () => {
const sales = [31];
- const result = await models.Sale.canEdit(ctx, sales, options);
-
- expect(result).toEqual(false);
-
+ await models.Sale.canEdit(ctx, sales, options);
await tx.rollback();
} catch (e) {
await tx.rollback();
- throw e;
+ error = e;
}
+
+ expect(error).toEqual(
+ new Error('It is not possible to modify tracked sales'));
});
});
@@ -75,22 +75,22 @@ describe('sale canEdit()', () => {
const saleCloned = [29];
it('should return false if any of the sales is cloned', async() => {
const tx = await models.Sale.beginTransaction({});
-
+ let error;
try {
const options = {transaction: tx};
const buyerId = 35;
const ctx = {req: {accessToken: {userId: buyerId}}};
- const result = await models.Sale.canEdit(ctx, saleCloned, options);
-
- expect(result).toEqual(false);
-
+ await models.Sale.canEdit(ctx, saleCloned, options);
await tx.rollback();
} catch (e) {
await tx.rollback();
- throw e;
+ error = e;
}
+
+ expect(error).toEqual(
+ new Error('It is not possible to modify cloned sales'));
});
it('should return true if any of the sales is cloned and has the correct role', async() => {
@@ -130,7 +130,7 @@ describe('sale canEdit()', () => {
it('should return false if any of the sales isFloramondo', async() => {
const tx = await models.Sale.beginTransaction({});
const sales = [26];
-
+ let error;
try {
const options = {transaction: tx};
@@ -140,15 +140,15 @@ describe('sale canEdit()', () => {
const saleToEdit = await models.Sale.findById(sales[0], null, options);
await saleToEdit.updateAttribute('itemFk', 9, options);
- const result = await models.Sale.canEdit(ctx, sales, options);
-
- expect(result).toEqual(false);
-
+ await models.Sale.canEdit(ctx, sales, options);
await tx.rollback();
} catch (e) {
await tx.rollback();
- throw e;
+ error = e;
}
+
+ expect(error).toEqual(
+ new Error('It is not possible to modify sales that their articles are from Floramondo'));
});
it('should return true if any of the sales is of isFloramondo and has the correct role', async() => {
diff --git a/modules/ticket/back/methods/sale/updateConcept.js b/modules/ticket/back/methods/sale/updateConcept.js
index 0730f85e28..dcd25dcbb1 100644
--- a/modules/ticket/back/methods/sale/updateConcept.js
+++ b/modules/ticket/back/methods/sale/updateConcept.js
@@ -40,10 +40,7 @@ module.exports = Self => {
try {
const currentLine = await models.Sale.findById(id, null, myOptions);
- const canEditSale = await models.Sale.canEdit(ctx, [id], myOptions);
-
- if (!canEditSale)
- throw new UserError(`Sale(s) blocked, please contact production`);
+ await models.Sale.canEdit(ctx, [id], myOptions);
const line = await currentLine.updateAttributes({concept: newConcept}, myOptions);
diff --git a/modules/ticket/back/methods/sale/updatePrice.js b/modules/ticket/back/methods/sale/updatePrice.js
index 8f27e1af50..505de51807 100644
--- a/modules/ticket/back/methods/sale/updatePrice.js
+++ b/modules/ticket/back/methods/sale/updatePrice.js
@@ -66,9 +66,7 @@ module.exports = Self => {
const sale = await models.Sale.findById(id, filter, myOptions);
- const canEditSale = await models.Sale.canEdit(ctx, [id], myOptions);
- if (!canEditSale)
- throw new UserError(`Sale(s) blocked, please contact production`);
+ await models.Sale.canEdit(ctx, [id], myOptions);
const oldPrice = sale.price;
const userId = ctx.req.accessToken.userId;
diff --git a/modules/ticket/back/methods/sale/updateQuantity.js b/modules/ticket/back/methods/sale/updateQuantity.js
index 8cf0720ce0..d2927c65c0 100644
--- a/modules/ticket/back/methods/sale/updateQuantity.js
+++ b/modules/ticket/back/methods/sale/updateQuantity.js
@@ -41,9 +41,7 @@ module.exports = Self => {
}
try {
- const canEditSale = await models.Sale.canEdit(ctx, [id], myOptions);
- if (!canEditSale)
- throw new UserError(`Sale(s) blocked, please contact production`);
+ await models.Sale.canEdit(ctx, [id], myOptions);
const filter = {
include: {
diff --git a/modules/ticket/back/methods/state/editableStates.js b/modules/ticket/back/methods/state/editableStates.js
index 2c90ac43b1..115876f26f 100644
--- a/modules/ticket/back/methods/state/editableStates.js
+++ b/modules/ticket/back/methods/state/editableStates.js
@@ -24,7 +24,7 @@ module.exports = Self => {
if (typeof options == 'object')
Object.assign(myOptions, options);
- let statesList = await models.State.find({where: filter.where}, myOptions);
+ let statesList = await models.State.find(filter, myOptions);
const isProduction = await models.Account.hasRole(userId, 'production', myOptions);
const isSalesPerson = await models.Account.hasRole(userId, 'salesPerson', myOptions);
const isAdministrative = await models.Account.hasRole(userId, 'administrative', myOptions);
diff --git a/modules/ticket/front/sale-tracking/index.html b/modules/ticket/front/sale-tracking/index.html
index 8518175514..c21eaa46ac 100644
--- a/modules/ticket/front/sale-tracking/index.html
+++ b/modules/ticket/front/sale-tracking/index.html
@@ -30,12 +30,12 @@
-
- {{::sale.itemFk | zeroFill:6}}
+ {{::sale.item.id}}
-
+
|
{{$t('From')}} |
- {{from | date('%d-%m-%Y')}} |
+ {{formatDate(from, '%d-%m-%Y')}} |
{{$t('To')}} |
- {{to | date('%d-%m-%Y')}} |
+ {{formatDate(to, '%d-%m-%Y')}} |
|
diff --git a/print/templates/reports/campaign-metrics/campaign-metrics.js b/print/templates/reports/campaign-metrics/campaign-metrics.js
index 14a4b6a9b6..45bca88dcf 100755
--- a/print/templates/reports/campaign-metrics/campaign-metrics.js
+++ b/print/templates/reports/campaign-metrics/campaign-metrics.js
@@ -1,27 +1,12 @@
-const Component = require(`vn-print/core/component`);
-const reportBody = new Component('report-body');
-const reportFooter = new Component('report-footer');
+const vnReport = require('../../../core/mixins/vn-report.js');
module.exports = {
name: 'campaign-metrics',
+ mixins: [vnReport],
async serverPrefetch() {
- this.client = await this.fetchClient(this.id);
- this.sales = await this.fetchSales(this.id, this.from, this.to);
-
- if (!this.client)
- throw new Error('Something went wrong');
- },
- methods: {
- fetchClient(id) {
- return this.findOneFromDef('client', [id]);
- },
- fetchSales(id, from, to) {
- return this.rawSqlFromDef('sales', [id, from, to]);
- },
- },
- components: {
- 'report-body': reportBody.build(),
- 'report-footer': reportFooter.build()
+ this.client = await this.findOneFromDef('client', [this.id]);
+ this.checkMainEntity(this.client);
+ this.sales = await this.rawSqlFromDef('sales', [this.id, this.from, this.to]);
},
props: {
id: {
diff --git a/print/templates/reports/claim-pickup-order/claim-pickup-order.html b/print/templates/reports/claim-pickup-order/claim-pickup-order.html
index b14f5410c4..000568ef2c 100644
--- a/print/templates/reports/claim-pickup-order/claim-pickup-order.html
+++ b/print/templates/reports/claim-pickup-order/claim-pickup-order.html
@@ -20,7 +20,7 @@