parent
93bca3b3f0
commit
cfdeb387a1
|
@ -0,0 +1,11 @@
|
||||||
|
DROP TRIGGER IF EXISTS `vn2008`.`TicketsAfterUpdate`;
|
||||||
|
|
||||||
|
DELIMITER $$
|
||||||
|
USE `vn2008`$$
|
||||||
|
CREATE DEFINER=`root`@`%` TRIGGER `vn2008`.`TicketsAfterUpdate`
|
||||||
|
AFTER UPDATE ON `Tickets` FOR EACH ROW
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
CALL stock.queueAdd ('ticket', NEW.Id_Ticket, OLD.Id_Ticket);
|
||||||
|
END$$
|
||||||
|
DELIMITER ;
|
|
@ -170,7 +170,6 @@ vn-table {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vn-textfield {
|
vn-textfield {
|
||||||
max-width: 100px;
|
|
||||||
float: right;
|
float: right;
|
||||||
margin: 0!important;
|
margin: 0!important;
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ module.exports = Self => {
|
||||||
include: [
|
include: [
|
||||||
{relation: 'ticket',
|
{relation: 'ticket',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'packages', 'warehouseFk', 'nickname', 'clientFk', 'priority'],
|
fields: ['id', 'packages', 'warehouseFk', 'nickname', 'clientFk', 'priority', 'addressFk'],
|
||||||
order: 'priority',
|
order: 'priority',
|
||||||
include: [
|
include: [
|
||||||
{
|
{
|
||||||
|
@ -56,7 +56,7 @@ module.exports = Self => {
|
||||||
{
|
{
|
||||||
relation: 'address',
|
relation: 'address',
|
||||||
scope: {
|
scope: {
|
||||||
fields: ['id', 'street', 'postcode', 'city'],
|
fields: ['id', 'street', 'postalCode', 'city'],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
module.exports = Self => {
|
||||||
|
Self.remoteMethod('guessPriority', {
|
||||||
|
description: 'Changes automatically the priority of the tickets in a route',
|
||||||
|
accessType: 'READ',
|
||||||
|
accepts: [{
|
||||||
|
arg: 'id',
|
||||||
|
type: 'number',
|
||||||
|
required: true,
|
||||||
|
description: 'Guess priority',
|
||||||
|
http: {source: 'path'}
|
||||||
|
}],
|
||||||
|
returns: {
|
||||||
|
type: 'object',
|
||||||
|
root: true
|
||||||
|
},
|
||||||
|
http: {
|
||||||
|
path: `/:id/guessPriority`,
|
||||||
|
verb: 'GET'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Self.guessPriority = async id => {
|
||||||
|
let query = `CALL vn.routeGuessPriority(?)`;
|
||||||
|
|
||||||
|
let options = [id];
|
||||||
|
return await Self.rawSql(query, options);
|
||||||
|
};
|
||||||
|
};
|
|
@ -1,4 +1,5 @@
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
require('../methods/route/summary')(Self);
|
require('../methods/route/summary')(Self);
|
||||||
require('../methods/route/getTickets')(Self);
|
require('../methods/route/getTickets')(Self);
|
||||||
|
require('../methods/route/guessPriority')(Self);
|
||||||
};
|
};
|
||||||
|
|
|
@ -8,3 +8,4 @@ import './card';
|
||||||
import './create';
|
import './create';
|
||||||
import './basic-data';
|
import './basic-data';
|
||||||
import './log';
|
import './log';
|
||||||
|
import './tickets';
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
"dependencies": ["client", "worker", "ticket"],
|
"dependencies": ["client", "worker", "ticket"],
|
||||||
"menu": [
|
"menu": [
|
||||||
{"state": "route.card.basicData", "icon": "settings"},
|
{"state": "route.card.basicData", "icon": "settings"},
|
||||||
{"state": "route.card.log", "icon": "history"}
|
{"state": "route.card.log", "icon": "history"},
|
||||||
],
|
{"state": "route.card.tickets", "icon": "icon-ticket"}],
|
||||||
"routes": [
|
"routes": [
|
||||||
{
|
{
|
||||||
"url": "/route",
|
"url": "/route",
|
||||||
|
@ -16,26 +16,22 @@
|
||||||
"component": "ui-view",
|
"component": "ui-view",
|
||||||
"description": "Routes",
|
"description": "Routes",
|
||||||
"acl": ["employee"]
|
"acl": ["employee"]
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"url": "/index?q",
|
"url": "/index?q",
|
||||||
"state": "route.index",
|
"state": "route.index",
|
||||||
"component": "vn-route-index",
|
"component": "vn-route-index",
|
||||||
"description": "Routes"
|
"description": "Routes"
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"url": "/create",
|
"url": "/create",
|
||||||
"state": "route.create",
|
"state": "route.create",
|
||||||
"component": "vn-route-create",
|
"component": "vn-route-create",
|
||||||
"description": "New route"
|
"description": "New route"
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"url": "/:id",
|
"url": "/:id",
|
||||||
"state": "route.card",
|
"state": "route.card",
|
||||||
"abstract": true,
|
"abstract": true,
|
||||||
"component": "vn-route-card"
|
"component": "vn-route-card"
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"url": "/summary",
|
"url": "/summary",
|
||||||
"state": "route.card.summary",
|
"state": "route.card.summary",
|
||||||
"component": "vn-route-summary",
|
"component": "vn-route-summary",
|
||||||
|
@ -43,8 +39,7 @@
|
||||||
"params": {
|
"params": {
|
||||||
"route": "$ctrl.route"
|
"route": "$ctrl.route"
|
||||||
}
|
}
|
||||||
},
|
}, {
|
||||||
{
|
|
||||||
"url": "/basic-data",
|
"url": "/basic-data",
|
||||||
"state": "route.card.basicData",
|
"state": "route.card.basicData",
|
||||||
"component": "vn-route-basic-data",
|
"component": "vn-route-basic-data",
|
||||||
|
@ -53,12 +48,21 @@
|
||||||
"route": "$ctrl.route"
|
"route": "$ctrl.route"
|
||||||
},
|
},
|
||||||
"acl": ["delivery"]
|
"acl": ["delivery"]
|
||||||
}, {
|
}, {
|
||||||
"url" : "/log",
|
"url" : "/log",
|
||||||
"state": "route.card.log",
|
"state": "route.card.log",
|
||||||
"component": "vn-route-log",
|
"component": "vn-route-log",
|
||||||
"description": "Log",
|
"description": "Log",
|
||||||
"acl": ["delivery"]
|
"acl": ["delivery"]
|
||||||
}
|
}, {
|
||||||
|
"url": "/tickets",
|
||||||
|
"state": "route.card.tickets",
|
||||||
|
"component": "vn-route-tickets",
|
||||||
|
"description": "Tickets",
|
||||||
|
"params": {
|
||||||
|
"route": "$ctrl.route"
|
||||||
|
},
|
||||||
|
"acl": ["delivery"]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
|
@ -0,0 +1,114 @@
|
||||||
|
<vn-crud-model
|
||||||
|
vn-id="model"
|
||||||
|
url="/api/Routes/{{$ctrl.$stateParams.id}}/getTickets"
|
||||||
|
order="priority ASC"
|
||||||
|
data="$ctrl.tickets"
|
||||||
|
auto-load="true">
|
||||||
|
</vn-crud-model>
|
||||||
|
<form name="form">
|
||||||
|
<vn-card pad-large>
|
||||||
|
<vn-tool-bar margin-small-bottom >
|
||||||
|
<vn-button
|
||||||
|
label="Varita"
|
||||||
|
ng-click="$ctrl.guessPriority()"
|
||||||
|
vn-tooltip="Change ticket state to 'Ok'">
|
||||||
|
</vn-button>
|
||||||
|
<vn-button
|
||||||
|
disabled="!$ctrl.isChecked"
|
||||||
|
ng-click="$ctrl.goToBuscaman()"
|
||||||
|
vn-tooltip="Open buscaman"
|
||||||
|
tooltip-position="up"
|
||||||
|
icon="icon-buscaman">
|
||||||
|
</vn-button>
|
||||||
|
</vn-tool-bar>
|
||||||
|
<vn-icon-button
|
||||||
|
vn-tooltip="Load more"
|
||||||
|
ng-click="$ctrl.goToBuscaman()">
|
||||||
|
</vn-icon-button>
|
||||||
|
<vn-table model="model" auto-load="false">
|
||||||
|
<vn-thead>
|
||||||
|
<vn-tr>
|
||||||
|
<vn-th shrink>
|
||||||
|
<vn-multi-check
|
||||||
|
data="$ctrl.tickets">
|
||||||
|
</vn-multi-check>
|
||||||
|
</vn-th>
|
||||||
|
<vn-th>Order</vn-th>
|
||||||
|
<vn-th number>Ticket id</vn-th>
|
||||||
|
<vn-th>Alias</vn-th>
|
||||||
|
<vn-th number shrink>Packages</vn-th>
|
||||||
|
<vn-th shrink>m³</vn-th>
|
||||||
|
<vn-th shrink>Warehouse</vn-th>
|
||||||
|
<vn-th shrink>PC</vn-th>
|
||||||
|
<vn-th>Street</vn-th>
|
||||||
|
<vn-th shrink></vn-th>
|
||||||
|
<vn-th shrink></vn-th>
|
||||||
|
</vn-tr>
|
||||||
|
</vn-thead>
|
||||||
|
<vn-tbody>
|
||||||
|
<vn-tr ng-repeat="ticket in $ctrl.tickets">
|
||||||
|
<vn-td shrink>
|
||||||
|
<vn-check
|
||||||
|
field="ticket.checked">
|
||||||
|
</vn-check>
|
||||||
|
</vn-td>
|
||||||
|
<vn-td>
|
||||||
|
<vn-textfield
|
||||||
|
vn-tab-index="-1"
|
||||||
|
type="number"
|
||||||
|
on-change="$ctrl.setPriority(ticket.id, ticket.priority)"
|
||||||
|
model="ticket.priority"
|
||||||
|
rule="ticket.priority">
|
||||||
|
</vn-textfield>
|
||||||
|
</vn-td>
|
||||||
|
<vn-td number>
|
||||||
|
<span
|
||||||
|
ng-click="$ctrl.showTicketDescriptor($event, ticket.id)"
|
||||||
|
class="link">
|
||||||
|
{{ticket.id | zeroFill:6}}
|
||||||
|
</span>
|
||||||
|
</vn-td>
|
||||||
|
<vn-td>
|
||||||
|
<span
|
||||||
|
ng-click="$ctrl.showClientDescriptor($event, ticket.clientFk)"
|
||||||
|
class="link">
|
||||||
|
{{ticket.nickname}}
|
||||||
|
</span>
|
||||||
|
</vn-td>
|
||||||
|
<vn-td number shrink>{{ticket.packages}}</vn-td>
|
||||||
|
<vn-td shrink>{{ticket.volume}}</vn-td>
|
||||||
|
<vn-td shrink>{{ticket.warehouse.name}}</vn-td>
|
||||||
|
<vn-td shrink>{{ticket.client.postcode}}</vn-td>
|
||||||
|
<vn-td expand title="{{ticket.client.street}}">{{ticket.client.street}}</vn-td>
|
||||||
|
<vn-td shrink>
|
||||||
|
<vn-icon
|
||||||
|
ng-if="ticket.notes.length"
|
||||||
|
vn-tooltip="{{ticket.notes[0].description}}"
|
||||||
|
icon="insert_drive_file">
|
||||||
|
</vn-icon>
|
||||||
|
</vn-td>
|
||||||
|
<vn-td>
|
||||||
|
<vn-icon-button
|
||||||
|
vn-tooltip="Remove ticket"
|
||||||
|
icon="delete"
|
||||||
|
ng-click="$ctrl.showDeleteConfirm(ticket.id)"
|
||||||
|
tabindex="-1">
|
||||||
|
</vn-icon-button>
|
||||||
|
</vn-td>
|
||||||
|
</vn-tr>
|
||||||
|
</vn-tbody>
|
||||||
|
</vn-table>
|
||||||
|
</vn-card>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<vn-ticket-descriptor-popover
|
||||||
|
vn-id="ticketDescriptor">
|
||||||
|
</vn-ticket-descriptor-popover>
|
||||||
|
<vn-client-descriptor-popover
|
||||||
|
vn-id="clientDescriptor">
|
||||||
|
</vn-client-descriptor-popover>
|
||||||
|
<vn-confirm
|
||||||
|
vn-id="confirm"
|
||||||
|
question="Delete ticket from route?"
|
||||||
|
on-response="$ctrl.deleteFromRoute(response)">
|
||||||
|
</vn-confirm>
|
|
@ -0,0 +1,111 @@
|
||||||
|
import ngModule from '../module';
|
||||||
|
import './style.scss';
|
||||||
|
|
||||||
|
class Controller {
|
||||||
|
constructor($stateParams, $, $translate, $http, vnApp) {
|
||||||
|
this.$translate = $translate;
|
||||||
|
this.$stateParams = $stateParams;
|
||||||
|
this.$ = $;
|
||||||
|
this.$http = $http;
|
||||||
|
this.vnApp = vnApp;
|
||||||
|
}
|
||||||
|
|
||||||
|
get isChecked() {
|
||||||
|
if (this.tickets) {
|
||||||
|
for (let instance of this.tickets)
|
||||||
|
if (instance.checked) return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
getHighestPriority() {
|
||||||
|
let max = 0;
|
||||||
|
this.$.model.data.forEach(tag => {
|
||||||
|
if (tag.priority > max)
|
||||||
|
max = tag.priority;
|
||||||
|
});
|
||||||
|
return max + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
setPriority(id, priority) {
|
||||||
|
let params = {priority: priority};
|
||||||
|
let query = `/api/Tickets/${id}/`;
|
||||||
|
this.$http.patch(query, params).then(() => {
|
||||||
|
this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
|
||||||
|
this.$.model.refresh();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
getCheckedLines() {
|
||||||
|
let lines = [];
|
||||||
|
let data = this.tickets;
|
||||||
|
if (data) {
|
||||||
|
for (let i = 0; i < data.length; i++) {
|
||||||
|
if (data[i].checked)
|
||||||
|
lines.push(data[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lines;
|
||||||
|
}
|
||||||
|
|
||||||
|
goToBuscaman() {
|
||||||
|
// firstAddress is a temporal variable, will be replaced with #1298
|
||||||
|
let firstAddress = `46460 Av Espioca 100-46460 Silla`;
|
||||||
|
let addresses = firstAddress;
|
||||||
|
|
||||||
|
let lines = this.getCheckedLines();
|
||||||
|
|
||||||
|
let url = 'http://gps.buscalia.com/usuario/localizar.aspx?bmi=true&addr=';
|
||||||
|
lines.forEach(line => {
|
||||||
|
addresses = addresses + '+to:' + line.address.postalCode + ' ' + line.address.street + '-' + line.address.postalCode + ' ' + line.address.city;
|
||||||
|
});
|
||||||
|
|
||||||
|
window.open(url + addresses, '_blank');
|
||||||
|
}
|
||||||
|
|
||||||
|
showDeleteConfirm(ticket) {
|
||||||
|
this.selectedTicket = ticket;
|
||||||
|
this.$.confirm.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteFromRoute(response) {
|
||||||
|
if (response === 'ACCEPT') {
|
||||||
|
let params = {routeFk: null};
|
||||||
|
let query = `/api/Tickets/${this.selectedTicket}/`;
|
||||||
|
this.$http.patch(query, params).then(() => {
|
||||||
|
this.vnApp.showSuccess(this.$translate.instant('Ticket deleted from route'));
|
||||||
|
this.$.model.refresh();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
guessPriority() {
|
||||||
|
let query = `/api/Routes/${this.$stateParams.id}/guessPriority/`;
|
||||||
|
this.$http.get(query).then(() => {
|
||||||
|
this.vnApp.showSuccess(this.$translate.instant('Order changed'));
|
||||||
|
this.$.model.refresh();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
showTicketDescriptor(event, ticketFk) {
|
||||||
|
this.$.ticketDescriptor.ticketFk = ticketFk;
|
||||||
|
this.$.ticketDescriptor.parent = event.target;
|
||||||
|
this.$.ticketDescriptor.show();
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
showClientDescriptor(event, clientFk) {
|
||||||
|
this.$.clientDescriptor.clientFk = clientFk;
|
||||||
|
this.$.clientDescriptor.parent = event.target;
|
||||||
|
this.$.clientDescriptor.show();
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Controller.$inject = ['$stateParams', '$scope', '$translate', '$http', 'vnApp'];
|
||||||
|
|
||||||
|
ngModule.component('vnRouteTickets', {
|
||||||
|
template: require('./index.html'),
|
||||||
|
controller: Controller
|
||||||
|
});
|
|
@ -0,0 +1,5 @@
|
||||||
|
Remove ticket: Borrar ticket
|
||||||
|
Open buscaman: Abrir buscaman
|
||||||
|
Ticket deleted from route: Ticket borrado de la ruta
|
||||||
|
Order changed: Orden cambiado
|
||||||
|
Delete ticket from route?: ¿Borrar ticket de la ruta?
|
|
@ -0,0 +1,6 @@
|
||||||
|
@import "variables";
|
||||||
|
|
||||||
|
vn-route-tickets form{
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: $width-large;
|
||||||
|
}
|
Loading…
Reference in New Issue