From f1b8cbdce11fb05a3dca68301593e5b0544321d6 Mon Sep 17 00:00:00 2001
From: Mono Mono <monomono@disroot.org>
Date: Mon, 11 Nov 2024 21:17:12 -0500
Subject: [PATCH 1/4] fix(Purchase): validation of form.

---
 .../frontend/don-confiao/src/components/Purchase.vue  | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue
index 65bca7b..238f9d5 100644
--- a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue
+++ b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue
@@ -1,6 +1,6 @@
 <template>
 <v-container>
-  <v-form ref="form" v-model="valid">
+  <v-form ref="purchase" v-model="valid" >
     <v-row>
       <v-col>
         <v-autocomplete
@@ -123,6 +123,8 @@
             item-title="text"
             item-value="value"
             label="Pago en"
+            :rules="[rules.required]"
+            required
           ></v-select>
           <v-btn @click="openCasherModal" v-if="purchase.payment_method === 'CASH'">Calcular Devuelta</v-btn>
           <CasherModal :total_purchase="calculateTotal" ref="casherModal"</CasherModal>
@@ -276,9 +278,10 @@
        return line.unit_price * line.quantity;
      },
      async submit() {
-       if (this.$refs.form.validate()) {
-           const hasInvalidQuantity = this.purchase.saleline_set.some(line => line.quantity <= 0);
-           if (hasInvalidQuantity) {
+       this.$refs.purchase.validate();
+       if (this.valid) {
+         const hasInvalidQuantity = this.purchase.saleline_set.some(line => line.quantity <= 0);
+         if (hasInvalidQuantity) {
                this.errorMessage = 'La cantidad de cada línea de compra debe ser mayor que cero.';
 
                console.log(this.errorMessage);

From a5ac06704b79340efd3c0f3c903c5f083986e512 Mon Sep 17 00:00:00 2001
From: Mono Mono <monomono@disroot.org>
Date: Mon, 11 Nov 2024 21:42:13 -0500
Subject: [PATCH 2/4] feat(Purchase): warn user when try eliminate the last
 line

---
 .../don-confiao/src/components/Purchase.vue   | 25 ++++++++-----------
 1 file changed, 10 insertions(+), 15 deletions(-)

diff --git a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue
index 238f9d5..e7f977c 100644
--- a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue
+++ b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue
@@ -104,8 +104,11 @@
             <v-col>
               <v-btn @click="removeLine(index)" color="red">Eliminar</v-btn>
             </v-col>
-          </v-row>
-        </v-container>
+        </v-row>
+        <v-alert type="warning" :duration="2000" closable v-model="show_alert_lines">
+          No se puede eliminar la única línea.
+        </v-alert>
+      </v-container>
         <v-btn @click="addLine" color="blue">Agregar</v-btn>
         </v-container>
         <v-divider></v-divider>
@@ -150,6 +153,7 @@
    data() {
      return {
        valid: false,
+       show_alert_lines: false,
        client_search: '',
        product_search: '',
        payment_methods: null,
@@ -266,12 +270,13 @@
        this.purchase.saleline_set.push({ product: '', unit_price: 0, quantity:0, measuring_unit: ''});
      },
      removeLine(index) {
-         // Solo elimina si hay más de una línea
          if (this.purchase.saleline_set.length > 1) {
              this.purchase.saleline_set.splice(index, 1);
          } else {
-         // Opcional: puedes mostrar un mensaje o alerta si lo deseas
-             console.log("No se puede eliminar la única línea.");
+           this.show_alert_lines = true;
+           setTimeout(() => {
+             this.show_alert_lines = false;
+           }, 2000);
          }
      },
      calculateSubtotal(line) {
@@ -280,16 +285,6 @@
      async submit() {
        this.$refs.purchase.validate();
        if (this.valid) {
-         const hasInvalidQuantity = this.purchase.saleline_set.some(line => line.quantity <= 0);
-         if (hasInvalidQuantity) {
-               this.errorMessage = 'La cantidad de cada línea de compra debe ser mayor que cero.';
-
-               console.log(this.errorMessage);
-               return; // Detener el submit si hay cantidades inválidas
-           }
-
-           this.errorMessage = ''; // Limpiar el mensaje de error
-
            try {
                const response = await fetch('/don_confiao/api/sales/', {
                    method: 'POST',

From 201333ab4bfef0bdebfb7566682e46745ce2a29f Mon Sep 17 00:00:00 2001
From: Mono Mono <monomono@disroot.org>
Date: Mon, 11 Nov 2024 21:47:46 -0500
Subject: [PATCH 3/4] feat(Purchase): warn user invalid form #71

---
 .../frontend/don-confiao/src/components/Purchase.vue     | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue
index e7f977c..8866909 100644
--- a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue
+++ b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue
@@ -133,6 +133,9 @@
           <CasherModal :total_purchase="calculateTotal" ref="casherModal"</CasherModal>
         </v-container>
         <v-btn @click="submit" color="green">Comprar</v-btn>
+        <v-alert type="error" :duration="2000" closable v-model="show_alert_purchase">
+          Verifique los campos obligatorios.
+        </v-alert>
   </v-form>
 </v-container>
 </template>
@@ -154,6 +157,7 @@
      return {
        valid: false,
        show_alert_lines: false,
+       show_alert_purchase: false,
        client_search: '',
        product_search: '',
        payment_methods: null,
@@ -306,6 +310,11 @@
            } catch (error) {
                console.error('Error de red:', error);
            }
+       } else {
+         this.show_alert_purchase = true;
+           setTimeout(() => {
+             this.show_alert_purchase = false;
+           }, 4000);
        }
      },
      navigate(route) {

From 159bd737c40252a519673704391cd853509352d1 Mon Sep 17 00:00:00 2001
From: Mono Mono <monomono@disroot.org>
Date: Mon, 11 Nov 2024 22:45:47 -0500
Subject: [PATCH 4/4] feat(Purchase): warn user whit browser actions #67.

---
 .../don-confiao/src/components/Purchase.vue   | 22 +++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue
index 8866909..dcca9d2 100644
--- a/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue
+++ b/tienda_ilusion/don_confiao/frontend/don-confiao/src/components/Purchase.vue
@@ -1,6 +1,6 @@
 <template>
 <v-container>
-  <v-form ref="purchase" v-model="valid" >
+  <v-form ref="purchase" v-model="valid" @change="onFormChange">
     <v-row>
       <v-col>
         <v-autocomplete
@@ -10,6 +10,7 @@
           no-data-text="No se hallaron clientes"
           item-title="name"
           item-value="id"
+          @update:model-value="onFormChange"
           label="Cliente"
           :rules="[rules.required]"
           required
@@ -156,6 +157,7 @@
    data() {
      return {
        valid: false,
+       form_changed: false,
        show_alert_lines: false,
        show_alert_purchase: false,
        client_search: '',
@@ -189,6 +191,12 @@
        this.drawer = false
      },
    },
+   beforeMount() {
+      window.addEventListener('beforeunload', this.confirmLeave);
+   },
+   beforeDestroy() {
+      window.removeEventListener('beforeunload', this.confirmLeave);
+   },
    computed: {
      calculateTotal() {
        return this.purchase.saleline_set.reduce((total, saleline) => {
@@ -218,9 +226,20 @@
      openModal() {
       this.$refs.customerModal.openModal();
      },
+     onFormChange() {
+       this.form_changed = true;
+     },
      openCasherModal() {
        this.$refs.casherModal.dialog = true
      },
+     confirmLeave(event) {
+       if (this.form_changed) {
+         const message = '¿seguro que quieres salir? Perderas la información diligenciada';
+         event.preventDefault();
+         event.returnValue = message;
+         return message;
+       }
+     },
      getCurrentDate() {
        const today = new Date();
        const yyyy = today.getFullYear();
@@ -233,7 +252,6 @@
        const selectedProductId = this.purchase.saleline_set[index].product;
        const selectedProduct = this.products.find(p => p.id == selectedProductId);
          this.purchase.saleline_set[index].unit_price = selectedProduct.price;
-         console.log(selectedProduct.measuring_unit);
          this.purchase.saleline_set[index].measuring_unit = selectedProduct.measuring_unit;
      },
      fetchClients() {