diff --git a/CHANGELOG.md b/CHANGELOG.md
index dbf6bdcc3..51dd2010c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
+- (Tickets) => Se añade la opción de clonar ticket. #6951
+
### Changed
### Fixed
diff --git a/src/pages/Ticket/Card/TicketDescriptorMenu.vue b/src/pages/Ticket/Card/TicketDescriptorMenu.vue
index 95f6a94d9..c7784bc2a 100644
--- a/src/pages/Ticket/Card/TicketDescriptorMenu.vue
+++ b/src/pages/Ticket/Card/TicketDescriptorMenu.vue
@@ -3,7 +3,7 @@ import axios from 'axios';
import { ref } from 'vue';
import { useQuasar } from 'quasar';
import { useI18n } from 'vue-i18n';
-import { useRouter, useRoute } from 'vue-router';
+import { useRouter } from 'vue-router';
import { usePrintService } from 'composables/usePrintService';
import SendEmailDialog from 'components/common/SendEmailDialog.vue';
import VnConfirm from 'components/ui/VnConfirm.vue';
@@ -17,13 +17,49 @@ const props = defineProps({
},
});
-const router = useRouter();
-const route = useRoute();
-const quasar = useQuasar();
+const { push, currentRoute } = useRouter();
+const { dialog, notify } = useQuasar();
const { t } = useI18n();
const { openReport, sendEmail } = usePrintService();
const ticket = ref(props.ticket);
+const ticketId = currentRoute.value.params.id;
+const actions = {
+ clone: async () => {
+ const opts = { message: t('Ticket cloned'), type: 'positive' };
+ let clonedTicketId;
+
+ try {
+ const { data } = await axios.post(`Tickets/${ticketId}/clone`, {
+ shipped: ticket.value.shipped,
+ });
+ clonedTicketId = data;
+ } catch (e) {
+ opts.message = t('It was not able to clone the ticket');
+ opts.type = 'negative';
+ } finally {
+ notify(opts);
+
+ if (clonedTicketId)
+ push({ name: 'TicketSummary', params: { id: clonedTicketId } });
+ }
+ },
+ remove: async () => {
+ try {
+ await axios.post(`Tickets/${ticketId}/setDeleted`);
+
+ notify({ message: t('Ticket deleted'), type: 'positive' });
+ notify({
+ message: t('You can undo this action within the first hour'),
+ icon: 'info',
+ });
+
+ push({ name: 'TicketList' });
+ } catch (e) {
+ notify({ message: e.message, type: 'negative' });
+ }
+ },
+};
function openDeliveryNote(type = 'deliveryNote', documentType = 'pdf') {
const path = `Tickets/${ticket.value.id}/delivery-note-${documentType}`;
@@ -35,7 +71,7 @@ function openDeliveryNote(type = 'deliveryNote', documentType = 'pdf') {
function sendDeliveryNoteConfirmation(type = 'deliveryNote', documentType = 'pdf') {
const customer = ticket.value.client;
- quasar.dialog({
+ dialog({
component: SendEmailDialog,
componentProps: {
data: {
@@ -67,7 +103,7 @@ function showSmsDialog(template, customData) {
const address = ticket.value.address;
const client = ticket.value.client;
const phone =
- route.params.phone ||
+ currentRoute.value.params.phone ||
address.mobile ||
address.phone ||
client.mobile ||
@@ -82,7 +118,7 @@ function showSmsDialog(template, customData) {
Object.assign(data, customData);
}
- quasar.dialog({
+ dialog({
component: VnSmsDialog,
componentProps: {
phone: phone,
@@ -95,42 +131,26 @@ function showSmsDialog(template, customData) {
}
async function showSmsDialogWithChanges() {
- const query = `TicketLogs/${route.params.id}/getChanges`;
+ const query = `TicketLogs/${ticketId}/getChanges`;
const response = await axios.get(query);
showSmsDialog('orderChanges', { changes: response.data });
}
async function sendSms(body) {
- await axios.post(`Tickets/${route.params.id}/sendSms`, body);
- quasar.notify({
+ await axios.post(`Tickets/${ticketId}/sendSms`, body);
+ notify({
message: 'Notification sent',
type: 'positive',
});
}
-function confirmDelete() {
- quasar
- .dialog({
- component: VnConfirm,
- componentProps: {
- promise: remove,
- },
- })
- .onOk(async () => await router.push({ name: 'TicketList' }));
-}
-
-async function remove() {
- const id = route.params.id;
- await axios.post(`Tickets/${id}/setDeleted`);
-
- quasar.notify({
- message: t('Ticket deleted'),
- type: 'positive',
- });
- quasar.notify({
- message: t('You can undo this action within the first hour'),
- icon: 'info',
+function openConfirmDialog(callback) {
+ dialog({
+ component: VnConfirm,
+ componentProps: {
+ promise: actions[callback],
+ },
});
}
@@ -227,9 +247,15 @@ async function remove() {
+
+
+
+
+ {{ t('To clone ticket') }}
+
-
+
@@ -253,4 +279,7 @@ es:
Order changes: Cambios del pedido
Ticket deleted: Ticket eliminado
You can undo this action within the first hour: Puedes deshacer esta acción dentro de la primera hora
+ To clone ticket: Clonar ticket
+ Ticket cloned: Ticked clonado
+ It was not able to clone the ticket: No se pudo clonar el ticket
diff --git a/test/cypress/integration/ticket/ticketDescriptor.spec.js b/test/cypress/integration/ticket/ticketDescriptor.spec.js
new file mode 100644
index 000000000..c212d3b4a
--- /dev/null
+++ b/test/cypress/integration/ticket/ticketDescriptor.spec.js
@@ -0,0 +1,27 @@
+///
+describe('Ticket descriptor', () => {
+ const toCloneOpt = '.q-list > :nth-child(5)';
+ const warehouseValue = '.summaryBody > :nth-child(2) > :nth-child(6) > .value > span';
+ const summaryHeader = '.summaryHeader > div';
+
+ beforeEach(() => {
+ const ticketId = 1;
+
+ cy.login('developer');
+ cy.visit(`/#/ticket/${ticketId}/summary`);
+ });
+
+ it('should clone the ticket without warehouse', () => {
+ cy.openLeftMenu();
+ cy.openActionsDescriptor();
+ cy.get(toCloneOpt).click();
+ cy.clickConfirm();
+ cy.get(warehouseValue).contains('-');
+ cy.get(summaryHeader)
+ .invoke('text')
+ .then((text) => {
+ const [, owner] = text.split('-');
+ cy.wrap(owner.trim()).should('eq', 'Bruce Wayne (1101)');
+ });
+ });
+});