Compare commits

..

2 Commits

Author SHA1 Message Date
52925f7896 feat : ajout du rôle ROLE_BUREAU et hiérarchie de rôles
- Hiérarchie Symfony : ROLE_ADMIN -> ROLE_BUREAU -> ROLE_USER
- ROLE_BUREAU autorise : export inventaire bovin, sync EDNOTIF, visibilité des colonnes Prix/kg et Prix total
- Front : utility roles.ts qui réplique la hiérarchie + auth store étendu (hasRole, isBureau)
- Refactor useBovineColumns : variants withPrices/withoutPrices × inventory/case, gate par isBureau
- Inventory page : Export/Rafraîchir conditionnés par isBureau
- Ajout du rôle dans la const ROLE pour le form admin user

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 12:18:44 +02:00
d60272b87e feat : durcissement des accès admin (DELETE Reception/Shipment + middleware Nuxt)
- DELETE Reception et Shipment passent de ROLE_USER à ROLE_ADMIN (alignement avec l'UI qui cachait déjà les boutons aux non-admin)
- Middleware Nuxt global qui redirige les non-admin de /admin/* vers / (et vers /login si pas authentifié)
- Aucun impact sur l'API /api/carriers qui reste lisible par tous (utilisée dans les formulaires de réception/expédition)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 12:09:57 +02:00
28 changed files with 1 additions and 54 deletions

View File

@@ -1,2 +1,2 @@
parameters:
app.version: '0.0.94'
app.version: '0.0.92'

View File

@@ -32,8 +32,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Type de bovin' })
import {createBovin, getBovin, updateBovin} from "~/services/bovine-type";
import type {BovineTypeData, BovinFormData} from "~/services/dto/bovine-type-data";
const router = useRouter()

View File

@@ -38,8 +38,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Types de bovins' })
import type { BovineTypeData } from '~/services/dto/bovine-type-data'
import { useAuthStore } from '~/stores/auth'
import { useDataTableServerState } from '~/composables/useDataTableServerState'

View File

@@ -44,8 +44,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Transporteur' })
import {createCarrier, getCarrier, updateCarrier} from "~/services/carrier";
import type {CarrierData, CarrierFormData} from "~/services/dto/carrier-data";
import {computed} from "vue";

View File

@@ -34,8 +34,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Transporteurs' })
import type { CarrierData } from '~/services/dto/carrier-data'
import { useDataTableServerState } from '~/composables/useDataTableServerState'

View File

@@ -96,8 +96,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Client' })
import {computed, reactive, ref, watch} from "vue"
import {createCustomer, getCustomer, updateCustomer} from "~/services/customer"
import type {CustomerData, CustomerFormData, CustomerPayload} from "~/services/dto/customer-data"

View File

@@ -3,8 +3,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Adresse client' })
import type { AddressData, AddressPayload } from "~/services/address"
import { createAddress, getAddress, updateAddress } from "~/services/address"
import { getCustomer, updateCustomer } from "~/services/customer"

View File

@@ -44,8 +44,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Clients' })
import type { CustomerData } from '~/services/dto/customer-data'
import { useAuthStore } from '~/stores/auth'
import { useDataTableServerState } from '~/composables/useDataTableServerState'

View File

@@ -97,8 +97,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Fournisseur' })
import {computed, reactive, ref, watch} from "vue"
import {createSupplier, getSupplier, updateSupplier} from "~/services/supplier"
import type {SupplierData, SupplierFormData, SupplierPayload} from "~/services/dto/supplier-data"

View File

@@ -3,8 +3,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Adresse fournisseur' })
import type {AddressData, AddressPayload} from "~/services/address";
import {createAddress, getAddress, updateAddress} from "~/services/address";
import {getSupplier, updateSupplier} from "~/services/supplier";

View File

@@ -44,8 +44,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Fournisseurs' })
import type { SupplierData } from '~/services/dto/supplier-data'
import { useAuthStore } from '~/stores/auth'
import { useDataTableServerState } from '~/composables/useDataTableServerState'

View File

@@ -74,8 +74,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Utilisateur' })
import { computed, reactive, ref, watch } from 'vue'
import { ROLE } from '~/utils/constants'
import { createUser, updateUser, getUser } from '~/services/auth'

View File

@@ -63,8 +63,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Utilisateurs' })
import type { UserData } from '~/services/dto/user-data'
import { ROLE } from '~/utils/constants'
import { useAuthStore } from '~/stores/auth'

View File

@@ -1,5 +1,4 @@
<script setup lang="ts">
useHead({ title: 'Accueil' })
</script>
<template>
<div class="flex flex-wrap justify-center pb-16 gap-12">

View File

@@ -69,8 +69,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Bovins' })
import { createBovine, getBovine, updateBovine } from '~/services/bovine'
import type { BovinePayload } from '~/services/dto/bovine-data'
import type { SupplierData } from '~/services/dto/supplier-data'

View File

@@ -80,8 +80,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Bâtiments' })
import type {BuildingData} from "~/services/dto/building-data"
import type {BuildingLayoutData} from "~/services/dto/building-layout-data"
import type {BuildingCasePositionData} from "~/services/dto/building-case-position-data"

View File

@@ -130,8 +130,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Cases' })
import type { BuildingCaseData } from '~/services/dto/building-case-data'
import type { BovineData } from '~/services/dto/bovine-data'
import { useAuthStore } from '~/stores/auth'

View File

@@ -147,8 +147,6 @@
<script setup lang="ts">
useHead({ title: 'Inventaire' })
import type { BovineData } from '~/services/dto/bovine-data'
import type { InventoryExportFilters } from '~/components/inventory/inventory-export-modal.vue'
import { useAuthStore } from '~/stores/auth'

View File

@@ -53,8 +53,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Connexion' })
import type { UserData } from '~/services/dto/user-data'
import { getUsers } from '~/services/auth'
import { useAuthStore } from '~/stores/auth'

View File

@@ -54,8 +54,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Réception' })
import { useReceptionStore } from '~/stores/reception'
import { storeToRefs } from 'pinia'
import { useWorkflowSteps } from '~/composables/useWorkflowSteps'

View File

@@ -73,8 +73,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Validation réception' })
import type { ReceptionData } from '~/services/dto/reception-data'
import type { ReceptionTypeData } from '~/services/dto/reception-type-data'
import { getReceptionTypeList } from '~/services/reception-type'

View File

@@ -226,8 +226,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Modifier réception' })
import { usePdfPrinter } from '#imports'
import { computed } from 'vue'
import UpdateBovin from '~/components/reception/update-bovin.vue'

View File

@@ -72,8 +72,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Réceptions en attente' })
import type { ReceptionData } from '~/services/dto/reception-data'
import type { ReceptionTypeData } from '~/services/dto/reception-type-data'
import { deleteReception } from '~/services/reception'

View File

@@ -125,8 +125,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Scanner' })
import { ref, computed, nextTick, onMounted, watch } from 'vue'
import { useBarcodeScanner } from '~/composables/useBarcodeScanner'
import { createBovine } from '~/services/bovine'

View File

@@ -51,8 +51,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Expédition' })
import { storeToRefs } from 'pinia'
import { useShipmentStore } from '~/stores/shipment'
import { useWorkflowSteps } from '~/composables/useWorkflowSteps'

View File

@@ -71,8 +71,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Validation expédition' })
import type { ShipmentData } from '~/services/dto/shipment-data'
import type { ShipmentTypeData } from '~/services/dto/shipment-type-data'
import { getShipmentTypeList } from '~/services/shipment-type'

View File

@@ -197,8 +197,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Modifier expédition' })
import { usePdfPrinter } from '#imports'
import { computed, onMounted, reactive, ref, watch } from 'vue'
import UpdateWeight from '~/components/commun/update-weight.vue'

View File

@@ -84,8 +84,6 @@
</template>
<script setup lang="ts">
useHead({ title: 'Expéditions en attente' })
import type { ShipmentData } from '~/services/dto/shipment-data'
import type { ShipmentTypeData } from '~/services/dto/shipment-type-data'
import { deleteShipment } from '~/services/shipment'