267 lines
8.2 KiB
JavaScript
267 lines
8.2 KiB
JavaScript
import ngModule from '../module';
|
|
import Section from 'salix/components/section';
|
|
import './style.scss';
|
|
|
|
export default class Controller extends Section {
|
|
constructor($element, $) {
|
|
super($element, $);
|
|
this.$checkAll = false;
|
|
|
|
this.smartTableOptions = {
|
|
activeButtons: {
|
|
search: true,
|
|
},
|
|
columns: [
|
|
{
|
|
field: 'state',
|
|
searchable: false
|
|
}, {
|
|
field: 'futureState',
|
|
searchable: false
|
|
}, {
|
|
field: 'totalWithVat',
|
|
searchable: false
|
|
}, {
|
|
field: 'futureTotalWithVat',
|
|
searchable: false
|
|
}, {
|
|
field: 'shipped',
|
|
searchable: false
|
|
}, {
|
|
field: 'futureShipped',
|
|
searchable: false
|
|
}, {
|
|
field: 'ipt',
|
|
autocomplete: {
|
|
url: 'ItemPackingTypes',
|
|
where: `{isActive: true}`,
|
|
showField: 'description',
|
|
valueField: 'code'
|
|
}
|
|
}, {
|
|
field: 'futureIpt',
|
|
autocomplete: {
|
|
url: 'ItemPackingTypes',
|
|
where: `{isActive: true}`,
|
|
showField: 'description',
|
|
valueField: 'code'
|
|
}
|
|
}, {
|
|
field: 'futureZoneFk',
|
|
autocomplete: {
|
|
url: 'Zones',
|
|
}
|
|
},
|
|
]
|
|
};
|
|
}
|
|
|
|
$postLink() {
|
|
this.setDefaultFilter();
|
|
}
|
|
|
|
setDefaultFilter() {
|
|
let today = Date.vnNew();
|
|
const tomorrow = new Date(today);
|
|
tomorrow.setDate(tomorrow.getDate() + 1);
|
|
this.$http.get(`UserConfigs/getUserConfig`)
|
|
.then(res => {
|
|
this.filterParams = {
|
|
dateFuture: tomorrow,
|
|
dateToAdvance: today,
|
|
warehouseFk: res.data.warehouseFk
|
|
};
|
|
this.$.model.addFilter({}, this.filterParams);
|
|
});
|
|
}
|
|
|
|
get checked() {
|
|
const tickets = this.$.model.data || [];
|
|
const checkedLines = [];
|
|
for (let ticket of tickets) {
|
|
if (ticket.checked)
|
|
checkedLines.push(ticket);
|
|
}
|
|
|
|
return checkedLines;
|
|
}
|
|
|
|
dateRange(value) {
|
|
const minHour = new Date(value);
|
|
minHour.setHours(0, 0, 0, 0);
|
|
const maxHour = new Date(value);
|
|
maxHour.setHours(23, 59, 59, 59);
|
|
|
|
return [minHour, maxHour];
|
|
}
|
|
|
|
totalPriceColor(totalWithVat) {
|
|
return this.isLessThan50(totalWithVat) ? 'warning' : '';
|
|
}
|
|
|
|
totalPriceTitle(totalWithVat) {
|
|
return this.isLessThan50(totalWithVat) ? 'Less than 50€' : '';
|
|
}
|
|
|
|
isLessThan50(totalWithVat) {
|
|
return (parseInt(totalWithVat) > 0 && parseInt(totalWithVat) < 50);
|
|
}
|
|
|
|
get confirmationMessage() {
|
|
if (!this.$.model) return 0;
|
|
|
|
return this.$t(`Advance confirmation`, {
|
|
checked: this.checked.length
|
|
});
|
|
}
|
|
|
|
agencies(futureAgency, agency) {
|
|
return this.$t(`Origin agency`, {agency: futureAgency}) +
|
|
'\n' + this.$t(`Destination agency`, {agency: agency});
|
|
}
|
|
|
|
async moveTicketsAdvance() {
|
|
let ticketsToMove = [];
|
|
for (const ticket of this.checked) {
|
|
if (!ticket.id) {
|
|
try {
|
|
const {query, params} = await this.requestComponentUpdate(ticket, false);
|
|
this.$http.post(query, params);
|
|
} catch (e) {}
|
|
continue;
|
|
}
|
|
ticketsToMove.push({
|
|
originId: ticket.futureId,
|
|
destinationId: ticket.id,
|
|
originShipped: ticket.futureShipped,
|
|
destinationShipped: ticket.shipped,
|
|
workerFk: ticket.workerFk
|
|
});
|
|
}
|
|
|
|
const params = {tickets: ticketsToMove};
|
|
return this.$http.post('Tickets/merge', params)
|
|
.then(() => {
|
|
this.refresh();
|
|
if (ticketsToMove.length)
|
|
this.vnApp.showSuccess(this.$t('Success', {tickets: ticketsToMove.length}));
|
|
});
|
|
}
|
|
|
|
async getLanded(params) {
|
|
const query = `Agencies/getLanded`;
|
|
return this.$http.get(query, {params}).then(res => {
|
|
if (res.data)
|
|
return res.data;
|
|
|
|
return this.vnApp.showError(
|
|
this.$t(`No delivery zone available for this landing date`)
|
|
);
|
|
});
|
|
}
|
|
|
|
async splitTickets() {
|
|
this.progress = [];
|
|
this.splitErrors = [];
|
|
this.$.splitTickets.hide();
|
|
this.$.splitProgress.enable = true;
|
|
this.$.splitProgress.cancel = false;
|
|
this.$.splitProgress.show();
|
|
|
|
for (const ticket of this.checked) {
|
|
if (this.$.splitProgress.cancel) break;
|
|
try {
|
|
const {query, params} = await this.requestComponentUpdate(ticket, true);
|
|
this.$http.post(query, params)
|
|
.catch(e => {
|
|
this.splitErrors.push({id: ticket.futureId, reason: e.message});
|
|
})
|
|
.finally(() => this.progressAdd(ticket.futureId));
|
|
} catch (e) {
|
|
this.splitErrors.push({id: ticket.futureId, reason: e.message});
|
|
this.progressAdd(ticket.futureId);
|
|
}
|
|
}
|
|
}
|
|
|
|
progressAdd(ticketId) {
|
|
this.progress.push(ticketId);
|
|
if (this.progress.length == this.checked.length) {
|
|
this.$.splitProgress.enable = false;
|
|
this.refresh();
|
|
if ((this.progress.length - this.splitErrors.length) > 0) {
|
|
this.vnApp.showSuccess(this.$t('Success', {
|
|
tickets: this.progress.length - this.splitErrors.length
|
|
}));
|
|
}
|
|
}
|
|
}
|
|
|
|
async requestComponentUpdate(ticket, isWithoutNegatives) {
|
|
const query = `tickets/${ticket.futureId}/componentUpdate`;
|
|
if (!ticket.landed) {
|
|
const newLanded = await this.getLanded({
|
|
shipped: this.$.model.userParams.dateToAdvance,
|
|
addressFk: ticket.addressFk,
|
|
agencyModeFk: ticket.agencyModeFk,
|
|
warehouseFk: ticket.warehouseFk
|
|
});
|
|
if (!newLanded)
|
|
throw new Error(this.$t(`No delivery zone available for this landing date`));
|
|
|
|
ticket.landed = newLanded.landed;
|
|
ticket.zoneFk = newLanded.zoneFk;
|
|
}
|
|
const params = {
|
|
clientFk: ticket.clientFk,
|
|
nickname: ticket.nickname,
|
|
agencyModeFk: ticket.agencyModeFk ?? ticket.futureAgencyModeFk,
|
|
addressFk: ticket.addressFk,
|
|
zoneFk: ticket.zoneFk ?? ticket.futureZoneFk,
|
|
warehouseFk: ticket.warehouseFk,
|
|
companyFk: ticket.companyFk,
|
|
shipped: this.$.model.userParams.dateToAdvance,
|
|
landed: ticket.landed,
|
|
isDeleted: false,
|
|
isWithoutNegatives,
|
|
newTicket: ticket.id ?? undefined,
|
|
keepPrice: true
|
|
};
|
|
|
|
return {query, params};
|
|
}
|
|
|
|
refresh() {
|
|
this.$.model.refresh();
|
|
this.$checkAll = null;
|
|
}
|
|
|
|
exprBuilder(param, value) {
|
|
switch (param) {
|
|
case 'id':
|
|
case 'futureId':
|
|
case 'liters':
|
|
case 'futureLiters':
|
|
case 'lines':
|
|
case 'futureLines':
|
|
case 'totalWithVat':
|
|
case 'futureTotalWithVat':
|
|
case 'futureZone':
|
|
case 'notMovableLines':
|
|
case 'futureZoneFk':
|
|
return {[param]: value};
|
|
case 'ipt':
|
|
return {'ipt': {like: `%${value}%`}};
|
|
case 'futureIpt':
|
|
return {'futureIpt': {like: `%${value}%`}};
|
|
}
|
|
}
|
|
}
|
|
|
|
Controller.$inject = ['$element', '$scope'];
|
|
|
|
ngModule.vnComponent('vnTicketAdvance', {
|
|
template: require('./index.html'),
|
|
controller: Controller
|
|
});
|