salix/modules/ticket/front/descriptor-menu/index.js

357 lines
10 KiB
JavaScript
Raw Normal View History

2020-11-09 13:52:25 +00:00
import ngModule from '../module';
import Section from 'salix/components/section';
import './style.scss';
class Controller extends Section {
constructor($element, $, vnReport, vnEmail, vnFile) {
2020-11-09 13:52:25 +00:00
super($element, $);
this.vnReport = vnReport;
this.vnEmail = vnEmail;
this.vnFile = vnFile;
2020-11-09 13:52:25 +00:00
}
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;
2020-11-10 09:38:25 +00:00
if (!value) return;
this.loadData().then(() => {
2021-05-03 10:09:12 +00:00
if (this.$params.sendSMS) {
this.showSMSDialog({
message: this.$params.message
});
}
2020-11-10 09:38:25 +00:00
});
2024-03-08 13:59:33 +00:00
const filter = {
2024-05-20 09:14:30 +00:00
fields: ['id', 'originFk', 'creationDate', 'newInstance'],
2024-03-08 13:59:33 +00:00
where: {
originFk: value,
newInstance: {like: '%"isDeleted":true%'}
},
2024-05-20 09:14:30 +00:00
order: 'creationDate DESC',
limit: 1
2024-03-08 13:59:33 +00:00
};
2024-05-20 09:14:30 +00:00
this.$http.get(`TicketLogs`, {filter})
2024-03-08 13:59:33 +00:00
.then(res => {
2024-05-20 09:30:43 +00:00
if (res && res.data && res.data.length) {
2024-03-08 13:59:33 +00:00
const now = Date.vnNew();
2024-05-20 09:30:43 +00:00
const maxDate = new Date(res.data[0].creationDate);
2024-03-08 13:59:33 +00:00
maxDate.setHours(maxDate.getHours() + 1);
if (now <= maxDate)
return this.canRestoreTicket = true;
}
this.canRestoreTicket = false;
})
.catch(() => {
this.canRestoreTicket = false;
});
2020-11-09 13:52:25 +00:00
}
get isInvoiced() {
return this.ticket.refFk !== null;
}
get isTicketModule() {
return this.$state.getCurrentPath()[1].state.name === 'ticket';
}
get hasInvoicing() {
return this.aclService.hasAny(['invoicing']);
}
2020-11-09 13:52:25 +00:00
loadData() {
const filter = {
include: [{
relation: 'address',
},
{
2020-11-09 13:52:25 +00:00
relation: 'client',
scope: {
fields: [
'salesPersonFk',
'name',
'isActive',
'isFreezed',
'isTaxDataChecked',
'credit',
'email',
'phone',
'mobile',
2022-11-23 07:55:44 +00:00
'hasElectronicInvoice',
2020-11-09 13:52:25 +00:00
],
include: {
relation: 'salesPersonUser',
scope: {
fields: ['id', 'name']
}
}
}
},
{
relation: 'invoiceOut'
}]
2020-11-09 13:52:25 +00:00
};
return this.$http.get(`Tickets/${this.ticketId}`, {filter})
.then(res => this.ticket = res.data)
.then(() => {
this.isTicketEditable();
});
}
reload() {
2020-11-10 09:38:25 +00:00
return this.loadData().then(() => {
if (this.parentReload)
this.parentReload();
});
2020-11-09 13:52:25 +00:00
}
2022-10-27 06:46:22 +00:00
transferClient() {
2023-07-20 08:19:03 +00:00
const ticket = this.ticket;
const clientFk = ticket.client.id;
2022-10-27 06:46:22 +00:00
this.$http.patch(`Tickets/${ticket.id}/transferClient`, {clientFk})
.then(() => {
2022-10-27 06:46:22 +00:00
this.vnApp.showSuccess(this.$t('Data saved!'));
this.reload();
});
}
2020-11-09 13:52:25 +00:00
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('Current ticket deleted and added to shift'));
this.reload();
2020-11-09 13:52:25 +00:00
});
}
2022-09-19 10:59:32 +00:00
showPdfDeliveryNote(type) {
this.vnReport.show(`tickets/${this.id}/delivery-note-pdf`, {
recipientId: this.ticket.client.id,
2022-09-19 10:59:32 +00:00
type: type
});
}
2021-10-07 08:04:50 +00:00
sendPdfDeliveryNote($data) {
2023-01-12 14:16:38 +00:00
let query = `tickets/${this.id}/delivery-note-email`;
2023-05-18 12:12:46 +00:00
if (this.hasDocuwareFile) query = `docuwares/delivery-note-email`;
2023-01-12 14:16:38 +00:00
return this.vnEmail.send(query, {
2023-05-18 12:12:46 +00:00
id: this.id,
2020-11-09 13:52:25 +00:00
recipientId: this.ticket.client.id,
2022-09-19 10:59:32 +00:00
recipient: $data.email
});
}
showCsvDeliveryNote() {
2022-10-03 06:28:47 +00:00
this.vnReport.show(`tickets/${this.id}/delivery-note-csv`, {
recipientId: this.ticket.client.id
});
}
2021-10-07 08:04:50 +00:00
sendCsvDeliveryNote($data) {
2022-10-03 06:28:47 +00:00
return this.vnEmail.send(`tickets/${this.id}/delivery-note-csv-email`, {
recipientId: this.ticket.client.id,
2022-10-03 06:28:47 +00:00
recipient: $data.email
2020-11-09 13:52:25 +00:00
});
}
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');
2020-11-09 13:52:25 +00:00
this.vnApp.showSuccess(this.$t('Ticket deleted. You can undo this action within the first hour'));
});
}
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,
2023-09-29 07:47:22 +00:00
shipped: this.ticket.shipped
2020-11-09 13:52:25 +00:00
};
this.showSMSDialog({
2021-04-08 11:39:11 +00:00
message: this.$t('Minimum is needed', params)
2020-11-09 13:52:25 +00:00
});
}
sendPaymentSms() {
this.showSMSDialog({
2021-04-08 11:39:11 +00:00
message: this.$t('Make a payment')
2020-11-09 13:52:25 +00:00
});
}
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)});
});
}
2020-11-09 13:52:25 +00:00
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);
2022-11-22 06:59:18 +00:00
2020-11-09 13:52:25 +00:00
this.$.sms.open();
}
makeInvoice(force) {
if (this.ticket.address.incotermsFk && !this.ticket.weight && !force)
return this.$.withoutWeightConfirmation.show();
return this.$http.post(`Tickets/invoiceTicketsAndPdf`, {ticketsIds: [this.id]})
2020-11-09 13:52:25 +00:00
.then(() => this.reload())
2024-01-30 14:54:03 +00:00
.then(() => this.vnApp.showSuccess(this.$t('Ticket invoiced')));
2020-11-09 13:52:25 +00:00
}
2021-10-07 11:36:23 +00:00
createPdfInvoice() {
2020-11-09 13:52:25 +00:00
const invoiceId = this.ticket.invoiceOut.id;
2021-03-15 12:43:22 +00:00
return this.$http.post(`InvoiceOuts/${invoiceId}/createPdf`)
.then(() => this.reload())
2020-11-09 13:52:25 +00:00
.then(() => {
const snackbarMessage = this.$t(
2021-03-15 12:43:22 +00:00
`The invoice PDF document has been regenerated`);
2020-11-09 13:52:25 +00:00
this.vnApp.showSuccess(snackbarMessage);
});
}
recalculateComponents() {
return this.$http.post(`Tickets/${this.id}/recalculateComponents`)
.then(() => this.reload())
.then(() => this.vnApp.showSuccess(this.$t('Data saved!')));
}
refund(withWarehouse) {
2024-08-23 08:57:35 +00:00
const params = {
ticketsIds: [this.id],
withWarehouse: withWarehouse,
negative: true // Asumimos que queremos cantidades negativas para reembolsos
};
const query = 'Tickets/cloneAll';
return this.$http.post(query, params)
.then(res => {
const [refundTicket] = res.data;
2024-08-23 08:57:35 +00:00
this.vnApp.showSuccess(this.$t('The following refund ticket has been created', {
ticketId: refundTicket.id
}));
this.$state.go('ticket.card.sale', {id: refundTicket.id});
2024-08-23 08:57:35 +00:00
})
.catch(error => {
this.vnApp.showError(this.$t('Error creating refund ticket', {
error: error.data?.error?.message || 'Unknown error'
}));
});
}
2022-11-25 08:59:02 +00:00
onSmsSend(sms) {
return this.$http.post(`Tickets/${this.id}/sendSms`, sms)
.then(() => this.vnApp.showSuccess(this.$t('SMS sent')));
}
2023-01-09 14:11:53 +00:00
hasDocuware() {
this.$http.post(`Docuwares/${this.id}/checkFile`, {fileCabinet: 'deliveryNote', signed: true})
2023-01-09 14:11:53 +00:00
.then(res => {
this.hasDocuwareFile = res.data;
});
}
uploadDocuware(force) {
if (!force)
return this.$.pdfToTablet.show();
return this.$http.post(`Docuwares/upload`, {fileCabinet: 'deliveryNote', ticketIds: [this.id]})
.then(() => {
this.vnApp.showSuccess(this.$t('PDF sent!'));
});
2023-01-09 14:11:53 +00:00
}
docuwareDownload() {
this.vnFile.download(`api/Tickets/${this.ticket.id}/docuwareDownload`);
}
setTicketWeight(weight) {
return this.$http.patch(`Tickets/${this.ticket.id}`, {weight})
.then(() => {
this.$.setTicketWeight.hide();
this.vnApp.showSuccess(this.$t('Data saved!'));
this.reload();
});
}
2020-11-09 13:52:25 +00:00
}
Controller.$inject = ['$element', '$scope', 'vnReport', 'vnEmail', 'vnFile'];
2020-11-09 13:52:25 +00:00
ngModule.vnComponent('vnTicketDescriptorMenu', {
template: require('./index.html'),
controller: Controller,
bindings: {
ticketId: '<',
2020-11-10 09:38:25 +00:00
parentReload: '&'
2020-11-09 13:52:25 +00:00
}
});