salix/client/ticket/src/sale/index.js

361 lines
11 KiB
JavaScript
Raw Normal View History

2018-03-22 17:02:48 +00:00
import ngModule from '../module';
import './style.scss';
2018-03-22 17:02:48 +00:00
class Controller {
2018-07-17 06:44:31 +00:00
constructor($scope, $state, $http, vnApp, $translate) {
this.$scope = $scope;
this.vnApp = vnApp;
this.$translate = $translate;
2018-07-17 06:44:31 +00:00
this.$state = $state;
this.$stateParams = $state.params;
this.$http = $http;
this.deletable = false;
this.edit = {};
this.moreOptions = [
2018-07-02 11:18:22 +00:00
{callback: this.showAddTurnDialog, name: "Add turn", always: true},
{callback: this.showDeleteTicketDialog, name: "Delete ticket", always: true},
{callback: this.markAsReserved, name: 'Mark as reserved'},
{callback: this.unmarkAsReserved, name: 'Unmark as reserved'},
2018-09-11 10:49:31 +00:00
{callback: this.showEditDialog, name: 'Update discount'},
{callback: this.createClaim, name: 'Add claim'}
];
}
2018-07-17 06:44:31 +00:00
onDataChange() {
this.sales = this.$scope.model.data;
this.getTaxes();
}
2018-07-17 06:44:31 +00:00
2018-07-02 11:18:22 +00:00
onMoreOpen() {
let options = this.moreOptions.filter(o => o.always || this.isChecked);
2018-07-17 06:44:31 +00:00
this.$scope.moreButton.data = options;
2018-07-02 11:18:22 +00:00
}
2018-07-17 06:44:31 +00:00
2018-06-19 10:10:38 +00:00
getTaxes() {
this.getSubTotal();
this.getVAT();
}
2018-07-17 06:44:31 +00:00
2018-06-19 10:10:38 +00:00
getSubTotal() {
let sales = this.sales;
2018-06-19 10:10:38 +00:00
this.subTotal = 0.00;
sales.forEach(sale => {
this.subTotal += (sale.quantity * sale.price) - ((sale.discount * (sale.quantity * sale.price)) / 100);
2018-06-19 10:10:38 +00:00
});
}
2018-07-17 06:44:31 +00:00
2018-06-19 10:10:38 +00:00
getVAT() {
if (this.ticket || this.ticket.id) {
this.$http.get(`/ticket/api/Tickets/${this.ticket.id}/getVAT`).then(res => {
this.VAT = res.data || 0;
this.total = this.subTotal + this.VAT;
});
}
2018-06-19 10:10:38 +00:00
}
2018-07-17 06:44:31 +00:00
get isEditable() {
try {
return !this.ticket.tracking.state.alertLevel;
} catch (e) {}
return true;
}
2018-07-17 06:44:31 +00:00
get isChecked() {
let data = this.sales;
if (data)
for (let instance of data)
if (instance.checked)
return true;
return false;
}
2018-07-17 06:44:31 +00:00
getCheckedLines() {
let lines = [];
let data = this.sales;
if (data)
for (let i = 0; i < data.length; i++)
if (data[i].checked)
lines.push({id: data[i].id, instance: i});
return lines;
}
2018-07-17 06:44:31 +00:00
onMoreChange(callback) {
callback.call(this);
}
2018-07-17 06:44:31 +00:00
// Change State
onStateOkClick() {
let filter = {where: {code: "OK"}, fields: ["id"]};
let json = encodeURIComponent(JSON.stringify(filter));
this.$http.get(`/ticket/api/States?filter=${json}`).then(res => {
this.onStateChange(res.data[0].id);
});
}
2018-07-17 06:44:31 +00:00
onStateChange(value) {
let params = {ticketFk: this.$state.params.id, stateFk: value};
this.$http.post(`/ticket/api/TicketTrackings/changeState`, params).then(() => {
this.card.reload();
this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
});
}
2018-07-17 06:44:31 +00:00
// Add Turn
showAddTurnDialog() {
2018-07-17 06:44:31 +00:00
this.$scope.addTurn.show();
}
2018-07-17 06:44:31 +00:00
addTurn(day) {
let params = {ticketFk: this.$state.params.id, weekDay: day};
this.$http.patch(`/ticket/api/TicketWeeklies`, params).then(() => {
2018-07-17 06:44:31 +00:00
this.$scope.addTurn.hide();
this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
});
}
2018-07-17 06:44:31 +00:00
// Delete Ticket
showDeleteTicketDialog() {
if (!this.isEditable)
return;
2018-07-17 06:44:31 +00:00
this.$scope.deleteConfirmation.show();
}
2018-07-17 06:44:31 +00:00
2018-07-16 11:31:03 +00:00
deleteTicket(response) {
if (response === 'ACCEPT') {
let params = {id: this.$state.params.id};
this.$http.post(`/ticket/api/Tickets/deleted`, params).then(() => {
this.$state.go('ticket.index');
this.vnApp.showSuccess(this.$translate.instant('Ticket deleted'));
2018-07-16 11:31:03 +00:00
});
}
}
2018-07-17 06:44:31 +00:00
// Remove Lines
onRemoveLinesClick(response) {
if (response === 'ACCEPT') {
let sales = this.getCheckedLines();
let params = {sales: sales, actualTicketFk: this.ticket.id};
let query = `/ticket/api/Sales/removes`;
this.$http.post(query, params).then(() => {
this.removeInstances(sales);
2018-09-05 14:14:13 +00:00
this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
});
}
}
2018-07-17 06:44:31 +00:00
2018-07-02 11:18:22 +00:00
removeInstances(instances) {
for (let i = instances.length - 1; i >= 0; i--) {
this.sales.splice(instances[i].instance, 1);
2018-07-02 11:18:22 +00:00
}
}
2018-07-17 06:44:31 +00:00
showRemoveLinesDialog() {
2018-07-17 06:44:31 +00:00
this.$scope.deleteLines.show();
}
2018-07-17 06:44:31 +00:00
// Move Lines
showTransferPopover(event) {
let filter = {clientFk: this.ticket.clientFk, ticketFk: this.ticket.id};
let json = encodeURIComponent(JSON.stringify(filter));
2018-07-02 11:18:22 +00:00
let query = `/ticket/api/Tickets/threeLastActive?filter=${json}`;
this.$http.get(query).then(res => {
this.lastThreeTickets = res.data;
});
2018-07-17 06:44:31 +00:00
this.$scope.transfer.parent = event.target;
this.$scope.transfer.show();
}
2018-07-17 06:44:31 +00:00
moveLines(ticketID) {
let sales = this.getCheckedLines();
let params = {sales: sales, newTicketFk: ticketID, actualTicketFk: this.ticket.id};
this.$http.post(`/ticket/api/Sales/moveToTicket`, params).then(() => {
this.goToTicket(ticketID);
});
}
2018-07-17 06:44:31 +00:00
linesToNewTicket() {
let ticket = {
oldTicketFk: this.ticket.id,
clientFk: this.ticket.clientFk,
addressFk: this.ticket.addressFk,
agencyModeFk: this.ticket.agencyModeFk,
warehouseFk: this.ticket.warehouseFk
};
let sales = this.getCheckedLines();
this.$http.post(`/api/Sales/MoveToNewTicket`, {ticket: ticket, sales: sales}).then(res => {
let url = this.$state.href("ticket.card.sale", {id: res.data}, {absolute: true});
window.open(url, '_blank');
2018-07-17 06:44:31 +00:00
this.$scope.transfer.hide();
this.$scope.model.refresh();
});
}
2018-07-17 06:44:31 +00:00
2018-09-11 10:49:31 +00:00
createClaim() {
let claim = {
ticketFk: this.ticket.id,
clientFk: this.ticket.clientFk,
ticketCreated: this.ticket.shipped,
workerFk: this.ticket.client.salesPersonFk
};
let sales = this.getCheckedLines();
for (let i = 0; i < sales.length; i++)
sales[i].quantity = this.sales[sales[i].instance].quantity;
this.$http.post(`claim/api/Claims/createFromSales`, {claim: claim, sales: sales}).then(res => {
let url = this.$state.href("claim.card.basicData", {id: res.data.id}, {absolute: true});
window.open(url, '_blank');
});
}
goToTicket(ticketID) {
this.$state.go("ticket.card.sale", {id: ticketID});
}
2018-07-17 06:44:31 +00:00
// Focus First Input
focusFirstInput(e) {
let firstFocusable = e.querySelector('input, textarea');
if (firstFocusable) {
firstFocusable.addEventListener('focus', () => {
firstFocusable.select();
});
setTimeout(() => {
firstFocusable.focus();
}, 200);
}
}
2018-07-17 06:44:31 +00:00
// Slesperson Mana
getManaSalespersonMana() {
this.$http.get(`/api/Tickets/${this.$state.params.id}/getSalesPersonMana`).then(res => {
this.mana = res.data;
});
}
2018-07-17 06:44:31 +00:00
// Item Descriptor
showDescriptor(event, itemFk) {
2018-09-04 09:49:00 +00:00
this.quicklinks = {
btnThree: {
icon: 'icon-transaction',
state: `item.card.diary({
id: ${itemFk},
q: '{"warehouseFk": ${this.ticket.warehouseFk}}'
})`,
tooltip: 'Item diary'
}
};
2018-07-17 06:44:31 +00:00
this.$scope.descriptor.itemFk = itemFk;
this.$scope.descriptor.parent = event.target;
this.$scope.descriptor.show();
}
2018-07-17 06:44:31 +00:00
onDescriptorLoad() {
2018-07-17 06:44:31 +00:00
this.$scope.popover.relocate();
2018-03-26 12:55:10 +00:00
}
2018-07-17 06:44:31 +00:00
// Edit Line
showEditPricePopover(event, sale) {
this.sale = sale;
this.editedPrice = this.sale.price;
this.edit = {
ticketFk: this.ticket.id,
id: sale.id,
quantity: sale.quantity
};
2018-07-17 06:44:31 +00:00
this.$scope.editPricePopover.parent = event.target;
this.$scope.editPricePopover.show();
this.focusFirstInput(this.$scope.editPricePopover.$element[0]);
}
2018-07-17 06:44:31 +00:00
updatePrice() {
if (this.editedPrice != this.sale.price) {
this.$http.post(`/ticket/api/Sales/updatePrice`, {id: this.edit.id, price: this.editedPrice, ticketFk: this.ticket.id}).then(() => {
this.sale.price = this.edit.price;
2018-07-17 06:44:31 +00:00
this.$scope.model.refresh();
this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
});
}
2018-07-17 06:44:31 +00:00
this.$scope.editPricePopover.hide();
}
2018-07-17 06:44:31 +00:00
showEditPopover(event, sale) {
this.sale = sale;
this.edit = [{
ticketFk: this.ticket.id,
id: sale.id,
quantity: sale.quantity,
price: sale.price,
discount: sale.discount
}];
2018-07-17 06:44:31 +00:00
this.$scope.editPopover.parent = event.target;
this.$scope.editPopover.show();
this.focusFirstInput(this.$scope.editPopover.$element[0]);
}
2018-07-17 06:44:31 +00:00
showEditDialog() {
this.edit = this.getCheckedLines();
2018-07-17 06:44:31 +00:00
this.$scope.editDialog.show();
this.focusFirstInput(this.$scope.editDialog.$element[0]);
}
2018-07-17 06:44:31 +00:00
hideEditDialog() {
2018-07-17 06:44:31 +00:00
this.$scope.model.refresh();
this.$scope.editDialog.hide();
}
2018-07-17 06:44:31 +00:00
hideEditPopover() {
2018-07-17 06:44:31 +00:00
this.$scope.model.refresh();
this.$scope.editPopover.hide();
}
2018-07-17 06:44:31 +00:00
updateQuantity(id, quantity) {
this.$http.post(`/ticket/api/Sales/${id}/updateQuantity`, {quantity: parseInt(quantity)}).then(() => {
this.vnApp.showSuccess(this.$translate.instant('Data saved!'));
}).catch(e => {
this.vnApp.showError(e.data.error.message);
2018-08-20 12:52:37 +00:00
}).finally(() => {
this.$scope.model.refresh();
});
}
2018-06-19 07:09:49 +00:00
/**
* Unmark sale as reserved
*/
unmarkAsReserved() {
this.setReserved(false);
}
/**
* Mark sale as reserved
2018-06-19 07:09:49 +00:00
*/
markAsReserved() {
this.setReserved(true);
}
2018-06-19 07:09:49 +00:00
setReserved(reserved) {
let sales = this.getCheckedLines();
let params = {sales: sales, ticketFk: this.ticket.id, reserved: reserved};
2018-06-19 07:09:49 +00:00
this.$http.post(`/ticket/api/Sales/reserve`, params).then(() => {
2018-07-17 06:44:31 +00:00
this.$scope.model.refresh();
2018-06-19 07:09:49 +00:00
});
}
2018-03-26 12:55:10 +00:00
}
2018-07-17 06:44:31 +00:00
Controller.$inject = ['$scope', '$state', '$http', 'vnApp', '$translate'];
2018-03-26 12:55:10 +00:00
2018-03-22 17:02:48 +00:00
ngModule.component('vnTicketSale', {
template: require('./index.html'),
controller: Controller,
bindings: {
ticket: '<'
},
require: {
card: '^vnTicketCard'
}
2018-03-22 17:02:48 +00:00
});