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