Psyduck - 可達鴨 之 鴨力山大 v0.1

Current Path : home/irplbiz/node_application/icl_calc/routes/
Upload File :
Current File : /home/irplbiz/node_application/icl_calc/routes/calculateV2.js

const XLSX = require('xlsx');
const XlsxPopulate = require('xlsx-calc');
const path = require('path');
const fs = require('fs');
const express = require('express');
const router = express.Router();

const filePath = path.join(__dirname, '../excel/ICL_Calculator.xlsx');
const outputPath = path.join(__dirname, '../excel/ICL_Calculator_UPDATED.xlsx');


// Load workbook
const workbook = XLSX.readFile(filePath, { cellFormula: true });

// Get worksheet
const sheet = workbook.Sheets['Final Sheet'];
// Write data to specific cells
function setCell(cell, value) {
  sheet[cell] = { t: typeof value === 'number' ? 'n' : 's', v: value };
}

function updateSheet({
  beltDesignation,
  beltWidth,
  rollLengthFeet,
  rollLengthMeters,
  topCover,
  bottomCover
}) {
  let finalRollLength = rollLengthFeet || (rollLengthMeters ? rollLengthMeters / 0.3048 : 0);

  // Assuming A4, B4, C4, F4, G4 as target cells for row 4
  setCell('A4', parseInt(beltDesignation) || 0);
  setCell('B4', parseInt(beltWidth) || 0);
  setCell('C4', parseInt(finalRollLength) || 0);
  setCell('F4', parseFloat(topCover) || 0);
  setCell('G4', parseFloat(bottomCover) || 0);
}


// Add TRUNC support
XlsxPopulate.set_fx('TRUNC', (args) => {
  const number = args[0];
  const precision = args[1] ?? 0;
  const factor = Math.pow(10, precision);
  return Math.trunc(number * factor) / factor;
})
// Save updated workbook

XlsxPopulate.set_fx('INT', (args) => {
  const number = args[0];
  //if (isNaN(number)) return 0; 
  return Math.floor(number);
});
XlsxPopulate.set_fx('ROUNDUP', (args) => {
  const number = Number(args[0]);
  const digits = Number(args[1]) || 0;
  if (isNaN(number)) return 0;  // fallback to avoid NaN
  const factor = Math.pow(10, digits);
  return Math.ceil(number * factor) / factor;
});
router.post('/', async (req, res) => {
  try {
    const {
      beltDesignation,
      beltWidth,
      rollLengthFeet,
      rollLengthMeters,
      topCover,
      bottomCover
    } = req.body;
console.log({
      beltDesignation,
      beltWidth,
      rollLengthFeet,
      rollLengthMeters,
      topCover,
      bottomCover
    } );

    
    await updateSheet({
          beltDesignation ,
          beltWidth ,
          rollLengthFeet ,
          rollLengthMeters,
          topCover ,
          bottomCover
        })

      // Calculate formulas
      XlsxPopulate(workbook);
      // Read calculated values from AE4 and AN4
      const rollsPer20ftContainer = sheet['AE4']?.w;
      const rollsPer40ftContainer = sheet['AN4']?.w;
      console.log(sheet['AE4']);
      XLSX.writeFile(workbook, outputPath);
    return res.json({
      rollsPer20ftContainer,
      rollsPer40ftContainer
    });
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: 'Calculation failed.' });
  }
});

module.exports = router;