feat : ajout du numéro identification des receptions et ajustement du bon de reception
This commit is contained in:
@@ -33,14 +33,13 @@
|
||||
@click="printReceipt"
|
||||
>Générer le bon</button>
|
||||
</div>
|
||||
<UiPdfPrinter ref="pdfPrinter" />
|
||||
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, ref } from 'vue'
|
||||
import { computed } from 'vue'
|
||||
import { storeToRefs } from 'pinia'
|
||||
import { useWeighing } from '~/composables/useWeighing'
|
||||
import { usePdfPrinter } from '~/composables/usePdfPrinter'
|
||||
import { useReceptionStore } from '~/stores/reception'
|
||||
|
||||
const props = defineProps<{
|
||||
@@ -50,14 +49,9 @@ const props = defineProps<{
|
||||
const router = useRouter()
|
||||
const receptionStore = useReceptionStore()
|
||||
const { current: storeReception } = storeToRefs(receptionStore)
|
||||
type PdfPrinterHandle = {
|
||||
print: (url: string) => Promise<void>
|
||||
}
|
||||
// Ref sur le composant d'impression pour déclencher le print() du PDF.
|
||||
const pdfPrinter = ref<PdfPrinterHandle | null>(null)
|
||||
const { printPdf } = usePdfPrinter()
|
||||
const {
|
||||
displayWeight,
|
||||
displayDsd,
|
||||
title,
|
||||
showLoadingBox,
|
||||
fetchWeight,
|
||||
@@ -73,12 +67,12 @@ const showGenerateReceipt = computed(
|
||||
)
|
||||
|
||||
const printReceipt = async () => {
|
||||
if (!import.meta.client || !receptionStore.current || !pdfPrinter.value) {
|
||||
if (!import.meta.client || !receptionStore.current) {
|
||||
return
|
||||
}
|
||||
|
||||
await saveWeight()
|
||||
await pdfPrinter.value.print(`/receptions/${receptionStore.current.id}/receipt`)
|
||||
await printPdf(`/receptions/${receptionStore.current.id}/receipt`)
|
||||
|
||||
// Laisse le temps a la boite de dialogue d'impression de s'ouvrir.
|
||||
await new Promise((resolve) => setTimeout(resolve, 600))
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
<template>
|
||||
<iframe ref="printFrame" class="hidden" />
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { usePdfPrinter } from '~/composables/usePdfPrinter'
|
||||
|
||||
const printFrame = ref<HTMLIFrameElement | null>(null)
|
||||
const { printPdf } = usePdfPrinter()
|
||||
|
||||
// Expose une methode simple pour imprimer un PDF depuis les ecrans.
|
||||
const print = async (url: string): Promise<void> => {
|
||||
return printPdf(url, printFrame)
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
print
|
||||
})
|
||||
</script>
|
||||
@@ -1,40 +1,29 @@
|
||||
import type { Ref } from 'vue'
|
||||
import { useApi } from '~/composables/useApi'
|
||||
|
||||
type PrintFrameRef = Ref<HTMLIFrameElement | null>
|
||||
import {useApi} from '~/composables/useApi'
|
||||
|
||||
export const usePdfPrinter = () => {
|
||||
const api = useApi()
|
||||
const api = useApi()
|
||||
const receptionStore = useReceptionStore()
|
||||
const currentReception = receptionStore.current
|
||||
|
||||
const printPdf = async (url: string, frameRef: PrintFrameRef): Promise<void> => {
|
||||
if (!import.meta.client) {
|
||||
return
|
||||
const printPdf = async (url: string): Promise<void> => {
|
||||
if (!import.meta.client) {
|
||||
return
|
||||
}
|
||||
|
||||
const blob = await api.getBlob(url)
|
||||
const blobUrl = URL.createObjectURL(blob)
|
||||
const a = document.createElement('a');
|
||||
a.href = url;
|
||||
// nom du fichier à changer par les infos du store pinia
|
||||
a.download = `${currentReception.identificationNumber}_${currentReception.supplier.name}_${currentReception.licensePlate}`;
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
a.remove();
|
||||
window.open(blobUrl, '_blank', 'noopener,noreferrer')
|
||||
setTimeout(() => URL.revokeObjectURL(blobUrl), 60000)
|
||||
}
|
||||
|
||||
const frame = frameRef.value
|
||||
if (!frame) {
|
||||
return
|
||||
return {
|
||||
printPdf
|
||||
}
|
||||
|
||||
// On charge le PDF en blob pour rester en same-origin dans l'iframe.
|
||||
const blob = await api.getBlob(url)
|
||||
const blobUrl = URL.createObjectURL(blob)
|
||||
|
||||
const tryPrint = () => {
|
||||
frame.contentWindow?.focus()
|
||||
frame.contentWindow?.print()
|
||||
}
|
||||
|
||||
frame.onload = () => {
|
||||
tryPrint()
|
||||
// On libere l'URL blob apres l'impression.
|
||||
setTimeout(() => URL.revokeObjectURL(blobUrl), 2000)
|
||||
}
|
||||
frame.src = blobUrl
|
||||
setTimeout(tryPrint, 1200)
|
||||
}
|
||||
|
||||
return {
|
||||
printPdf
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import type { DriverData } from '~/services/dto/driver-data'
|
||||
|
||||
export interface ReceptionData {
|
||||
id: number
|
||||
identificationNumber?: string | null
|
||||
licensePlate: string | null
|
||||
weights?: WeightEntryData[] | null
|
||||
receptionDate: string
|
||||
|
||||
Reference in New Issue
Block a user