diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index 15f93b9..4fee92a 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -16,4 +16,4 @@ $ProjectFileDir$ - \ No newline at end of file + diff --git a/.idea/workspace.xml b/.idea/workspace.xml index ff03320..968a9a5 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -4,9 +4,19 @@ + + @@ -775,17 +771,16 @@ - - - - - - file://$PROJECT_DIR$/frontend/stores/reception.ts - @@ -802,4 +797,4 @@ - \ No newline at end of file + diff --git a/CHANGELOG.md b/CHANGELOG.md index 05c904f..e88d430 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,8 @@ Ajouter dans le fichier .env du frontend * Ajout du bundle malio/ednotif-bundle * Ajout de composant UI * Finalisation de la partie réception de marchandise +* [#267] Lister les réceptions en attente +* [#268] Lister les réceptions terminées ### Changed diff --git a/frontend/components/card-link.vue b/frontend/components/card-link.vue new file mode 100644 index 0000000..b44d4f3 --- /dev/null +++ b/frontend/components/card-link.vue @@ -0,0 +1,30 @@ + + + + + + diff --git a/frontend/components/reception/reception-bovine-received.vue b/frontend/components/reception/reception-bovine-received.vue new file mode 100644 index 0000000..4a928d2 --- /dev/null +++ b/frontend/components/reception/reception-bovine-received.vue @@ -0,0 +1,183 @@ + + diff --git a/frontend/components/reception/reception-form.vue b/frontend/components/reception/reception-form.vue index 14e684e..393de8f 100644 --- a/frontend/components/reception/reception-form.vue +++ b/frontend/components/reception/reception-form.vue @@ -142,7 +142,8 @@ import type {DriverData} from '~/services/dto/driver-data' import {getDriverList} from '~/services/driver' import type {VehicleData} from '~/services/dto/vehicle-data' import {getVehicleList} from '~/services/vehicle' -import {SUPLLIER_CODE} from "~/utils/constants"; +import {RECEPTION_TYPE_CODES, SUPLLIER_CODE} from "~/utils/constants"; +import {deleteReceptionBovine, getReceptionBovineList} from "~/services/reception-bovine"; type ReceptionFormData = { licensePlate: string @@ -222,6 +223,18 @@ const filteredVehicles = computed(() => { ) }) +const selectedReceptionType = computed(() => + receptionTypes.value.find((type) => String(type.id) === form.receptionTypeId) ?? null +) + +// Supprime les données bovines si on change de type de réception +const clearReceptionBovines = async (receptionIri: string) => { + const existing = await getReceptionBovineList(receptionIri) + for (const selection of existing) { + await deleteReceptionBovine(selection.id) + } +} + // Hydrate le formulaire depuis la réception en cours watch( () => receptionStore.current, @@ -509,6 +522,16 @@ async function validate() { return } + const previousTypeCode = receptionStore.current.receptionType?.code ?? null + const nextTypeCode = selectedReceptionType.value?.code ?? null + const receptionIri = `/api/receptions/${receptionStore.current.id}` + + if ( + previousTypeCode === RECEPTION_TYPE_CODES.BOVINS && + nextTypeCode === RECEPTION_TYPE_CODES.MERCHANDISES + ) { + await clearReceptionBovines(receptionIri) + } const nextStep = receptionStore.current.currentStep + 1 await receptionStore.updateReception(receptionStore.current.id, { currentStep: nextStep, diff --git a/frontend/components/reception/reception-product-received.vue b/frontend/components/reception/reception-product-received.vue index aed56c6..79c01e2 100644 --- a/frontend/components/reception/reception-product-received.vue +++ b/frontend/components/reception/reception-product-received.vue @@ -1,10 +1,9 @@ diff --git a/frontend/i18n/locales/fr.json b/frontend/i18n/locales/fr.json index 6f9026f..cc66034 100644 --- a/frontend/i18n/locales/fr.json +++ b/frontend/i18n/locales/fr.json @@ -1,64 +1,72 @@ { - "errors": { - "http": { - "get": "Impossible de récupérer les données.", - "post": "Impossible de créer la ressource.", - "put": "Impossible de mettre à jour la ressource.", - "patch": "Impossible de mettre à jour la ressource.", - "delete": "Impossible de supprimer la ressource." + "errors": { + "http": { + "get": "Impossible de récupérer les données.", + "post": "Impossible de créer la ressource.", + "put": "Impossible de mettre à jour la ressource.", + "patch": "Impossible de mettre à jour la ressource.", + "delete": "Impossible de supprimer la ressource." + }, + "reception": { + "list": "Impossible de récupérer la liste des réceptions.", + "fetch": "Impossible de récupérer la réception.", + "create": "Impossible de créer la réception.", + "update": "Impossible de mettre à jour la réception.", + "weigh": "Impossible de récupérer la pesée." + }, + "receptionType": { + "list": "Impossible de récupérer la liste des types de réception." + }, + "merchandiseType": { + "list": "Impossible de récupérer la liste des types de marchandises." + }, + "building": { + "list": "Impossible de récupérer la liste des bâtiments." + }, + "pelletType": { + "list": "Impossible de récupérer la liste des types de granulés." + }, + "receptionPelletBuilding": { + "list": "Impossible de récupérer la liste des dépôts de granulés.", + "create": "Impossible d'enregistrer le dépôt de granulés.", + "delete": "Impossible de supprimer le dépôt de granulés." + }, + "receptionBovine": { + "list": "Impossible de récupérer la liste des bovins de la réception.", + "create": "Impossible d'enregistrer le bovin.", + "delete": "Impossible de supprimer le bovin." + }, + "supplier": { + "list": "Impossible de récupérer la liste des fournisseurs." + }, + "truck": { + "list": "Impossible de récupérer la liste des camions." + }, + "bovin": { + "list": "Impossible de récupérer la liste des races de bovins." + }, + "carrier": { + "list": "Impossible de récupérer la liste des transporteurs." + }, + "driver": { + "list": "Impossible de récupérer la liste des chauffeurs." + }, + "vehicle": { + "list": "Impossible de récupérer la liste des immatriculations." + }, + "auth": { + "login": "Identifiants invalides.", + "users": "Impossible de récupérer les utilisateurs.", + "logout": "Impossible de se déconnecter." + } }, - "reception": { - "list": "Impossible de récupérer la liste des réceptions.", - "fetch": "Impossible de récupérer la réception.", - "create": "Impossible de créer la réception.", - "update": "Impossible de mettre à jour la réception.", - "weigh": "Impossible de récupérer la pesée." - }, - "receptionType": { - "list": "Impossible de récupérer la liste des types de réception." - }, - "merchandiseType": { - "list": "Impossible de récupérer la liste des types de marchandises." - }, - "building": { - "list": "Impossible de récupérer la liste des bâtiments." - }, - "pelletType": { - "list": "Impossible de récupérer la liste des types de granulés." - }, - "receptionPelletBuilding": { - "list": "Impossible de récupérer la liste des dépôts de granulés.", - "create": "Impossible d'enregistrer le dépôt de granulés.", - "delete": "Impossible de supprimer le dépôt de granulés." - }, - "supplier": { - "list": "Impossible de récupérer la liste des fournisseurs." - }, - "truck": { - "list": "Impossible de récupérer la liste des camions." - }, - "carrier": { - "list": "Impossible de récupérer la liste des transporteurs." - }, - "driver": { - "list": "Impossible de récupérer la liste des chauffeurs." - }, - "vehicle": { - "list": "Impossible de récupérer la liste des immatriculations." - }, - "auth": { - "login": "Identifiants invalides.", - "users": "Impossible de récupérer les utilisateurs.", - "logout": "Impossible de se déconnecter." + "success": { + "reception": { + "update": "Réception mise à jour avec succès." + }, + "auth": { + "login": "Connexion réussie.", + "logout": "Déconnexion réussie." + } } - }, - "success": { - "reception": { - "update": "Réception mise à jour avec succès." - }, - "auth": { - "login": "Connexion réussie.", - "logout": "Déconnexion réussie." - } - } } diff --git a/frontend/nuxt.config.ts b/frontend/nuxt.config.ts index 7ed11e0..81acdf1 100644 --- a/frontend/nuxt.config.ts +++ b/frontend/nuxt.config.ts @@ -9,7 +9,8 @@ export default defineNuxtConfig({ '@nuxtjs/tailwindcss', '@pinia/nuxt', 'nuxt-toast', - '@nuxtjs/i18n' + '@nuxtjs/i18n', + '@nuxt/icon' ], css: ['~/assets/css/main.css', '~/assets/css/toast.css'], runtimeConfig: { diff --git a/frontend/package-lock.json b/frontend/package-lock.json index a070811..071d6e3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -7,6 +7,7 @@ "name": "frontend", "hasInstallScript": true, "dependencies": { + "@nuxt/icon": "^2.2.1", "@nuxtjs/i18n": "^10.2.1", "@pinia/nuxt": "^0.11.3", "izitoast": "^1.4.0", @@ -35,6 +36,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -63,7 +77,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -1064,6 +1077,7 @@ "version": "4.12.2", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "peer": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1072,6 +1086,7 @@ "version": "0.21.1", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "peer": true, "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", @@ -1085,6 +1100,7 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1094,6 +1110,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1105,6 +1122,7 @@ "version": "0.4.2", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "peer": true, "dependencies": { "@eslint/core": "^0.17.0" }, @@ -1116,6 +1134,7 @@ "version": "0.17.0", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "peer": true, "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -1127,6 +1146,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "peer": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1149,6 +1169,7 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1158,6 +1179,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "peer": true, "engines": { "node": ">= 4" } @@ -1166,6 +1188,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1177,6 +1200,7 @@ "version": "9.39.2", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1188,6 +1212,7 @@ "version": "2.1.7", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -1196,6 +1221,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "peer": true, "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" @@ -1208,6 +1234,7 @@ "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "peer": true, "engines": { "node": ">=18.18.0" } @@ -1216,6 +1243,7 @@ "version": "0.16.7", "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "peer": true, "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" @@ -1228,6 +1256,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "peer": true, "engines": { "node": ">=12.22" }, @@ -1240,6 +1269,7 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "peer": true, "engines": { "node": ">=18.18" }, @@ -1248,6 +1278,47 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@iconify/collections": { + "version": "1.0.646", + "resolved": "https://registry.npmjs.org/@iconify/collections/-/collections-1.0.646.tgz", + "integrity": "sha512-zA5Gr1MJm1SI0TjOUl7wu4kvBWXQ6Uh8ALEtqQ5ucXyUxP2M8m2bk2hfVtGykSdMlDB+Xs2AHbJ9pQqayz9WGQ==", + "license": "MIT", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "mlly": "^1.8.0" + } + }, + "node_modules/@iconify/vue": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-5.0.0.tgz", + "integrity": "sha512-C+KuEWIF5nSBrobFJhT//JS87OZ++QDORB6f2q2Wm6fl2mueSTpFBeBsveK0KW9hWiZ4mNiPjsh6Zs4jjdROSg==", + "license": "MIT", + "dependencies": { + "@iconify/types": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/cyberalien" + }, + "peerDependencies": { + "vue": ">=3" + } + }, "node_modules/@intlify/bundle-utils": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-11.0.3.tgz", @@ -2268,6 +2339,28 @@ "devtools-wizard": "cli.mjs" } }, + "node_modules/@nuxt/icon": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@nuxt/icon/-/icon-2.2.1.tgz", + "integrity": "sha512-GI840yYGuvHI0BGDQ63d6rAxGzG96jQcWrnaWIQKlyQo/7sx9PjXkSHckXUXyX1MCr9zY6U25Td6OatfY6Hklw==", + "license": "MIT", + "dependencies": { + "@iconify/collections": "^1.0.641", + "@iconify/types": "^2.0.0", + "@iconify/utils": "^3.1.0", + "@iconify/vue": "^5.0.0", + "@nuxt/devtools-kit": "^3.1.1", + "@nuxt/kit": "^4.2.2", + "consola": "^3.4.2", + "local-pkg": "^1.1.2", + "mlly": "^1.8.0", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.10.0", + "tinyglobby": "^0.2.15" + } + }, "node_modules/@nuxt/kit": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-4.2.2.tgz", @@ -2951,7 +3044,6 @@ "version": "0.95.0", "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.95.0.tgz", "integrity": "sha512-Te8fE/SmiiKWIrwBwxz5Dod87uYvsbcZ9JAL5ylPg1DevyKgTkxCXnPEaewk1Su2qpfNmry5RHoN+NywWFCG+A==", - "peer": true, "dependencies": { "@oxc-project/types": "^0.95.0" }, @@ -4856,7 +4948,8 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "peer": true }, "node_modules/@types/parse-path": { "version": "7.0.3", @@ -5206,7 +5299,6 @@ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.26.tgz", "integrity": "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@vue/compiler-core": "3.5.26", @@ -5404,7 +5496,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5442,6 +5533,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5814,7 +5906,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -5928,7 +6019,6 @@ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -6005,6 +6095,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "peer": true, "engines": { "node": ">=6" } @@ -6123,7 +6214,6 @@ "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", "license": "MIT", - "peer": true, "dependencies": { "consola": "^3.2.3" } @@ -6734,7 +6824,8 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "peer": true }, "node_modules/deepmerge": { "version": "4.3.1", @@ -7245,6 +7336,7 @@ "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -7271,6 +7363,7 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7280,6 +7373,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "peer": true, "engines": { "node": ">=10" }, @@ -7291,6 +7385,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -7302,6 +7397,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "peer": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -7313,6 +7409,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "peer": true, "engines": { "node": ">= 4" } @@ -7321,6 +7418,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7332,6 +7430,7 @@ "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "peer": true, "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", @@ -7348,6 +7447,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -7371,6 +7471,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -7382,6 +7483,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "peer": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -7479,7 +7581,8 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "peer": true }, "node_modules/fast-fifo": { "version": "1.3.2", @@ -7506,12 +7609,14 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "peer": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "peer": true }, "node_modules/fast-npm-meta": { "version": "0.4.7", @@ -7552,6 +7657,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "peer": true, "dependencies": { "flat-cache": "^4.0.0" }, @@ -7581,6 +7687,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -7596,6 +7703,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "peer": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -7607,7 +7715,8 @@ "node_modules/flatted": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==" + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "peer": true }, "node_modules/foreground-child": { "version": "3.3.1", @@ -7874,6 +7983,7 @@ "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "peer": true, "engines": { "node": ">=18" }, @@ -8174,6 +8284,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "peer": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -8189,6 +8300,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "peer": true, "engines": { "node": ">=4" } @@ -8210,6 +8322,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "peer": true, "engines": { "node": ">=0.8.19" } @@ -8537,8 +8650,7 @@ "node_modules/izitoast": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/izitoast/-/izitoast-1.4.0.tgz", - "integrity": "sha512-Oc1X2wiQtPp39i5VpIjf3GJf5sfCtHKXZ5szx7RareyEeFLUlcEW0FSfBni28+Ul6KNKZRKzhVuWzSP4Xngh0w==", - "peer": true + "integrity": "sha512-Oc1X2wiQtPp39i5VpIjf3GJf5sfCtHKXZ5szx7RareyEeFLUlcEW0FSfBni28+Ul6KNKZRKzhVuWzSP4Xngh0w==" }, "node_modules/jackspeak": { "version": "3.4.3", @@ -8596,17 +8708,20 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "peer": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "peer": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "peer": true }, "node_modules/json5": { "version": "2.2.3", @@ -8684,6 +8799,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "peer": true, "dependencies": { "json-buffer": "3.0.1" } @@ -8957,6 +9073,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -9041,6 +9158,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -9078,7 +9196,8 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "peer": true }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -9424,7 +9543,8 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "peer": true }, "node_modules/negotiator": { "version": "0.6.3", @@ -10162,7 +10282,6 @@ "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-4.2.2.tgz", "integrity": "sha512-n6oYFikgLEb70J4+K19jAzfx4exZcRSRX7yZn09P5qlf2Z59VNOBqNmaZO5ObzvyGUZ308SZfL629/Q2v2FVjw==", "license": "MIT", - "peer": true, "dependencies": { "@dxup/nuxt": "^0.2.2", "@nuxt/cli": "^3.31.1", @@ -10430,6 +10549,7 @@ "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "peer": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -10476,7 +10596,6 @@ "resolved": "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.102.0.tgz", "integrity": "sha512-xMiyHgr2FZsphQ12ZCsXRvSYzmKXCm1ejmyG4GDZIiKOmhyt5iKtWq0klOfFsEQ6jcgbwrUdwcCVYzr1F+h5og==", "license": "MIT", - "peer": true, "dependencies": { "@oxc-project/types": "^0.102.0" }, @@ -10549,6 +10668,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -10563,6 +10683,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -10589,6 +10710,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "peer": true, "dependencies": { "callsites": "^3.0.0" }, @@ -10637,6 +10759,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "peer": true, "engines": { "node": ">=8" } @@ -10751,7 +10874,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.4.tgz", "integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==", - "peer": true, "dependencies": { "@vue/devtools-api": "^7.7.7" }, @@ -10857,7 +10979,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -11407,7 +11528,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -11475,6 +11595,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -11529,6 +11650,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "peer": true, "engines": { "node": ">=6" } @@ -11880,7 +12002,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", "license": "MIT", - "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -12440,6 +12561,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "peer": true, "engines": { "node": ">=8" }, @@ -12702,7 +12824,6 @@ "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -13042,6 +13163,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -13111,7 +13233,6 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13553,6 +13674,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -13578,7 +13700,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -13935,7 +14056,6 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz", "integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==", "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.26", "@vue/compiler-sfc": "3.5.26", @@ -13971,7 +14091,6 @@ "version": "11.2.8", "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-11.2.8.tgz", "integrity": "sha512-vJ123v/PXCZntd6Qj5Jumy7UBmIuE92VrtdX+AXr+1WzdBHojiBxnAxdfctUFL+/JIN+VQH4BhsfTtiGsvVObg==", - "peer": true, "dependencies": { "@intlify/core-base": "11.2.8", "@intlify/shared": "11.2.8", @@ -13992,7 +14111,6 @@ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", "license": "MIT", - "peer": true, "dependencies": { "@vue/devtools-api": "^6.6.4" }, @@ -14044,6 +14162,7 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -14309,6 +14428,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "peer": true, "engines": { "node": ">=10" }, diff --git a/frontend/package.json b/frontend/package.json index a13235f..7e848f6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -11,6 +11,7 @@ "build:dist": "nuxt generate && rm -rf dist && cp -R .output/public dist" }, "dependencies": { + "@nuxt/icon": "^2.2.1", "@nuxtjs/i18n": "^10.2.1", "@pinia/nuxt": "^0.11.3", "izitoast": "^1.4.0", diff --git a/frontend/pages/index.vue b/frontend/pages/index.vue index d2c35fb..fd54a9a 100644 --- a/frontend/pages/index.vue +++ b/frontend/pages/index.vue @@ -1,55 +1,16 @@ + - - diff --git a/frontend/pages/reception/[[id]].vue b/frontend/pages/reception/[[id]].vue index 9be5d9a..e90b226 100644 --- a/frontend/pages/reception/[[id]].vue +++ b/frontend/pages/reception/[[id]].vue @@ -16,7 +16,12 @@ - + + @@ -25,6 +30,7 @@ import {useReceptionStore} from '~/stores/reception' import {storeToRefs} from 'pinia' import {RECEPTION_STEP_LABELS} from '~/constants/steps' +import {RECEPTION_TYPE_CODES} from "~/utils/constants"; const route = useRoute() const router = useRouter() diff --git a/frontend/pages/reception/finish-reception.vue b/frontend/pages/reception/finish-reception.vue new file mode 100644 index 0000000..63fbc20 --- /dev/null +++ b/frontend/pages/reception/finish-reception.vue @@ -0,0 +1,53 @@ + + + diff --git a/frontend/pages/reception/waiting-reception.vue b/frontend/pages/reception/waiting-reception.vue new file mode 100644 index 0000000..c9118c2 --- /dev/null +++ b/frontend/pages/reception/waiting-reception.vue @@ -0,0 +1,51 @@ + + + diff --git a/frontend/services/bovine-type.ts b/frontend/services/bovine-type.ts new file mode 100644 index 0000000..4e4dafd --- /dev/null +++ b/frontend/services/bovine-type.ts @@ -0,0 +1,23 @@ +import { useApi } from '~/composables/useApi' +import type {BovineTypeData} from "~/services/dto/bovine-type-data"; + +export type BovineTypeListResponse = + | BovineTypeData[] + | { 'hydra:member'?: BovineTypeData[] } + +export async function getBovineTypeList(): Promise { + const api = useApi() + const response = await api.get('bovine_types', {}, { + toastErrorKey: 'errors.bovin.list' + }) + + if (Array.isArray(response)) { + return response + } + + if (response && typeof response === 'object' && Array.isArray(response['hydra:member'])) { + return response['hydra:member'] + } + + return [] +} diff --git a/frontend/services/dto/bovine-type-data.ts b/frontend/services/dto/bovine-type-data.ts new file mode 100644 index 0000000..c12ca7c --- /dev/null +++ b/frontend/services/dto/bovine-type-data.ts @@ -0,0 +1,5 @@ +export interface BovineTypeData{ + id: number + label: string + code: string +} diff --git a/frontend/services/dto/reception-bovine-data.ts b/frontend/services/dto/reception-bovine-data.ts new file mode 100644 index 0000000..d23f984 --- /dev/null +++ b/frontend/services/dto/reception-bovine-data.ts @@ -0,0 +1,8 @@ +import type {BovineTypeData} from "~/services/dto/bovine-type-data"; + +export interface ReceptionBovineTypeData{ + id: number + quantity : number + reception?: string + bovineType: BovineTypeData +} diff --git a/frontend/services/dto/reception-data.ts b/frontend/services/dto/reception-data.ts index 857fa07..f1fe901 100644 --- a/frontend/services/dto/reception-data.ts +++ b/frontend/services/dto/reception-data.ts @@ -8,6 +8,7 @@ import type { AddressData } from '~/services/dto/address-data' import type { TruckData } from '~/services/dto/truck-data' import type { CarrierData } from '~/services/dto/carrier-data' import type { DriverData } from '~/services/dto/driver-data' +import type {BovineTypeData} from "~/services/dto/bovine-type-data"; export interface ReceptionData { id: number @@ -20,7 +21,9 @@ export interface ReceptionData { receptionType?: ReceptionTypeData | null merchandiseType?: MerchandiseTypeData | null merchandiseDetail?: string | null + bovineDetail?: string | null buildings?: BuildingData[] | null + bovinesTypes?: BovineTypeData[] | null pelletBuildings?: ReceptionPelletBuildingData[] | null user?: UserData | null supplier?: SupplierData | null @@ -46,7 +49,9 @@ export type ReceptionPayload = { receptionType?: string | null merchandiseType?: string | null merchandiseDetail?: string | null + bovineDetail?: string | null buildings?: string[] | null + bovinesTypes?: string[] | null user?: string | null supplier?: string | null address?: string | null diff --git a/frontend/services/reception-bovine.ts b/frontend/services/reception-bovine.ts new file mode 100644 index 0000000..3d166d6 --- /dev/null +++ b/frontend/services/reception-bovine.ts @@ -0,0 +1,59 @@ +import { useApi } from '~/composables/useApi' +import type { ReceptionBovineTypeData } from '~/services/dto/reception-bovine-data' + +export type ReceptionBovineListResponse = + | ReceptionBovineTypeData[] + | { 'hydra:member'?: ReceptionBovineTypeData[] } + +export type ReceptionBovinePayload = { + quantity: number + reception: string + bovineType: string +} + +export async function getReceptionBovineList( + receptionIri: string +): Promise { + const api = useApi() + const response = await api.get( + 'reception_bovines', + { reception: receptionIri }, + { + toastErrorKey: 'errors.receptionBovine.list' + } + ) + + if (Array.isArray(response)) { + return response + } + if (response && typeof response === 'object' && Array.isArray(response['hydra:member'])) { + return response['hydra:member'] + } + return [] +} + +export async function createReceptionBovine( + payload: ReceptionBovinePayload +): Promise { + const api = useApi() + return api.post('reception_bovines', payload, { + toastErrorKey: 'errors.receptionBovine.create' + }) +} + +export async function deleteReceptionBovine(id: number): Promise { + const api = useApi() + await api.delete(`reception_bovines/${id}`, {}, { + toastErrorKey: 'errors.receptionBovine.delete' + }) +} + +export async function updateReceptionBovine( + id: number, + payload: Partial +): Promise { + const api = useApi() + return api.patch(`reception_bovines/${id}`, payload, { + toastErrorKey: 'errors.receptionBovine.update' + }) +} diff --git a/frontend/services/reception.ts b/frontend/services/reception.ts index c569d0e..68d75d7 100644 --- a/frontend/services/reception.ts +++ b/frontend/services/reception.ts @@ -2,13 +2,15 @@ import {useApi} from '~/composables/useApi' import type {ReceptionData, ReceptionPayload} from '~/services/dto/reception-data' import type {WeightData} from '~/services/dto/weight-data' -export async function getReceptionList() { +export async function getReceptionList(isValid: boolean|null = null) { const api = useApi() - return api.get(`receptions`, {}, { + const query = isValid !== null ? { isValid: isValid} : {} + return api.get('receptions', query, { toastErrorKey: 'errors.reception.list' }) } + export async function getReception(id: number) { const api = useApi() return api.get(`receptions/${id}`, {}, { diff --git a/frontend/utils/constants.ts b/frontend/utils/constants.ts index 3676886..507b268 100644 --- a/frontend/utils/constants.ts +++ b/frontend/utils/constants.ts @@ -1,5 +1,6 @@ export const RECEPTION_TYPE_CODES = { - MERCHANDISES: 'MARCHANDISES' + MERCHANDISES: 'MARCHANDISES', + BOVINS: 'BOVINS' } as const export const MERCHANDISE_TYPE_CODES = { diff --git a/migrations/Version20260203123833.php b/migrations/Version20260203123833.php new file mode 100644 index 0000000..05296c7 --- /dev/null +++ b/migrations/Version20260203123833.php @@ -0,0 +1,39 @@ +addSql('CREATE TABLE bovine_type (id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, label VARCHAR(120) NOT NULL, code VARCHAR(50) NOT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE TABLE reception_bovine (id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, quantity INT NOT NULL, reception_id INT DEFAULT NULL, bovine_type_id INT NOT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX IDX_636B9DB97C14DF52 ON reception_bovine (reception_id)'); + $this->addSql('CREATE INDEX IDX_636B9DB97899F32E ON reception_bovine (bovine_type_id)'); + $this->addSql('ALTER TABLE reception_bovine ADD CONSTRAINT FK_636B9DB97C14DF52 FOREIGN KEY (reception_id) REFERENCES reception (id)'); + $this->addSql('ALTER TABLE reception_bovine ADD CONSTRAINT FK_636B9DB97899F32E FOREIGN KEY (bovine_type_id) REFERENCES bovine_type (id) NOT DEFERRABLE'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE reception_bovine DROP CONSTRAINT FK_636B9DB97C14DF52'); + $this->addSql('ALTER TABLE reception_bovine DROP CONSTRAINT FK_636B9DB97899F32E'); + $this->addSql('DROP TABLE bovine_type'); + $this->addSql('DROP TABLE reception_bovine'); + } +} diff --git a/migrations/Version20260204141406.php b/migrations/Version20260204141406.php new file mode 100644 index 0000000..3c64fab --- /dev/null +++ b/migrations/Version20260204141406.php @@ -0,0 +1,33 @@ +addSql('ALTER TABLE reception_bovine ALTER quantity SET DEFAULT 0'); + $this->addSql('CREATE UNIQUE INDEX uniq_reception_bovine_type ON reception_bovine (reception_id, bovine_type_id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('DROP INDEX uniq_reception_bovine_type'); + $this->addSql('ALTER TABLE reception_bovine ALTER quantity DROP DEFAULT'); + } +} diff --git a/migrations/Version20260205070819.php b/migrations/Version20260205070819.php new file mode 100644 index 0000000..4116413 --- /dev/null +++ b/migrations/Version20260205070819.php @@ -0,0 +1,31 @@ +addSql('ALTER TABLE reception ADD bovine_detail VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE reception DROP bovine_detail'); + } +} diff --git a/src/Entity/BovineType.php b/src/Entity/BovineType.php new file mode 100644 index 0000000..ee12732 --- /dev/null +++ b/src/Entity/BovineType.php @@ -0,0 +1,70 @@ + '\d+'], + normalizationContext: ['groups' => ['bovine-type:read']], + ), + new GetCollection( + normalizationContext: ['groups' => ['bovine-type:read']], + ), + ], + security: "is_granted('ROLE_USER')", +)] +class BovineType +{ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column] + #[Groups(['bovine-type:read', 'reception:read', 'reception-bovine:read'])] + private ?int $id = null; + + #[ORM\Column(length: 120)] + #[Groups(['bovine-type:read', 'reception:read', 'reception-bovine:read'])] + private ?string $label = null; + + #[ORM\Column(length: 50)] + #[Groups(['bovine-type:read', 'reception:read', 'reception-bovine:read'])] + private ?string $code = null; + + public function getId(): ?int + { + return $this->id; + } + + public function getLabel(): ?string + { + return $this->label; + } + + public function setLabel(string $label): static + { + $this->label = $label; + + return $this; + } + + public function getCode(): ?string + { + return $this->code; + } + + public function setCode(string $code): static + { + $this->code = $code; + + return $this; + } +} diff --git a/src/Entity/Reception.php b/src/Entity/Reception.php index 636dc3d..66305a0 100644 --- a/src/Entity/Reception.php +++ b/src/Entity/Reception.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace App\Entity; +use ApiPlatform\Doctrine\Orm\Filter\BooleanFilter; +use ApiPlatform\Metadata\ApiFilter; use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\Get; @@ -26,6 +28,7 @@ use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer; #[ORM\Entity] #[ORM\HasLifecycleCallbacks] #[ORM\Table(name: 'reception')] +#[ApiFilter(BooleanFilter::class, properties: ['isValid'])] #[ApiResource( operations: [ new Get( @@ -72,27 +75,27 @@ class Reception #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column] - #[Groups(['reception:read'])] + #[Groups(['reception:read', 'reception-bovine:read'])] private ?int $id = null; #[ORM\Column(length: 20, nullable: true)] - #[Groups(['reception:read', 'reception:write'])] + #[Groups(['reception:read', 'reception:write', 'reception-bovine:read'])] private ?string $licensePlate = null; #[ORM\Column(length: 20, unique: true, nullable: true)] - #[Groups(['reception:read'])] + #[Groups(['reception:read', 'reception-bovine:read'])] private ?string $identificationNumber = null; #[ORM\Column(options: ['default' => 0])] - #[Groups(['reception:read', 'reception:write'])] + #[Groups(['reception:read', 'reception:write', 'reception-bovine:read'])] private int $currentStep = 0; #[ORM\Column(options: ['default' => false])] - #[Groups(['reception:read', 'reception:write'])] + #[Groups(['reception:read', 'reception:write', 'reception-bovine:read'])] private bool $isValid = false; #[ORM\Column(name: 'date_reception', type: 'datetime_immutable')] - #[Groups(['reception:read', 'reception:write'])] + #[Groups(['reception:read', 'reception:write', 'reception-bovine:read'])] #[Context([DateTimeNormalizer::FORMAT_KEY => 'Y-m-d'])] private ?DateTimeImmutable $receptionDate = null; @@ -168,6 +171,20 @@ class Reception #[ApiProperty(readableLink: true)] private ?Driver $driver = null; + /** + * @var Collection + */ + #[ORM\OneToMany(targetEntity: ReceptionBovine::class, mappedBy: 'reception', cascade: ['persist', 'remove'], orphanRemoval: true)] + #[Assert\Range( + min: 0 + )] + #[Groups(['reception:read', 'reception:write'])] + private Collection $bovines_types; + + #[ORM\Column(length: 255, nullable: true)] + #[Groups(['reception:read', 'reception:write'])] + private ?string $bovineDetail = null; + public function __construct( ?DateTimeImmutable $receptionDate = null, ) { @@ -175,6 +192,7 @@ class Reception $this->weights = new ArrayCollection(); $this->buildings = new ArrayCollection(); $this->pelletBuildings = new ArrayCollection(); + $this->bovines_types = new ArrayCollection(); } public function getId(): ?int @@ -469,4 +487,46 @@ class Reception ) ; } + + /** + * @return Collection + */ + public function getBovinesTypes(): Collection + { + return $this->bovines_types; + } + + public function addBovinesType(ReceptionBovine $bovinesType): static + { + if (!$this->bovines_types->contains($bovinesType)) { + $this->bovines_types->add($bovinesType); + $bovinesType->setReception($this); + } + + return $this; + } + + public function removeBovinesType(ReceptionBovine $bovinesType): static + { + if ($this->bovines_types->removeElement($bovinesType)) { + // set the owning side to null (unless already changed) + if ($bovinesType->getReception() === $this) { + $bovinesType->setReception(null); + } + } + + return $this; + } + + public function getBovineDetail(): ?string + { + return $this->bovineDetail; + } + + public function setBovineDetail(?string $bovineDetail): static + { + $this->bovineDetail = $bovineDetail; + + return $this; + } } diff --git a/src/Entity/ReceptionBovine.php b/src/Entity/ReceptionBovine.php new file mode 100644 index 0000000..f58d592 --- /dev/null +++ b/src/Entity/ReceptionBovine.php @@ -0,0 +1,109 @@ + 'exact'])] +#[ORM\UniqueConstraint(name: 'uniq_reception_bovine_type', columns: ['reception_id', 'bovine_type_id'])] +#[ApiResource( + operations: [ + new Get( + requirements: ['id' => '\d+'], + normalizationContext: ['groups' => ['reception-bovine:read']], + ), + new GetCollection( + normalizationContext: ['groups' => ['reception-bovine:read']], + ), + new Post( + normalizationContext: ['groups' => ['reception-bovine:read']], + denormalizationContext: ['groups' => ['reception-bovine:write']], + ), + new Patch( + normalizationContext: ['groups' => ['reception-bovine:read']], + denormalizationContext: ['groups' => ['reception-bovine:write']], + ), + new Delete(), + ], + security: "is_granted('ROLE_USER')", +)] +class ReceptionBovine +{ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column] + #[Groups(['reception-bovine:read', 'reception:read'])] + + private ?int $id = null; + + #[ORM\ManyToOne(inversedBy: 'bovines_types')] + #[Groups(['reception-bovine:read', 'reception-bovine:write'])] + private ?Reception $reception = null; + + #[ORM\ManyToOne] + #[ORM\JoinColumn(nullable: false)] + #[Groups(['reception-bovine:read', 'reception-bovine:write', 'reception:read'])] + #[ApiProperty(readableLink: true)] + private ?BovineType $bovineType = null; + + #[ORM\Column(options: ['default' => 0])] + #[Assert\Range( + min: 0 + )] + #[Groups(['reception-bovine:read', 'reception-bovine:write', 'reception:read'])] + private ?int $quantity = null; + + public function getId(): ?int + { + return $this->id; + } + + public function getReception(): ?Reception + { + return $this->reception; + } + + public function setReception(?Reception $reception): static + { + $this->reception = $reception; + + return $this; + } + + public function getBovineType(): ?BovineType + { + return $this->bovineType; + } + + public function setBovineType(?BovineType $bovineType): static + { + $this->bovineType = $bovineType; + + return $this; + } + + public function getQuantity(): ?int + { + return $this->quantity; + } + + public function setQuantity(int $quantity): static + { + $this->quantity = $quantity; + + return $this; + } +} diff --git a/src/Repository/.gitignore b/src/Repository/.gitignore deleted file mode 100644 index e69de29..0000000