From 87a0a0bccc8d3aebbc3723f10681e3e4e193efe1 Mon Sep 17 00:00:00 2001
From: Gerard <gerard@verdnatura.es>
Date: Tue, 22 Jan 2019 10:04:42 +0100
Subject: [PATCH 1/4] #972 ticket.tracking

---
 e2e/helpers/selectors.js                      |  7 +-
 .../05_create_new_tracking_state.spec.js      | 14 +---
 loopback/locale/es.json                       |  1 +
 .../methods/ticket-tracking/changeState.js    | 17 +++--
 .../ticket-tracking/specs/changeState.spec.js | 62 +++++++++++++---
 modules/ticket/back/models/ticket-tracking.js |  1 +
 modules/ticket/front/routes.json              |  2 +-
 modules/ticket/front/tracking/edit/index.html | 21 ++++--
 modules/ticket/front/tracking/edit/index.js   | 60 +++++++++++++--
 .../ticket/front/tracking/edit/index.spec.js  | 74 +++++++++++++++++++
 .../ticket/front/tracking/index/index.html    |  2 +-
 modules/ticket/front/tracking/index/index.js  |  8 +-
 12 files changed, 220 insertions(+), 49 deletions(-)
 create mode 100644 modules/ticket/front/tracking/edit/index.spec.js

diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js
index d7cb354470..fe0b699204 100644
--- a/e2e/helpers/selectors.js
+++ b/e2e/helpers/selectors.js
@@ -386,7 +386,8 @@ export default {
         trackingButton: `vn-left-menu a[ui-sref="ticket.card.tracking.index"]`,
         createStateButton: `${components.vnFloatButton}`,
         stateAutocomplete: 'vn-ticket-tracking-edit vn-autocomplete[field="$ctrl.ticket.stateFk"]',
-        saveButton: `${components.vnSubmit}`
+        saveButton: `${components.vnSubmit}`,
+        cancelButton: `vn-ticket-tracking-edit vn-button[ui-sref="ticket.card.tracking.index"]`
     },
     ticketBasicData: {
         basicDataButton: `vn-left-menu a[ui-sref="ticket.card.data.stepOne"]`,
@@ -437,8 +438,8 @@ export default {
         saveServiceButton: `${components.vnSubmit}`
     },
     createStateView: {
-        stateAutocomplete: `vn-autocomplete[field="$ctrl.ticket.stateFk"]`,
-        clearStateInputButton: `vn-autocomplete[field="$ctrl.ticket.stateFk"] > div > div > div > vn-icon > i`,
+        stateAutocomplete: `vn-autocomplete[field="$ctrl.stateFk"]`,
+        clearStateInputButton: `vn-autocomplete[field="$ctrl.stateFk"] > div > div > div > vn-icon > i`,
         saveStateButton: `${components.vnSubmit}`
     },
     claimsIndex: {
diff --git a/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js b/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js
index 44f3dae51a..8446d84fc9 100644
--- a/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js
+++ b/e2e/paths/ticket-module/05_create_new_tracking_state.spec.js
@@ -25,27 +25,19 @@ describe('Ticket Create new tracking state path', () => {
             .click(selectors.createStateView.saveStateButton)
             .waitForLastSnackbar();
 
-        expect(result).toEqual('No changes to save');
+        expect(result).toEqual('State cannot be blank');
     });
 
     it(`should attempt create a new state then clear and save it`, async() => {
         let result = await nightmare
             .autocompleteSearch(selectors.createStateView.stateAutocomplete, '¿Fecha?')
             .waitToClick(selectors.createStateView.clearStateInputButton)
-            .click(selectors.createStateView.saveStateButton)
+            .waitToClick(selectors.createStateView.saveStateButton)
             .waitForLastSnackbar();
 
-        expect(result).toEqual('Data saved!');
+        expect(result).toEqual('State cannot be blank');
     });
 
-    it('should again access to the create state view by clicking the create floating button', async() => {
-        let url = await nightmare
-            .click(selectors.ticketTracking.createStateButton)
-            .wait(selectors.createStateView.stateAutocomplete)
-            .parsedUrl();
-
-        expect(url.hash).toContain('tracking/edit');
-    });
 
     it(`should create a new state`, async() => {
         let result = await nightmare
diff --git a/loopback/locale/es.json b/loopback/locale/es.json
index a244b5ae68..de9547daa6 100644
--- a/loopback/locale/es.json
+++ b/loopback/locale/es.json
@@ -18,6 +18,7 @@
 	"That payment method requires an IBAN": "El método de pago seleccionado requiere un IBAN",
 	"That payment method requires a BIC": "El método de pago seleccionado requiere un BIC",
 	"State cannot be blank": "El estado no puede estar en blanco",
+	"Worker cannot be blank": "El trabajador no puede estar en blanco",
 	"Cannot change the payment method if no salesperson": "No se puede cambiar la forma de pago si no hay comercial asignado",
 	"can't be blank": "El campo no puede estar vacío",
 	"Observation type cannot be blank": "El tipo de observación no puede estar en blanco",
diff --git a/modules/ticket/back/methods/ticket-tracking/changeState.js b/modules/ticket/back/methods/ticket-tracking/changeState.js
index 3ec81f2ce3..a701a1fdb3 100644
--- a/modules/ticket/back/methods/ticket-tracking/changeState.js
+++ b/modules/ticket/back/methods/ticket-tracking/changeState.js
@@ -25,18 +25,25 @@ module.exports = Self => {
         let models = Self.app.models;
         let isProduction;
         let isEditable = await Self.app.models.Ticket.isEditable(params.ticketFk);
+        let assignedState = await Self.app.models.State.findOne({where: {code: 'PICKER_DESIGNED'}});
+        let isAssigned = assignedState.id === params.stateFk;
+        let currentUserId;
 
         if (ctx.req.accessToken) {
             let token = ctx.req.accessToken;
-            let currentUserId = token && token.userId;
-            isProduction = await models.Account.hasRole(currentUserId, 'Production');
+            currentUserId = token && token.userId;
+            isProduction = await models.Account.hasRole(currentUserId, 'production');
+            isSalesperson = await models.Account.hasRole(currentUserId, 'salesPerson');
+        }
+
+        if ((!isEditable && !isProduction) || (isEditable && !isAssigned && isSalesperson) || (!isSalesperson && !isProduction))
+            throw new UserError(`You don't have enough privileges to change the state of this ticket`);
+
+        if (!isAssigned) {
             let worker = await models.Worker.findOne({where: {userFk: currentUserId}});
             params.workerFk = worker.id;
         }
 
-        if (!isEditable && !isProduction)
-            throw new UserError(`You don't have enough privileges to change the state of this ticket`);
-
         return await Self.app.models.TicketTracking.create(params);
     };
 };
diff --git a/modules/ticket/back/methods/ticket-tracking/specs/changeState.spec.js b/modules/ticket/back/methods/ticket-tracking/specs/changeState.spec.js
index 1b35b6d700..1ac4ec14b0 100644
--- a/modules/ticket/back/methods/ticket-tracking/specs/changeState.spec.js
+++ b/modules/ticket/back/methods/ticket-tracking/specs/changeState.spec.js
@@ -3,18 +3,18 @@ const app = require(`${serviceRoot}/server/server`);
 describe('ticket changeState()', () => {
     let ticket;
 
-    beforeAll(async () => {
+    beforeAll(async() => {
         let originalTicket = await app.models.Ticket.findOne({where: {id: 16}});
         originalTicket.id = null;
         ticket = await app.models.Ticket.create(originalTicket);
     });
 
-    afterAll(async () => {
+    afterAll(async() => {
         await app.models.Ticket.destroyById(ticket.id);
     });
 
-    it('should throw an error if the ticket is not editable and the user isnt production', async () => {
-        let ctx = {req: {accessToken: {userId: 110}}};
+    it('should throw an error if the ticket is not editable and the user isnt production', async() => {
+        let ctx = {req: {accessToken: {userId: 18}}};
         let params = {ticketFk: 2, stateFk: 3};
         let error;
         try {
@@ -26,26 +26,66 @@ describe('ticket changeState()', () => {
         expect(error).toEqual(new Error(`You don't have enough privileges to change the state of this ticket`));
     });
 
-    it('should be able to create a ticket tracking line for a not editable ticket if the user has the production role', async () => {
-        let ctx = {req: {accessToken: {userId: 50}}};
-        let params = {ticketFk: 20, stateFk: 3};
+    it('should throw an error if the state is assigned and theres not worker in params', async() => {
+        let ctx = {req: {accessToken: {userId: 18}}};
+        let assignedState = await app.models.State.findOne({where: {code: 'PICKER_DESIGNED'}});
+        let params = {ticketFk: 11, stateFk: assignedState.id};
+        let error;
+        try {
+            await app.models.TicketTracking.changeState(ctx, params);
+        } catch (e) {
+            error = e;
+        }
+
+        expect(error.message).toEqual('La instancia `TicketTracking` no es válida. Detalles: `workerFk` Worker cannot be blank (value: undefined).');
+    });
+
+    it('should throw an error if a worker thats not production tries to change the state to one thats not assigned', async() => {
+        let ctx = {req: {accessToken: {userId: 110}}};
+        let params = {ticketFk: 11, stateFk: 3};
+        let error;
+        try {
+            await app.models.TicketTracking.changeState(ctx, params);
+        } catch (e) {
+            error = e;
+        }
+
+        expect(error.message).toEqual(`You don't have enough privileges to change the state of this ticket`);
+    });
+
+    it('should be able to create a ticket tracking line for a not editable ticket if the user has the production role', async() => {
+        let ctx = {req: {accessToken: {userId: 49}}};
+        let params = {ticketFk: ticket.id, stateFk: 3};
 
         let res = await app.models.TicketTracking.changeState(ctx, params);
 
         expect(res.__data.ticketFk).toBe(params.ticketFk);
         expect(res.__data.stateFk).toBe(params.stateFk);
-        expect(res.__data.workerFk).toBe(50);
+        expect(res.__data.workerFk).toBe(49);
         expect(res.__data.id).toBeDefined();
     });
 
-    it('return an array with the created ticket tracking line', async () => {
-        let ctx = {req: {accessToken: {userId: 108}}};
+    it('return an array with the created ticket tracking line', async() => {
+        let ctx = {req: {accessToken: {userId: 49}}};
         let params = {ticketFk: ticket.id, stateFk: 3};
         let res = await app.models.TicketTracking.changeState(ctx, params);
 
         expect(res.__data.ticketFk).toBe(params.ticketFk);
         expect(res.__data.stateFk).toBe(params.stateFk);
-        expect(res.__data.workerFk).toBe(110);
+        expect(res.__data.workerFk).toBe(49);
+        expect(res.__data.id).toBeDefined();
+    });
+
+    it('return an array with the created ticket tracking line when the user is salesperson, uses the state assigned and thes a workerFk given', async() => {
+        let ctx = {req: {accessToken: {userId: 18}}};
+        let assignedState = await app.models.State.findOne({where: {code: 'PICKER_DESIGNED'}});
+        let params = {ticketFk: ticket.id, stateFk: assignedState.id, workerFk: 1};
+        let res = await app.models.TicketTracking.changeState(ctx, params);
+
+        expect(res.__data.ticketFk).toBe(params.ticketFk);
+        expect(res.__data.stateFk).toBe(params.stateFk);
+        expect(res.__data.workerFk).toBe(params.workerFk);
+        expect(res.__data.workerFk).toBe(1);
         expect(res.__data.id).toBeDefined();
     });
 });
diff --git a/modules/ticket/back/models/ticket-tracking.js b/modules/ticket/back/models/ticket-tracking.js
index 2ebef8a9a9..2b2a935365 100644
--- a/modules/ticket/back/models/ticket-tracking.js
+++ b/modules/ticket/back/models/ticket-tracking.js
@@ -2,4 +2,5 @@ module.exports = function(Self) {
     require('../methods/ticket-tracking/changeState')(Self);
 
     Self.validatesPresenceOf('stateFk', {message: 'State cannot be blank'});
+    Self.validatesPresenceOf('workerFk', {message: 'Worker cannot be blank'});
 };
diff --git a/modules/ticket/front/routes.json b/modules/ticket/front/routes.json
index 59fd490bf5..f130195e0c 100644
--- a/modules/ticket/front/routes.json
+++ b/modules/ticket/front/routes.json
@@ -142,7 +142,7 @@
             "params": {
                 "ticket": "$ctrl.ticket"
             },
-            "acl": ["production", "administrative"]
+            "acl": ["production", "administrative", "salesPerson"]
         },
         {
             "url" : "/sale-checked",
diff --git a/modules/ticket/front/tracking/edit/index.html b/modules/ticket/front/tracking/edit/index.html
index b2ca12e437..1d26e08dc0 100644
--- a/modules/ticket/front/tracking/edit/index.html
+++ b/modules/ticket/front/tracking/edit/index.html
@@ -1,9 +1,8 @@
-<mg-ajax path="/ticket/api/TicketTrackings/changeState" options="vnPost"></mg-ajax>
+<mg-ajax path="/api/TicketTrackings/changeState" options="vnPost"></mg-ajax>
 <vn-watcher
     vn-id="watcher"
-    data="$ctrl.ticket"
-    form="form"
-    save="post">
+    data="$ctrl.params"
+    form="form">
 </vn-watcher>
 <form name="form" ng-submit="$ctrl.onSubmit()" compact>
     <vn-card pad-large>
@@ -11,11 +10,23 @@
         <vn-horizontal>
             <vn-autocomplete
                 vn-one
-                field="$ctrl.ticket.stateFk" 
+                field="$ctrl.stateFk" 
                 url="/ticket/api/States"
                 label="State"
                 vn-focus>
             </vn-autocomplete>
+            <vn-autocomplete 
+                vn-one
+                ng-if="$ctrl.isPickerDesignedState"
+                field="$ctrl.workerFk"
+                url="/client/api/Clients/activeWorkersWithRole"
+                show-field="firstName"
+                search-function="{firstName: $search}"
+                value-field="id"
+                where="{role: 'employee'}"
+                label="Worker">
+                <tpl-item>{{firstName}} {{name}}</tpl-item>
+            </vn-autocomplete>
         </vn-horizontal>
     </vn-card>
     <vn-button-bar>
diff --git a/modules/ticket/front/tracking/edit/index.js b/modules/ticket/front/tracking/edit/index.js
index 77bc7d12fb..f3a64aaaf4 100644
--- a/modules/ticket/front/tracking/edit/index.js
+++ b/modules/ticket/front/tracking/edit/index.js
@@ -1,7 +1,8 @@
 import ngModule from '../../module';
 
 class Controller {
-    constructor($scope, $state, vnApp, $translate) {
+    constructor($scope, $state, vnApp, $translate, $http) {
+        this.$http = $http;
         this.$ = $scope;
         this.$state = $state;
         this.vnApp = vnApp;
@@ -9,17 +10,60 @@ class Controller {
         this.ticket = {
             ticketFk: $state.params.id
         };
+        this.params = {ticketFk: $state.params.id};
     }
-    onSubmit() {
-        this.$.watcher.submit().then(
-            () => {
-                this.card.reload();
-                this.$state.go('ticket.card.tracking.index');
+
+    $onInit() {
+        this.getPickerDesignedState();
+    }
+
+    set stateFk(value) {
+        this.params.stateFk = value;
+        this.isPickerDesignedState = this.getIsPickerDesignedState(value);
+    }
+
+    get stateFk() {
+        return this.params.stateFk;
+    }
+
+    set workerFk(value) {
+        this.params.workerFk = value;
+    }
+
+    get workerFk() {
+        return this.params.workerFk;
+    }
+
+    getPickerDesignedState() {
+        let filter = {
+            where: {
+                code: 'PICKER_DESIGNED'
             }
-        );
+        };
+        let json = encodeURIComponent(JSON.stringify(filter));
+        this.$http.get(`/api/States?filter=${json}`).then(res => {
+            if (res && res.data)
+                this.pickerDesignedState = res.data[0].id;
+        });
+    }
+
+    getIsPickerDesignedState(value) {
+        if (value == this.pickerDesignedState)
+            return true;
+
+        return false;
+    }
+
+    onSubmit() {
+        this.$http.post(`/api/TicketTrackings/changeState`, this.params).then(() => {
+            this.$.watcher.updateOriginalData();
+            this.card.reload();
+            this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
+            this.$state.go('ticket.card.tracking.index');
+        });
     }
 }
-Controller.$inject = ['$scope', '$state', 'vnApp', '$translate'];
+Controller.$inject = ['$scope', '$state', 'vnApp', '$translate', '$http'];
 
 ngModule.component('vnTicketTrackingEdit', {
     template: require('./index.html'),
diff --git a/modules/ticket/front/tracking/edit/index.spec.js b/modules/ticket/front/tracking/edit/index.spec.js
new file mode 100644
index 0000000000..9d5fbbfb17
--- /dev/null
+++ b/modules/ticket/front/tracking/edit/index.spec.js
@@ -0,0 +1,74 @@
+import './index';
+
+describe('Ticket', () => {
+    describe('Component vnTicketTrackingEdit', () => {
+        let controller;
+        let $httpBackend;
+
+        beforeEach(ngModule('ticket'));
+
+        beforeEach(angular.mock.inject(($componentController, _$httpBackend_, $translate, vnApp) => {
+            $httpBackend = _$httpBackend_;
+            controller = $componentController('vnTicketTrackingEdit');
+            controller.ticket = {id: 1};
+            controller.$ = {watcher: {updateOriginalData: () => {}}};
+            controller.card = {reload: () => {}};
+            controller.vnApp = {showSuccess: () => {}};
+            controller.$translate = $translate;
+            controller.vnApp = vnApp;
+        }));
+
+        describe('stateFk setter/getter', () => {
+            it('should set params.stateFk and set isPickerDesignedState', () => {
+                let stateFk = {id: 1};
+                controller.stateFk = stateFk;
+
+                expect(controller.params.stateFk).toEqual(stateFk);
+                expect(controller.isPickerDesignedState).toEqual(false);
+            });
+        });
+
+        describe('workerFk setter', () => {
+            it('should set params.workerFk', () => {
+                controller.workerFk = 1;
+
+                expect(controller.params.workerFk).toEqual(1);
+            });
+        });
+
+        describe('getPickerDesignedState()', () => {
+            it('should get the state that has the code PICKER_DESIGNED', () => {
+                let filter = {
+                    where: {
+                        code: 'PICKER_DESIGNED'
+                    }
+                };
+                let json = encodeURIComponent(JSON.stringify(filter));
+                $httpBackend.expectGET(`/api/States?filter=${json}`).respond([{id: 22}]);
+                controller.getPickerDesignedState();
+                $httpBackend.flush();
+
+                expect(controller.pickerDesignedState).toEqual(22);
+            });
+        });
+
+        describe('onSubmit()', () => {
+            it('should POST the data, call updateOriginalData, reload, showSuccess and go functions', () => {
+                controller.params = {stateFk: 22, workerFk: 101};
+                spyOn(controller.card, 'reload');
+                spyOn(controller.$.watcher, 'updateOriginalData');
+                spyOn(controller.vnApp, 'showSuccess');
+                spyOn(controller.$state, 'go');
+
+                $httpBackend.expectPOST(`/api/TicketTrackings/changeState`, controller.params).respond({});
+                controller.onSubmit();
+                $httpBackend.flush();
+
+                expect(controller.card.reload).toHaveBeenCalledWith();
+                expect(controller.$.watcher.updateOriginalData).toHaveBeenCalledWith();
+                expect(controller.vnApp.showSuccess).toHaveBeenCalledWith(controller.$translate.instant('Data saved!'));
+                expect(controller.$state.go).toHaveBeenCalledWith('ticket.card.tracking.index');
+            });
+        });
+    });
+});
diff --git a/modules/ticket/front/tracking/index/index.html b/modules/ticket/front/tracking/index/index.html
index 33ec6761ff..21ef5c176e 100644
--- a/modules/ticket/front/tracking/index/index.html
+++ b/modules/ticket/front/tracking/index/index.html
@@ -34,6 +34,6 @@
         <vn-pagination model="model"></vn-pagination>
     </vn-card>
 </vn-vertical>
-<a ui-sref="ticket.card.tracking.edit" vn-bind="+" vn-visible-by="production, administrative" fixed-bottom-right>
+<a ui-sref="ticket.card.tracking.edit" vn-bind="+" vn-visible-by="production, administrative, salesperson" fixed-bottom-right>
     <vn-float-button icon="add"></vn-float-button>
 </a>
\ No newline at end of file
diff --git a/modules/ticket/front/tracking/index/index.js b/modules/ticket/front/tracking/index/index.js
index 5b127650ef..54b21f76c9 100644
--- a/modules/ticket/front/tracking/index/index.js
+++ b/modules/ticket/front/tracking/index/index.js
@@ -6,15 +6,15 @@ class Controller {
         this.filter = {
             include: [
                 {
-                    relation: "worker",
+                    relation: 'worker',
                     scope: {
-                        fields: ["firstName", "name"]
+                        fields: ['firstName', 'name']
                     }
                 },
                 {
-                    relation: "state",
+                    relation: 'state',
                     scope: {
-                        fields: ["name"]
+                        fields: ['name']
                     }
                 }
             ]

From b0a60fc94a54cfc8a8e531901c8d85fe14a6ed1e Mon Sep 17 00:00:00 2001
From: Gerard <gerard@verdnatura.es>
Date: Tue, 22 Jan 2019 10:31:12 +0100
Subject: [PATCH 2/4] #1023 claim.detail cantidad total parecer ser erronea

---
 modules/claim/front/detail/index.html | 66 ++++++++++++++-------------
 modules/claim/front/detail/index.js   | 17 +++++--
 2 files changed, 49 insertions(+), 34 deletions(-)

diff --git a/modules/claim/front/detail/index.html b/modules/claim/front/detail/index.html
index 857e1a93eb..2c62a5abbd 100644
--- a/modules/claim/front/detail/index.html
+++ b/modules/claim/front/detail/index.html
@@ -82,38 +82,42 @@
     </a>
 </vn-vertical>
 <!-- Add Lines Dialog -->
-<vn-dialog vn-id="add-sales">
+<vn-dialog vn-id="add-sales" class="modalForm">
     <tpl-body>
-        <h3><span translate>Claimable sales from ticket</span> {{$ctrl.claim.ticketFk}}</h3>
-        <vn-table>
-            <vn-thead>
-                <vn-tr>
-                    <vn-th number>Id</vn-th>
-                    <vn-th number>Landed</vn-th>
-                    <vn-th number>Quantity</vn-th>
-                    <vn-th number>Description</vn-th>
-                    <vn-th number>Price</vn-th>
-                    <vn-th number>Disc.</vn-th>
-                    <vn-th number>Total</vn-th>
-                </vn-tr>
-            </vn-thead>
-            <vn-tbody>
-                <vn-tr ng-repeat="sale in $ctrl.salesToClaim" class="clickable" ng-click="$ctrl.addClaimedSale($index)">
-                    <vn-td number>{{sale.saleFk}} {{$index}}</vn-td>
-                    <vn-td number>{{sale.landed | dateTime: 'dd/MM/yyyy'}}</vn-td>
-                    <vn-td number>{{sale.quantity}}</vn-td>
-                    <vn-td number>{{sale.concept}}</vn-td>
-                    <vn-td number>{{sale.price | currency:'€':2}}</vn-td>
-                    <vn-td number>{{sale.discount}} %</vn-td>
-                    <vn-td number>
-                        {{(sale.quantity * sale.price) - ((sale.discount * (sale.quantity * sale.price))/100) | currency:'€':2}}
-                    </vn-td>
-                </vn-tr>
-            </vn-tbody>
-            <vn-empty-rows ng-if="$ctrl.salesToClaim.length === 0" translate>
-                No results
-            </vn-empty-rows>
-        </vn-table>
+        <vn-horizontal pad-medium class="header">
+            <h5><span translate>Claimable sales from ticket</span> {{$ctrl.claim.ticketFk}}</h5>
+        </vn-horizontal>
+        <vn-horizontal pad-medium>
+            <vn-table>
+                <vn-thead>
+                    <vn-tr>
+                        <vn-th number>Id</vn-th>
+                        <vn-th number>Landed</vn-th>
+                        <vn-th number>Quantity</vn-th>
+                        <vn-th number>Description</vn-th>
+                        <vn-th number>Price</vn-th>
+                        <vn-th number>Disc.</vn-th>
+                        <vn-th number>Total</vn-th>
+                    </vn-tr>
+                </vn-thead>
+                <vn-tbody>
+                    <vn-tr ng-repeat="sale in $ctrl.salesToClaim" class="clickable" ng-click="$ctrl.addClaimedSale($index)">
+                        <vn-td number>{{sale.saleFk}} {{$index}}</vn-td>
+                        <vn-td number>{{sale.landed | dateTime: 'dd/MM/yyyy'}}</vn-td>
+                        <vn-td number>{{sale.quantity}}</vn-td>
+                        <vn-td number>{{sale.concept}}</vn-td>
+                        <vn-td number>{{sale.price | currency:'€':2}}</vn-td>
+                        <vn-td number>{{sale.discount}} %</vn-td>
+                        <vn-td number>
+                            {{(sale.quantity * sale.price) - ((sale.discount * (sale.quantity * sale.price))/100) | currency:'€':2}}
+                        </vn-td>
+                    </vn-tr>
+                </vn-tbody>
+                <vn-empty-rows ng-if="$ctrl.salesToClaim.length === 0" translate>
+                    No results
+                </vn-empty-rows>
+            </vn-table>
+        </vn-horizontal>
     </tpl-body>
 </vn-dialog>
 <vn-item-descriptor-popover
diff --git a/modules/claim/front/detail/index.js b/modules/claim/front/detail/index.js
index dfee80243a..bec5e8c3db 100644
--- a/modules/claim/front/detail/index.js
+++ b/modules/claim/front/detail/index.js
@@ -24,6 +24,17 @@ class Controller {
         };
     }
 
+    set salesClaimed(value) {
+        this._salesClaimed = value;
+
+        if (value)
+            this.calculateTotals();
+    }
+
+    get salesClaimed() {
+        return this._salesClaimed;
+    }
+
     openAddSalesDialog() {
         this.getClaimableFromTicket();
         this.$.addSales.show();
@@ -71,9 +82,9 @@ class Controller {
     calculateTotals() {
         this.paidTotal = 0.0;
         this.claimedTotal = 0.0;
-        if (!this.salesClaimed) return;
+        if (!this._salesClaimed) return;
 
-        this.salesClaimed.forEach(sale => {
+        this._salesClaimed.forEach(sale => {
             let orgSale = sale.sale;
             this.paidTotal += this.getSaleTotal(orgSale);
             this.claimedTotal += sale.quantity * orgSale.price - ((orgSale.discount * (sale.quantity * orgSale.price)) / 100);
@@ -81,7 +92,7 @@ class Controller {
     }
 
     getSaleTotal(sale) {
-        return sale.quantity * sale.price - ((100 - sale.discount) / 100);
+        return (sale.quantity * sale.price) - ((100 - sale.discount) / 100);
     }
 
     // Item Descriptor

From 471374f32d0add969f371970b8dc322c3e54fd6e Mon Sep 17 00:00:00 2001
From: Gerard <gerard@verdnatura.es>
Date: Tue, 22 Jan 2019 10:31:36 +0100
Subject: [PATCH 3/4] excluded test due changes in mailer #79

---
 modules/client/front/billing-data/index.spec.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/modules/client/front/billing-data/index.spec.js b/modules/client/front/billing-data/index.spec.js
index 52cfeacfad..b8d0f8b116 100644
--- a/modules/client/front/billing-data/index.spec.js
+++ b/modules/client/front/billing-data/index.spec.js
@@ -30,8 +30,8 @@ describe('Client', () => {
                 expect(controller.notifyChanges).toHaveBeenCalledWith();
             });
         });
-
-        describe('notifyChanges()', () => {
+        // Excluded due mailer changes #79
+        xdescribe('notifyChanges()', () => {
             it(`should perform a GET query`, () => {
                 $httpBackend.when('GET', `/mailer/notification/payment-update/101`).respond(true);
                 $httpBackend.expect('GET', `/mailer/notification/payment-update/101`);

From ec1d36f8b926c5ad9c29c6c45127c203702b376a Mon Sep 17 00:00:00 2001
From: Joan Sanchez <joan@verdnatura.es>
Date: Tue, 22 Jan 2019 10:57:52 +0100
Subject: [PATCH 4/4] copy print folder on dockerfile build

---
 Dockerfile                                          |   2 ++
 loopback/server/boot/print.js                       |   2 +-
 {services/print => print}/config/print.json         |   0
 {services/print => print}/config/routes.json        |   0
 {services/print => print}/lib/config.js             |   0
 {services/print => print}/lib/database.js           |   0
 {services/print => print}/lib/emailEngine.js        |   0
 {services/print => print}/lib/errorHandler.js       |   0
 .../print => print}/lib/exceptions/userException.js |   0
 {services/print => print}/lib/mixins/text.js        |   0
 {services/print => print}/lib/reportEngine.js       |   0
 {services/print => print}/lib/router.js             |   0
 {services/print => print}/lib/smtp.js               |   0
 {services/print => print}/package.json              |   0
 .../reports/client-welcome/assets/css/style.css     |   0
 .../reports/client-welcome/index.html               |   0
 .../print => print}/reports/client-welcome/index.js |   0
 .../reports/client-welcome/locale.js                |   0
 .../reports/delivery-note/assets/css/style.css      |   0
 .../reports/delivery-note/index.html                |   0
 .../print => print}/reports/delivery-note/index.js  |   0
 .../print => print}/reports/delivery-note/locale.js |   0
 .../reports/email-footer/assets/css/style.css       |   0
 .../reports/email-footer/assets/images/action.png   | Bin
 .../reports/email-footer/assets/images/facebook.png | Bin
 .../reports/email-footer/assets/images/info.png     | Bin
 .../email-footer/assets/images/instagram.png        | Bin
 .../reports/email-footer/assets/images/linkedin.png | Bin
 .../email-footer/assets/images/pinterest.png        | Bin
 .../reports/email-footer/assets/images/twitter.png  | Bin
 .../reports/email-footer/assets/images/youtube.png  | Bin
 .../print => print}/reports/email-footer/index.html |   0
 .../print => print}/reports/email-footer/index.js   |   0
 .../print => print}/reports/email-footer/locale.js  |   0
 .../reports/email-header/assets/css/style.css       |   0
 .../reports/email-header/assets/images/logo.png     | Bin
 .../print => print}/reports/email-header/index.html |   0
 .../print => print}/reports/email-header/index.js   |   0
 .../print => print}/reports/email-header/locale.js  |   0
 .../reports/letter-debtor-nd/assets/css/style.css   |   0
 .../reports/letter-debtor-nd/assets/files/model.ezp | Bin
 .../letter-debtor-nd/assets/files/model2.ezp        | Bin
 .../reports/letter-debtor-nd/index.html             |   0
 .../reports/letter-debtor-nd/index.js               |   0
 .../reports/letter-debtor-nd/locale.js              |   0
 .../reports/letter-debtor-st/assets/css/style.css   |   0
 .../reports/letter-debtor-st/assets/files/model.ezp | Bin
 .../letter-debtor-st/assets/files/model2.ezp        | Bin
 .../reports/letter-debtor-st/index.html             |   0
 .../reports/letter-debtor-st/index.js               |   0
 .../reports/letter-debtor-st/locale.js              |   0
 .../reports/payment-update/assets/css/style.css     |   0
 .../reports/payment-update/index.html               |   0
 .../print => print}/reports/payment-update/index.js |   0
 .../reports/payment-update/locale.js                |   0
 .../reports/printer-setup/assets/css/style.css      |   0
 .../reports/printer-setup/assets/files/model.ezp    | Bin
 .../reports/printer-setup/index.html                |   0
 .../print => print}/reports/printer-setup/index.js  |   0
 .../print => print}/reports/printer-setup/locale.js |   0
 {services/print => print}/server.js                 |   0
 61 files changed, 3 insertions(+), 1 deletion(-)
 rename {services/print => print}/config/print.json (100%)
 rename {services/print => print}/config/routes.json (100%)
 rename {services/print => print}/lib/config.js (100%)
 rename {services/print => print}/lib/database.js (100%)
 rename {services/print => print}/lib/emailEngine.js (100%)
 rename {services/print => print}/lib/errorHandler.js (100%)
 rename {services/print => print}/lib/exceptions/userException.js (100%)
 rename {services/print => print}/lib/mixins/text.js (100%)
 rename {services/print => print}/lib/reportEngine.js (100%)
 rename {services/print => print}/lib/router.js (100%)
 rename {services/print => print}/lib/smtp.js (100%)
 rename {services/print => print}/package.json (100%)
 rename {services/print => print}/reports/client-welcome/assets/css/style.css (100%)
 rename {services/print => print}/reports/client-welcome/index.html (100%)
 rename {services/print => print}/reports/client-welcome/index.js (100%)
 rename {services/print => print}/reports/client-welcome/locale.js (100%)
 rename {services/print => print}/reports/delivery-note/assets/css/style.css (100%)
 rename {services/print => print}/reports/delivery-note/index.html (100%)
 rename {services/print => print}/reports/delivery-note/index.js (100%)
 rename {services/print => print}/reports/delivery-note/locale.js (100%)
 rename {services/print => print}/reports/email-footer/assets/css/style.css (100%)
 rename {services/print => print}/reports/email-footer/assets/images/action.png (100%)
 rename {services/print => print}/reports/email-footer/assets/images/facebook.png (100%)
 rename {services/print => print}/reports/email-footer/assets/images/info.png (100%)
 rename {services/print => print}/reports/email-footer/assets/images/instagram.png (100%)
 rename {services/print => print}/reports/email-footer/assets/images/linkedin.png (100%)
 rename {services/print => print}/reports/email-footer/assets/images/pinterest.png (100%)
 rename {services/print => print}/reports/email-footer/assets/images/twitter.png (100%)
 rename {services/print => print}/reports/email-footer/assets/images/youtube.png (100%)
 rename {services/print => print}/reports/email-footer/index.html (100%)
 rename {services/print => print}/reports/email-footer/index.js (100%)
 rename {services/print => print}/reports/email-footer/locale.js (100%)
 rename {services/print => print}/reports/email-header/assets/css/style.css (100%)
 rename {services/print => print}/reports/email-header/assets/images/logo.png (100%)
 rename {services/print => print}/reports/email-header/index.html (100%)
 rename {services/print => print}/reports/email-header/index.js (100%)
 rename {services/print => print}/reports/email-header/locale.js (100%)
 rename {services/print => print}/reports/letter-debtor-nd/assets/css/style.css (100%)
 rename {services/print => print}/reports/letter-debtor-nd/assets/files/model.ezp (100%)
 rename {services/print => print}/reports/letter-debtor-nd/assets/files/model2.ezp (100%)
 rename {services/print => print}/reports/letter-debtor-nd/index.html (100%)
 rename {services/print => print}/reports/letter-debtor-nd/index.js (100%)
 rename {services/print => print}/reports/letter-debtor-nd/locale.js (100%)
 rename {services/print => print}/reports/letter-debtor-st/assets/css/style.css (100%)
 rename {services/print => print}/reports/letter-debtor-st/assets/files/model.ezp (100%)
 rename {services/print => print}/reports/letter-debtor-st/assets/files/model2.ezp (100%)
 rename {services/print => print}/reports/letter-debtor-st/index.html (100%)
 rename {services/print => print}/reports/letter-debtor-st/index.js (100%)
 rename {services/print => print}/reports/letter-debtor-st/locale.js (100%)
 rename {services/print => print}/reports/payment-update/assets/css/style.css (100%)
 rename {services/print => print}/reports/payment-update/index.html (100%)
 rename {services/print => print}/reports/payment-update/index.js (100%)
 rename {services/print => print}/reports/payment-update/locale.js (100%)
 rename {services/print => print}/reports/printer-setup/assets/css/style.css (100%)
 rename {services/print => print}/reports/printer-setup/assets/files/model.ezp (100%)
 rename {services/print => print}/reports/printer-setup/index.html (100%)
 rename {services/print => print}/reports/printer-setup/index.js (100%)
 rename {services/print => print}/reports/printer-setup/locale.js (100%)
 rename {services/print => print}/server.js (100%)

diff --git a/Dockerfile b/Dockerfile
index 6c0a6a4106..2b55f61d8a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -18,12 +18,14 @@ RUN apt-get update \
 WORKDIR /salix
 COPY package.json package-lock.json ./
 COPY loopback/package.json loopback/
+COPY print/package.json print/
 RUN npm install --only=prod
 
 COPY loopback loopback
 COPY back back
 COPY modules modules
 COPY dist/webpack-assets.json dist/
+COPY print print
 COPY \
     modules.yml \
     LICENSE \
diff --git a/loopback/server/boot/print.js b/loopback/server/boot/print.js
index 686578fec9..4a4996d2c0 100644
--- a/loopback/server/boot/print.js
+++ b/loopback/server/boot/print.js
@@ -1,3 +1,3 @@
 module.exports = function(app) {
-    require('../../../services/print/server.js')(app);
+    require('../../../print/server.js')(app);
 };
diff --git a/services/print/config/print.json b/print/config/print.json
similarity index 100%
rename from services/print/config/print.json
rename to print/config/print.json
diff --git a/services/print/config/routes.json b/print/config/routes.json
similarity index 100%
rename from services/print/config/routes.json
rename to print/config/routes.json
diff --git a/services/print/lib/config.js b/print/lib/config.js
similarity index 100%
rename from services/print/lib/config.js
rename to print/lib/config.js
diff --git a/services/print/lib/database.js b/print/lib/database.js
similarity index 100%
rename from services/print/lib/database.js
rename to print/lib/database.js
diff --git a/services/print/lib/emailEngine.js b/print/lib/emailEngine.js
similarity index 100%
rename from services/print/lib/emailEngine.js
rename to print/lib/emailEngine.js
diff --git a/services/print/lib/errorHandler.js b/print/lib/errorHandler.js
similarity index 100%
rename from services/print/lib/errorHandler.js
rename to print/lib/errorHandler.js
diff --git a/services/print/lib/exceptions/userException.js b/print/lib/exceptions/userException.js
similarity index 100%
rename from services/print/lib/exceptions/userException.js
rename to print/lib/exceptions/userException.js
diff --git a/services/print/lib/mixins/text.js b/print/lib/mixins/text.js
similarity index 100%
rename from services/print/lib/mixins/text.js
rename to print/lib/mixins/text.js
diff --git a/services/print/lib/reportEngine.js b/print/lib/reportEngine.js
similarity index 100%
rename from services/print/lib/reportEngine.js
rename to print/lib/reportEngine.js
diff --git a/services/print/lib/router.js b/print/lib/router.js
similarity index 100%
rename from services/print/lib/router.js
rename to print/lib/router.js
diff --git a/services/print/lib/smtp.js b/print/lib/smtp.js
similarity index 100%
rename from services/print/lib/smtp.js
rename to print/lib/smtp.js
diff --git a/services/print/package.json b/print/package.json
similarity index 100%
rename from services/print/package.json
rename to print/package.json
diff --git a/services/print/reports/client-welcome/assets/css/style.css b/print/reports/client-welcome/assets/css/style.css
similarity index 100%
rename from services/print/reports/client-welcome/assets/css/style.css
rename to print/reports/client-welcome/assets/css/style.css
diff --git a/services/print/reports/client-welcome/index.html b/print/reports/client-welcome/index.html
similarity index 100%
rename from services/print/reports/client-welcome/index.html
rename to print/reports/client-welcome/index.html
diff --git a/services/print/reports/client-welcome/index.js b/print/reports/client-welcome/index.js
similarity index 100%
rename from services/print/reports/client-welcome/index.js
rename to print/reports/client-welcome/index.js
diff --git a/services/print/reports/client-welcome/locale.js b/print/reports/client-welcome/locale.js
similarity index 100%
rename from services/print/reports/client-welcome/locale.js
rename to print/reports/client-welcome/locale.js
diff --git a/services/print/reports/delivery-note/assets/css/style.css b/print/reports/delivery-note/assets/css/style.css
similarity index 100%
rename from services/print/reports/delivery-note/assets/css/style.css
rename to print/reports/delivery-note/assets/css/style.css
diff --git a/services/print/reports/delivery-note/index.html b/print/reports/delivery-note/index.html
similarity index 100%
rename from services/print/reports/delivery-note/index.html
rename to print/reports/delivery-note/index.html
diff --git a/services/print/reports/delivery-note/index.js b/print/reports/delivery-note/index.js
similarity index 100%
rename from services/print/reports/delivery-note/index.js
rename to print/reports/delivery-note/index.js
diff --git a/services/print/reports/delivery-note/locale.js b/print/reports/delivery-note/locale.js
similarity index 100%
rename from services/print/reports/delivery-note/locale.js
rename to print/reports/delivery-note/locale.js
diff --git a/services/print/reports/email-footer/assets/css/style.css b/print/reports/email-footer/assets/css/style.css
similarity index 100%
rename from services/print/reports/email-footer/assets/css/style.css
rename to print/reports/email-footer/assets/css/style.css
diff --git a/services/print/reports/email-footer/assets/images/action.png b/print/reports/email-footer/assets/images/action.png
similarity index 100%
rename from services/print/reports/email-footer/assets/images/action.png
rename to print/reports/email-footer/assets/images/action.png
diff --git a/services/print/reports/email-footer/assets/images/facebook.png b/print/reports/email-footer/assets/images/facebook.png
similarity index 100%
rename from services/print/reports/email-footer/assets/images/facebook.png
rename to print/reports/email-footer/assets/images/facebook.png
diff --git a/services/print/reports/email-footer/assets/images/info.png b/print/reports/email-footer/assets/images/info.png
similarity index 100%
rename from services/print/reports/email-footer/assets/images/info.png
rename to print/reports/email-footer/assets/images/info.png
diff --git a/services/print/reports/email-footer/assets/images/instagram.png b/print/reports/email-footer/assets/images/instagram.png
similarity index 100%
rename from services/print/reports/email-footer/assets/images/instagram.png
rename to print/reports/email-footer/assets/images/instagram.png
diff --git a/services/print/reports/email-footer/assets/images/linkedin.png b/print/reports/email-footer/assets/images/linkedin.png
similarity index 100%
rename from services/print/reports/email-footer/assets/images/linkedin.png
rename to print/reports/email-footer/assets/images/linkedin.png
diff --git a/services/print/reports/email-footer/assets/images/pinterest.png b/print/reports/email-footer/assets/images/pinterest.png
similarity index 100%
rename from services/print/reports/email-footer/assets/images/pinterest.png
rename to print/reports/email-footer/assets/images/pinterest.png
diff --git a/services/print/reports/email-footer/assets/images/twitter.png b/print/reports/email-footer/assets/images/twitter.png
similarity index 100%
rename from services/print/reports/email-footer/assets/images/twitter.png
rename to print/reports/email-footer/assets/images/twitter.png
diff --git a/services/print/reports/email-footer/assets/images/youtube.png b/print/reports/email-footer/assets/images/youtube.png
similarity index 100%
rename from services/print/reports/email-footer/assets/images/youtube.png
rename to print/reports/email-footer/assets/images/youtube.png
diff --git a/services/print/reports/email-footer/index.html b/print/reports/email-footer/index.html
similarity index 100%
rename from services/print/reports/email-footer/index.html
rename to print/reports/email-footer/index.html
diff --git a/services/print/reports/email-footer/index.js b/print/reports/email-footer/index.js
similarity index 100%
rename from services/print/reports/email-footer/index.js
rename to print/reports/email-footer/index.js
diff --git a/services/print/reports/email-footer/locale.js b/print/reports/email-footer/locale.js
similarity index 100%
rename from services/print/reports/email-footer/locale.js
rename to print/reports/email-footer/locale.js
diff --git a/services/print/reports/email-header/assets/css/style.css b/print/reports/email-header/assets/css/style.css
similarity index 100%
rename from services/print/reports/email-header/assets/css/style.css
rename to print/reports/email-header/assets/css/style.css
diff --git a/services/print/reports/email-header/assets/images/logo.png b/print/reports/email-header/assets/images/logo.png
similarity index 100%
rename from services/print/reports/email-header/assets/images/logo.png
rename to print/reports/email-header/assets/images/logo.png
diff --git a/services/print/reports/email-header/index.html b/print/reports/email-header/index.html
similarity index 100%
rename from services/print/reports/email-header/index.html
rename to print/reports/email-header/index.html
diff --git a/services/print/reports/email-header/index.js b/print/reports/email-header/index.js
similarity index 100%
rename from services/print/reports/email-header/index.js
rename to print/reports/email-header/index.js
diff --git a/services/print/reports/email-header/locale.js b/print/reports/email-header/locale.js
similarity index 100%
rename from services/print/reports/email-header/locale.js
rename to print/reports/email-header/locale.js
diff --git a/services/print/reports/letter-debtor-nd/assets/css/style.css b/print/reports/letter-debtor-nd/assets/css/style.css
similarity index 100%
rename from services/print/reports/letter-debtor-nd/assets/css/style.css
rename to print/reports/letter-debtor-nd/assets/css/style.css
diff --git a/services/print/reports/letter-debtor-nd/assets/files/model.ezp b/print/reports/letter-debtor-nd/assets/files/model.ezp
similarity index 100%
rename from services/print/reports/letter-debtor-nd/assets/files/model.ezp
rename to print/reports/letter-debtor-nd/assets/files/model.ezp
diff --git a/services/print/reports/letter-debtor-nd/assets/files/model2.ezp b/print/reports/letter-debtor-nd/assets/files/model2.ezp
similarity index 100%
rename from services/print/reports/letter-debtor-nd/assets/files/model2.ezp
rename to print/reports/letter-debtor-nd/assets/files/model2.ezp
diff --git a/services/print/reports/letter-debtor-nd/index.html b/print/reports/letter-debtor-nd/index.html
similarity index 100%
rename from services/print/reports/letter-debtor-nd/index.html
rename to print/reports/letter-debtor-nd/index.html
diff --git a/services/print/reports/letter-debtor-nd/index.js b/print/reports/letter-debtor-nd/index.js
similarity index 100%
rename from services/print/reports/letter-debtor-nd/index.js
rename to print/reports/letter-debtor-nd/index.js
diff --git a/services/print/reports/letter-debtor-nd/locale.js b/print/reports/letter-debtor-nd/locale.js
similarity index 100%
rename from services/print/reports/letter-debtor-nd/locale.js
rename to print/reports/letter-debtor-nd/locale.js
diff --git a/services/print/reports/letter-debtor-st/assets/css/style.css b/print/reports/letter-debtor-st/assets/css/style.css
similarity index 100%
rename from services/print/reports/letter-debtor-st/assets/css/style.css
rename to print/reports/letter-debtor-st/assets/css/style.css
diff --git a/services/print/reports/letter-debtor-st/assets/files/model.ezp b/print/reports/letter-debtor-st/assets/files/model.ezp
similarity index 100%
rename from services/print/reports/letter-debtor-st/assets/files/model.ezp
rename to print/reports/letter-debtor-st/assets/files/model.ezp
diff --git a/services/print/reports/letter-debtor-st/assets/files/model2.ezp b/print/reports/letter-debtor-st/assets/files/model2.ezp
similarity index 100%
rename from services/print/reports/letter-debtor-st/assets/files/model2.ezp
rename to print/reports/letter-debtor-st/assets/files/model2.ezp
diff --git a/services/print/reports/letter-debtor-st/index.html b/print/reports/letter-debtor-st/index.html
similarity index 100%
rename from services/print/reports/letter-debtor-st/index.html
rename to print/reports/letter-debtor-st/index.html
diff --git a/services/print/reports/letter-debtor-st/index.js b/print/reports/letter-debtor-st/index.js
similarity index 100%
rename from services/print/reports/letter-debtor-st/index.js
rename to print/reports/letter-debtor-st/index.js
diff --git a/services/print/reports/letter-debtor-st/locale.js b/print/reports/letter-debtor-st/locale.js
similarity index 100%
rename from services/print/reports/letter-debtor-st/locale.js
rename to print/reports/letter-debtor-st/locale.js
diff --git a/services/print/reports/payment-update/assets/css/style.css b/print/reports/payment-update/assets/css/style.css
similarity index 100%
rename from services/print/reports/payment-update/assets/css/style.css
rename to print/reports/payment-update/assets/css/style.css
diff --git a/services/print/reports/payment-update/index.html b/print/reports/payment-update/index.html
similarity index 100%
rename from services/print/reports/payment-update/index.html
rename to print/reports/payment-update/index.html
diff --git a/services/print/reports/payment-update/index.js b/print/reports/payment-update/index.js
similarity index 100%
rename from services/print/reports/payment-update/index.js
rename to print/reports/payment-update/index.js
diff --git a/services/print/reports/payment-update/locale.js b/print/reports/payment-update/locale.js
similarity index 100%
rename from services/print/reports/payment-update/locale.js
rename to print/reports/payment-update/locale.js
diff --git a/services/print/reports/printer-setup/assets/css/style.css b/print/reports/printer-setup/assets/css/style.css
similarity index 100%
rename from services/print/reports/printer-setup/assets/css/style.css
rename to print/reports/printer-setup/assets/css/style.css
diff --git a/services/print/reports/printer-setup/assets/files/model.ezp b/print/reports/printer-setup/assets/files/model.ezp
similarity index 100%
rename from services/print/reports/printer-setup/assets/files/model.ezp
rename to print/reports/printer-setup/assets/files/model.ezp
diff --git a/services/print/reports/printer-setup/index.html b/print/reports/printer-setup/index.html
similarity index 100%
rename from services/print/reports/printer-setup/index.html
rename to print/reports/printer-setup/index.html
diff --git a/services/print/reports/printer-setup/index.js b/print/reports/printer-setup/index.js
similarity index 100%
rename from services/print/reports/printer-setup/index.js
rename to print/reports/printer-setup/index.js
diff --git a/services/print/reports/printer-setup/locale.js b/print/reports/printer-setup/locale.js
similarity index 100%
rename from services/print/reports/printer-setup/locale.js
rename to print/reports/printer-setup/locale.js
diff --git a/services/print/server.js b/print/server.js
similarity index 100%
rename from services/print/server.js
rename to print/server.js