[#FER-22] Pouvoir exporter les réceptions/expéditions fines en Excel (!56)
Some checks failed
Auto Tag Develop / tag (push) Has been cancelled

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

| Numéro du ticket | Titre du ticket |
|------------------|-----------------|
|                  |                 |

## Description de la PR

## Modification du .env

## Check list

- [ ] Pas de régression
- [ ] TU/TI/TF rédigée
- [ ] TU/TI/TF OK
- [ ] CHANGELOG modifié

Reviewed-on: #56
Co-authored-by: tristan <tristan@yuno.malio.fr>
Co-committed-by: tristan <tristan@yuno.malio.fr>
This commit was merged in pull request #56.
This commit is contained in:
2026-05-19 13:49:33 +00:00
committed by Autin
parent de39207102
commit eccb8e1fc6
11 changed files with 894 additions and 2 deletions

View File

@@ -2,6 +2,15 @@
<div class="flex items-center justify-start gap-10">
<Icon @click="router.push('/')" name="gg:arrow-left-o" size="44" class="cursor-pointer text-primary-500"/>
<h1 class="text-3xl font-bold uppercase text-primary-500">liste des réceptions finies</h1>
<div
v-if="auth.isBureau"
class="bg-primary-500 p-1 rounded-md flex items-center cursor-pointer hover:opacity-80"
:class="exporting ? 'cursor-not-allowed opacity-60' : ''"
title="Exporter en Excel"
@click="exportReceptions"
>
<Icon name="mdi:file-excel-outline" size="32" class="text-white" />
</div>
</div>
<div class="px-[86px]">
@@ -79,9 +88,35 @@ import type { ReceptionData } from '~/services/dto/reception-data'
import type { ReceptionTypeData } from '~/services/dto/reception-type-data'
import { getReceptionTypeList } from '~/services/reception-type'
import { useDataTableServerState } from '~/composables/useDataTableServerState'
import { useAuthStore } from '~/stores/auth'
const router = useRouter()
const auth = useAuthStore()
const api = useApi()
const receptionTypes = ref<ReceptionTypeData[]>([])
const exporting = ref(false)
const exportReceptions = async () => {
if (exporting.value) return
exporting.value = true
try {
const blob = await api.getBlob('receptions/export')
const filename = `receptions_${new Date().toISOString().slice(0, 10)}.xlsx`
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = filename
a.style.display = 'none'
document.body.appendChild(a)
a.click()
a.remove()
setTimeout(() => URL.revokeObjectURL(url), 60_000)
} catch {
// toast déjà géré par useApi onResponseError
} finally {
exporting.value = false
}
}
const receptionTypeOptions = computed(() =>
receptionTypes.value.map(rt => ({ value: rt.id, label: rt.label }))

View File

@@ -2,6 +2,15 @@
<div class="flex items-center justify-start gap-10">
<Icon @click="router.push('/')" name="gg:arrow-left-o" size="44" class="cursor-pointer text-primary-500"/>
<h1 class="text-3xl font-bold uppercase text-primary-500">liste des expéditions finies</h1>
<div
v-if="auth.isBureau"
class="bg-primary-500 p-1 rounded-md flex items-center cursor-pointer hover:opacity-80"
:class="exporting ? 'cursor-not-allowed opacity-60' : ''"
title="Exporter en Excel"
@click="exportShipments"
>
<Icon name="mdi:file-excel-outline" size="32" class="text-white" />
</div>
</div>
<div class="px-[86px]">
@@ -77,9 +86,35 @@ import type { ShipmentData } from '~/services/dto/shipment-data'
import type { ShipmentTypeData } from '~/services/dto/shipment-type-data'
import { getShipmentTypeList } from '~/services/shipment-type'
import { useDataTableServerState } from '~/composables/useDataTableServerState'
import { useAuthStore } from '~/stores/auth'
const router = useRouter()
const auth = useAuthStore()
const api = useApi()
const shipmentTypes = ref<ShipmentTypeData[]>([])
const exporting = ref(false)
const exportShipments = async () => {
if (exporting.value) return
exporting.value = true
try {
const blob = await api.getBlob('shipments/export')
const filename = `expeditions_${new Date().toISOString().slice(0, 10)}.xlsx`
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = filename
a.style.display = 'none'
document.body.appendChild(a)
a.click()
a.remove()
setTimeout(() => URL.revokeObjectURL(url), 60_000)
} catch {
// toast déjà géré par useApi onResponseError
} finally {
exporting.value = false
}
}
const shipmentTypeOptions = computed(() =>
shipmentTypes.value.map(st => ({ value: st.id, label: st.label }))