feat(FE-316): Add instruction sheet and format data sheet

This commit is contained in:
rstubryan
2025-12-29 19:43:32 +07:00
parent e81c0a3baf
commit 1d27781c02
@@ -8,29 +8,69 @@ export const generateUniformityTemplate = (
projectFlockKandangLookup: ProjectFlockKandangLookup projectFlockKandangLookup: ProjectFlockKandangLookup
) => { ) => {
try { try {
// Calculate 2% sample from total population
const sampleSize = Math.round(availableQuantity * 0.02); 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) => ({ const data = Array.from({ length: sampleSize }, (_, index) => ({
NO: index + 1, NO: index + 1,
BW: '', BW: '',
})); }));
const worksheet = XLSX.utils.json_to_sheet(data, { const dataWorksheet = XLSX.utils.json_to_sheet(data, {
header: ['NO', 'BW'], header: ['NO', 'BW'],
}); });
worksheet['!cols'] = [{ wch: 10 }, { wch: 15 }]; dataWorksheet['!cols'] = [{ wch: 10 }, { wch: 15 }];
const workbook = XLSX.utils.book_new(); const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, instructionSheet, 'Instruksi');
const kandangName = projectFlockKandangLookup.kandang?.name || 'Kandang'; const dataSheetName =
const flockName = projectFlockKandangLookup.project_flock?.flock_name || '';
const flockPeriod = projectFlockKandangLookup.project_flock?.period || 1;
const sheetName =
kandangName.length > 31 ? kandangName.substring(0, 31) : kandangName; 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 const sanitizedFlockName = flockName
.toLowerCase() .toLowerCase()