++
+
+
+
diff --git a/patch/7017.patch b/patch/7017.patch
new file mode 100644
index 000000000..4d50e5353
--- /dev/null
+++ b/patch/7017.patch
@@ -0,0 +1,30 @@
+diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue
+index 04b4b201..70c9369f 100644
+--- a/src/components/FormModel.vue
++++ b/src/components/FormModel.vue
+@@ -113,6 +113,8 @@ onUnmounted(() => {
+ state.unset($props.model);
+ });
+
++const formRef = ref();
++
+ const isLoading = ref(false);
+ // Si elegimos observar los cambios del form significa que inicialmente las actions estaran deshabilitadas
+ const isResetting = ref(false);
+@@ -152,6 +154,8 @@ async function fetch() {
+ }
+
+ async function save() {
++ const isValid = await formRef.value.validate();
++ if (!isValid) return;
+ if ($props.observeFormChanges && !hasChanges.value) {
+ notify('globals.noChanges', 'negative');
+ return;
+@@ -214,6 +218,7 @@ watch(formUrl, async () => {
+
+
+
+
+
+-
++
+
+
+
diff --git a/patch/changes.patch b/patch/changes.patch
new file mode 100644
index 000000000..7ec165690
--- /dev/null
+++ b/patch/changes.patch
@@ -0,0 +1,232 @@
+diff --git a/src/components/CreateBankEntityForm.vue b/src/components/CreateBankEntityForm.vue
+index 0ad35490..20550255 100644
+--- a/src/components/CreateBankEntityForm.vue
++++ b/src/components/CreateBankEntityForm.vue
+@@ -60,6 +60,7 @@ const onDataSaved = (formData, requestResponse) => {
+ v-model="data.name"
+ :required="true"
+ :rules="validate('bankEntity.name')"
++ autofocus
+ />
+
+
+diff --git a/src/components/ui/VnRow.vue b/src/components/ui/VnRow.vue
+index f2d2b55d..a2f89ff3 100644
+--- a/src/components/ui/VnRow.vue
++++ b/src/components/ui/VnRow.vue
+@@ -1,17 +1,17 @@
+
+-
++
+
+
+
+
diff --git a/src/pages/Ticket/Negative/TicketLackList.vue b/src/pages/Ticket/Negative/TicketLackList.vue
index 51ee9c81d..8400620ba 100644
--- a/src/pages/Ticket/Negative/TicketLackList.vue
+++ b/src/pages/Ticket/Negative/TicketLackList.vue
@@ -6,6 +6,8 @@ import VnPaginate from 'components/ui/VnPaginate.vue';
import { useSession } from 'src/composables/useSession';
import TicketLackFilter from 'pages/Ticket/Negative/TicketLackFilter.vue';
import TicketDescriptorDialog from 'pages/Ticket/Negative/TicketLackDescriptorDialog.vue';
+import NegativeOriginDialog from 'pages/Ticket/Negative/NegativeOriginDialog.vue';
+import TotalNegativeOriginDialog from 'pages/Ticket/Negative/TotalNegativeOriginDialog.vue';
import ItemDescriptorProxy from 'src/pages/Item/Card/ItemDescriptorProxy.vue';
import VnSubToolbar from 'src/components/ui/VnSubToolbar.vue';
import axios from 'axios';
@@ -289,8 +291,18 @@ const updateNegativeOrigin = async () => {
-
-
+
+
+
- {
autofocus
/>
-
+ -->
diff --git a/src/pages/Ticket/Negative/TotalNegativeOriginDialog.vue b/src/pages/Ticket/Negative/TotalNegativeOriginDialog.vue
new file mode 100644
index 000000000..263534c74
--- /dev/null
+++ b/src/pages/Ticket/Negative/TotalNegativeOriginDialog.vue
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+ {{
+ t('ticket.negative.totalNegative')
+ }}
+
+
+
+
+
+
+
+
+
+
+ {{ `${rows.length} ${t('globals.results')}` }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/testt.patch b/testt.patch
new file mode 100644
index 000000000..a63dd2b51
--- /dev/null
+++ b/testt.patch
@@ -0,0 +1,13 @@
+diff --git a/src/layouts/MainLayout.vue b/src/layouts/MainLayout.vue
+index 021ee685..8ff625d5 100644
+--- a/src/layouts/MainLayout.vue
++++ b/src/layouts/MainLayout.vue
+@@ -5,7 +5,7 @@ const quasar = useQuasar();
+
+
+
+-
++
+
+
+
diff --git a/workerPDA.patch b/workerPDA.patch
new file mode 100644
index 000000000..7f43dc498
--- /dev/null
+++ b/workerPDA.patch
@@ -0,0 +1,138 @@
+diff --git a/src/components/FormModel.vue b/src/components/FormModel.vue
+index 9f5ae319..61de5d9f 100644
+--- a/src/components/FormModel.vue
++++ b/src/components/FormModel.vue
+@@ -10,6 +10,7 @@ import { useValidator } from 'src/composables/useValidator';
+ import useNotify from 'src/composables/useNotify.js';
+ import SkeletonForm from 'components/ui/SkeletonForm.vue';
+ import VnConfirm from './ui/VnConfirm.vue';
++import { tMobile } from 'src/composables/tMobile';
+
+ const quasar = useQuasar();
+ const state = useState();
+@@ -43,6 +44,10 @@ const $props = defineProps({
+ type: Boolean,
+ default: true,
+ },
++ defaultButtons: {
++ type: Object,
++ default: () => {},
++ },
+ autoLoad: {
+ type: Boolean,
+ default: false,
+@@ -119,7 +124,19 @@ const hasChanges = ref(!$props.observeFormChanges);
+ const originalData = ref({ ...$props.formInitialData });
+ const formData = computed(() => state.get($props.model));
+ const formUrl = computed(() => $props.url);
+-
++const defaultButtons = computed(() => ({
++ save: {
++ color: 'primary',
++ icon: 'restart_alt',
++ label: 'globals.save',
++ },
++ reset: {
++ color: 'primary',
++ icon: 'save',
++ label: 'globals.reset',
++ },
++ ...$props.defaultButtons,
++}));
+ const startFormWatcher = () => {
+ watch(
+ () => formData.value,
+@@ -131,10 +148,6 @@ const startFormWatcher = () => {
+ );
+ };
+
+-function tMobile(...args) {
+- if (!quasar.platform.is.mobile) return t(...args);
+-}
+-
+ async function fetch() {
+ const { data } = await axios.get($props.url, {
+ params: { filter: JSON.stringify($props.filter) },
+@@ -233,21 +246,21 @@ watch(formUrl, async () => {
+
+
+
+
+
+
+diff --git a/src/i18n/es/index.js b/src/i18n/es/index.js
+index be16e367..a9684e4d 100644
+--- a/src/i18n/es/index.js
++++ b/src/i18n/es/index.js
+@@ -31,6 +31,7 @@ export default {
+ close: 'Cerrar',
+ cancel: 'Cancelar',
+ confirm: 'Confirmar',
++ assign: 'Asignar',
+ back: 'Volver',
+ yes: 'Si',
+ no: 'No',
+@@ -881,6 +882,7 @@ export default {
+ model: 'Modelo',
+ serialNumber: 'NĂºmero de serie',
+ removePDA: 'Desasignar PDA',
++ assignPDA: 'Asignar PDA',
+ },
+ create: {
+ name: 'Nombre',
+diff --git a/src/pages/Worker/Card/WorkerPda.vue b/src/pages/Worker/Card/WorkerPda.vue
+index a487f249..964846d7 100644
+--- a/src/pages/Worker/Card/WorkerPda.vue
++++ b/src/pages/Worker/Card/WorkerPda.vue
+@@ -2,14 +2,16 @@
+ import { useI18n } from 'vue-i18n';
+ import { useRoute } from 'vue-router';
+ import { onMounted, ref, computed } from 'vue';
+-
+ import FetchData from 'components/FetchData.vue';
+ import FormModel from 'components/FormModel.vue';
+ import VnSelectFilter from 'src/components/common/VnSelectFilter.vue';
+-
+ import useNotify from 'src/composables/useNotify.js';
+ import axios from 'axios';
+ import { useRole } from 'src/composables/useRole';
++import { tMobile } from 'src/composables/tMobile';
++import { useStateStore } from 'stores/useStateStore';
++
++const stateStore = useStateStore();
+
+ const route = useRoute();
+ const { t } = useI18n();
+@@ -77,7 +79,9 @@ onMounted(async () => await fetchCurrentDeviceRef.value.fetch());
+ :url-create="`Workers/${route.params.id}/allocatePDA`"
+ model="DeviceProductionUser"
+ :form-initial-data="newPDA"
++ :default-actions="true"
+ auto-load
++ :default-buttons="{ save: { label: 'globals.assign' } }"
+ @on-data-saved="(_, data) => setCurrentPDA(data)"
+ >
+