From 1d27781c028edcce7dbc3cb9d19da2b31b94586f Mon Sep 17 00:00:00 2001 From: rstubryan Date: Mon, 29 Dec 2025 19:43:32 +0700 Subject: [PATCH] feat(FE-316): Add instruction sheet and format data sheet --- .../uniformity/export/UniformityTemplate.tsx | 58 ++++++++++++++++--- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/src/components/pages/uniformity/export/UniformityTemplate.tsx b/src/components/pages/uniformity/export/UniformityTemplate.tsx index 27e3b7e5..3cd3f76b 100644 --- a/src/components/pages/uniformity/export/UniformityTemplate.tsx +++ b/src/components/pages/uniformity/export/UniformityTemplate.tsx @@ -8,29 +8,69 @@ export const generateUniformityTemplate = ( projectFlockKandangLookup: ProjectFlockKandangLookup ) => { try { - // Calculate 2% sample from total population const sampleSize = Math.round(availableQuantity * 0.02); + const kandangName = projectFlockKandangLookup.kandang?.name || 'Kandang'; + const flockName = projectFlockKandangLookup.project_flock?.flock_name || ''; + const flockPeriod = projectFlockKandangLookup.project_flock?.period || 1; + const locationName = + projectFlockKandangLookup.project_flock?.location?.name || ''; + const areaName = projectFlockKandangLookup.project_flock?.area?.name || ''; + + const instructions = [ + ['PETUNJUK PENGISIAN DATA UNIFORMITY'], + [''], + ['INFORMASI PROYEK'], + ['Location', locationName], + ['Area', areaName], + ['Flock Name', flockName], + ['Periode', flockPeriod], + ['Kandang', kandangName], + ['Total Populasi', formatNumber(availableQuantity)], + ['Jumlah Sampel (2%)', formatNumber(sampleSize)], + [''], + ['CARA PENGISIAN:'], + ['1. Pindah ke sheet "Data" untuk mengisi data BW (Body Weight)'], + [ + '2. Kolom NO sudah terisi otomatis dari 1 sampai ' + + formatNumber(sampleSize), + ], + ['3. Isi kolom BW dengan berat badan ayam dalam gram'], + ['4. Pastikan semua baris terisi dengan data yang valid'], + ['5. Simpan file dan upload kembali ke sistem'], + [''], + ['FORMAT DATA:'], + ['• NO: Nomor urut ayam (1, 2, 3, ...)'], + ['• BW: Berat badan dalam gram (contoh: 1500, 1650, 1800)'], + [''], + ['CATATAN:'], + ['• Data yang diisi adalah sampel 2% dari total populasi'], + ['• Pastikan timbangan dalam kondisi baik dan terkalibrasi'], + ['• Lakukan pengukuran pada waktu yang sama setiap hari'], + ]; + + const instructionSheet = XLSX.utils.aoa_to_sheet(instructions); + instructionSheet['!cols'] = [ + { wch: 30 }, // Column A width + { wch: 40 }, // Column B width + ]; const data = Array.from({ length: sampleSize }, (_, index) => ({ NO: index + 1, BW: '', })); - const worksheet = XLSX.utils.json_to_sheet(data, { + const dataWorksheet = XLSX.utils.json_to_sheet(data, { header: ['NO', 'BW'], }); - worksheet['!cols'] = [{ wch: 10 }, { wch: 15 }]; + dataWorksheet['!cols'] = [{ wch: 10 }, { wch: 15 }]; const workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(workbook, instructionSheet, 'Instruksi'); - const kandangName = projectFlockKandangLookup.kandang?.name || 'Kandang'; - const flockName = projectFlockKandangLookup.project_flock?.flock_name || ''; - const flockPeriod = projectFlockKandangLookup.project_flock?.period || 1; - - const sheetName = + const dataSheetName = kandangName.length > 31 ? kandangName.substring(0, 31) : kandangName; - XLSX.utils.book_append_sheet(workbook, worksheet, sheetName); + XLSX.utils.book_append_sheet(workbook, dataWorksheet, dataSheetName); const sanitizedFlockName = flockName .toLowerCase()