diff --git a/src/components/RefundInvoiceForm.vue b/src/components/RefundInvoiceForm.vue new file mode 100644 index 000000000..1b545103a --- /dev/null +++ b/src/components/RefundInvoiceForm.vue @@ -0,0 +1,173 @@ +<script setup> +import { ref, reactive } from 'vue'; +import { useI18n } from 'vue-i18n'; +import { useRouter } from 'vue-router'; +import { useDialogPluginComponent } from 'quasar'; +import VnRow from 'components/ui/VnRow.vue'; +import FetchData from 'components/FetchData.vue'; +import VnSelect from 'components/common/VnSelect.vue'; +import FormPopup from './FormPopup.vue'; +import axios from 'axios'; +import useNotify from 'src/composables/useNotify.js'; + +const $props = defineProps({ + invoiceOutData: { + type: Object, + default: () => {}, + }, +}); + +const { dialogRef } = useDialogPluginComponent(); +const { t } = useI18n(); +const router = useRouter(); +const { notify } = useNotify(); + +const rectificativeTypeOptions = ref([]); +const siiTypeInvoiceOutsOptions = ref([]); +const inheritWarehouse = ref(true); +const invoiceParams = reactive({ + id: $props.invoiceOutData?.id, +}); +const invoiceCorrectionTypesOptions = ref([]); + +const refund = async () => { + const params = { + id: invoiceParams.id, + cplusRectificationTypeFk: invoiceParams.cplusRectificationTypeFk, + siiTypeInvoiceOutFk: invoiceParams.siiTypeInvoiceOutFk, + invoiceCorrectionTypeFk: invoiceParams.invoiceCorrectionTypeFk, + }; + + try { + const { data } = await axios.post('InvoiceOuts/refundAndInvoice', params); + notify(t('Refunded invoice'), 'positive'); + const [id] = data?.refundId || []; + if (id) router.push({ name: 'InvoiceOutSummary', params: { id } }); + } catch (err) { + console.error('Error refunding invoice', err); + } +}; +</script> + +<template> + <FetchData + url="CplusRectificationTypes" + :filter="{ order: 'description' }" + @on-fetch=" + (data) => ( + (rectificativeTypeOptions = data), + (invoiceParams.cplusRectificationTypeFk = data.filter( + (type) => type.description == 'I – Por diferencias' + )[0].id) + ) + " + auto-load + /> + <FetchData + url="SiiTypeInvoiceOuts" + :filter="{ where: { code: { like: 'R%' } } }" + @on-fetch=" + (data) => ( + (siiTypeInvoiceOutsOptions = data), + (invoiceParams.siiTypeInvoiceOutFk = data.filter( + (type) => type.code == 'R4' + )[0].id) + ) + " + auto-load + /> + <FetchData + url="InvoiceCorrectionTypes" + @on-fetch="(data) => (invoiceCorrectionTypesOptions = data)" + auto-load + /> + + <QDialog ref="dialogRef"> + <FormPopup + @on-submit="refund()" + :custom-submit-button-label="t('Accept')" + :default-cancel-button="false" + > + <template #form-inputs> + <VnRow> + <VnSelect + :label="t('Rectificative type')" + :options="rectificativeTypeOptions" + hide-selected + option-label="description" + option-value="id" + v-model="invoiceParams.cplusRectificationTypeFk" + :required="true" + /> + </VnRow> + <VnRow> + <VnSelect + :label="t('Class')" + :options="siiTypeInvoiceOutsOptions" + hide-selected + option-label="description" + option-value="id" + v-model="invoiceParams.siiTypeInvoiceOutFk" + :required="true" + > + <template #option="scope"> + <QItem v-bind="scope.itemProps"> + <QItemSection> + <QItemLabel> + {{ scope.opt?.code }} - + {{ scope.opt?.description }} + </QItemLabel> + </QItemSection> + </QItem> + </template> + </VnSelect> + </VnRow> + + <VnRow> + <VnSelect + :label="t('Type')" + :options="invoiceCorrectionTypesOptions" + hide-selected + option-label="description" + option-value="id" + v-model="invoiceParams.invoiceCorrectionTypeFk" + :required="true" + /> </VnRow + ><VnRow> + <div> + <QCheckbox + :label="t('Inherit warehouse')" + v-model="inheritWarehouse" + /> + <QIcon name="info" class="cursor-info q-ml-sm" size="sm"> + <QTooltip>{{ t('Inherit warehouse tooltip') }}</QTooltip> + </QIcon> + </div> + </VnRow> + </template> + </FormPopup> + </QDialog> +</template> + +<i18n> +en: + Refund invoice: Refund invoice + Rectificative type: Rectificative type + Class: Class + Type: Type + Refunded invoice: Refunded invoice + Inherit warehouse: Inherit the warehouse + Inherit warehouse tooltip: Select this option to inherit the warehouse when refunding the invoice + Accept: Accept + Error refunding invoice: Error refunding invoice +es: + Refund invoice: Abonar factura + Rectificative type: Tipo rectificativa + Class: Clase + Type: Tipo + Refunded invoice: Factura abonada + Inherit warehouse: Heredar el almacén + Inherit warehouse tooltip: Seleccione esta opción para heredar el almacén al abonar la factura. + Accept: Aceptar + Error refunding invoice: Error abonando factura +</i18n> diff --git a/src/components/TransferInvoiceForm.vue b/src/components/TransferInvoiceForm.vue index 23c988ee7..f7050cdba 100644 --- a/src/components/TransferInvoiceForm.vue +++ b/src/components/TransferInvoiceForm.vue @@ -2,13 +2,12 @@ import { ref, reactive } from 'vue'; import { useI18n } from 'vue-i18n'; import { useRouter } from 'vue-router'; -import { useQuasar } from 'quasar'; +import { useQuasar, useDialogPluginComponent } from 'quasar'; import VnConfirm from 'components/ui/VnConfirm.vue'; import VnRow from 'components/ui/VnRow.vue'; import FetchData from 'components/FetchData.vue'; import VnSelect from 'components/common/VnSelect.vue'; import FormPopup from './FormPopup.vue'; -import { useDialogPluginComponent } from 'quasar'; import axios from 'axios'; import useNotify from 'src/composables/useNotify.js'; @@ -18,18 +17,19 @@ const $props = defineProps({ default: () => {}, }, }); + const { dialogRef } = useDialogPluginComponent(); const quasar = useQuasar(); const { t } = useI18n(); const router = useRouter(); const { notify } = useNotify(); + +const rectificativeTypeOptions = ref([]); +const siiTypeInvoiceOutsOptions = ref([]); const checked = ref(true); const transferInvoiceParams = reactive({ id: $props.invoiceOutData?.id, }); - -const rectificativeTypeOptions = ref([]); -const siiTypeInvoiceOutsOptions = ref([]); const invoiceCorrectionTypesOptions = ref([]); const selectedClient = (client) => { @@ -43,9 +43,9 @@ const makeInvoice = async () => { const params = { id: transferInvoiceParams.id, cplusRectificationTypeFk: transferInvoiceParams.cplusRectificationTypeFk, + siiTypeInvoiceOutFk: transferInvoiceParams.siiTypeInvoiceOutFk, invoiceCorrectionTypeFk: transferInvoiceParams.invoiceCorrectionTypeFk, newClientFk: transferInvoiceParams.newClientFk, - siiTypeInvoiceOutFk: transferInvoiceParams.siiTypeInvoiceOutFk, makeInvoice: checked.value, }; diff --git a/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue b/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue index 0ded54688..6a3bb5a78 100644 --- a/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue +++ b/src/pages/InvoiceOut/Card/InvoiceOutDescriptorMenu.vue @@ -5,6 +5,7 @@ import { useRouter } from 'vue-router'; import { useQuasar } from 'quasar'; import TransferInvoiceForm from 'src/components/TransferInvoiceForm.vue'; +import RefundInvoiceForm from 'src/components/RefundInvoiceForm.vue'; import SendEmailDialog from 'components/common/SendEmailDialog.vue'; import useNotify from 'src/composables/useNotify'; @@ -37,7 +38,6 @@ const { openConfirmationModal } = useVnConfirm(); const quasar = useQuasar(); const salixUrl = ref(); const invoiceFormType = ref('pdf'); -const defaultEmailAddress = ref($props.invoiceOutData.client?.email); const showInvoicePdf = () => { const url = `api/InvoiceOuts/${$props.invoiceOutData.id}/download?access_token=${token}`; @@ -54,12 +54,6 @@ const showSendInvoiceDialog = (type) => { invoiceFormType.value = type; quasar.dialog({ component: SendEmailDialog, - componentProps: { - data: { - address: defaultEmailAddress.value, - }, - promise: sendEmailInvoice, - }, }); }; @@ -141,6 +135,15 @@ const showTransferInvoiceForm = async () => { }, }); }; + +const showRefundInvoiceForm = () => { + quasar.dialog({ + component: RefundInvoiceForm, + componentProps: { + invoiceOutData: $props.invoiceOutData, + }, + }); +}; </script> <template> @@ -228,19 +231,14 @@ const showTransferInvoiceForm = async () => { </QItemSection> <QMenu anchor="top end" self="top start"> <QList> - <QItem v-ripple clickable @click="refundInvoice(true, false)"> + <QItem v-ripple clickable @click="refundInvoice(true)"> <QItemSection>{{ t('With warehouse, no invoice') }}</QItemSection> </QItem> - <QItem v-ripple clickable @click="refundInvoice(false, false)"> + <QItem v-ripple clickable @click="refundInvoice(false)"> <QItemSection>{{ t('Without warehouse, no invoice') }}</QItemSection> </QItem> - <QItem v-ripple clickable @click="refundInvoice(true, true)"> - <QItemSection>{{ t('With warehouse, with invoice') }}</QItemSection> - </QItem> - <QItem v-ripple clickable @click="refundInvoice(false, true)"> - <QItemSection>{{ - t('Without warehouse, with invoice') - }}</QItemSection> + <QItem v-ripple clickable @click="showRefundInvoiceForm()"> + <QItemSection>{{ t('Invoiced') }}</QItemSection> </QItem> </QList> </QMenu> @@ -265,8 +263,7 @@ es: Send CSV: Enviar CSV With warehouse, no invoice: Con almacén, sin factura Without warehouse, no invoice: Sin almacén, sin factura - With warehouse, with invoice: Con almacén, con factura - Without warehouse, with invoice: Sin almacén, con factura + Invoiced: Facturado Without warehouse: Sin almacén InvoiceOut deleted: Factura eliminada Confirm deletion: Confirmar eliminación