diff --git a/Jenkinsfile b/Jenkinsfile index 82748e93d..e61547070 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -34,6 +34,11 @@ node stage ("docker") { + stage ("install modules loopback service") + { + sh "cd ./services/loopback && npm install" + } + stage ("Stopping/Removing Docker") { sh "docker-compose down --rmi all" diff --git a/client/client/src/fiscal-data/fiscal-data.html b/client/client/src/fiscal-data/fiscal-data.html index ce221c67f..73d9a96cc 100644 --- a/client/client/src/fiscal-data/fiscal-data.html +++ b/client/client/src/fiscal-data/fiscal-data.html @@ -11,10 +11,10 @@ Fiscal data - + - + @@ -37,7 +37,7 @@ url="/client/api/Countries" show-field="name" value-field="id" - label="País"> + label="CountryFk"> diff --git a/client/client/src/locale/es.json b/client/client/src/locale/es.json index 3a36dab65..c3bc8aac5 100644 --- a/client/client/src/locale/es.json +++ b/client/client/src/locale/es.json @@ -1,5 +1,8 @@ { "Client": "Cliente", "Clients": "Clientes", - "Fiscal data": "Datos Fiscales" + "Fiscal data": "Datos Fiscales", + "Has to invoice": "Factura", + "Invoice by mail": "Factura impresa", + "CountryFk": "País" } \ No newline at end of file diff --git a/client/core/src/paging/paging.html b/client/core/src/paging/paging.html index 6e2f56fd3..6e71f321d 100644 --- a/client/core/src/paging/paging.html +++ b/client/core/src/paging/paging.html @@ -1,6 +1,7 @@ button', vnMenuItem: 'vn-menu-item > li > a', - vnAutocomplete: 'vn-autocomplete' + vnAutocomplete: 'vn-autocomplete', + vnCheck: 'vn-check' }; diff --git a/e2e/helpers/extensions.js b/e2e/helpers/extensions.js index 6ace6673d..168540de4 100644 --- a/e2e/helpers/extensions.js +++ b/e2e/helpers/extensions.js @@ -27,7 +27,7 @@ Nightmare.action('getInnerText', function(selector, done) { Nightmare.action('getInputValue', function(selector, done) { this.wait(selector) .evaluate_now(function(elementToSelect) { - return document.querySelectorAll(elementToSelect)[0].value; + return document.querySelector(elementToSelect).value; }, done, selector); }); diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index c832dd8a6..97c496bbf 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -1,16 +1,6 @@ // eslint max-len: ["error", 500] // eslint key-spacing: ["error", 500] -import components from './selector_variables.js'; - -function checkElement(selector, attributeValue) { - let aux = selector.split(' '); - if (aux[0] === 'vn-autocomplete') { - return selector.replace(aux[0], `${aux[0]}[field="${attributeValue}"]`); - } - if (aux[0] === 'vn-textfield') { - return selector.replace(aux[4], `${aux[4]}[name="${attributeValue}"]`); - } -} +import components from './components_selectors.js'; export default { login: { @@ -35,34 +25,34 @@ export default { createClientButton: `${components.vnFloatButton}` }, createClientView: { - name: `${checkElement(components.vnTextfield, 'name')}`, - taxNumber: `${checkElement(components.vnTextfield, 'fi')}`, - socialName: `${checkElement(components.vnTextfield, 'socialName')}`, - userName: `${checkElement(components.vnTextfield, 'userName')}`, - email: `${checkElement(components.vnTextfield, 'email')}`, + name: `${components.vnTextfield}[name="name"]`, + taxNumber: `${components.vnTextfield}[name="fi"]`, + socialName: `${components.vnTextfield}[name="socialName"]`, + userName: `${components.vnTextfield}[name="userName"]`, + email: `${components.vnTextfield}[name="email"]`, createButton: `${components.vnSubmit}` }, basicData: { - basicDataButton: `${components.vnMenuItem}`, - nameInput: `${checkElement(components.vnTextfield, 'name')}`, - taxNumberInput: `${checkElement(components.vnTextfield, 'fi')}`, - socialNameInput: `${checkElement(components.vnTextfield, 'socialName')}`, - phoneInput: `${checkElement(components.vnTextfield, 'phone')}`, - mobileInput: `${checkElement(components.vnTextfield, 'mobile')}`, - faxInput: `${checkElement(components.vnTextfield, 'fax')}`, - emailInput: `${checkElement(components.vnTextfield, 'email')}`, - salesPersonInput: `${checkElement(components.vnAutocomplete, '$ctrl.client.salesPersonFk')}`, - channelInput: 'body > vn-app > vn-vertical > vn-vertical > vn-client-card > vn-horizontal > vn-auto > vn-vertical > vn-client-basic-data > form > vn-card > div > vn-vertical > vn-horizontal:nth-child(4) > vn-autocomplete:nth-child(3) > vn-vertical > vn-textfield > div > input', - channelMetropolisOption: 'body > vn-app > vn-vertical > vn-vertical > vn-client-card > vn-horizontal > vn-auto > vn-vertical > vn-client-basic-data > form > vn-card > div > vn-vertical > vn-horizontal:nth-child(4) > vn-autocomplete:nth-child(3) > vn-vertical > vn-drop-down > vn-vertical > vn-one:nth-child(2) > ul > li:nth-child(3)', - saveButton: 'body > vn-app > vn-vertical > vn-vertical > vn-client-card > vn-horizontal > vn-auto > vn-vertical > vn-client-basic-data > form > vn-button-bar > vn-submit > input' + basicDataButton: `${components.vnMenuItem}[ui-sref="clientCard.basicData"]`, + nameInput: `${components.vnTextfield}[name="name"]`, + taxNumberInput: `${components.vnTextfield}[name="fi"]`, + socialNameInput: `${components.vnTextfield}[name="socialName"]`, + phoneInput: `${components.vnTextfield}[name="phone"]`, + mobileInput: `${components.vnTextfield}[name="mobile"]`, + faxInput: `${components.vnTextfield}[name="fax"]`, + emailInput: `${components.vnTextfield}[name="email"]`, + salesPersonInput: `${components.vnAutocomplete}[field="$ctrl.client.salesPersonFk"]`, + channelInput: `${components.vnAutocomplete}[field="$ctrl.client.contactChannelFk"] > vn-vertical > ${components.vnTextfield}`, + channelMetropolisOption: `${components.vnAutocomplete}[field="$ctrl.client.contactChannelFk"] > vn-vertical > vn-drop-down > vn-vertical > vn-one:nth-child(2) > ul > li:nth-child(3)`, + saveButton: `${components.vnSubmit}` }, fiscalData: { - fiscalDataButton: 'body > vn-app > vn-vertical > vn-vertical > vn-client-card > vn-horizontal > vn-empty > vn-left-menu > vn-card > div > vn-vertical > vn-actions > vn-horizontal > ul > vn-menu-item:nth-child(2) > li > a', - addressInput: 'body > vn-app > vn-vertical > vn-vertical > vn-client-card > vn-horizontal > vn-auto > vn-vertical > vn-client-fiscal-data > form > vn-card > div > vn-vertical > vn-horizontal:nth-child(3) > vn-textfield:nth-child(1) > div > input', - hasToInvoiceCheckboxLabel: 'body > vn-app > vn-vertical > vn-vertical > vn-client-card > vn-horizontal > vn-auto > vn-vertical > vn-client-fiscal-data > form > vn-card > div > vn-vertical > vn-horizontal:nth-child(2) > vn-one:nth-child(1) > vn-check > label', - hasToInvoiceCheckboxInput: 'body > vn-app > vn-vertical > vn-vertical > vn-client-card > vn-horizontal > vn-auto > vn-vertical > vn-client-fiscal-data > form > vn-card > div > vn-vertical > vn-horizontal:nth-child(2) > vn-one:nth-child(1) > vn-check > label > input', - // printToInvoiceCheckboxLabel: '', - // printInvoiceCheckboxInput: '', + fiscalDataButton: `${components.vnMenuItem}[ui-sref="clientCard.fiscalData"]`, + hasToInvoiceCheckboxLabel: `${components.vnCheck}[label='Has to invoice'] > label`, + hasToInvoiceCheckboxInput: `${components.vnCheck}[label='Has to invoice'] > label > label > input`, + invoiceByMailCheckboxLabel: `${components.vnCheck}[label='Invoice by mail'] > label`, + invoiceByMailCheckboxInput: `${components.vnCheck}[label='Invoice by mail'] > label > label > input`, + addressInput: `${components.vnTextfield}[name="street"]`, saveButton: 'body > vn-app > vn-vertical > vn-vertical > vn-client-card > vn-horizontal > vn-auto > vn-vertical > vn-client-fiscal-data > form > vn-button-bar > vn-submit > input' } }; diff --git a/e2e/paths/create_client_path.spec.js b/e2e/paths/create_client_path.spec.js index 42b416ab1..b9107bf2c 100644 --- a/e2e/paths/create_client_path.spec.js +++ b/e2e/paths/create_client_path.spec.js @@ -25,7 +25,7 @@ describe('create client path', () => { .waitForURL(moduleAccessViewHashURL) .url() .then(url => { - expect(url).toBe(config.url + moduleAccessViewHashURL); + expect(url).toEqual(config.url + moduleAccessViewHashURL); done(); }) .catch(catchErrors(done)); @@ -37,7 +37,7 @@ describe('create client path', () => { .wait(selectors.clientsIndex.createClientButton) .url() .then(url => { - expect(url).toBe(config.url + '#!/clients'); + expect(url).toEqual(config.url + '#!/clients'); done(); }) .catch(catchErrors(done)); @@ -51,7 +51,7 @@ describe('create client path', () => { .waitForNumberOfElements(selectors.clientsIndex.searchResult, 0) .countSearchResults(selectors.clientsIndex.searchResult) .then(result => { - expect(result).toBe(0); + expect(result).toEqual(0); done(); }) .catch(catchErrors(done)); @@ -63,7 +63,7 @@ describe('create client path', () => { .wait(selectors.createClientView.createButton) .url() .then(url => { - expect(url).toBe(config.url + '#!/create'); + expect(url).toEqual(config.url + '#!/create'); done(); }) .catch(catchErrors(done)); @@ -75,7 +75,7 @@ describe('create client path', () => { .wait(selectors.globalItems.snackbarIsActive) .getInnerText(selectors.globalItems.snackbarIsActive) .then(result => { - expect(result).toBe('No hay cambios que guardar'); + expect(result).toEqual('No hay cambios que guardar'); done(); }) .catch(catchErrors(done)); @@ -149,7 +149,7 @@ describe('create client path', () => { .wait(selectors.globalItems.snackbarIsActive) .getInnerText(selectors.globalItems.snackbarIsActive) .then(result => { - expect(result).toBe(`Algunos campos no son válidos`); + expect(result).toEqual(`Algunos campos no son válidos`); done(); }) .catch(catchErrors(done)); @@ -198,7 +198,7 @@ describe('create client path', () => { .wait(selectors.clientsIndex.createClientButton) .url() .then(url => { - expect(url).toBe(config.url + '#!/clients'); + expect(url).toEqual(config.url + '#!/clients'); done(); }) .catch(catchErrors(done)); @@ -212,7 +212,7 @@ describe('create client path', () => { .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) .countSearchResults(selectors.clientsIndex.searchResult) .then(result => { - expect(result).toBe(1); + expect(result).toEqual(1); done(); }) .catch(catchErrors(done)); diff --git a/e2e/paths/edit_basic_data.spec.js b/e2e/paths/edit_basic_data.spec.js index d8d79a9e9..0c8436a0c 100644 --- a/e2e/paths/edit_basic_data.spec.js +++ b/e2e/paths/edit_basic_data.spec.js @@ -25,7 +25,7 @@ describe('Edit basicData path', () => { .waitForURL(moduleAccessViewHashURL) .url() .then(url => { - expect(url).toBe(config.url + moduleAccessViewHashURL); + expect(url).toEqual(config.url + moduleAccessViewHashURL); done(); }) .catch(catchErrors(done)); @@ -39,7 +39,7 @@ describe('Edit basicData path', () => { .wait(selectors.clientsIndex.createClientButton) .url() .then(url => { - expect(url).toBe(config.url + '#!/clients'); + expect(url).toEqual(config.url + '#!/clients'); done(); }) .catch(catchErrors(done)); @@ -53,7 +53,7 @@ describe('Edit basicData path', () => { .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) .countSearchResults(selectors.clientsIndex.searchResult) .then(result => { - expect(result).toBe(1); + expect(result).toEqual(1); done(); }) .catch(catchErrors(done)); @@ -81,7 +81,7 @@ describe('Edit basicData path', () => { .wait(selectors.globalItems.snackbarIsActive) .getInnerText(selectors.globalItems.snackbarIsActive) .then(result => { - expect(result).toBe(`¡Datos guardados!`); + expect(result).toEqual(`¡Datos guardados!`); done(); }) .catch(catchErrors(done)); @@ -96,7 +96,7 @@ describe('Edit basicData path', () => { .wait(selectors.basicData.nameInput) .getInputValue(selectors.basicData.nameInput) .then(result => { - expect(result).toBe(`Carol Danvers Edited`); + expect(result).toEqual(`Carol Danvers Edited`); done(); }) .catch(catchErrors(done)); @@ -111,7 +111,7 @@ describe('Edit basicData path', () => { .wait(selectors.globalItems.snackbarIsActive) .getInnerText(selectors.globalItems.snackbarIsActive) .then(result => { - expect(result).toBe(`¡Datos guardados!`); + expect(result).toEqual(`¡Datos guardados!`); done(); }) .catch(catchErrors(done)); @@ -126,7 +126,7 @@ describe('Edit basicData path', () => { .wait(selectors.basicData.taxNumberInput) .getInputValue(selectors.basicData.taxNumberInput) .then(result => { - expect(result).toBe(`AVG tax Edited`); + expect(result).toEqual(`AVG tax Edited`); done(); }) .catch(catchErrors(done)); @@ -141,7 +141,7 @@ describe('Edit basicData path', () => { .wait(selectors.globalItems.snackbarIsActive) .getInnerText(selectors.globalItems.snackbarIsActive) .then(result => { - expect(result).toBe(`¡Datos guardados!`); + expect(result).toEqual(`¡Datos guardados!`); done(); }) .catch(catchErrors(done)); @@ -156,7 +156,7 @@ describe('Edit basicData path', () => { .wait(selectors.basicData.socialNameInput) .getInputValue(selectors.basicData.socialNameInput) .then(result => { - expect(result).toBe(`Avengers Team Edited`); + expect(result).toEqual(`Avengers Team Edited`); done(); }) .catch(catchErrors(done)); @@ -171,7 +171,7 @@ describe('Edit basicData path', () => { .wait(selectors.globalItems.snackbarIsActive) .getInnerText(selectors.globalItems.snackbarIsActive) .then(result => { - expect(result).toBe(`¡Datos guardados!`); + expect(result).toEqual(`¡Datos guardados!`); done(); }) .catch(catchErrors(done)); @@ -186,7 +186,7 @@ describe('Edit basicData path', () => { .wait(selectors.basicData.phoneInput) .getInputValue(selectors.basicData.phoneInput) .then(result => { - expect(result).toBe('123456789'); + expect(result).toEqual('123456789'); done(); }) .catch(catchErrors(done)); @@ -201,7 +201,7 @@ describe('Edit basicData path', () => { .wait(selectors.globalItems.snackbarIsActive) .getInnerText(selectors.globalItems.snackbarIsActive) .then(result => { - expect(result).toBe(`¡Datos guardados!`); + expect(result).toEqual(`¡Datos guardados!`); done(); }) .catch(catchErrors(done)); @@ -216,7 +216,7 @@ describe('Edit basicData path', () => { .wait(selectors.basicData.mobileInput) .getInputValue(selectors.basicData.mobileInput) .then(result => { - expect(result).toBe('987654321'); + expect(result).toEqual('987654321'); done(); }) .catch(catchErrors(done)); @@ -231,7 +231,7 @@ describe('Edit basicData path', () => { .wait(selectors.globalItems.snackbarIsActive) .getInnerText(selectors.globalItems.snackbarIsActive) .then(result => { - expect(result).toBe(`¡Datos guardados!`); + expect(result).toEqual(`¡Datos guardados!`); done(); }) .catch(catchErrors(done)); @@ -246,7 +246,7 @@ describe('Edit basicData path', () => { .wait(selectors.basicData.faxInput) .getInputValue(selectors.basicData.faxInput) .then(result => { - expect(result).toBe('432198765'); + expect(result).toEqual('432198765'); done(); }) .catch(catchErrors(done)); @@ -261,7 +261,7 @@ describe('Edit basicData path', () => { .wait(selectors.globalItems.snackbarIsActive) .getInnerText(selectors.globalItems.snackbarIsActive) .then(result => { - expect(result).toBe(`¡Datos guardados!`); + expect(result).toEqual(`¡Datos guardados!`); done(); }) .catch(catchErrors(done)); @@ -276,7 +276,7 @@ describe('Edit basicData path', () => { .wait(selectors.basicData.emailInput) .getInputValue(selectors.basicData.emailInput) .then(result => { - expect(result).toBe('CarolDanversEdited@verdnatura.es'); + expect(result).toEqual('CarolDanversEdited@verdnatura.es'); done(); }) .catch(catchErrors(done)); @@ -290,7 +290,7 @@ describe('Edit basicData path', () => { // .wait(selectors.globalItems.snackbarIsActive) // .getInnerText(selectors.globalItems.snackbarIsActive) // .then(result => { - // expect(result).toBe(`¡Datos guardados!`); + // expect(result).toEqual(`¡Datos guardados!`); // done(); // }) // .catch(catchErrors(done)); @@ -305,7 +305,7 @@ describe('Edit basicData path', () => { .wait(selectors.globalItems.snackbarIsActive) .getInnerText(selectors.globalItems.snackbarIsActive) .then(result => { - expect(result).toBe(`¡Datos guardados!`); + expect(result).toEqual(`¡Datos guardados!`); done(); }) .catch(catchErrors(done)); @@ -320,7 +320,7 @@ describe('Edit basicData path', () => { .wait(100) .getInputValue(selectors.basicData.channelInput) .then(result => { - expect(result).toBe('Metropolis newspaper'); + expect(result).toEqual('Metropolis newspaper'); done(); }) .catch(catchErrors(done)); diff --git a/e2e/paths/edit_fiscal_data.spec.js b/e2e/paths/edit_fiscal_data.spec.js index 3dcea55a0..add095d7c 100644 --- a/e2e/paths/edit_fiscal_data.spec.js +++ b/e2e/paths/edit_fiscal_data.spec.js @@ -25,7 +25,7 @@ describe('Edit fiscalData path', () => { .waitForURL(moduleAccessViewHashURL) .url() .then(url => { - expect(url).toBe(config.url + moduleAccessViewHashURL); + expect(url).toEqual(config.url + moduleAccessViewHashURL); done(); }) .catch(catchErrors(done)); @@ -39,7 +39,7 @@ describe('Edit fiscalData path', () => { .wait(selectors.clientsIndex.createClientButton) .url() .then(url => { - expect(url).toBe(config.url + '#!/clients'); + expect(url).toEqual(config.url + '#!/clients'); done(); }) .catch(catchErrors(done)); @@ -53,7 +53,7 @@ describe('Edit fiscalData path', () => { .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1) .countSearchResults(selectors.clientsIndex.searchResult) .then(result => { - expect(result).toBe(1); + expect(result).toEqual(1); done(); }) .catch(catchErrors(done)); @@ -80,7 +80,7 @@ describe('Edit fiscalData path', () => { .wait(selectors.globalItems.snackbarIsActive) .getInnerText(selectors.globalItems.snackbarIsActive) .then(result => { - expect(result).toBe('¡Datos guardados!'); + expect(result).toEqual('¡Datos guardados!'); done(); }) .catch(catchErrors(done)); @@ -95,7 +95,37 @@ describe('Edit fiscalData path', () => { .wait(selectors.fiscalData.hasToInvoiceCheckboxLabel) .evaluate(selector => { return document.querySelector(selector).checked; - }, selectors.fiscalData.hasToInvoiceCheckboxInput) + }, selectors.fiscalData.hasToInvoiceCheckboxLabel) + .then(value => { + expect(value).toBeFalsy(); + done(); + }) + .catch(catchErrors(done)); + }); + + it(`should uncheck the invoiceByMail checkbox`, done => { + nightmare + .waitToClick(selectors.fiscalData.invoiceByMailCheckboxLabel) + .waitToClick(selectors.fiscalData.saveButton) + .wait(selectors.globalItems.snackbarIsActive) + .getInnerText(selectors.globalItems.snackbarIsActive) + .then(result => { + expect(result).toEqual('¡Datos guardados!'); + done(); + }) + .catch(catchErrors(done)); + }); + + it(`should confirm invoiceByMail checkbox is unchecked`, done => { + nightmare + .waitForSnackbarReset() + .waitToClick(selectors.basicData.basicDataButton) + .wait(selectors.basicData.nameInput) + .waitToClick(selectors.fiscalData.fiscalDataButton) + .wait(selectors.fiscalData.invoiceByMailCheckboxLabel) + .evaluate(selector => { + return document.querySelector(selector).checked; + }, selectors.fiscalData.invoiceByMailCheckboxLabel) .then(value => { expect(value).toBeFalsy(); done(); diff --git a/services/auth/Dockerfile b/services/auth/Dockerfile index f0390d9e9..582de9eae 100644 --- a/services/auth/Dockerfile +++ b/services/auth/Dockerfile @@ -4,8 +4,6 @@ COPY auth /app COPY loopback /loopback -RUN npm install loopback - WORKDIR /app RUN npm install diff --git a/services/client/Dockerfile b/services/client/Dockerfile index 01cc147f1..2ff9fa445 100644 --- a/services/client/Dockerfile +++ b/services/client/Dockerfile @@ -4,8 +4,6 @@ COPY client /app COPY loopback /loopback -RUN npm install loopback - WORKDIR /app RUN npm install diff --git a/services/client/package.json b/services/client/package.json index 7189c15cc..e37c7ab5a 100644 --- a/services/client/package.json +++ b/services/client/package.json @@ -13,6 +13,7 @@ "url": "https://git.verdnatura.es/salix" }, "dependencies": { - "loopback-context": "^3.3.0" + "loopback-context": "^3.3.0", + "request": "^2.83.0" } } diff --git a/services/production/Dockerfile b/services/production/Dockerfile index 41e52e736..7c0658d7c 100644 --- a/services/production/Dockerfile +++ b/services/production/Dockerfile @@ -4,8 +4,6 @@ COPY production /app COPY loopback /loopback -RUN npm install loopback - WORKDIR /app RUN npm install diff --git a/services/production/common/methods/fake-production/list.js b/services/production/common/methods/fake-production/list.js index 3282348cd..fddb9c310 100644 --- a/services/production/common/methods/fake-production/list.js +++ b/services/production/common/methods/fake-production/list.js @@ -28,6 +28,13 @@ module.exports = function(Self) { onFinish(err); } + reBuildFilter(); + let where = Self.dataSource.connector.buildWhere(Self.modelName, filter.where); + let query = `SELECT * FROM tmp.production ${where.sql} GROUP BY RouteFk ORDER BY routeFk`; + conn.query(query, where.params, onFinish); + } + + function reBuildFilter() { if (filter.where && filter.where.q) { let regexQ = new RegExp(filter.where.q); delete filter.where.q; @@ -53,14 +60,10 @@ module.exports = function(Self) { } filter.where = newFilter; } - - let where = Self.dataSource.connector.buildWhere(Self.modelName, filter.where); - let query = `SELECT * FROM FakeProduction_tmp ${where.sql} GROUP BY RouteFk ORDER BY routeFk`; - conn.query(query, where.params, onFinish); } function onFinish(err, results) { - conn.query('DROP TEMPORARY TABLE IF EXISTS FakeProduction_tmp'); + conn.query('DROP TEMPORARY TABLE IF EXISTS tmp.production'); conn.release(); if (err) callback(err); diff --git a/services/production/package.json b/services/production/package.json index 8001114a5..91f9e27d2 100644 --- a/services/production/package.json +++ b/services/production/package.json @@ -12,5 +12,8 @@ "url": "https://git.verdnatura.es/salix" }, "license": "GPL-3.0", - "description": "vn-production" + "description": "vn-production", + "dependencies": { + "uuid": "^3.1.0" + } } diff --git a/services/route/Dockerfile b/services/route/Dockerfile index 6491d6e4f..ded1fa1db 100644 --- a/services/route/Dockerfile +++ b/services/route/Dockerfile @@ -4,8 +4,6 @@ COPY route /app COPY loopback /loopback -RUN npm install loopback - WORKDIR /app RUN npm install diff --git a/services/salix/Dockerfile b/services/salix/Dockerfile index 8af14e460..db7b8720f 100644 --- a/services/salix/Dockerfile +++ b/services/salix/Dockerfile @@ -4,8 +4,6 @@ COPY salix /app COPY loopback /loopback -RUN npm install loopback - WORKDIR /app RUN npm install