diff --git a/db/export-structure.sh b/db/export-structure.sh index e2a5a618b..c5c65ef34 100755 --- a/db/export-structure.sh +++ b/db/export-structure.sh @@ -3,7 +3,6 @@ SCHEMAS=( account bs - bi cache edi hedera diff --git a/loopback/server/datasources.json b/loopback/server/datasources.json index 87fff60e1..0df03882c 100644 --- a/loopback/server/datasources.json +++ b/loopback/server/datasources.json @@ -18,20 +18,15 @@ "acquireTimeout": 20000 }, "osticket": { - "connector": "vn-mysql", - "database": "vn", - "debug": false, - "host": "localhost", - "port": "3306", - "username": "root", - "password": "root" + "connector": "memory", + "timezone": "local" }, "tempStorage": { "name": "tempStorage", "connector": "loopback-component-storage", - "provider": "filesystem", + "provider": "filesystem", "root": "./storage/tmp", - "maxFileSize": "262144000", + "maxFileSize": "262144000", "allowedContentTypes": [ "application/x-7z-compressed", "application/x-zip-compressed", @@ -41,17 +36,17 @@ "application/zip", "application/rar", "multipart/x-zip", - "image/png", - "image/jpeg", + "image/png", + "image/jpeg", "image/jpg" ] }, "dmsStorage": { "name": "dmsStorage", "connector": "loopback-component-storage", - "provider": "filesystem", + "provider": "filesystem", "root": "./storage/dms", - "maxFileSize": "262144000", + "maxFileSize": "262144000", "allowedContentTypes": [ "application/x-7z-compressed", "application/x-zip-compressed", @@ -61,32 +56,32 @@ "application/zip", "application/rar", "multipart/x-zip", - "image/png", - "image/jpeg", + "image/png", + "image/jpeg", "image/jpg" ] }, "imageStorage": { "name": "imageStorage", "connector": "loopback-component-storage", - "provider": "filesystem", + "provider": "filesystem", "root": "./storage/image", - "maxFileSize": "52428800", + "maxFileSize": "52428800", "allowedContentTypes": [ - "image/png", - "image/jpeg", + "image/png", + "image/jpeg", "image/jpg" ] }, "invoiceStorage": { "name": "invoiceStorage", "connector": "loopback-component-storage", - "provider": "filesystem", + "provider": "filesystem", "root": "./storage/pdfs/invoice", - "maxFileSize": "52428800", + "maxFileSize": "52428800", "allowedContentTypes": [ "application/octet-stream", "application/pdf" ] } -} +} \ No newline at end of file diff --git a/modules/client/front/balance/create/index.html b/modules/client/front/balance/create/index.html index 81be14382..357ae5d03 100644 --- a/modules/client/front/balance/create/index.html +++ b/modules/client/front/balance/create/index.html @@ -60,7 +60,8 @@ + label="Delivered amount" + step="0.01"> { accepts: [ { arg: 'filter', - type: 'Object', + type: 'object', description: 'Filter defining where, order, offset, and limit - must be a JSON-encoded string', http: {source: 'query'} }, { arg: 'search', - type: 'String', + type: 'string', description: 'Searchs the invoiceOut by id', http: {source: 'query'} }, { arg: 'clientFk', - type: 'Integer', + type: 'integer', description: 'The client id', http: {source: 'query'} }, { arg: 'fi', - type: 'String', + type: 'string', description: 'The client fiscal id', http: {source: 'query'} }, { arg: 'hasPdf', - type: 'Boolean', + type: 'boolean', description: 'Whether the the invoiceOut has PDF or not', http: {source: 'query'} }, { arg: 'amount', - type: 'Number', + type: 'number', description: 'The amount filter', http: {source: 'query'} }, { arg: 'min', - type: 'Number', + type: 'number', description: 'The minimun amount flter', http: {source: 'query'} }, { arg: 'max', - type: 'Number', + type: 'number', description: 'The maximun amount flter', http: {source: 'query'} }, { arg: 'issued', - type: 'Date', + type: 'date', description: 'The issued date filter', http: {source: 'query'} }, { arg: 'created', - type: 'Date', + type: 'date', description: 'The created date filter', http: {source: 'query'} }, { arg: 'dued', - type: 'Date', + type: 'date', description: 'The due date filter', http: {source: 'query'} } ], returns: { - type: ['Object'], + type: ['object'], root: true }, http: { diff --git a/modules/item/back/methods/item/filter.js b/modules/item/back/methods/item/filter.js index eba0b0f91..dca808aa3 100644 --- a/modules/item/back/methods/item/filter.js +++ b/modules/item/back/methods/item/filter.js @@ -10,48 +10,57 @@ module.exports = Self => { accepts: [ { arg: 'filter', - type: 'Object', + type: 'object', description: 'Filter defining where, order, offset, and limit - must be a JSON-encoded string', - }, { + }, + { arg: 'tags', - type: ['Object'], + type: ['object'], description: 'List of tags to filter with', - }, { + }, + { arg: 'search', - type: 'String', + type: 'string', description: `If it's and integer searchs by id, otherwise it searchs by name`, - }, { + }, + { arg: 'id', - type: 'Integer', + type: 'integer', description: 'Item id', - }, { + }, + { arg: 'categoryFk', - type: 'Integer', + type: 'integer', description: 'Category id', - }, { + }, + { arg: 'typeFk', - type: 'Integer', + type: 'integer', description: 'Type id', - }, { + }, + { arg: 'isActive', - type: 'Boolean', + type: 'boolean', description: 'Whether the the item is or not active', - }, { + }, + { arg: 'salesPersonFk', - type: 'Integer', + type: 'integer', description: 'The buyer of the item', - }, { + }, + { arg: 'description', - type: 'String', + type: 'string', description: 'The item description', - }, { + }, + { arg: 'stemMultiplier', - type: 'Integer', + type: 'integer', description: 'The item multiplier', } ], returns: { - type: ['Object'], + type: ['object'], root: true }, http: { @@ -60,23 +69,28 @@ module.exports = Self => { } }); - Self.filter = async(ctx, filter) => { - let conn = Self.dataSource.connector; + Self.filter = async(ctx, filter, options) => { + const conn = Self.dataSource.connector; + let myOptions = {}; + + if (typeof options == 'object') + Object.assign(myOptions, options); + let codeWhere; if (ctx.args.search) { - let items = await Self.app.models.ItemBarcode.find({ + const items = await Self.app.models.ItemBarcode.find({ where: {code: ctx.args.search}, fields: ['itemFk'] - }); - let itemIds = []; + }, myOptions); + const itemIds = []; for (const item of items) itemIds.push(item.itemFk); codeWhere = {'i.id': {inq: itemIds}}; } - let where = buildFilter(ctx.args, (param, value) => { + const where = buildFilter(ctx.args, (param, value) => { switch (param) { case 'search': return /^\d+$/.test(value) @@ -90,8 +104,8 @@ module.exports = Self => { return {'i.stemMultiplier': value}; case 'typeFk': return {'i.typeFk': value}; - case 'category': - return {'ic.name': value}; + case 'categoryFk': + return {'ic.id': value}; case 'salesPersonFk': return {'it.workerFk': value}; case 'origin': @@ -104,7 +118,7 @@ module.exports = Self => { }); filter = mergeFilters(filter, {where}); - let stmts = []; + const stmts = []; let stmt; stmt = new ParameterizedSQL( @@ -173,9 +187,10 @@ module.exports = Self => { stmt.merge(conn.makeWhere(filter.where)); stmt.merge(conn.makePagination(filter)); - let itemsIndex = stmts.push(stmt) - 1; - let sql = ParameterizedSQL.join(stmts, ';'); - let result = await conn.executeStmt(sql); + const itemsIndex = stmts.push(stmt) - 1; + const sql = ParameterizedSQL.join(stmts, ';'); + const result = await conn.executeStmt(sql, myOptions); + return itemsIndex === 0 ? result : result[itemsIndex]; }; }; diff --git a/modules/item/back/methods/item/specs/filter.spec.js b/modules/item/back/methods/item/specs/filter.spec.js index 72175ccc4..340bc0db2 100644 --- a/modules/item/back/methods/item/specs/filter.spec.js +++ b/modules/item/back/methods/item/specs/filter.spec.js @@ -2,29 +2,62 @@ const app = require('vn-loopback/server/server'); describe('item filter()', () => { it('should return 1 result filtering by id', async() => { - let filter = {}; - let result = await app.models.Item.filter({args: {filter: filter, search: 1}}); + const tx = await app.models.Item.beginTransaction({}); + const options = {transaction: tx}; - expect(result.length).toEqual(1); - expect(result[0].id).toEqual(1); + try { + const filter = {}; + const ctx = {args: {filter: filter, search: 1}}; + const result = await app.models.Item.filter(ctx, filter, options); + + expect(result.length).toEqual(1); + expect(result[0].id).toEqual(1); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } }); it('should return 1 result filtering by barcode', async() => { - let filter = {}; - let result = await app.models.Item.filter({args: {filter: filter, search: 4444444444}}); + const tx = await app.models.Item.beginTransaction({}); + const options = {transaction: tx}; - expect(result.length).toEqual(1); - expect(result[0].id).toEqual(2); + try { + const filter = {}; + const ctx = {args: {filter: filter, search: 4444444444}}; + const result = await app.models.Item.filter(ctx, filter, options); + + expect(result.length).toEqual(1); + expect(result[0].id).toEqual(2); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } }); it('should return 2 results using filter and tags', async() => { - let filter = { - order: 'isActive ASC, name', - limit: 8 - }; - let tags = [{value: 'medical box', tagFk: 58}]; - let result = await app.models.Item.filter({args: {filter: filter, typeFk: 5, tags: tags}}); + const tx = await app.models.Item.beginTransaction({}); + const options = {transaction: tx}; - expect(result.length).toEqual(2); + try { + const filter = { + order: 'isActive ASC, name', + limit: 8 + }; + const tags = [{value: 'medical box', tagFk: 58}]; + const ctx = {args: {filter: filter, typeFk: 5, tags: tags}}; + const result = await app.models.Item.filter(ctx, filter, options); + + expect(result.length).toEqual(2); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } }); }); diff --git a/modules/worker/front/calendar/index.js b/modules/worker/front/calendar/index.js index d60fa0647..014a35b63 100644 --- a/modules/worker/front/calendar/index.js +++ b/modules/worker/front/calendar/index.js @@ -91,8 +91,10 @@ class Controller extends Section { } getActiveContract() { - this.$http.get(`Workers/${this.worker.id}/activeContract`) - .then(res => this.businessId = res.data.businessFk); + this.$http.get(`Workers/${this.worker.id}/activeContract`).then(res => { + if (res.data) + this.businessId = res.data.businessFk; + }); } getContractHolidays() { diff --git a/modules/worker/front/time-control/index.js b/modules/worker/front/time-control/index.js index b980243c9..2631c82d2 100644 --- a/modules/worker/front/time-control/index.js +++ b/modules/worker/front/time-control/index.js @@ -90,7 +90,10 @@ class Controller extends Section { getActiveContract() { return this.$http.get(`Workers/${this.worker.id}/activeContract`) - .then(res => this.businessId = res.data.businessFk); + .then(res => { + if (res.data) + this.businessId = res.data.businessFk; + }); } fetchHours() { @@ -111,6 +114,8 @@ class Controller extends Section { } getAbsences() { + if (!this.businessId) return; + const fullYear = this.started.getFullYear(); let params = { businessFk: this.businessId, diff --git a/print/templates/reports/driver-route/driver-route.html b/print/templates/reports/driver-route/driver-route.html index bad1bf179..eed85e1d7 100644 --- a/print/templates/reports/driver-route/driver-route.html +++ b/print/templates/reports/driver-route/driver-route.html @@ -1,163 +1,166 @@ - - - - - + + +
- - - -
-
-

{{$t('route')}} {{route.id}}

-
-
{{$t('information')}}
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
{{$t('route')}}{{route.id}}{{$t('driver')}}{{route.userNickName}}
{{$t('date')}}{{route.created | date('%d-%m-%Y')}}{{$t('vehicle')}}{{route.vehicleTradeMark}} {{route.vehicleModel}}
{{$t('time')}}{{route.time | date('%H:%M')}}{{route.plateNumber}}
{{$t('volume')}}{{route.m3}}{{$t('agency')}}{{route.agencyName}}
-
- - - - - - - - - - - - - - - -
-

Hora inicio

-
-

Hora fin

-
-

Km inicio

-
-

Km fin

-
-
- -
-
-
- -
-
-
-
-
-
- -
-
- - - - - - - - - - - - - - - - - - - -
{{$t('order')}}{{$t('ticket')}}{{$t('client')}}{{$t('address')}}{{$t('packages')}}
{{ticket.priority}}{{ticket.id}}{{ticket.clientFk}} {{ticket.addressName}} - {{ticket.addressFk.toString().substr(0, ticket.addressFk.toString().length - 3)}} - - {{ticket.addressFk.toString().substr(-3, 3)}} - - {{ticket.packages}}
-
+ + + + + - - -
+ + + +
+
+

{{$t('route')}} {{route.id}}

+
+
{{$t('information')}}
+
- - - - + + + + - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - +
{{$t('street')}}{{ticket.street}}{{$t('postcode')}}{{ticket.postalCode}}{{$t('route')}}{{route.id}}{{$t('driver')}}{{route.userNickName}}
{{$t('city')}}{{ticket.city}}{{$t('date')}}{{route.created | date('%d-%m-%Y')}}{{$t('vehicle')}}{{route.vehicleTradeMark}} {{route.vehicleModel}}
{{$t('time')}}{{route.time | date('%H:%M')}}{{route.plateNumber}}
{{$t('volume')}}{{route.m3}} {{$t('agency')}}{{ticket.ticketAgency}}
{{$t('mobile')}}{{ticket.mobile}}{{$t('phone')}}{{ticket.phone}}
{{$t('warehouse')}}{{ticket.warehouseName}}{{$t('salesPerson')}}{{ticket.salesPersonName}}
{{$t('import')}}{{ticket.import | currency('EUR', $i18n.locale)}}{{route.agencyName}}
-
-

{{ticket.description}}

-

{{$t('stowaway')}}: {{ticket.shipFk}}

+
+ + + + + + + + + + + + + + + +
+

Hora inicio

+
+

Hora fin

+
+

Km inicio

+
+

Km fin

+
+
+ +
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
{{$t('order')}}{{$t('ticket')}}{{$t('client')}}{{$t('address')}}{{$t('packages')}}{{$t('packagingType')}}
{{ticket.priority}}{{ticket.id}}{{ticket.clientFk}} {{ticket.addressName}} + {{ticket.addressFk.toString().substr(0, + ticket.addressFk.toString().length - 3)}} + + {{ticket.addressFk.toString().substr(-3, 3)}} + + {{ticket.packages}}{{ticket.itemPackingTypes}}
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{$t('street')}}{{ticket.street}}{{$t('postcode')}}{{ticket.postalCode}}
{{$t('city')}}{{ticket.city}}{{$t('agency')}}{{ticket.ticketAgency}}
{{$t('mobile')}}{{ticket.mobile}}{{$t('phone')}}{{ticket.phone}}
{{$t('warehouse')}}{{ticket.warehouseName}}{{$t('salesPerson')}}{{ticket.salesPersonName}}
{{$t('import')}}{{ticket.import | currency('EUR', $i18n.locale)}}
+
+

{{ticket.description}}

+

{{$t('stowaway')}}: {{ticket.shipFk}}

+
+
+
- - - -
- +
+ + + +
+ \ No newline at end of file diff --git a/print/templates/reports/driver-route/driver-route.js b/print/templates/reports/driver-route/driver-route.js index 39b5d44e9..0b2638239 100755 --- a/print/templates/reports/driver-route/driver-route.js +++ b/print/templates/reports/driver-route/driver-route.js @@ -30,7 +30,7 @@ module.exports = { return this.rawSqlFromDef('routes', [routesId]); }, fetchTickets(routesId) { - return this.rawSqlFromDef('tickets', [routesId]); + return this.rawSqlFromDef('tickets', [routesId, routesId]); } }, components: { diff --git a/print/templates/reports/driver-route/locale/es.yml b/print/templates/reports/driver-route/locale/es.yml index 7b86f527f..4f0f3ac3c 100644 --- a/print/templates/reports/driver-route/locale/es.yml +++ b/print/templates/reports/driver-route/locale/es.yml @@ -10,6 +10,7 @@ order: Orden client: Cliente address: Consignatario packages: Bultos +packagingType: Encajado street: Dirección postcode: Código Postal city: Ciudad diff --git a/print/templates/reports/driver-route/sql/tickets.sql b/print/templates/reports/driver-route/sql/tickets.sql index 1bdaf31a5..8806a0473 100644 --- a/print/templates/reports/driver-route/sql/tickets.sql +++ b/print/templates/reports/driver-route/sql/tickets.sql @@ -18,8 +18,9 @@ SELECT am.name ticketAgency, tob.description, s.shipFk, - u.nickName salesPersonName -FROM route r + u.nickName salesPersonName, + ipkg.itemPackingTypes +FROM route r LEFT JOIN ticket t ON t.routeFk = r.id LEFT JOIN address a ON a.id = t.addressFk LEFT JOIN client c ON c.id = t.clientFk @@ -30,5 +31,15 @@ FROM route r LEFT JOIN warehouse wh ON wh.id = t.warehouseFk LEFT JOIN agencyMode am ON am.id = t.agencyModeFk LEFT JOIN stowaway s ON s.id = t.id -WHERE r.id IN(?) -ORDER BY t.priority, t.id \ No newline at end of file + LEFT JOIN ( + SELECT t.id AS ticketFk, + GROUP_CONCAT(DISTINCT(i.itemPackingTypeFk)) AS itemPackingTypes + FROM route r + JOIN ticket t ON t.routeFk = r.id + JOIN sale s ON s.ticketFk = t.id + JOIN item i ON i.id = s.itemFk + WHERE r.id IN (?) + GROUP BY t.id + ) ipkg ON ipkg.ticketFk = t.id +WHERE r.id IN (?) +ORDER BY t.priority, t.id; \ No newline at end of file diff --git a/print/templates/reports/receipt/sql/receipt.sql b/print/templates/reports/receipt/sql/receipt.sql index 9b3919495..b8f5a4112 100644 --- a/print/templates/reports/receipt/sql/receipt.sql +++ b/print/templates/reports/receipt/sql/receipt.sql @@ -1,9 +1,11 @@ SELECT r.id, r.amountPaid, - r.amountUnpaid, + cr.amount AS amountUnpaid, r.payed, r.companyFk FROM receipt r JOIN client c ON c.id = r.clientFk + JOIN vn.clientRisk cr ON cr.clientFk = c.id + AND cr.companyFk = r.companyFk WHERE r.id = ? \ No newline at end of file