diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1c97e65d6b..3f241b91fe 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- [Artículo](Datos Básicos) Añadido campo Unidades/Caja
### Changed
+- [Tickets](Líneas preparadas) Actualizada sección para que sea más visual
### Fixed
- [General] Al utilizar el traductor de Google se descuadraban los iconos
diff --git a/db/changes/230201/00-ACL_ItemShelvingSale.sql b/db/changes/230201/00-ACL_ItemShelvingSale.sql
new file mode 100644
index 0000000000..38b65f89aa
--- /dev/null
+++ b/db/changes/230201/00-ACL_ItemShelvingSale.sql
@@ -0,0 +1,2 @@
+INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalId`)
+ VALUES ('ItemShelvingSale','*','*','ALLOW','employee');
diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql
index 06c6f64f37..f1c9df51f5 100644
--- a/db/dump/fixtures.sql
+++ b/db/dump/fixtures.sql
@@ -1143,10 +1143,10 @@ INSERT INTO `vn`.`itemShelving` (`itemFk`, `shelvingFk`, `visible`, `grouping`,
INSERT INTO `vn`.`itemShelvingSale` (`itemShelvingFk`, `saleFk`, `quantity`, `created`, `userFk`)
VALUES
- ('1', '1', '1', '', '1106'),
- ('2', '2', '5', '', '1106'),
- ('1', '7', '1', '', '1106'),
- ('2', '8', '5', '', '1106');
+ ('1', '1', '1', util.VN_CURDATE(), '1106'),
+ ('2', '2', '5', util.VN_CURDATE(), '1106'),
+ ('1', '7', '1', util.VN_CURDATE(), '1106'),
+ ('2', '8', '5', util.VN_CURDATE(), '1106');
INSERT INTO `vncontrol`.`accion`(`accion_id`, `accion`)
VALUES
diff --git a/front/core/components/table/style.scss b/front/core/components/table/style.scss
index d0a29a3ba7..5572686618 100644
--- a/front/core/components/table/style.scss
+++ b/front/core/components/table/style.scss
@@ -29,7 +29,7 @@ vn-table {
& > tbody {
display: table-row-group;
}
- & > vn-tfoot,
+ & > vn-tfoot,
& > .vn-tfoot,
& > tfoot {
border-top: $border;
@@ -42,7 +42,7 @@ vn-table {
height: 48px;
}
vn-thead, .vn-thead,
- vn-tbody, .vn-tbody,
+ vn-tbody, .vn-tbody,
vn-tfoot, .vn-tfoot,
thead, tbody, tfoot {
& > * {
@@ -153,6 +153,18 @@ vn-table {
background-color: $color-font-bg-dark;
color: $color-font-bg;
}
+ &.dark-notice {
+ background-color: $color-notice;
+ color: $color-font-bg;
+ }
+ &.yellow {
+ background-color: $color-yellow;
+ color: $color-font-bg;
+ }
+ &.pink {
+ background-color: $color-pink;
+ color: $color-font-bg;
+ }
}
vn-icon-menu {
display: inline-block;
@@ -194,7 +206,7 @@ vn-table.scrollable > .vn-table,
}
vn-thead th,
- vn-thead vn-th,
+ vn-thead vn-th,
thead vn-th,
thead th {
border-bottom: $border;
@@ -217,4 +229,4 @@ vn-table.scrollable.lg,
.tableWrapper {
overflow-x: auto;
-}
\ No newline at end of file
+}
diff --git a/front/core/styles/variables.scss b/front/core/styles/variables.scss
index c79a8590fb..bcc9fab667 100644
--- a/front/core/styles/variables.scss
+++ b/front/core/styles/variables.scss
@@ -101,6 +101,8 @@ $color-marginal: #222;
$color-success: #a3d131;
$color-notice: #32b1ce;
$color-alert: #fa3939;
+$color-pink: #ff99cc;
+$color-yellow: #ffff00;
$color-button: $color-secondary;
$color-spacer: rgba(255, 255, 255, .3);
diff --git a/modules/invoiceOut/back/methods/invoiceOut/specs/createPdf.spec.js b/modules/invoiceOut/back/methods/invoiceOut/specs/createPdf.spec.js
index ee3310368e..803338ef33 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/specs/createPdf.spec.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/specs/createPdf.spec.js
@@ -11,7 +11,6 @@ describe('InvoiceOut createPdf()', () => {
const ctx = {req: activeCtx};
it('should create a new PDF file and set true the hasPdf property', async() => {
- pending('https://redmine.verdnatura.es/issues/4875');
const invoiceId = 1;
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
active: activeCtx
diff --git a/modules/invoiceOut/back/methods/invoiceOut/specs/downloadZip.spec.js b/modules/invoiceOut/back/methods/invoiceOut/specs/downloadZip.spec.js
index 4d18336351..41ea454871 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/specs/downloadZip.spec.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/specs/downloadZip.spec.js
@@ -13,7 +13,6 @@ describe('InvoiceOut downloadZip()', () => {
};
it('should return part of link to dowloand the zip', async() => {
- pending('https://redmine.verdnatura.es/issues/4875');
const tx = await models.InvoiceOut.beginTransaction({});
try {
diff --git a/modules/invoiceOut/back/methods/invoiceOut/specs/filter.spec.js b/modules/invoiceOut/back/methods/invoiceOut/specs/filter.spec.js
index 7b58862365..e5cf5fda03 100644
--- a/modules/invoiceOut/back/methods/invoiceOut/specs/filter.spec.js
+++ b/modules/invoiceOut/back/methods/invoiceOut/specs/filter.spec.js
@@ -51,7 +51,6 @@ describe('InvoiceOut filter()', () => {
});
it('should return the invoice out matching hasPdf', async() => {
- pending('https://redmine.verdnatura.es/issues/4875');
const tx = await models.InvoiceOut.beginTransaction({});
const options = {transaction: tx};
@@ -67,7 +66,7 @@ describe('InvoiceOut filter()', () => {
const result = await models.InvoiceOut.filter(ctx, {id: invoiceOut.id}, options);
- expect(result.length).toEqual(1);
+ expect(result.length).toBeGreaterThanOrEqual(1);
await tx.rollback();
} catch (e) {
diff --git a/modules/item/back/methods/item-shelving-sale/filter.js b/modules/item/back/methods/item-shelving-sale/filter.js
new file mode 100644
index 0000000000..12029d33d0
--- /dev/null
+++ b/modules/item/back/methods/item-shelving-sale/filter.js
@@ -0,0 +1,49 @@
+
+const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
+
+module.exports = Self => {
+ Self.remoteMethod('filter', {
+ description: 'Returns all item shelving sale matching with the filter',
+ accessType: 'READ',
+ accepts: [{
+ arg: 'filter',
+ type: 'object',
+ description: 'Filter defining where and paginated data'
+ }],
+ returns: {
+ type: ['object'],
+ root: true
+ },
+ http: {
+ path: `/filter`,
+ verb: 'GET'
+ }
+ });
+
+ Self.filter = async(filter, options) => {
+ const conn = Self.dataSource.connector;
+ const myOptions = {};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ const stmt = new ParameterizedSQL(`
+ SELECT iss.created,
+ iss.saleFk,
+ iss.quantity,
+ iss.userFk,
+ ish.shelvingFk,
+ p.code,
+ u.name
+ FROM itemShelvingSale iss
+ LEFT JOIN itemShelving ish ON iss.itemShelvingFk = ish.id
+ LEFT JOIN shelving s ON ish.shelvingFk = s.code
+ LEFT JOIN parking p ON s.parkingFk = p.id
+ LEFT JOIN account.user u ON u.id = iss.userFk`
+ );
+
+ stmt.merge(conn.makeSuffix(filter));
+
+ return conn.executeStmt(stmt);
+ };
+};
diff --git a/modules/item/back/models/item-shelving-sale.js b/modules/item/back/models/item-shelving-sale.js
new file mode 100644
index 0000000000..b89be9f00c
--- /dev/null
+++ b/modules/item/back/models/item-shelving-sale.js
@@ -0,0 +1,3 @@
+module.exports = Self => {
+ require('../methods/item-shelving-sale/filter')(Self);
+};
diff --git a/modules/item/back/models/item-shelving.json b/modules/item/back/models/item-shelving.json
index 951a4553ab..0890350dac 100644
--- a/modules/item/back/models/item-shelving.json
+++ b/modules/item/back/models/item-shelving.json
@@ -12,21 +12,12 @@
"id": true,
"description": "Identifier"
},
- "shelve": {
- "type": "string"
- },
"shelvingFk": {
"type": "string"
},
"itemFk": {
"type": "number"
},
- "deep": {
- "type": "number"
- },
- "quantity": {
- "type": "number"
- },
"created": {
"type": "date"
}
@@ -41,6 +32,11 @@
"type": "belongsTo",
"model": "Account",
"foreignKey": "userFk"
- }
+ },
+ "shelving": {
+ "type": "belongsTo",
+ "model": "Shelving",
+ "foreignKey": "shelvingFk"
+ }
}
}
diff --git a/modules/ticket/back/methods/sale/salePreparingList.js b/modules/ticket/back/methods/sale/salePreparingList.js
new file mode 100644
index 0000000000..e6e7d5164c
--- /dev/null
+++ b/modules/ticket/back/methods/sale/salePreparingList.js
@@ -0,0 +1,33 @@
+module.exports = Self => {
+ Self.remoteMethodCtx('salePreparingList', {
+ description: 'Returns a list with the lines of a ticket and its different states of preparation',
+ accessType: 'READ',
+ accepts: [{
+ arg: 'id',
+ type: 'number',
+ required: true,
+ description: 'The ticket id',
+ http: {source: 'path'}
+ }],
+ returns: {
+ type: ['object'],
+ root: true
+ },
+ http: {
+ path: `/:id/salePreparingList`,
+ verb: 'GET'
+ }
+ });
+
+ Self.salePreparingList = async(ctx, id, options) => {
+ const myOptions = {};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ query = `CALL vn.salePreparingList(?)`;
+ const [sales] = await Self.rawSql(query, [id], myOptions);
+
+ return sales;
+ };
+};
diff --git a/modules/ticket/back/models/sale.js b/modules/ticket/back/models/sale.js
index ae247fc242..bab201fddb 100644
--- a/modules/ticket/back/models/sale.js
+++ b/modules/ticket/back/models/sale.js
@@ -1,5 +1,6 @@
module.exports = Self => {
require('../methods/sale/getClaimableFromTicket')(Self);
+ require('../methods/sale/salePreparingList')(Self);
require('../methods/sale/reserve')(Self);
require('../methods/sale/deleteSales')(Self);
require('../methods/sale/updatePrice')(Self);
diff --git a/modules/ticket/front/sale-tracking/index.html b/modules/ticket/front/sale-tracking/index.html
index fc585650a3..8518175514 100644
--- a/modules/ticket/front/sale-tracking/index.html
+++ b/modules/ticket/front/sale-tracking/index.html
@@ -1,10 +1,11 @@
@@ -12,31 +13,27 @@
-
+ Is checked
Item
- Description
+ Description
Quantity
- Original
- Worker
- State
- Created
+
-
-
-
-
+
+
+
+
+
+
+
- {{sale.itemFk | zeroFill:6}}
+ {{::sale.itemFk | zeroFill:6}}
@@ -53,16 +50,18 @@
{{::sale.quantity}}
- {{::sale.originalQuantity}}
-
-
- {{::sale.userNickname | dashIfEmpty}}
-
+
+
+
+
+
- {{::sale.state}}
- {{::sale.created | date: 'dd/MM/yyyy HH:mm'}}
@@ -70,8 +69,99 @@
+ warehouse-fk="$ctrl.ticket.warehouseFk"
+ ticket-fk="$ctrl.ticket.id">
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+ Quantity
+ Original
+ Worker
+ State
+ Created
+
+
+
+
+ {{::sale.quantity}}
+ {{::sale.originalQuantity}}
+
+
+ {{::sale.userNickname | dashIfEmpty}}
+
+
+ {{::sale.state}}
+ {{::sale.created | date: 'dd/MM/yyyy HH:mm'}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Quantity
+ Worker
+ Shelving
+ Parking
+ Created
+
+
+
+
+ {{::itemShelvingSale.quantity}}
+
+
+ {{::itemShelvingSale.name | dashIfEmpty}}
+
+
+ {{::itemShelvingSale.shelvingFk}}
+ {{::itemShelvingSale.code}}
+ {{::itemShelvingSale.created | date: 'dd/MM/yyyy HH:mm'}}
+
+
+
+
+
+
+
+
diff --git a/modules/ticket/front/sale-tracking/index.js b/modules/ticket/front/sale-tracking/index.js
index 394ef4f1ee..60e42a461b 100644
--- a/modules/ticket/front/sale-tracking/index.js
+++ b/modules/ticket/front/sale-tracking/index.js
@@ -1,12 +1,100 @@
import ngModule from '../module';
import Section from 'salix/components/section';
+import './style.scss';
-class Controller extends Section {}
+class Controller extends Section {
+ constructor($element, $) {
+ super($element, $);
+ this.filter = {
+ include: [
+ {
+ relation: 'item'
+ }, {
+ relation: 'saleTracking',
+ scope: {
+ fields: ['isChecked']
+ }
+ }
+ ]
+ };
+ }
+
+ get sales() {
+ return this._sales;
+ }
+
+ set sales(value) {
+ this._sales = value;
+ if (value) {
+ const query = `Sales/${this.$params.id}/salePreparingList`;
+ this.$http.get(query)
+ .then(res => {
+ this.salePreparingList = res.data;
+ for (const salePreparing of this.salePreparingList) {
+ for (const sale of this.sales) {
+ if (salePreparing.saleFk == sale.id)
+ sale.preparingList = salePreparing;
+ }
+ }
+ });
+ }
+ }
+
+ showItemDescriptor(event, sale) {
+ this.quicklinks = {
+ btnThree: {
+ icon: 'icon-transaction',
+ state: `item.card.diary({
+ id: ${sale.itemFk},
+ warehouseFk: ${this.ticket.warehouseFk},
+ lineFk: ${sale.id}
+ })`,
+ tooltip: 'Item diary'
+ }
+ };
+ this.$.itemDescriptor.show(event.target, sale.itemFk);
+ }
+
+ chipHasSaleGroupDetail(hasSaleGroupDetail) {
+ if (hasSaleGroupDetail) return 'pink';
+ else return 'message';
+ }
+
+ chipIsPreviousSelected(isPreviousSelected) {
+ if (isPreviousSelected) return 'notice';
+ else return 'message';
+ }
+
+ chipIsPrevious(isPrevious) {
+ if (isPrevious) return 'dark-notice';
+ else return 'message';
+ }
+
+ chipIsPrepared(isPrepared) {
+ if (isPrepared) return 'warning';
+ else return 'message';
+ }
+
+ chipIsControled(isControled) {
+ if (isControled) return 'yellow';
+ else return 'message';
+ }
+
+ showSaleTracking(sale) {
+ this.saleId = sale.id;
+ this.$.saleTracking.show();
+ }
+
+ showItemShelvingSale(sale) {
+ this.saleId = sale.id;
+ this.$.itemShelvingSale.show();
+ }
+}
ngModule.vnComponent('vnTicketSaleTracking', {
template: require('./index.html'),
controller: Controller,
bindings: {
- ticket: '<',
- },
+ ticket: '<'
+ }
});
diff --git a/modules/ticket/front/sale-tracking/locale/es.yml b/modules/ticket/front/sale-tracking/locale/es.yml
new file mode 100644
index 0000000000..eabc0a04d7
--- /dev/null
+++ b/modules/ticket/front/sale-tracking/locale/es.yml
@@ -0,0 +1,6 @@
+ItemShelvings sale: Carros línea
+has saleGroupDetail: tiene detalle grupo lineas
+is previousSelected: es previa seleccionada
+is previous: es previa
+is prepared: esta preparado
+is controled: esta controlado
diff --git a/modules/ticket/front/sale-tracking/style.scss b/modules/ticket/front/sale-tracking/style.scss
new file mode 100644
index 0000000000..6d8b3db69f
--- /dev/null
+++ b/modules/ticket/front/sale-tracking/style.scss
@@ -0,0 +1,7 @@
+@import "variables";
+
+.chip {
+ display: inline-block;
+ min-width: 15px;
+ min-height: 25px;
+}