diff --git a/back/methods/docuware/checkFile.js b/back/methods/docuware/checkFile.js index 19224057c..76789649f 100644 --- a/back/methods/docuware/checkFile.js +++ b/back/methods/docuware/checkFile.js @@ -71,11 +71,10 @@ module.exports = Self => { } try { - const response = await Self.get(fileCabinet, filter); - const [documents] = response.Items; - if (!documents) return false; + const [response] = await Self.get(fileCabinet, filter); + if (!response) return false; - return {id: documents.Id}; + return {id: response['Document ID']}; } catch (error) { return false; } diff --git a/back/methods/docuware/deliveryNoteEmail.js b/back/methods/docuware/deliveryNoteEmail.js index 1557a3a87..a654eb262 100644 --- a/back/methods/docuware/deliveryNoteEmail.js +++ b/back/methods/docuware/deliveryNoteEmail.js @@ -65,7 +65,7 @@ module.exports = Self => { const email = new Email('delivery-note', params); - const docuwareFile = await models.Docuware.download(ctx, id, 'deliveryNote'); + const docuwareFile = await models.Docuware.download(id, 'deliveryNote'); return email.send({ overrideAttachments: true, diff --git a/back/methods/docuware/specs/checkFile.spec.js b/back/methods/docuware/specs/checkFile.spec.js index 8460bb561..c60809e85 100644 --- a/back/methods/docuware/specs/checkFile.spec.js +++ b/back/methods/docuware/specs/checkFile.spec.js @@ -16,19 +16,9 @@ describe('docuware download()', () => { it('should return the document data', async() => { const docuwareId = 1; - const response = { - Items: [ - { - Id: docuwareId, - Fields: [ - { - FieldName: 'ESTADO', - Item: 'Firmado' - } - ] - } - ] - }; + const response = [{ + 'Document ID': docuwareId + }]; spyOn(docuwareModel, 'get').and.returnValue((new Promise(resolve => resolve(response)))); const result = await models.Docuware.checkFile(ticketId, fileCabinetName, null, true); diff --git a/back/methods/docuware/upload.js b/back/methods/docuware/upload.js index 096301e56..7055bf8d5 100644 --- a/back/methods/docuware/upload.js +++ b/back/methods/docuware/upload.js @@ -111,7 +111,7 @@ module.exports = Self => { throw new UserError('Action not allowed on the test environment'); // delete old - const docuwareFile = await models.Docuware.checkFile(ctx, id, fileCabinet, false); + const docuwareFile = await models.Docuware.checkFile(id, fileCabinet, false); if (docuwareFile) { const deleteJson = { 'Field': [{'FieldName': 'ESTADO', 'Item': 'Pendiente eliminar', 'ItemElementName': 'String'}] diff --git a/back/methods/osticket/sendToSupport.js b/back/methods/osticket/sendToSupport.js index 320691e23..5b9ebb4e3 100644 --- a/back/methods/osticket/sendToSupport.js +++ b/back/methods/osticket/sendToSupport.js @@ -33,14 +33,14 @@ module.exports = Self => { await Self.app.models.EmailUser.findById(ctx.req.accessToken.userId, {fields: ['email']}); let html = `Motivo:
${reason}
`; + html += `Usuario:
${ctx.req.accessToken.userId} ${emailUser.email}
`; for (const data in additionalData) html += `${data}:
${tryParse(additionalData[data])}
`; const subjectReason = JSON.parse(additionalData?.httpRequest)?.data?.error; smtp.send({ - to: config.app.reportEmail, - replyTo: emailUser.email, + to: `${config.app.reportEmail}, ${emailUser.email}`, subject: '[Support-Salix] ' + additionalData?.frontPath + ' ' + diff --git a/db/changes/233001/00-aclSaleTracking.sql b/db/changes/233001/00-aclSaleTracking.sql new file mode 100644 index 000000000..6a699091a --- /dev/null +++ b/db/changes/233001/00-aclSaleTracking.sql @@ -0,0 +1,4 @@ +INSERT INTO `salix`.`ACL` (model, property, accessType, permission, principalType, principalId) + VALUES + ('SaleTracking', 'deleteSaleGroupDetail', 'WRITE', 'ALLOW', 'ROLE', 'employee'), + ('SaleTracking', 'replaceOrCreate', 'WRITE', 'ALLOW', 'ROLE', 'employee'); diff --git a/db/changes/233201/00-saleGroupDetail.sql b/db/changes/233201/00-saleGroupDetail.sql new file mode 100644 index 000000000..d16478716 --- /dev/null +++ b/db/changes/233201/00-saleGroupDetail.sql @@ -0,0 +1,7 @@ +DELETE FROM `vn`.`saleGroupDetail` WHERE id IN (468106,468104,468107,468105,495210,495208,495207,495209,462879,462880,447186,450623,450622,455606,455605,455827,455829,455828,459067,460689,460691,460690,460692,462408,463403,463405,463404,463129,463127,463126,463128,468098,468096,468099,468097,468310,468314,468313,475654,468325,473248,474803,474739,475042,475052,475047,475041,475051,475046,475040,475050,475045,475039,475049,475044,475038,475048,475043,474888,474892,474890,474887,474891,474889,481109,481107,481105,481108,481106,481110,479008,490787,490792,490791,485295,485294,485293,485528,490796,487853,487959,491303,490789,490914,490913,492305,492310,492307,492304,492309,492306,492303,492308,494111,494110,494480,494482,494481,494483,495202,495200,495199,495201,497209,499765,499763,499767,499764,499768,499766,502014,502013,508820,508819,508818,463133,463131,463130,463132,468102,468100,468103,468101,468311,468316,468315,468327,474894,474898,474896,474893,474897,474895,495206,495204,495203,495205,499771,499769,499773,499770,499774,499772); +ALTER TABLE `vn`.`saleGroupDetail` ADD CONSTRAINT saleGroupDetail_UN UNIQUE KEY (saleFk); + +INSERT INTO `salix`.`ACL` (`model`,`property`,`accessType`,`permission`,`principalId`) + VALUES + ('SaleGroupDetail','deleteById','WRITE','ALLOW','employee'); + diff --git a/front/core/services/token.js b/front/core/services/token.js index c16cc3c4f..426fe2b73 100644 --- a/front/core/services/token.js +++ b/front/core/services/token.js @@ -60,7 +60,7 @@ export default class Token { if (!this.token) return; const created = storage.getItem('vnTokenCreated'); this.created = created && new Date(created); - this.renewPeriod = storage.getItem('vnTokenRenewPeriod'); + this.ttl = storage.getItem('vnTokenTtl'); } setStorage(storage, token, created, ttl) { diff --git a/modules/item/back/methods/item-shelving-sale/filter.js b/modules/item/back/methods/item-shelving-sale/filter.js index 12029d33d..01a9f1856 100644 --- a/modules/item/back/methods/item-shelving-sale/filter.js +++ b/modules/item/back/methods/item-shelving-sale/filter.js @@ -28,11 +28,15 @@ module.exports = Self => { Object.assign(myOptions, options); const stmt = new ParameterizedSQL(` - SELECT iss.created, + SELECT + iss.id, + iss.created, iss.saleFk, iss.quantity, iss.userFk, + ish.id itemShelvingFk, ish.shelvingFk, + s.parkingFk, p.code, u.name FROM itemShelvingSale iss diff --git a/modules/item/back/models/item-shelving.json b/modules/item/back/models/item-shelving.json index 8628bfeee..ff9ecabe3 100644 --- a/modules/item/back/models/item-shelving.json +++ b/modules/item/back/models/item-shelving.json @@ -41,11 +41,6 @@ "type": "belongsTo", "model": "VnUser", "foreignKey": "userFk" - }, - "shelving": { - "type": "belongsTo", - "model": "Shelving", - "foreignKey": "shelvingFk" } } } diff --git a/modules/monitor/front/index/orders/index.html b/modules/monitor/front/index/orders/index.html index 74e80e40e..4d1171185 100644 --- a/modules/monitor/front/index/orders/index.html +++ b/modules/monitor/front/index/orders/index.html @@ -32,7 +32,7 @@ - @@ -46,7 +46,7 @@ ui-sref="order.card.summary({id: {{::order.id}}})" target="_blank"> - @@ -98,7 +98,7 @@ scroll-offset="100"> - Filter by selection - Exclude selection - Remove filter - Remove all filters - Copy value @@ -138,4 +138,4 @@ on-accept="$ctrl.onDelete()" question="All the selected elements will be deleted. Are you sure you want to continue?" message="Delete selected elements"> - \ No newline at end of file + diff --git a/modules/order/front/catalog-search-panel/index.js b/modules/order/front/catalog-search-panel/index.js index 21c0c50fa..b84243ca7 100644 --- a/modules/order/front/catalog-search-panel/index.js +++ b/modules/order/front/catalog-search-panel/index.js @@ -25,10 +25,6 @@ class Controller extends SearchPanel { this.filter.values.push({}); setTimeout(() => this.parentPopover.relocate()); } - - changeTag() { - - } } ngModule.vnComponent('vnOrderCatalogSearchPanel', { diff --git a/modules/route/front/tickets/index.html b/modules/route/front/tickets/index.html index ea6755cca..46b62c5ba 100644 --- a/modules/route/front/tickets/index.html +++ b/modules/route/front/tickets/index.html @@ -58,7 +58,7 @@ Street City PC - Client + Client Warehouse Packages @@ -100,9 +100,9 @@ {{::ticket.street}} - diff --git a/modules/ticket/back/methods/sale-tracking/delete.js b/modules/ticket/back/methods/sale-tracking/delete.js new file mode 100644 index 000000000..0b977e5d4 --- /dev/null +++ b/modules/ticket/back/methods/sale-tracking/delete.js @@ -0,0 +1,69 @@ + +module.exports = Self => { + Self.remoteMethod('delete', { + description: 'Delete sale trackings and item shelving sales', + accessType: 'READ', + accepts: [ + { + arg: 'saleFk', + type: 'number', + description: 'The sale id' + }, + { + arg: 'stateCode', + type: 'string' + } + ], + returns: { + type: ['object'], + root: true + }, + http: { + path: `/delete`, + verb: 'POST' + } + }); + + Self.delete = async(saleFk, stateCode, options) => { + const models = Self.app.models; + const myOptions = {}; + let tx; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + if (!myOptions.transaction) { + tx = await Self.beginTransaction({}); + myOptions.transaction = tx; + } + + try { + if (stateCode === 'PREPARED') { + const itemShelvingSales = await models.ItemShelvingSale.find({where: {saleFk: saleFk}}, myOptions); + for (let itemShelvingSale of itemShelvingSales) + await itemShelvingSale.destroy(myOptions); + } + + const state = await models.State.findOne({ + where: {code: stateCode} + }, myOptions); + + const filter = { + where: { + saleFk: saleFk, + stateFk: state.id + } + }; + const saleTrackings = await models.SaleTracking.find(filter, myOptions); + for (let saleTracking of saleTrackings) + await saleTracking.destroy(myOptions); + + if (tx) await tx.commit(); + + return true; + } catch (e) { + if (tx) await tx.rollback(); + throw e; + } + }; +}; diff --git a/modules/ticket/back/methods/sale-tracking/filter.js b/modules/ticket/back/methods/sale-tracking/filter.js new file mode 100644 index 000000000..2fa21cb1a --- /dev/null +++ b/modules/ticket/back/methods/sale-tracking/filter.js @@ -0,0 +1,94 @@ + +const ParameterizedSQL = require('loopback-connector').ParameterizedSQL; + +module.exports = Self => { + Self.remoteMethod('filter', { + 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'} + }, + { + arg: 'filter', + type: 'object', + description: 'Filter defining where and paginated data' + } + ], + returns: { + type: ['object'], + root: true + }, + http: { + path: `/:id/filter`, + verb: 'GET' + } + }); + + Self.filter = async(id, filter, options) => { + const conn = Self.dataSource.connector; + const myOptions = {}; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + const stmts = []; + let stmt; + + stmts.push('CALL cache.last_buy_refresh(FALSE)'); + + stmt = new ParameterizedSQL( + `SELECT t.clientFk, + t.shipped, + s.ticketFk, + s.itemFk, + s.quantity, + s.concept, + s.id saleFk, + i.image, + i.subName, + IF(stPrevious.saleFk,TRUE,FALSE) as isPreviousSelected, + stPrevious.isChecked as isPrevious, + stPrepared.isChecked as isPrepared, + stControled.isChecked as isControled, + sgd.id saleGroupDetailFk, + (MAX(sgd.id) IS NOT NULL) AS hasSaleGroupDetail, + p.code AS parkingCode, + i.value5, + i.value6, + i.value7, + i.value8, + i.value9, + i.value10 + FROM vn.ticket t + JOIN vn.sale s ON s.ticketFk = t.id + JOIN vn.item i ON i.id = s.itemFk + LEFT JOIN cache.last_buy lb ON lb.item_id = i.id AND lb.warehouse_id = t.warehouseFk + LEFT JOIN vn.state st ON TRUE + LEFT JOIN vn.saleTracking stPrevious ON stPrevious.saleFk = s.id + AND stPrevious.stateFk = (SELECT id FROM vn.state WHERE code = 'PREVIOUS_PREPARATION') + LEFT JOIN vn.saleTracking stPrepared ON stPrepared.saleFk = s.id + AND stPrepared.stateFk = (SELECT id FROM vn.state WHERE code = 'PREPARED') + LEFT JOIN vn.saleTracking stControled ON stControled.saleFk = s.id + AND stControled.stateFk = (SELECT id FROM vn.state s2 WHERE code = 'CHECKED') + LEFT JOIN vn.saleGroupDetail sgd ON sgd.saleFk = s.id + LEFT JOIN vn.saleGroup sg ON sg.id = sgd.saleGroupFk + LEFT JOIN vn.parking p ON p.id = sg.parkingFk + WHERE t.id = ? + GROUP BY s.id`, [id]); + + stmts.push(stmt); + + stmt.merge(Self.makeSuffix(filter)); + + const index = stmts.push(stmt) - 1; + const sql = ParameterizedSQL.join(stmts, ';'); + const result = await conn.executeStmt(sql, myOptions); + + return result[index]; + }; +}; diff --git a/modules/ticket/back/methods/sale-tracking/new.js b/modules/ticket/back/methods/sale-tracking/new.js new file mode 100644 index 000000000..6a99c299c --- /dev/null +++ b/modules/ticket/back/methods/sale-tracking/new.js @@ -0,0 +1,90 @@ + +module.exports = Self => { + Self.remoteMethodCtx('new', { + description: `Replaces the record or creates it if it doesn't exist`, + accessType: 'READ', + accepts: [ + { + arg: 'saleFk', + type: 'number', + description: 'The sale id' + }, + { + arg: 'isChecked', + type: 'boolean' + }, + { + arg: 'quantity', + type: 'number' + }, + { + arg: 'stateCode', + type: 'string' + } + ], + returns: { + type: ['object'], + root: true + }, + http: { + path: `/new`, + verb: 'POST' + } + }); + + Self.new = async(ctx, saleFk, isChecked, quantity, stateCode, options) => { + const models = Self.app.models; + const userId = ctx.req.accessToken.userId; + const myOptions = {}; + let tx; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + if (!myOptions.transaction) { + tx = await Self.beginTransaction({}); + myOptions.transaction = tx; + } + try { + const state = await models.State.findOne({ + where: {code: stateCode} + }, myOptions); + + const saleTracking = await models.SaleTracking.findOne({ + where: { + saleFk: saleFk, + stateFk: state.id, + workerFk: userId + } + }, myOptions); + + let newSaleTracking; + if (saleTracking) { + newSaleTracking = await saleTracking.updateAttributes({ + saleFk: saleFk, + stateFk: state.id, + workerFk: userId, + isChecked: isChecked, + originalQuantity: quantity, + isScanned: null + }, myOptions); + } else { + newSaleTracking = await models.SaleTracking.create({ + saleFk: saleFk, + stateFk: state.id, + workerFk: userId, + isChecked: isChecked, + originalQuantity: quantity, + isScanned: null + }, myOptions); + } + + if (tx) await tx.commit(); + + return newSaleTracking; + } catch (e) { + if (tx) await tx.rollback(); + throw e; + } + }; +}; diff --git a/modules/ticket/back/methods/sale-tracking/specs/delete.spec.js b/modules/ticket/back/methods/sale-tracking/specs/delete.spec.js new file mode 100644 index 000000000..a8bcf5692 --- /dev/null +++ b/modules/ticket/back/methods/sale-tracking/specs/delete.spec.js @@ -0,0 +1,30 @@ +const models = require('vn-loopback/server/server').models; + +describe('sale-tracking delete()', () => { + it('should delete a row of saleTracking and itemShelvingSale', async() => { + const tx = await models.SaleTracking.beginTransaction({}); + + try { + const options = {transaction: tx}; + + const itemShelvingsBefore = await models.ItemShelvingSale.find(null, options); + const saleTrackingsBefore = await models.SaleTracking.find(null, options); + + const saleFk = 1; + const stateCode = 'PREPARED'; + const result = await models.SaleTracking.delete(saleFk, stateCode, options); + + const itemShelvingsAfter = await models.ItemShelvingSale.find(null, options); + const saleTrackingsAfter = await models.SaleTracking.find(null, options); + + expect(result).toEqual(true); + expect(saleTrackingsAfter.length).toBeLessThan(saleTrackingsBefore.length); + expect(itemShelvingsAfter.length).toBeLessThan(itemShelvingsBefore.length); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); +}); diff --git a/modules/ticket/back/methods/sale-tracking/specs/filter.spec.js b/modules/ticket/back/methods/sale-tracking/specs/filter.spec.js new file mode 100644 index 000000000..8a679f3a5 --- /dev/null +++ b/modules/ticket/back/methods/sale-tracking/specs/filter.spec.js @@ -0,0 +1,23 @@ +const app = require('vn-loopback/server/server'); + +describe('sale-tracking filter()', () => { + it('should return 1 result filtering by ticket id', async() => { + const tx = await app.models.Claim.beginTransaction({}); + + try { + const options = {transaction: tx}; + + const id = 1; + const filter = {order: ['concept ASC', 'quantity DESC']}; + const result = await app.models.SaleTracking.filter(id, filter, options); + + expect(result.length).toEqual(4); + expect(result[0].ticketFk).toEqual(1); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); +}); diff --git a/modules/ticket/back/methods/sale-tracking/specs/listSaleTracking.spec.js b/modules/ticket/back/methods/sale-tracking/specs/listSaleTracking.spec.js index d51c56874..89f274c57 100644 --- a/modules/ticket/back/methods/sale-tracking/specs/listSaleTracking.spec.js +++ b/modules/ticket/back/methods/sale-tracking/specs/listSaleTracking.spec.js @@ -1,6 +1,6 @@ const models = require('vn-loopback/server/server').models; -describe('ticket listSaleTracking()', () => { +describe('sale-tracking listSaleTracking()', () => { it('should call the listSaleTracking method and return the response', async() => { const tx = await models.SaleTracking.beginTransaction({}); diff --git a/modules/ticket/back/methods/sale-tracking/specs/new.spec.js b/modules/ticket/back/methods/sale-tracking/specs/new.spec.js new file mode 100644 index 000000000..fcd383582 --- /dev/null +++ b/modules/ticket/back/methods/sale-tracking/specs/new.spec.js @@ -0,0 +1,49 @@ +const models = require('vn-loopback/server/server').models; + +describe('sale-tracking new()', () => { + it('should update a saleTracking', async() => { + const tx = await models.SaleTracking.beginTransaction({}); + + try { + const options = {transaction: tx}; + const ctx = {req: {accessToken: {userId: 55}}}; + + const saleFk = 1; + const isChecked = true; + const quantity = 20; + const stateCode = 'PREPARED'; + const result = await models.SaleTracking.new(ctx, saleFk, isChecked, quantity, stateCode, options); + + expect(result.isChecked).toBe(true); + expect(result.originalQuantity).toBe(20); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); + + it('should create a saleTracking', async() => { + const tx = await models.SaleTracking.beginTransaction({}); + + try { + const options = {transaction: tx}; + const ctx = {req: {accessToken: {userId: 1}}}; + + const saleFk = 1; + const isChecked = true; + const quantity = 20; + const stateCode = 'PREPARED'; + const result = await models.SaleTracking.new(ctx, saleFk, isChecked, quantity, stateCode, options); + + expect(result.isChecked).toBe(true); + expect(result.originalQuantity).toBe(20); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); +}); diff --git a/modules/ticket/back/methods/sale/salePreparingList.js b/modules/ticket/back/methods/sale/salePreparingList.js deleted file mode 100644 index e6e7d5164..000000000 --- a/modules/ticket/back/methods/sale/salePreparingList.js +++ /dev/null @@ -1,33 +0,0 @@ -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/methods/ticket/docuwareDownload.js b/modules/ticket/back/methods/ticket/docuwareDownload.js index e9b74b1a9..7084bbdd4 100644 --- a/modules/ticket/back/methods/ticket/docuwareDownload.js +++ b/modules/ticket/back/methods/ticket/docuwareDownload.js @@ -32,6 +32,14 @@ module.exports = Self => { }); Self.docuwareDownload = async id => { + const models = Self.app.models; + const docuwareInfo = await models.Docuware.findOne({ + where: { + code: 'deliveryNote', + action: 'find' + } + }); + const filter = { condition: [ { @@ -50,6 +58,6 @@ module.exports = Self => { } ] }; - return Self.app.models.Docuware.download(id, 'deliveryNote', filter); + return models.Docuware.download(id, 'deliveryNote', filter); }; }; diff --git a/modules/ticket/back/models/sale-tracking.js b/modules/ticket/back/models/sale-tracking.js index 4a46dd6b7..54a2b5a1a 100644 --- a/modules/ticket/back/models/sale-tracking.js +++ b/modules/ticket/back/models/sale-tracking.js @@ -1,3 +1,6 @@ module.exports = Self => { + require('../methods/sale-tracking/filter')(Self); require('../methods/sale-tracking/listSaleTracking')(Self); + require('../methods/sale-tracking/new')(Self); + require('../methods/sale-tracking/delete')(Self); }; diff --git a/modules/ticket/back/models/sale.js b/modules/ticket/back/models/sale.js index bab201fdd..ae247fc24 100644 --- a/modules/ticket/back/models/sale.js +++ b/modules/ticket/back/models/sale.js @@ -1,6 +1,5 @@ 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/back/models/ticket-methods.js b/modules/ticket/back/models/ticket-methods.js index c37337253..14cb104be 100644 --- a/modules/ticket/back/models/ticket-methods.js +++ b/modules/ticket/back/models/ticket-methods.js @@ -42,4 +42,5 @@ module.exports = function(Self) { require('../methods/ticket/expeditionPalletLabel')(Self); require('../methods/ticket/saveSign')(Self); require('../methods/ticket/invoiceTickets')(Self); + require('../methods/ticket/docuwareDownload')(Self); }; diff --git a/modules/ticket/front/descriptor-menu/index.js b/modules/ticket/front/descriptor-menu/index.js index 360d93564..d1f39fd19 100644 --- a/modules/ticket/front/descriptor-menu/index.js +++ b/modules/ticket/front/descriptor-menu/index.js @@ -3,10 +3,11 @@ import Section from 'salix/components/section'; import './style.scss'; class Controller extends Section { - constructor($element, $, vnReport, vnEmail) { + constructor($element, $, vnReport, vnEmail, vnFile) { super($element, $); this.vnReport = vnReport; this.vnEmail = vnEmail; + this.vnFile = vnFile; } get ticketId() { @@ -322,7 +323,7 @@ class Controller extends Section { } docuwareDownload() { - this.vnFile.download(`api/Ticket/${this.ticket.id}/docuwareDownload`); + this.vnFile.download(`api/Tickets/${this.ticket.id}/docuwareDownload`); } setTicketWeight(weight) { @@ -335,7 +336,7 @@ class Controller extends Section { } } -Controller.$inject = ['$element', '$scope', 'vnReport', 'vnEmail']; +Controller.$inject = ['$element', '$scope', 'vnReport', 'vnEmail', 'vnFile']; ngModule.vnComponent('vnTicketDescriptorMenu', { template: require('./index.html'), diff --git a/modules/ticket/front/sale-tracking/index.html b/modules/ticket/front/sale-tracking/index.html index 0309dde13..f05cf15fb 100644 --- a/modules/ticket/front/sale-tracking/index.html +++ b/modules/ticket/front/sale-tracking/index.html @@ -1,11 +1,19 @@ + + + + @@ -13,7 +21,7 @@ - Is checked + Is checked Item Description Quantity @@ -23,76 +31,84 @@ - + + ng-class="{ + 'pink': sale.hasSaleGroupDetail, + 'none': !sale.hasSaleGroupDetail, + }" + class="circleState" + vn-tooltip="sale group detail" + vn-click-stop="$ctrl.clickSaleGroupDetail($index)"> - + - + - + - + - + - {{::sale.item.id}} + {{::sale.itemFk}}
- {{::sale.item.name}} - -

{{::sale.item.subName}}

+ {{::sale.concept}} + +

{{::sale.subName}}

{{::sale.quantity}} - {{::sale.saleGroupDetail.saleGroup.parking.code | dashIfEmpty}} + {{::sale.parkingCode | dashIfEmpty}} @@ -154,28 +170,35 @@ - - - + + Quantity Worker - Shelving - Parking + Shelving + Parking Created - {{::itemShelvingSale.quantity}} + + {{itemShelvingSale.quantity}} + + + + + - {{::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 60b422cc0..6c0e7232e 100644 --- a/modules/ticket/front/sale-tracking/index.js +++ b/modules/ticket/front/sale-tracking/index.js @@ -3,62 +3,6 @@ import Section from 'salix/components/section'; import './style.scss'; class Controller extends Section { - constructor($element, $) { - super($element, $); - this.filter = { - include: [ - { - relation: 'item' - }, - { - relation: 'saleTracking', - scope: { - fields: ['isChecked'] - } - }, - { - relation: 'saleGroupDetail', - scope: { - fields: ['saleGroupFk'], - include: { - relation: 'saleGroup', - scope: { - fields: ['parkingFk'], - include: { - relation: 'parking', - scope: { - fields: ['code'] - } - } - } - } - } - } - ] - }; - } - - 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: { @@ -75,20 +19,145 @@ class Controller extends Section { } showSaleTracking(sale) { - this.saleId = sale.id; + this.saleId = sale.saleFk; this.$.saleTracking.show(); } showItemShelvingSale(sale) { - this.saleId = sale.id; + this.saleId = sale.saleFk; this.$.itemShelvingSale.show(); } + + clickSaleGroupDetail(index) { + const sale = this.sales[index]; + if (!sale.saleGroupDetailFk) return; + + return this.$http.delete(`SaleGroupDetails/${sale.saleGroupDetailFk}`) + .then(() => { + sale.hasSaleGroupDetail = false; + this.vnApp.showSuccess(this.$t('Data saved!')); + }); + } + + clickPreviousSelected(index) { + const sale = this.sales[index]; + if (!sale.isPreviousSelected) { + this.saleTrackingNew(sale, 'PREVIOUS_PREPARATION', false); + sale.isPreviousSelected = true; + } else { + this.saleTrackingDel(sale, 'PREVIOUS_PREPARATION'); + sale.isPreviousSelected = false; + sale.isPrevious = false; + } + } + + clickPrevious(index) { + const sale = this.sales[index]; + if (!sale.isPrevious) { + this.saleTrackingNew(sale, 'PREVIOUS_PREPARATION', true); + sale.isPrevious = true; + sale.isPreviousSelected = true; + } else { + this.saleTrackingNew(sale, 'PREVIOUS_PREPARATION', false); + sale.isPrevious = false; + } + } + + clickPrepared(index) { + const sale = this.sales[index]; + if (!sale.isPrepared) { + this.saleTrackingNew(sale, 'PREPARED', true); + sale.isPrepared = true; + } else { + this.saleTrackingDel(sale, 'PREPARED'); + sale.isPrepared = false; + } + } + + clickControled(index) { + const sale = this.sales[index]; + if (!sale.isControled) { + this.saleTrackingNew(sale, 'CHECKED', true); + sale.isControled = true; + } else { + this.saleTrackingDel(sale, 'CHECKED'); + sale.isControled = false; + } + } + + saleTrackingNew(sale, stateCode, isChecked) { + const params = { + saleFk: sale.saleFk, + isChecked: isChecked, + quantity: sale.quantity, + stateCode: stateCode + }; + this.$http.post(`SaleTrackings/new`, params).then(() => { + this.vnApp.showSuccess(this.$t('Data saved!')); + }); + } + + saleTrackingDel(sale, stateCode) { + const params = { + saleFk: sale.saleFk, + stateCode: stateCode + }; + this.$http.post(`SaleTrackings/delete`, params).then(() => { + this.vnApp.showSuccess(this.$t('Data saved!')); + }); + } + + updateQuantity(itemShelvingSale) { + const params = { + quantity: itemShelvingSale.quantity + }; + this.$http.patch(`ItemShelvingSales/${itemShelvingSale.id}`, params) + .then(() => { + this.vnApp.showSuccess(this.$t('Data saved!')); + }); + } + + async updateShelving(itemShelvingSale) { + const params = { + shelvingFk: itemShelvingSale.shelvingFk + }; + const res = await this.$http.patch(`ItemShelvings/${itemShelvingSale.itemShelvingFk}`, params); + + const filter = { + fields: ['parkingFk'], + where: { + code: res.data.shelvingFk + } + }; + this.$http.get(`Shelvings/findOne`, {filter}) + .then(res => { + itemShelvingSale.parkingFk = res.data.parkingFk; + this.vnApp.showSuccess(this.$t('Data saved!')); + }); + } + + async updateParking(itemShelvingSale) { + const filter = { + fields: ['id'], + where: { + code: itemShelvingSale.shelvingFk + } + }; + const res = await this.$http.get(`Shelvings/findOne`, {filter}); + + const params = { + parkingFk: itemShelvingSale.parkingFk + }; + this.$http.patch(`Shelvings/${res.data.id}`, params) + .then(() => this.vnApp.showSuccess(this.$t('Data saved!'))); + } } ngModule.vnComponent('vnTicketSaleTracking', { template: require('./index.html'), controller: Controller, bindings: { - ticket: '<' + ticket: '<', + model: '{{invoice.name}}
{{invoice.postalAddress}}
{{invoice.postcodeCity}}
+
{{invoice.postCode}}, {{invoice.city}}, ({{invoice.province}})
{{$t('fiscalId')}}: {{invoice.nif}}
{{$t('phone')}}: {{invoice.phone}}
diff --git a/print/templates/reports/invoiceIn/sql/invoice.sql b/print/templates/reports/invoiceIn/sql/invoice.sql index dae979011..82eeebce0 100644 --- a/print/templates/reports/invoiceIn/sql/invoice.sql +++ b/print/templates/reports/invoiceIn/sql/invoice.sql @@ -4,6 +4,9 @@ SELECT i.issued, s.name, s.street AS postalAddress, + s.city, + s.postCode, + pr.name province, s.nif, s.phone, p.name payMethod @@ -11,4 +14,5 @@ SELECT JOIN supplier s ON s.id = i.supplierFk JOIN company c ON c.id = i.companyFk JOIN payMethod p ON p.id = s.payMethodFk + LEFT JOIN province pr ON pr.id = s.provinceFk WHERE i.id = ?