diff --git a/db/changes/12200-Normalidad/00-zoneEstimatedDelivery.sql b/db/changes/12200-Normalidad/00-zoneEstimatedDelivery.sql new file mode 100644 index 000000000..8cf30796e --- /dev/null +++ b/db/changes/12200-Normalidad/00-zoneEstimatedDelivery.sql @@ -0,0 +1,47 @@ +USE `vn`; +CREATE + OR REPLACE ALGORITHM = UNDEFINED + DEFINER = `root`@`%` + SQL SECURITY DEFINER +VIEW `vn`.`zoneEstimatedDelivery` AS + SELECT + `t`.`zoneFk` AS `zoneFk`, + CAST((CURDATE() + INTERVAL ((HOUR(`zc`.`hour`) * 60) + MINUTE(`zc`.`hour`)) MINUTE) + AS TIME) AS `hourTheoretical`, + CAST(SUM(`sv`.`volume`) AS DECIMAL (5 , 1 )) AS `totalVolume`, + CAST(SUM(IF((`s`.`alertLevel` < 2), + `sv`.`volume`, + 0)) + AS DECIMAL (5 , 1 )) AS `remainingVolume`, + GREATEST(IFNULL(`lhp`.`m3`, 0), + IFNULL(`dl`.`minSpeed`, 0)) AS `speed`, + CAST((`zc`.`hour` + INTERVAL ((-(SUM(IF((`s`.`alertLevel` < 2), + `sv`.`volume`, + 0))) * 60) / GREATEST(IFNULL(`lhp`.`m3`, 0), + IFNULL(`dl`.`minSpeed`, 0))) MINUTE) + AS TIME) AS `hourEffective`, + FLOOR(((-(SUM(IF((`s`.`alertLevel` < 2), + `sv`.`volume`, + 0))) * 60) / GREATEST(IFNULL(`lhp`.`m3`, 0), + IFNULL(`dl`.`minSpeed`, 0)))) AS `minutesLess`, + CAST((`zc`.`hour` + INTERVAL ((-(SUM(IF((`s`.`alertLevel` < 2), + `sv`.`volume`, + 0))) * 60) / GREATEST(IFNULL(`lhp`.`m3`, 0), + IFNULL(`dl`.`minSpeed`, 0))) MINUTE) + AS TIME) AS `etc` + FROM + ((((((((`ticket` `t` + JOIN `ticketStateToday` `tst` ON ((`tst`.`ticket` = `t`.`id`))) + JOIN `state` `s` ON ((`s`.`id` = `tst`.`state`))) + JOIN `saleVolume` `sv` ON ((`sv`.`ticketFk` = `t`.`id`))) + LEFT JOIN `lastHourProduction` `lhp` ON ((`lhp`.`warehouseFk` = `t`.`warehouseFk`))) + JOIN `warehouse` `w` ON ((`w`.`id` = `t`.`warehouseFk`))) + JOIN `warehouseAlias` `wa` ON ((`wa`.`id` = `w`.`aliasFk`))) + LEFT JOIN `zoneClosure` `zc` ON (((`zc`.`zoneFk` = `t`.`zoneFk`) + AND (`zc`.`dated` = CURDATE())))) + LEFT JOIN `cache`.`departure_limit` `dl` ON (((`dl`.`warehouse_id` = `t`.`warehouseFk`) + AND (`dl`.`fecha` = CURDATE())))) + WHERE + ((`wa`.`name` = 'Silla') + AND (CAST(`t`.`shipped` AS DATE) = CURDATE())) + GROUP BY `t`.`zoneFk`; \ No newline at end of file diff --git a/db/changes/12200-Normalidad/01-zoneETD.sql b/db/changes/12200-Normalidad/01-zoneETD.sql new file mode 100644 index 000000000..e4cf48548 --- /dev/null +++ b/db/changes/12200-Normalidad/01-zoneETD.sql @@ -0,0 +1,16 @@ +CREATE + OR REPLACE ALGORITHM = UNDEFINED + DEFINER = `root`@`%` + SQL SECURITY DEFINER +VIEW `vn`.`zone_ETD` AS + SELECT + `zed`.`zoneFk` AS `zoneFk`, + `zed`.`hourTheoretical` AS `HoraTeórica`, + `zed`.`totalVolume` AS `volumenTotal`, + `zed`.`remainingVolume` AS `volumenPendiente`, + `zed`.`speed` AS `velocidad`, + `zed`.`hourEffective` AS `HoraPráctica`, + `zed`.`minutesLess` AS `minutesLess`, + `zed`.`etc` AS `etc` + FROM + `vn`.`zoneEstimatedDelivery` `zed` \ No newline at end of file diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index e40bb505b..a1018ab5a 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -88,13 +88,18 @@ INSERT INTO `vn`.`country`(`id`, `country`, `isUeeMember`, `code`, `currencyFk`, (19,'Francia', 1, 'FR', 1, 27), (30,'Canarias', 1, 'IC', 1, 24); -INSERT INTO `vn`.`warehouse`(`id`, `name`, `isComparative`, `isInventory`, `hasAvailable`, `isManaged`, `hasStowaway`, `hasDms`, `hasComission`) +INSERT INTO `vn`.`warehouseAlias`(`id`, `name`) VALUES - (1, 'Warehouse One', 1, 1, 1, 1, 1, 1, 1), - (2, 'Warehouse Two', 1, 1, 1, 1, 0, 0, 1), - (3, 'Warehouse Three', 1, 1, 1, 1, 0, 0, 0), - (4, 'Warehouse Four', 1, 1, 1, 1, 0, 0, 0), - (5, 'Warehouse Five', 1, 1, 1, 1, 0, 0, 0); + (1, 'Main Warehouse'), + (2, 'Silla'); + +INSERT INTO `vn`.`warehouse`(`id`, `name`, `isComparative`, `isInventory`, `hasAvailable`, `isManaged`, `hasStowaway`, `hasDms`, `hasComission`, `aliasFk`) + VALUES + (1, 'Warehouse One', 1, 1, 1, 1, 1, 1, 1, 2), + (2, 'Warehouse Two', 1, 1, 1, 1, 0, 0, 1, 2), + (3, 'Warehouse Three', 1, 1, 1, 1, 0, 0, 0, 2), + (4, 'Warehouse Four', 1, 1, 1, 1, 0, 0, 0, 2), + (5, 'Warehouse Five', 1, 1, 1, 1, 0, 0, 0, 2); INSERT INTO `vn`.`sector`(`id`, `description`, `warehouseFk`, `isPreviousPreparedByPacking`, `code`, `pickingPlacement`, `path`) VALUES @@ -111,10 +116,6 @@ INSERT INTO `vn`.`shelving` (`code`, `parkingFk`, `isPrinted`, `priority`, `park ('GVC', '1', '0', '1', '0', '106'), ('HEJ', '2', '0', '1', '0', '106'); -INSERT INTO `vn`.`warehouseAlias`(`id`, `name`) - VALUES - (1, 'Main Warehouse'); - INSERT INTO `vn`.`accountingType`(`id`, `description`) VALUES (1, 'Digital money'), @@ -510,7 +511,23 @@ INSERT INTO `vn`.`zoneWarehouse` (`id`, `zoneFk`, `warehouseFk`) (11, 11, 5), (12, 12, 4), (13, 13, 5); - + +INSERT INTO `vn`.`zoneClosure` (`zoneFk`, `dated`, `hour`) + VALUES + (1, CURDATE(), '23:59'), + (2, CURDATE(), '23:59'), + (3, CURDATE(), '23:59'), + (4, CURDATE(), '23:59'), + (5, CURDATE(), '23:59'), + (6, CURDATE(), '23:59'), + (7, CURDATE(), '23:59'), + (8, CURDATE(), '23:59'), + (9, CURDATE(), '23:59'), + (10, CURDATE(), '23:59'), + (11, CURDATE(), '23:59'), + (12, CURDATE(), '23:59'), + (13, CURDATE(), '23:59'); + INSERT INTO `vn`.`zoneConfig` (`scope`) VALUES ('1'); INSERT INTO `vn`.`route`(`id`, `time`, `workerFk`, `created`, `vehicleFk`, `agencyModeFk`, `description`, `m3`, `cost`, `started`, `finished`, `zoneFk`) diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index f9a84ac65..cb29afac9 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -631,7 +631,7 @@ export default { }, ordersIndex: { searchResult: 'vn-order-index vn-card > vn-table > div > vn-tbody > a.vn-tr', - firstSearchResultTotal: 'vn-order-index vn-card > vn-table > div > vn-tbody vn-tr vn-td:nth-child(7)', + secondSearchResultTotal: 'vn-order-index vn-card > vn-table > div > vn-tbody vn-tr:nth-child(2) vn-td:nth-child(9)', searchResultDate: 'vn-order-index vn-table vn-tbody > a:nth-child(1) > vn-td:nth-child(4)', searchResultAddress: 'vn-order-index vn-table vn-tbody > a:nth-child(1) > vn-td:nth-child(6)', searchButton: 'vn-searchbar vn-icon[icon="search"]', diff --git a/e2e/paths/07-order/01_summary.spec.js b/e2e/paths/07-order/01_summary.spec.js index f4bc44827..d170f290e 100644 --- a/e2e/paths/07-order/01_summary.spec.js +++ b/e2e/paths/07-order/01_summary.spec.js @@ -8,6 +8,7 @@ describe('Order summary path', () => { browser = await getBrowser(); page = browser.page; await page.loginAndModule('employee', 'order'); + await page.waitFor(2000); await page.accessToSearchResult('16'); }); diff --git a/e2e/paths/07-order/05_index.spec.js b/e2e/paths/07-order/05_index.spec.js index ef55051aa..c07a9c6f7 100644 --- a/e2e/paths/07-order/05_index.spec.js +++ b/e2e/paths/07-order/05_index.spec.js @@ -15,9 +15,9 @@ describe('Order Index', () => { await browser.close(); }); - it(`should check the first search result doesn't contain a total of 0€`, async() => { + it(`should check the second search result doesn't contain a total of 0€`, async() => { await page.waitToClick(selectors.ordersIndex.searchButton); - const result = await page.waitToGetProperty(selectors.ordersIndex.firstSearchResultTotal, 'innerText'); + const result = await page.waitToGetProperty(selectors.ordersIndex.secondSearchResultTotal, 'innerText'); expect(result).not.toContain('0.00'); }); @@ -26,8 +26,8 @@ describe('Order Index', () => { await page.waitToClick(selectors.ordersIndex.openAdvancedSearch); await page.waitToClick(selectors.ordersIndex.advancedSearchShowEmptyCheckbox); await page.waitToClick(selectors.ordersIndex.advancedSearchButton); - await page.waitForTextInElement(selectors.ordersIndex.firstSearchResultTotal, '0.00'); - const result = await page.waitToGetProperty(selectors.ordersIndex.firstSearchResultTotal, 'innerText'); + await page.waitForTextInElement(selectors.ordersIndex.secondSearchResultTotal, '0.00'); + const result = await page.waitToGetProperty(selectors.ordersIndex.secondSearchResultTotal, 'innerText'); expect(result).toContain('0.00'); }); diff --git a/loopback/locale/es.json b/loopback/locale/es.json index e58d55da0..9951df4a5 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -133,5 +133,6 @@ "Distance must be lesser than 1000": "La distancia debe ser inferior a 1000", "This ticket is deleted": "Este ticket está eliminado", "A travel with this data already exists": "Ya existe un travel con estos datos", - "This thermograph id already exists": "La id del termógrafo ya existe" + "This thermograph id already exists": "La id del termógrafo ya existe", + "ORDER_ALREADY_CONFIRMED": "ORDER_ALREADY_CONFIRMED" } \ No newline at end of file diff --git a/modules/claim/back/methods/claim/specs/regularizeClaim.spec.js b/modules/claim/back/methods/claim/specs/regularizeClaim.spec.js index ecaccd4e4..1d3bff26d 100644 --- a/modules/claim/back/methods/claim/specs/regularizeClaim.spec.js +++ b/modules/claim/back/methods/claim/specs/regularizeClaim.spec.js @@ -1,7 +1,6 @@ const app = require('vn-loopback/server/server'); -// #2304 -xdescribe('regularizeClaim()', () => { +describe('regularizeClaim()', () => { const claimFk = 1; const pendentState = 1; const resolvedState = 3; diff --git a/modules/order/back/methods/order/filter.js b/modules/order/back/methods/order/filter.js index cdd54859f..bfa64c4dd 100644 --- a/modules/order/back/methods/order/filter.js +++ b/modules/order/back/methods/order/filter.js @@ -133,7 +133,6 @@ module.exports = Self => { }); filter = mergeFilters(filter, {where}); - let stmts = []; let stmt; @@ -157,14 +156,20 @@ module.exports = Self => { c.salesPersonFk, u.nickname workerNickname, u.name name, - co.code companyCode + co.code companyCode, + zed.zoneFk, + zed.hourTheoretical, + zed.hourEffective FROM hedera.order o LEFT JOIN address a ON a.id = o.address_id LEFT JOIN agencyMode am ON am.id = o.agency_id LEFT JOIN client c ON c.id = o.customer_id LEFT JOIN worker wk ON wk.id = c.salesPersonFk LEFT JOIN account.user u ON u.id = wk.userFk - LEFT JOIN company co ON co.id = o.company_id`); + LEFT JOIN company co ON co.id = o.company_id + LEFT JOIN orderTicket ot ON ot.orderFk = o.id + LEFT JOIN ticket t ON t.id = ot.ticketFk + LEFT JOIN zoneEstimatedDelivery zed ON zed.zoneFk = t.zoneFk`); if (args && args.ticketFk) { stmt.merge({ @@ -172,7 +177,11 @@ module.exports = Self => { }); } - stmt.merge(conn.makeSuffix(filter)); + stmt.merge(conn.makeWhere(filter.where)); + stmt.merge({ + sql: `GROUP BY o.id` + }); + stmt.merge(conn.makePagination(filter)); stmts.push(stmt); stmts.push(` diff --git a/modules/order/front/index/index.html b/modules/order/front/index/index.html index a28979646..8e64b4b0c 100644 --- a/modules/order/front/index/index.html +++ b/modules/order/front/index/index.html @@ -10,11 +10,13 @@ Id - Client Sales person + Client Confirmed Created Landed + T. Hour + Real hour Total @@ -24,13 +26,6 @@ class="clickable search-result" ui-sref="order.card.summary({id: {{::order.id}}})"> {{::order.id}} - - - {{::order.clientName}} - - - + + + {{::order.clientName}} + + + {{::order.created | date: 'dd/MM/yyyy HH:mm'}} - {{::order.landed | date:'dd/MM/yyyy'}} + + + {{::order.landed | date:'dd/MM/yyyy'}} + + + {{::order.hourTheoretical | date: 'HH:mm'}} + {{::ticket.hourEffective | date: 'HH:mm'}} {{::order.total | currency: 'EUR': 2 | dashIfEmpty}} { + let controller; + let $window; + let orders = [{ + id: 1, + clientFk: 1, + isConfirmed: false + }, { + id: 2, + clientFk: 1, + isConfirmed: false + }, { + id: 3, + clientFk: 1, + isConfirmed: true + }]; + + beforeEach(ngModule('order')); + + beforeEach(inject(($componentController, _$window_,) => { + $window = _$window_; + const $element = angular.element(''); + controller = $componentController('vnOrderIndex', {$element}); + })); + + describe('compareDate()', () => { + it('should return warning when the date is the present', () => { + let curDate = new Date(); + let result = controller.compareDate(curDate); + + expect(result).toEqual('warning'); + }); + + it('should return sucess when the date is in the future', () => { + let futureDate = new Date(); + futureDate = futureDate.setDate(futureDate.getDate() + 10); + let result = controller.compareDate(futureDate); + + expect(result).toEqual('success'); + }); + + it('should return undefined when the date is in the past', () => { + let pastDate = new Date(); + pastDate = pastDate.setDate(pastDate.getDate() - 10); + let result = controller.compareDate(pastDate); + + expect(result).toEqual(undefined); + }); + }); + + describe('preview()', () => { + it('should show the dialog summary', () => { + controller.$.summary = {show: () => {}}; + jest.spyOn(controller.$.summary, 'show'); + + let event = new MouseEvent('click', { + view: $window, + bubbles: true, + cancelable: true + }); + controller.preview(event, orders[0]); + + expect(controller.$.summary.show).toHaveBeenCalledWith(); + }); + }); +}); diff --git a/modules/order/front/locale/es.yml b/modules/order/front/locale/es.yml index 154f92098..fbc384f21 100644 --- a/modules/order/front/locale/es.yml +++ b/modules/order/front/locale/es.yml @@ -21,4 +21,6 @@ Ascendant: Ascendente Descendant: Descendente Created from: Creado desde Search order by id: Buscar el pedido por identificador -order: pedido \ No newline at end of file +order: pedido +Confirm lines: Confirmar las lineas +Confirm: Confirmar \ No newline at end of file diff --git a/modules/order/front/summary/index.html b/modules/order/front/summary/index.html index 2f7399dec..f27e2e510 100644 --- a/modules/order/front/summary/index.html +++ b/modules/order/front/summary/index.html @@ -1,5 +1,14 @@ -
{{$ctrl.summary.id}} - {{$ctrl.summary.client.name}} - {{$ctrl.summary.client.salesPerson.id}}
+
{{$ctrl.summary.id}} - {{$ctrl.summary.client.name}} - {{$ctrl.summary.client.salesPerson.id}} + + +
{ + this.vnApp.showSuccess(this.$t('Order confirmed')); + this.$state.go(`ticket.index`, { + q: JSON.stringify({clientFk: this.order.clientFk}) + }); + }); + } } ngModule.component('vnOrderSummary', { diff --git a/modules/order/front/summary/style.scss b/modules/order/front/summary/style.scss index a0ed56d42..d0f7a3d03 100644 --- a/modules/order/front/summary/style.scss +++ b/modules/order/front/summary/style.scss @@ -3,6 +3,21 @@ vn-order-summary .summary{ max-width: $width-lg; + h5 { + display: flex; + justify-content: space-between; + align-items: center; + align-content: center; + + + span { + flex: 1; + } + + vn-button { + flex: none + } + } & > div > vn-horizontal > vn-one { min-width: 160px !important; diff --git a/modules/zone/back/model-config.json b/modules/zone/back/model-config.json index 7638e3f6c..f353be088 100644 --- a/modules/zone/back/model-config.json +++ b/modules/zone/back/model-config.json @@ -28,5 +28,8 @@ }, "ZoneWarehouse": { "dataSource": "vn" + }, + "ZoneEstimatedDelivery": { + "dataSource": "vn" } } diff --git a/modules/zone/back/models/zone-estimated-delivery.json b/modules/zone/back/models/zone-estimated-delivery.json new file mode 100644 index 000000000..d65cee3b5 --- /dev/null +++ b/modules/zone/back/models/zone-estimated-delivery.json @@ -0,0 +1,44 @@ +{ + "name": "ZoneEstimatedDelivery", + "base": "VnModel", + "options": { + "mysql": { + "table": "zoneEstimatedDelivery" + } + }, + "properties": { + "zoneFk": { + "id": true, + "type": "Number" + }, + "hourTheoretical": { + "type": "date" + }, + "totalVolume": { + "type": "Number" + }, + "remainingVolume": { + "type": "Number" + }, + "speed": { + "type": "Number" + }, + "hourEffective": { + "type": "Date" + }, + "minutesLess": { + "type": "Date" + }, + "etc": { + "type": "Date" + } + + }, + "relations": { + "zone": { + "type": "belongsTo", + "model": "Zone", + "foreignKey": "zoneFk" + } + } +} \ No newline at end of file