fix : correction des retours de la V0
This commit is contained in:
@@ -1,13 +1,15 @@
|
||||
<template>
|
||||
|
||||
<form @submit.prevent="validate">
|
||||
<form :class="{ submitted }" @submit.prevent="validate">
|
||||
<div class="grid grid-cols-2 items-start gap-y-8 gap-x-40 mb-[60px]">
|
||||
<div class="flex items-center justify-between gap-10 relative">
|
||||
<div class="flex flex-row absolute -left-[60px] justify-between">
|
||||
<Icon @click="router.push('/reception/finish-reception')" name="gg:arrow-left-o" size="44" class="cursor-pointer text-primary-500"/>
|
||||
</div>
|
||||
<h1 class="font-bold text-4xl col-start-1 row-start-1 text-primary-500 uppercase">Réception {{ form.identificationNumber }}</h1>
|
||||
<Icon @click="printReceipt" name="mdi:printer-outline" size="44" class="cursor-pointer text-primary-500"/>
|
||||
<div class="bg-primary-500 p-1 rounded-md flex items-center" title="Imprimer" @click="printReceipt">
|
||||
<Icon name="mdi:printer-outline" size="32" class="cursor-pointer text-white"/>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Nom de l'utilisateur -->
|
||||
<UiSelect
|
||||
@@ -21,6 +23,7 @@
|
||||
}))"
|
||||
:loading="isLoadingUsers"
|
||||
wrapper-class="col-start-1 row-start-2"
|
||||
required
|
||||
/>
|
||||
<!-- Date de réception -->
|
||||
<UiDateInput
|
||||
@@ -29,6 +32,7 @@
|
||||
v-model="form.receptionDate"
|
||||
label="Date de réception"
|
||||
wrapper-class="col-start-1 row-start-3"
|
||||
required
|
||||
/>
|
||||
<!-- type de reception -->
|
||||
<UiSelect
|
||||
@@ -42,6 +46,7 @@
|
||||
}))"
|
||||
:loading="isLoadingSuppliers"
|
||||
wrapper-class="col-start-1 row-start-4"
|
||||
required
|
||||
/>
|
||||
<!-- Fournisseur -->
|
||||
<UiSelect
|
||||
@@ -55,6 +60,7 @@
|
||||
}))"
|
||||
:loading="isLoadingSuppliers"
|
||||
wrapper-class="col-start-1 row-start-5"
|
||||
required
|
||||
/>
|
||||
<!-- Adresse fournisseur -->
|
||||
<UiSelect
|
||||
@@ -67,6 +73,7 @@
|
||||
}))"
|
||||
:disabled="(isLoadingSuppliers || supplierAddresses.length === 0) && !auth.isAdmin"
|
||||
wrapper-class="col-start-2 row-start-1"
|
||||
required
|
||||
/>
|
||||
<!-- Camion -->
|
||||
<UiSelect
|
||||
@@ -80,6 +87,7 @@
|
||||
}))"
|
||||
:loading="isLoadingTrucks"
|
||||
wrapper-class="col-start-2 row-start-2"
|
||||
required
|
||||
/>
|
||||
<!-- Transporteur -->
|
||||
<UiSelect
|
||||
@@ -94,6 +102,7 @@
|
||||
:loading="isLoadingCarriers"
|
||||
select-class="h-[34px]"
|
||||
wrapper-class="col-start-2 row-start-3"
|
||||
required
|
||||
/>
|
||||
<!-- Chauffeur (LIOT) -->
|
||||
<UiSelect
|
||||
@@ -108,6 +117,7 @@
|
||||
:loading="isLoadingDrivers"
|
||||
wrapper-class="col-start-2 row-start-5"
|
||||
v-if="isLiotCarrier"
|
||||
required
|
||||
/>
|
||||
<!-- Plaque d'immatriculation -->
|
||||
<div v-if="!isLiotCarrier" class="col-start-2 row-start-4">
|
||||
@@ -115,6 +125,7 @@
|
||||
:disabled="!auth.isAdmin"
|
||||
v-model="form.licensePlate"
|
||||
v-model:allowAny="allowAnyLicensePlate"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
<!-- Immatriculation (LIOT) -->
|
||||
@@ -130,27 +141,37 @@
|
||||
:loading="isLoadingVehicles"
|
||||
:disabled="(isLoadingVehicles || filteredVehicles.length === 0) && !auth.isAdmin"
|
||||
wrapper-class="col-start-2 row-start-4"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
<div v-if="formIsLoading">
|
||||
<div class="flex justify-evenly gap-y-8 gap-x-41 mb-10 border-b border-primary-500/60">
|
||||
<h1
|
||||
class="font-bold text-3xl uppercase px-12 col-start-1 row-start-1 cursor-pointer "
|
||||
:class="activeTab === 'weights' ? 'border-b-[6px] border-primary-500 text-primary-500' : 'text-primary-500/50'"
|
||||
class="font-bold text-3xl uppercase px-12 col-start-1 row-start-1 cursor-pointer"
|
||||
:class="[
|
||||
activeTab === 'weights' ? 'border-b-[6px] border-primary-500 text-primary-500' : 'text-primary-500/50',
|
||||
hasGrossWeightError ? '!text-red-500 !border-red-500' : ''
|
||||
]"
|
||||
@click="activeTab = 'weights'"
|
||||
>
|
||||
pesée à plein
|
||||
</h1>
|
||||
<h1
|
||||
class="font-bold text-3xl uppercase col-start-1 row-start-1 px-12 cursor-pointer "
|
||||
:class="activeTab === 'weightsEmpty' ? 'border-b-[6px] border-primary-500 text-primary-500 ' : 'text-primary-500/50'"
|
||||
class="font-bold text-3xl uppercase col-start-1 row-start-1 px-12 cursor-pointer"
|
||||
:class="[
|
||||
activeTab === 'weightsEmpty' ? 'border-b-[6px] border-primary-500 text-primary-500' : 'text-primary-500/50',
|
||||
hasTareWeightError ? '!text-red-500 !border-red-500' : ''
|
||||
]"
|
||||
@click="activeTab = 'weightsEmpty'"
|
||||
>
|
||||
pesée à vide
|
||||
</h1>
|
||||
<h1
|
||||
class="font-bold text-3xl uppercase px-12 col-start-2 row-start-1 cursor-pointer "
|
||||
:class="activeTab === 'merchandise' ? 'border-b-[6px] border-primary-500 text-primary-500' : 'text-primary-500/50'"
|
||||
class="font-bold text-3xl uppercase px-12 col-start-2 row-start-1 cursor-pointer"
|
||||
:class="[
|
||||
activeTab === 'merchandise' ? 'border-b-[6px] border-primary-500 text-primary-500' : 'text-primary-500/50',
|
||||
hasMerchandiseTabError ? '!text-red-500 !border-red-500' : ''
|
||||
]"
|
||||
@click="activeTab = 'merchandise'"
|
||||
>
|
||||
{{ isMerchandise ? "Marchandise" : "Bovins" }}
|
||||
@@ -176,6 +197,9 @@
|
||||
v-model="merchandiseForm"
|
||||
:isAdmin="auth.isAdmin"
|
||||
/>
|
||||
<p v-if="activeTab === 'merchandise' && isMerchandise" class="text-red-500 text-sm mt-2" :class="showMerchandiseError ? '' : 'invisible'">
|
||||
{{ merchandiseErrorMessage || ' ' }}
|
||||
</p>
|
||||
|
||||
<update-bovin
|
||||
v-if="activeTab === 'merchandise' && !isMerchandise"
|
||||
@@ -183,12 +207,16 @@
|
||||
v-model:otherQuantity="bovineOtherQuantity"
|
||||
:isAdmin="auth.isAdmin"
|
||||
/>
|
||||
<p v-if="activeTab === 'merchandise' && !isMerchandise" class="text-red-500 text-sm mt-2" :class="showMerchandiseError ? '' : 'invisible'">
|
||||
{{ merchandiseErrorMessage || ' ' }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="flex justify-center">
|
||||
<UiButton
|
||||
v-if="auth.isAdmin"
|
||||
type="submit"
|
||||
class="inline-flex mb-16 items-center justify-center text-xl text-white uppercase bg-primary-500 h-[50px] px-8 rounded hover:opacity-80 gap-2 justify-self-end"
|
||||
@click="submitted = true"
|
||||
>
|
||||
Valider
|
||||
</UiButton>
|
||||
@@ -239,7 +267,9 @@ import { getVehicleList } from '~/services/vehicle'
|
||||
import { createWeight, updateWeight } from '~/services/weight'
|
||||
import { useAuthStore } from '~/stores/auth'
|
||||
import { useReceptionStore } from '~/stores/reception'
|
||||
import { RECEPTION_TYPE_CODES, SUPPLIER_CODE } from '~/utils/constants'
|
||||
import { MERCHANDISE_TYPE_CODES, RECEPTION_TYPE_CODES, SUPPLIER_CODE } from '~/utils/constants'
|
||||
import { getMerchandiseTypeList } from '~/services/merchandise-type'
|
||||
import type { MerchandiseTypeData } from '~/services/dto/merchandise-type-data'
|
||||
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
@@ -260,6 +290,17 @@ const merchandiseForm = ref<MerchandiseEntryData>({
|
||||
selectedPelletBuildingIds: {}
|
||||
})
|
||||
const allowAnyLicensePlate = ref(false)
|
||||
const submitted = ref(false)
|
||||
const showMerchandiseError = ref(false)
|
||||
const merchandiseErrorMessage = ref('')
|
||||
|
||||
const hasGrossWeightError = computed(() =>
|
||||
submitted.value && (grossWeight.value.weight === null || grossWeight.value.weighedAt === null || grossWeight.value.dsd === null)
|
||||
)
|
||||
const hasTareWeightError = computed(() =>
|
||||
submitted.value && (tareWeight.value.weight === null || tareWeight.value.weighedAt === null || tareWeight.value.dsd === null)
|
||||
)
|
||||
const hasMerchandiseTabError = computed(() => submitted.value && showMerchandiseError.value)
|
||||
const isLoading = ref(false)
|
||||
const users = ref<UserData[]>([])
|
||||
const isLoadingUsers = ref(false)
|
||||
@@ -277,6 +318,7 @@ const vehicles = ref<VehicleData[]>([])
|
||||
const isLoadingVehicles = ref(false)
|
||||
const formIsLoading = ref(false)
|
||||
const isMerchandise = ref(false)
|
||||
const merchandiseTypesList = ref<MerchandiseTypeData[]>([])
|
||||
const isHydrating = ref(false)
|
||||
const vehicleSyncLock = ref(false)
|
||||
|
||||
@@ -436,7 +478,7 @@ function hydrateFromReception(reception: ReceptionData | null) {
|
||||
isHydrating.value = true
|
||||
form.identificationNumber = reception?.identificationNumber ?? ''
|
||||
form.licensePlate = reception?.licensePlate ?? ''
|
||||
form.receptionDate = reception?.receptionDate ?? new Date().toISOString().slice(0, 10)
|
||||
form.receptionDate = reception?.receptionDate?.slice(0, 10) ?? new Date().toISOString().slice(0, 10)
|
||||
form.userId = reception?.user?.id
|
||||
? String(reception.user.id)
|
||||
: form.userId
|
||||
@@ -776,6 +818,53 @@ async function validate() {
|
||||
}
|
||||
|
||||
if (idReception) {
|
||||
const hasInvalidWeights =
|
||||
grossWeight.value.weight === null || grossWeight.value.weighedAt === null || grossWeight.value.dsd === null ||
|
||||
tareWeight.value.weight === null || tareWeight.value.weighedAt === null || tareWeight.value.dsd === null
|
||||
|
||||
if (hasInvalidWeights) {
|
||||
return
|
||||
}
|
||||
|
||||
showMerchandiseError.value = false
|
||||
merchandiseErrorMessage.value = ''
|
||||
|
||||
if (!isMerchandise.value && getTotalBovines() === 0) {
|
||||
showMerchandiseError.value = true
|
||||
merchandiseErrorMessage.value = 'Veuillez saisir au moins une race bovine.'
|
||||
return
|
||||
}
|
||||
|
||||
if (isMerchandise.value) {
|
||||
const selectedType = merchandiseTypesList.value.find(
|
||||
(t) => String(t.id) === merchandiseForm.value.merchandiseTypeId
|
||||
)
|
||||
const isAutresType = selectedType?.code === MERCHANDISE_TYPE_CODES.AUTRES
|
||||
const isGranuleType = selectedType?.code === MERCHANDISE_TYPE_CODES.GRANULE
|
||||
|
||||
if (isAutresType && !merchandiseForm.value.merchandiseDetail.trim()) {
|
||||
showMerchandiseError.value = true
|
||||
merchandiseErrorMessage.value = 'Veuillez préciser le type de marchandise.'
|
||||
return
|
||||
}
|
||||
|
||||
if (!isAutresType && !isGranuleType && merchandiseForm.value.selectedBuildingIds.length === 0) {
|
||||
showMerchandiseError.value = true
|
||||
merchandiseErrorMessage.value = 'Veuillez sélectionner au moins un bâtiment.'
|
||||
return
|
||||
}
|
||||
|
||||
if (isGranuleType) {
|
||||
const hasAny = Object.values(merchandiseForm.value.selectedPelletBuildingIds)
|
||||
.some((ids) => ids.length > 0)
|
||||
if (!hasAny) {
|
||||
showMerchandiseError.value = true
|
||||
merchandiseErrorMessage.value = 'Veuillez sélectionner au moins un bâtiment.'
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await receptionStore.updateReception(idReception, {
|
||||
...payload
|
||||
})
|
||||
@@ -820,6 +909,7 @@ async function validate() {
|
||||
|
||||
onMounted(async () => {
|
||||
await loadTypes()
|
||||
merchandiseTypesList.value = await getMerchandiseTypeList()
|
||||
syncMerchandiseFlag()
|
||||
formIsLoading.value = true
|
||||
await loadUsers()
|
||||
|
||||
Reference in New Issue
Block a user