351 lines
10 KiB
JavaScript
351 lines
10 KiB
JavaScript
import ngModule from '../module';
|
|
import Section from 'salix/components/section';
|
|
import './style.scss';
|
|
|
|
class Controller extends Section {
|
|
constructor($element, $, vnReport, vnEmail) {
|
|
super($element, $);
|
|
this.vnReport = vnReport;
|
|
this.vnEmail = vnEmail;
|
|
}
|
|
|
|
get ticketId() {
|
|
return this._ticketId;
|
|
}
|
|
|
|
set ticketId(value) {
|
|
this._ticketId = value;
|
|
this.id = value;
|
|
}
|
|
|
|
get id() {
|
|
return this._id;
|
|
}
|
|
|
|
set id(value) {
|
|
this._id = value;
|
|
|
|
if (!value) return;
|
|
|
|
this.loadData().then(() => {
|
|
if (this.$params.sendSMS) {
|
|
this.showSMSDialog({
|
|
message: this.$params.message
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
get isInvoiced() {
|
|
return this.ticket.refFk !== null;
|
|
}
|
|
|
|
get isTicketModule() {
|
|
return this.$state.getCurrentPath()[1].state.name === 'ticket';
|
|
}
|
|
|
|
get hasInvoicing() {
|
|
return this.aclService.hasAny(['invoicing']);
|
|
}
|
|
|
|
loadData() {
|
|
const filter = {
|
|
include: [{
|
|
relation: 'address',
|
|
},
|
|
{
|
|
relation: 'client',
|
|
scope: {
|
|
fields: [
|
|
'salesPersonFk',
|
|
'name',
|
|
'isActive',
|
|
'isFreezed',
|
|
'isTaxDataChecked',
|
|
'credit',
|
|
'email',
|
|
'phone',
|
|
'mobile',
|
|
'hasElectronicInvoice',
|
|
],
|
|
include: {
|
|
relation: 'salesPersonUser',
|
|
scope: {
|
|
fields: ['id', 'name']
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
relation: 'invoiceOut'
|
|
}]
|
|
};
|
|
|
|
return this.$http.get(`Tickets/${this.ticketId}`, {filter})
|
|
.then(res => this.ticket = res.data)
|
|
.then(() => {
|
|
this.isTicketEditable();
|
|
});
|
|
}
|
|
|
|
reload() {
|
|
return this.loadData().then(() => {
|
|
if (this.parentReload)
|
|
this.parentReload();
|
|
});
|
|
}
|
|
|
|
transferClient() {
|
|
this.$http.get(`Clients/${this.ticket.client.id}`).then(client => {
|
|
const ticket = this.ticket;
|
|
|
|
const params =
|
|
{
|
|
clientFk: client.data.id,
|
|
addressFk: client.data.defaultAddressFk,
|
|
};
|
|
|
|
this.$http.patch(`Tickets/${ticket.id}`, params).then(() => {
|
|
this.vnApp.showSuccess(this.$t('Data saved!'));
|
|
this.reload();
|
|
});
|
|
});
|
|
}
|
|
|
|
isTicketEditable() {
|
|
if (!this.ticket) return;
|
|
|
|
this.$http.get(`Tickets/${this.id}/isEditable`).then(res => {
|
|
this.isEditable = res.data;
|
|
});
|
|
}
|
|
|
|
addTurn(day) {
|
|
const params = {
|
|
ticketFk: this.id,
|
|
weekDay: day,
|
|
agencyModeFk: this.ticket.agencyModeFk
|
|
};
|
|
return this.$http.patch(`TicketWeeklies`, params)
|
|
.then(() => {
|
|
this.$.addTurn.hide();
|
|
this.vnApp.showSuccess(this.$t('Data saved!'));
|
|
});
|
|
}
|
|
|
|
showPdfDeliveryNote(type) {
|
|
this.vnReport.show(`tickets/${this.id}/delivery-note-pdf`, {
|
|
recipientId: this.ticket.client.id,
|
|
type: type
|
|
});
|
|
}
|
|
|
|
sendPdfDeliveryNote($data) {
|
|
let query = `tickets/${this.id}/delivery-note-email`;
|
|
if (this.hasDocuwareFile) query = `docuwares/delivery-note-email`;
|
|
|
|
return this.vnEmail.send(query, {
|
|
id: this.id,
|
|
recipientId: this.ticket.client.id,
|
|
recipient: $data.email
|
|
});
|
|
}
|
|
|
|
showCsvDeliveryNote() {
|
|
this.vnReport.show(`tickets/${this.id}/delivery-note-csv`, {
|
|
recipientId: this.ticket.client.id
|
|
});
|
|
}
|
|
|
|
sendCsvDeliveryNote($data) {
|
|
return this.vnEmail.send(`tickets/${this.id}/delivery-note-csv-email`, {
|
|
recipientId: this.ticket.client.id,
|
|
recipient: $data.email
|
|
});
|
|
}
|
|
|
|
deleteTicket() {
|
|
return this.$http.post(`Tickets/${this.id}/setDeleted`)
|
|
.then(() => this.reload())
|
|
.then(() => {
|
|
const isInsideTicket = this.$state.current.name.startsWith('ticket');
|
|
if (isInsideTicket)
|
|
this.$state.go('ticket.index');
|
|
|
|
this.vnApp.showSuccess(this.$t('Ticket deleted. You can undo this action within the first hour'));
|
|
});
|
|
}
|
|
|
|
get canRestoreTicket() {
|
|
const isDeleted = this.ticket.isDeleted;
|
|
const now = Date.vnNew();
|
|
const maxDate = new Date(this.ticket.updated);
|
|
maxDate.setHours(maxDate.getHours() + 1);
|
|
|
|
return isDeleted && (now <= maxDate);
|
|
}
|
|
|
|
restoreTicket() {
|
|
return this.$http.post(`Tickets/${this.id}/restore`)
|
|
.then(() => this.reload())
|
|
.then(() => this.vnApp.showSuccess(this.$t('Data saved!')));
|
|
}
|
|
|
|
showChangeShipped() {
|
|
this.newShipped = this.ticket.shipped;
|
|
this.$.changeShippedDialog.show();
|
|
}
|
|
|
|
changeShipped() {
|
|
const data = {shipped: this.newShipped};
|
|
return this.$http.post(`Tickets/${this.id}/updateEditableTicket`, data)
|
|
.then(() => this.reload())
|
|
.then(() => this.vnApp.showSuccess(this.$t('Shipped hour updated')));
|
|
}
|
|
|
|
sendImportSms() {
|
|
const params = {
|
|
ticketId: this.id,
|
|
created: this.ticket.updated
|
|
};
|
|
this.showSMSDialog({
|
|
message: this.$t('Minimum is needed', params)
|
|
});
|
|
}
|
|
|
|
sendPaymentSms() {
|
|
this.showSMSDialog({
|
|
message: this.$t('Make a payment')
|
|
});
|
|
}
|
|
|
|
sendChangesSms() {
|
|
return this.$http.get(`TicketLogs/${this.id}/getChanges`)
|
|
.then(res => {
|
|
const params = {
|
|
ticketId: this.id,
|
|
created: this.ticket.updated,
|
|
changes: res.data
|
|
};
|
|
this.showSMSDialog({message: this.$t('Send changes', params)});
|
|
});
|
|
}
|
|
|
|
showSMSDialog(params) {
|
|
const address = this.ticket.address;
|
|
const client = this.ticket.client;
|
|
const phone = this.$params.phone
|
|
|| address.mobile
|
|
|| address.phone
|
|
|| client.mobile
|
|
|| client.phone;
|
|
|
|
this.newSMS = Object.assign({
|
|
ticketId: this.id,
|
|
destinationFk: this.ticket.clientFk,
|
|
destination: phone
|
|
}, params);
|
|
|
|
this.$.sms.open();
|
|
}
|
|
|
|
makeInvoice() {
|
|
const params = {ticketsIds: [this.id]};
|
|
/*
|
|
This should call the notification sistem to insert a new notification
|
|
in te queue, yet to check how to handle user permissions,
|
|
as of 08-11-2022 every employee can insert a new notification in the queue
|
|
|
|
*/
|
|
const client = this.ticket.client;
|
|
|
|
if (client.hasElectronicInvoice) {
|
|
this.$http.post(`NotificationQueues`, {
|
|
notificationFk: 'invoice-electronic',
|
|
authorFk: client.id,
|
|
params: JSON.stringify(
|
|
{
|
|
'name': client.name,
|
|
'email': client.email,
|
|
'ticketId': this.id,
|
|
'url': window.location.href
|
|
})
|
|
}).then(() => {
|
|
this.vnApp.showSuccess(this.$t('Invoice sent'));
|
|
});
|
|
}
|
|
|
|
return this.$http.post(`Tickets/makeInvoice`, params)
|
|
.then(() => this.reload())
|
|
.then(() => this.vnApp.showSuccess(this.$t('Ticket invoiced')));
|
|
}
|
|
|
|
createPdfInvoice() {
|
|
const invoiceId = this.ticket.invoiceOut.id;
|
|
return this.$http.post(`InvoiceOuts/${invoiceId}/createPdf`)
|
|
.then(() => this.reload())
|
|
.then(() => {
|
|
const snackbarMessage = this.$t(
|
|
`The invoice PDF document has been regenerated`);
|
|
this.vnApp.showSuccess(snackbarMessage);
|
|
});
|
|
}
|
|
|
|
recalculateComponents() {
|
|
return this.$http.post(`Tickets/${this.id}/recalculateComponents`)
|
|
.then(() => this.reload())
|
|
.then(() => this.vnApp.showSuccess(this.$t('Data saved!')));
|
|
}
|
|
|
|
async refund() {
|
|
const params = {ticketsIds: [this.id]};
|
|
const query = 'Tickets/refund';
|
|
return this.$http.post(query, params).then(res => {
|
|
const refundTicket = res.data;
|
|
this.vnApp.showSuccess(this.$t('The following refund ticket have been created', {
|
|
ticketId: refundTicket.id
|
|
}));
|
|
this.$state.go('ticket.card.sale', {id: refundTicket.id});
|
|
});
|
|
}
|
|
|
|
onSmsSend(sms) {
|
|
return this.$http.post(`Tickets/${this.id}/sendSms`, sms)
|
|
.then(() => this.vnApp.showSuccess(this.$t('SMS sent')));
|
|
}
|
|
|
|
hasDocuware() {
|
|
this.$http.post(`Docuwares/${this.id}/checkFile`, {fileCabinet: 'deliveryNote', signed: true})
|
|
.then(res => {
|
|
this.hasDocuwareFile = res.data;
|
|
});
|
|
}
|
|
|
|
uploadDocuware(force) {
|
|
if (!force)
|
|
return this.$.pdfToTablet.show();
|
|
|
|
return this.$http.post(`Docuwares/${this.id}/upload`, {fileCabinet: 'deliveryNote'})
|
|
.then(() => {
|
|
this.$.balanceCreate.amountPaid = this.ticket.totalWithVat;
|
|
this.$.balanceCreate.clientFk = this.ticket.clientFk;
|
|
this.$.balanceCreate.description = 'Albaran: ';
|
|
this.$.balanceCreate.description += this.ticket.id;
|
|
|
|
this.$.balanceCreate.show();
|
|
this.vnApp.showSuccess(this.$t('PDF sent!'));
|
|
});
|
|
}
|
|
}
|
|
|
|
Controller.$inject = ['$element', '$scope', 'vnReport', 'vnEmail'];
|
|
|
|
ngModule.vnComponent('vnTicketDescriptorMenu', {
|
|
template: require('./index.html'),
|
|
controller: Controller,
|
|
bindings: {
|
|
ticketId: '<',
|
|
parentReload: '&'
|
|
}
|
|
});
|