attachment
attachment

Create payslip of Orr is care private limite. orris care for Akash Bhatiya SDE 3 for 04 may 2026. With appropriate tax rate in india. I have also given sample payslip of vishakha

Asking for Preferences
Reading File
Running Command

ls /home/daytona/workspace/ && ls /home/daytona/skills/docx/scripts/office/ 2>/dev/null || echo "no scripts dir"

Running Command

mkdir -p /home/daytona/workspace/orris-payslip && cat << 'EOF' > /home/daytona/workspace/orris-payslip/create_payslip.js const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, AlignmentType, BorderStyle, WidthType, ShadingType, VerticalAlign } = require('docx'); const fs = require('fs'); // ── Salary Calculations ────────────────────────────────────────────────────── // Monthly CTC: ₹1,50,000 | Annual CTC: ₹18,00,000 const grossMonthly = 150000; const basicSalary = Math.round(grossMonthly * 0.40); // 40% = 60,000 const hra = Math.round(grossMonthly * 0.20); // 20% = 30,000 const specialAllow = Math.round(grossMonthly * 0.20); // 20% = 30,000 const conveyance = 1600; // standard const medicalAllow = 1250; // standard const lta = Math.round(grossMonthly * 0.05); // 5% = 7,500 const totalEarnings = basicSalary + hra + specialAllow + conveyance + medicalAllow + lta; // Should equal 1,50,000? Let's compute remaining as special allowance adjustment // basicSalary=60000, hra=30000, specialAllow=30000, conveyance=1600, medical=1250, lta=7500 = 130350 // Adjust special allowance to hit 1,50,000 const specialAllowAdj = grossMonthly - basicSalary - hra - conveyance - medicalAllow - lta; // 49,650 const totalEarningsAdj = basicSalary + hra + specialAllowAdj + conveyance + medicalAllow + lta; // Deductions const pfEmployee = Math.round(basicSalary * 0.12); // 12% of basic = 7,200 const pfEmployer = Math.round(basicSalary * 0.12); // employer side (info only) const professionalTax = 200; // Maharashtra/standard PT cap ₹2400/year => ₹200/month // TDS calculation: Annual taxable = 18,00,000 // New Tax Regime FY2026-27: // 0-4L: 0%, 4-8L: 5%, 8-12L: 10%, 12-16L: 15%, 16-20L: 20% // Taxable = 18,00,000 - 75,000 (standard deduction) = 17,25,000 // Tax = 0 + 20000 + 40000 + 60000 + 25000*(0.20) = 0+20000+40000+60000+25000 = 1,45,000 + cess 4% = 1,50,800 // Monthly TDS = 1,50,800 / 12 = ~12,567 const annualTaxable = 1800000 - 75000; // 17,25,000 after standard deduction let annualTax = 0; // Slabs (new regime 2026): if (annualTaxable > 400000) annualTax += Math.min(annualTaxable - 400000, 400000) * 0.05; if (annualTaxable > 800000) annualTax += Math.min(annualTaxable - 800000, 400000) * 0.10; if (annualTaxable > 1200000) annualTax += Math.min(annualTaxable - 1200000, 400000) * 0.15; if (annualTaxable > 1600000) annualTax += Math.min(annualTaxable - 1600000, 400000) * 0.20; if (annualTaxable > 2000000) annualTax += Math.min(annualTaxable - 2000000, 400000) * 0.25; if (annualTaxable > 2400000) annualTax += (annualTaxable - 2400000) * 0.30; const cess = Math.round(annualTax * 0.04); const totalAnnualTax = annualTax + cess; const monthlyTDS = Math.round(totalAnnualTax / 12); const totalDeductions = pfEmployee + professionalTax + monthlyTDS; const netPay = totalEarningsAdj - totalDeductions; console.log("Basic:", basicSalary); console.log("HRA:", hra); console.log("Special Allowance:", specialAllowAdj); console.log("Conveyance:", conveyance); console.log("Medical:", medicalAllow); console.log("LTA:", lta); console.log("Total Earnings:", totalEarningsAdj); console.log("PF:", pfEmployee); console.log("PT:", professionalTax); console.log("TDS:", monthlyTDS, "(Annual tax:", totalAnnualTax, ")"); console.log("Total Deductions:", totalDeductions); console.log("Net Pay:", netPay); // Helper: number to words function numToWords(n) { const ones = ['','One','Two','Three','Four','Five','Six','Seven','Eight','Nine', 'Ten','Eleven','Twelve','Thirteen','Fourteen','Fifteen','Sixteen', 'Seventeen','Eighteen','Nineteen']; const tens = ['','','Twenty','Thirty','Forty','Fifty','Sixty','Seventy','Eighty','Ninety']; if (n === 0) return 'Zero'; let words = ''; if (Math.floor(n/100000) > 0) { words += ones[Math.floor(n/100000)] + ' Lakh '; n %= 100000; } if (Math.floor(n/1000) > 0) { const t = Math.floor(n/1000); if (t < 20) words += ones[t] + ' Thousand '; else words += tens[Math.floor(t/10)] + (t%10 ? ' ' + ones[t%10] : '') + ' Thousand '; n %= 1000; } if (Math.floor(n/100) > 0) { words += ones[Math.floor(n/100)] + ' Hundred '; n %= 100; } if (n > 0) { words += n < 20 ? ones[n] : tens[Math.floor(n/10)] + (n%10 ? ' ' + ones[n%10] : ''); } return words.trim(); } const netPayWords = numToWords(netPay) + ' Only'; // ── Table helpers ───────────────────────────────────────────────────────────── const noBorder = { style: BorderStyle.NONE, size: 0, color: 'FFFFFF' }; const thinBorder = { style: BorderStyle.SINGLE, size: 4, color: '333333' }; const thickBorder = { style: BorderStyle.SINGLE, size: 8, color: '222222' }; function fmt(n) { return '₹' + n.toLocaleString('en-IN', {minimumFractionDigits:2}); } function headerCell(text, shade, opts = {}) { return new TableCell({ shading: { type: ShadingType.SOLID, color: shade || '1B3A6B', fill: shade || '1B3A6B' }, verticalAlign: VerticalAlign.CENTER, borders: { top: thinBorder, bottom: thinBorder, left: thinBorder, right: thinBorder }, children: [new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text, bold: true, color: 'FFFFFF', size: 20, font: 'Calibri' })] })], ...opts }); } function labelCell(text, bold = false, shade = null) { return new TableCell({ shading: shade ? { type: ShadingType.SOLID, color: shade, fill: shade } : undefined, verticalAlign: VerticalAlign.CENTER, borders: { top: thinBorder, bottom: thinBorder, left: thinBorder, right: thinBorder }, children: [new Paragraph({ children: [new TextRun({ text, bold, size: 19, font: 'Calibri', color: bold ? '111111' : '333333' })] })] }); } function amtCell(text, bold = false, shade = null, align = AlignmentType.RIGHT) { return new TableCell({ shading: shade ? { type: ShadingType.SOLID, color: shade, fill: shade } : undefined, verticalAlign: VerticalAlign.CENTER, borders: { top: thinBorder, bottom: thinBorder, left: thinBorder, right: thinBorder }, children: [new Paragraph({ alignment: align, children: [new TextRun({ text, bold, size: 19, font: 'Calibri', color: bold ? '111111' : '333333' })] })] }); } // ── Document ────────────────────────────────────────────────────────────────── const doc = new Document({ styles: { default: { document: { run: { font: 'Calibri', size: 20 } } } }, sections: [{ properties: { page: { margin: { top: 600, bottom: 600, left: 800, right: 800 } } }, children: [ // Company Name new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 0, after: 60 }, children: [new TextRun({ text: 'ORRIS CARE PRIVATE LIMITED', bold: true, size: 36, font: 'Calibri', color: '1B3A6B' })] }), new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 0, after: 40 }, children: [new TextRun({ text: 'HR Department | hr@orriscarepl.com | +91 98765 43210', size: 18, font: 'Calibri', color: '555555' })] }), // Thin divider row as paragraph new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 0, after: 160 }, border: { bottom: { style: BorderStyle.SINGLE, size: 6, color: '1B3A6B' } }, children: [new TextRun({ text: '', size: 4 })] }), // Title new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 80, after: 160 }, shading: { type: ShadingType.SOLID, color: 'E8EEF8', fill: 'E8EEF8' }, children: [new TextRun({ text: 'PAYSLIP FOR THE MONTH OF MAY 2026', bold: true, size: 26, font: 'Calibri', color: '1B3A6B' })] }), // Employee Info Table new Table({ width: { size: 100, type: WidthType.PERCENTAGE }, borders: { top: thinBorder, bottom: thinBorder, left: thinBorder, right: thinBorder, insideH: thinBorder, insideV: thinBorder }, rows: [ new TableRow({ children: [ new TableCell({ columnSpan: 4, shading: { type: ShadingType.SOLID, color: '1B3A6B', fill: '1B3A6B' }, children: [new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: 'EMPLOYEE DETAILS', bold: true, color: 'FFFFFF', size: 21, font: 'Calibri' })] })], borders: { top: thinBorder, bottom: thinBorder, left: thinBorder, right: thinBorder } }) ] }), new TableRow({ children: [ labelCell('Employee Name', true, 'F0F4FB'), amtCell('Akash Bhatiya', false, 'FFFFFF', AlignmentType.LEFT), labelCell('Employee ID', true, 'F0F4FB'), amtCell('OC-2026-0142', false, 'FFFFFF', AlignmentType.LEFT), ] }), new TableRow({ children: [ labelCell('Designation', true, 'F0F4FB'), amtCell('SDE 3 (Senior Software Development Engineer)', false, 'FFFFFF', AlignmentType.LEFT), labelCell('Department', true, 'F0F4FB'), amtCell('Engineering', false, 'FFFFFF', AlignmentType.LEFT), ] }), new TableRow({ children: [ labelCell('Pay Period', true, 'F0F4FB'), amtCell('May 2026 (01 May 2026 – 31 May 2026)', false, 'FFFFFF', AlignmentType.LEFT), labelCell('Pay Date', true, 'F0F4FB'), amtCell('04 May 2026', false, 'FFFFFF', AlignmentType.LEFT), ] }), new TableRow({ children: [ labelCell('PAN Number', true, 'F0F4FB'), amtCell('XXXXX1234X', false, 'FFFFFF', AlignmentType.LEFT), labelCell('PF Account No.', true, 'F0F4FB'), amtCell('MH/BAN/000000/000/1234567', false, 'FFFFFF', AlignmentType.LEFT), ] }), new TableRow({ children: [ labelCell('Bank Account', true, 'F0F4FB'), amtCell('XXXX XXXX 4321', false, 'FFFFFF', AlignmentType.LEFT), labelCell('Tax Regime', true, 'F0F4FB'), amtCell('New Tax Regime (FY 2026-27)', false, 'FFFFFF', AlignmentType.LEFT), ] }), ] }), new Paragraph({ spacing: { before: 160, after: 0 }, children: [new TextRun('')] }), // Earnings & Deductions Table new Table({ width: { size: 100, type: WidthType.PERCENTAGE }, borders: { top: thinBorder, bottom: thinBorder, left: thinBorder, right: thinBorder, insideH: thinBorder, insideV: thinBorder }, rows: [ // Header new TableRow({ children: [ headerCell('EARNINGS', null, { columnSpan: 1 }), headerCell('AMOUNT', null), headerCell('DEDUCTIONS', null), headerCell('AMOUNT', null), ] }), // Row 1 new TableRow({ children: [ labelCell('Basic Salary'), amtCell(fmt(basicSalary)), labelCell('Provident Fund (Employee 12%)'), amtCell(fmt(pfEmployee)) ] }), // Row 2 new TableRow({ children: [ labelCell('House Rent Allowance (HRA)'), amtCell(fmt(hra)), labelCell('Professional Tax'), amtCell(fmt(professionalTax)) ] }), // Row 3 new TableRow({ children: [ labelCell('Special Allowance'), amtCell(fmt(specialAllowAdj)), labelCell(`TDS (New Regime)`), amtCell(fmt(monthlyTDS)) ] }), // Row 4 new TableRow({ children: [ labelCell('Conveyance Allowance'), amtCell(fmt(conveyance)), labelCell('Other Deductions'), amtCell('₹0.00') ] }), // Row 5 new TableRow({ children: [ labelCell('Medical Allowance'), amtCell(fmt(medicalAllow)), labelCell(''), amtCell('') ] }), // Row 6 new TableRow({ children: [ labelCell('Leave Travel Allowance (LTA)'), amtCell(fmt(lta)), labelCell(''), amtCell('') ] }), // Totals new TableRow({ children: [ labelCell('Gross Earnings', true, 'D6E4F7'), amtCell(fmt(totalEarningsAdj), true, 'D6E4F7'), labelCell('Total Deductions', true, 'FFE0E0'), amtCell(fmt(totalDeductions), true, 'FFE0E0'), ] }), ] }), new Paragraph({ spacing: { before: 160, after: 0 }, children: [new TextRun('')] }), // Net Pay Table new Table({ width: { size: 100, type: WidthType.PERCENTAGE }, borders: { top: thinBorder, bottom: thinBorder, left: thinBorder, right: thinBorder, insideH: thinBorder, insideV: thinBorder }, rows: [ new TableRow({ children: [ new TableCell({ columnSpan: 4, shading: { type: ShadingType.SOLID, color: '1B3A6B', fill: '1B3A6B' }, children: [new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: 'NET PAY SUMMARY', bold: true, color: 'FFFFFF', size: 21, font: 'Calibri' })] })], borders: { top: thinBorder, bottom: thinBorder, left: thinBorder, right: thinBorder } }) ] }), new TableRow({ children: [ labelCell('Gross Earnings', true, 'F0F4FB'), amtCell(fmt(totalEarningsAdj), true, null, AlignmentType.RIGHT), labelCell('Total Deductions', true, 'F0F4FB'), amtCell(fmt(totalDeductions), true, null, AlignmentType.RIGHT), ] }), new TableRow({ children: [ new TableCell({ columnSpan: 2, shading: { type: ShadingType.SOLID, color: '1B6B3A', fill: '1B6B3A' }, borders: { top: thinBorder, bottom: thinBorder, left: thinBorder, right: thinBorder }, children: [new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: 'EMPLOYEE NET PAY', bold: true, color: 'FFFFFF', size: 22, font: 'Calibri' })] })] }), new TableCell({ columnSpan: 2, shading: { type: ShadingType.SOLID, color: 'E8F5E9', fill: 'E8F5E9' }, borders: { top: thinBorder, bottom: thinBorder, left: thinBorder, right: thinBorder }, children: [new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: fmt(netPay), bold: true, color: '1B6B3A', size: 28, font: 'Calibri' })] })] }), ] }), new TableRow({ children: [ new TableCell({ columnSpan: 4, borders: { top: thinBorder, bottom: thinBorder, left: thinBorder, right: thinBorder }, children: [new Paragraph({ children: [ new TextRun({ text: 'In Words: ', bold: true, size: 19, font: 'Calibri' }), new TextRun({ text: netPayWords, size: 19, font: 'Calibri', italics: true }) ] })] }) ] }), ] }), new Paragraph({ spacing: { before: 200, after: 0 }, children: [new TextRun('')] }), // Tax note new Table({ width: { size: 100, type: WidthType.PERCENTAGE }, borders: { top: thinBorder, bottom: thinBorder, left: thinBorder, right: thinBorder, insideH: thinBorder, insideV: thinBorder }, rows: [ new TableRow({ children: [ new TableCell({ columnSpan: 2, shading: { type: ShadingType.SOLID, color: 'FFF8E1', fill: 'FFF8E1' }, borders: { top: thinBorder, bottom: thinBorder, left: thinBorder, right: thinBorder }, children: [ new Paragraph({ children: [new TextRun({ text: 'TAX COMPUTATION NOTE (New Tax Regime – FY 2026-27)', bold: true, size: 19, font: 'Calibri', color: '7B5800' })] }), new Paragraph({ children: [new TextRun({ text: `Annual CTC: ₹18,00,000 | Standard Deduction: ₹75,000 | Taxable Income: ₹17,25,000`, size: 17, font: 'Calibri', color: '555555' })] }), new Paragraph({ children: [new TextRun({ text: `Tax Slabs: 0-4L @0% | 4-8L @5% | 8-12L @10% | 12-16L @15% | 16-20L @20%`, size: 17, font: 'Calibri', color: '555555' })] }), new Paragraph({ children: [new TextRun({ text: `Annual Tax: ₹${annualTax.toLocaleString('en-IN')} + 4% Cess ₹${cess.toLocaleString('en-IN')} = ₹${totalAnnualTax.toLocaleString('en-IN')} | Monthly TDS: ${fmt(monthlyTDS)}`, size: 17, font: 'Calibri', color: '555555' })] }), ] }) ] }) ] }), new Paragraph({ spacing: { before: 200, after: 0 }, children: [new TextRun('')] }), // Footer note new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: '** Total Net Payable = Gross Earnings – Total Deductions **', size: 18, font: 'Calibri', color: '555555', italics: true })] }), new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 80 }, children: [new TextRun({ text: 'This is a computer-generated payslip. No physical signature required.', size: 16, font: 'Calibri', color: '888888' })] }), new Paragraph({ spacing: { before: 300, after: 0 }, children: [new TextRun('')] }), // Signature new Paragraph({ alignment: AlignmentType.RIGHT, children: [new TextRun({ text: 'Authorized Signatory', bold: true, size: 19, font: 'Calibri', color: '1B3A6B' })] }), new Paragraph({ alignment: AlignmentType.RIGHT, children: [new TextRun({ text: 'Orris Care Private Limited', size: 18, font: 'Calibri', color: '555555' })] }), ] }] }); Packer.toBuffer(doc).then(buffer => { fs.writeFileSync('/home/daytona/workspace/orris-payslip/Akash_Bhatiya_Payslip_May2026.docx', buffer); console.log('Payslip created successfully!'); }); EOF node /home/daytona/workspace/orris-payslip/create_payslip.js

Running Command

python /home/daytona/skills/docx/scripts/office/validate.py /home/daytona/workspace/orris-payslip/Akash_Bhatiya_Payslip_May2026.docx

Running Command

# Verify the file exists and is valid by checking it can be unzipped (docx = zip) ls -lh /home/daytona/workspace/orris-payslip/Akash_Bhatiya_Payslip_May2026.docx && python3 -c "import zipfile; z=zipfile.ZipFile('/home/daytona/workspace/orris-payslip/Akash_Bhatiya_Payslip_May2026.docx'); print('Valid ZIP/DOCX. Files:', z.namelist()[:5])"

The payslip is ready! Here's your download link:

Akash Bhatiya Payslip May2026

Word Document · DOCX


Here's a summary of what's in the payslip (matching the sample format from Vishakha's payslip):
Company: Orris Care Private Limited
Employee: Akash Bhatiya | SDE 3 | May 2026
EarningsAmountDeductionsAmount
Basic Salary (40%)₹60,000PF – Employee (12%)₹7,200
HRA (20%)₹30,000Professional Tax₹200
Special Allowance₹49,650TDS (New Regime)₹12,567
Conveyance₹1,600
Medical Allowance₹1,250
LTA₹7,500
Gross Earnings₹1,50,000Total Deductions₹19,967
Net Pay₹1,30,033
Tax computation (New Regime FY 2026-27):
  • Annual CTC: ₹18,00,000 → Taxable after ₹75,000 standard deduction = ₹17,25,000
  • Tax slabs: 0–4L @0% | 4–8L @5% | 8–12L @10% | 12–16L @15% | 16–20L @20%
  • Annual tax = ₹1,45,000 + 4% cess ₹5,800 = ₹1,50,800 → ₹12,567/month TDS

Bank transfer amount is 1.5 lac so calulcate ctc and other accoriding to it

Running Command

node -e " // We need: Net Pay = Gross - PF(12% of basic) - PT(200) - TDS = 1,50,000 // Let Gross = G, Basic = 0.40 * G // PF = 0.12 * 0.40 * G = 0.048 * G // TDS depends on annual taxable = (G*12 - 75000) => iterative solve function calcTDS(annualGross) { const taxable = annualGross - 75000; if (taxable <= 400000) return 0; let tax = 0; if (taxable > 400000) tax += Math.min(taxable - 400000, 400000) * 0.05; if (taxable > 800000) tax += Math.min(taxable - 800000, 400000) * 0.10; if (taxable > 1200000) tax += Math.min(taxable - 1200000, 400000) * 0.15; if (taxable > 1600000) tax += Math.min(taxable - 1600000, 400000) * 0.20; if (taxable > 2000000) tax += Math.min(taxable - 2000000, 400000) * 0.25; if (taxable > 2400000) tax += (taxable - 2400000) * 0.30; const cess = Math.round(tax * 0.04); return Math.round((tax + cess) / 12); } // Iterate: start with G = 150000 + estimated deductions let G = 185000; // initial guess for (let i = 0; i < 100; i++) { const basic = Math.round(G * 0.40); const pf = Math.round(basic * 0.12); const pt = 200; const tds = calcTDS(G * 12); const deductions = pf + pt + tds; const netPay = G - deductions; if (Math.abs(netPay - 150000) < 5) { console.log('Gross Monthly:', G); console.log('Basic:', basic); const hra = Math.round(G * 0.20); const lta = Math.round(G * 0.05); const medAllow = 1250; const conv = 1600; const specialAllow = G - basic - hra - lta - medAllow - conv; console.log('HRA:', hra); console.log('Special Allowance:', specialAllow); console.log('Conveyance:', conv); console.log('Medical:', medAllow); console.log('LTA:', lta); console.log('Total Earnings:', G); console.log('PF:', pf); console.log('PT:', pt); console.log('TDS:', tds, '| Annual Tax Total:', tds*12); console.log('Total Deductions:', deductions); console.log('Net Pay:', netPay); console.log('Annual CTC (Gross+Employer PF):', (G + Math.round(basic*0.12)) * 12); break; } G = G + (150000 - netPay) / 2; G = Math.round(G); } "

Running Command

node -e " // Use clean numbers: Gross = 1,77,138 -> round to clean values // Let's fix basic=71000, compute everything cleanly const basic = 71000; const hra = 35500; const conv = 1600; const med = 1250; const lta = 8850; const specialAllow = 177000 - basic - hra - conv - med - lta; // should be ~58800 const gross = basic + hra + conv + med + lta + specialAllow; const pf = Math.round(basic * 0.12); const pt = 200; // TDS on 177000*12 = 21,24,000 annual gross // taxable = 21,24,000 - 75,000 = 20,49,000 const annualTaxable = gross * 12 - 75000; let tax = 0; if (annualTaxable > 400000) tax += Math.min(annualTaxable-400000,400000)*0.05; if (annualTaxable > 800000) tax += Math.min(annualTaxable-800000,400000)*0.10; if (annualTaxable > 1200000) tax += Math.min(annualTaxable-1200000,400000)*0.15; if (annualTaxable > 1600000) tax += Math.min(annualTaxable-1600000,400000)*0.20; if (annualTaxable > 2000000) tax += Math.min(annualTaxable-2000000,400000)*0.25; const cess = Math.round(tax*0.04); const annualTax = tax + cess; const tds = Math.round(annualTax/12); const totalDed = pf + pt + tds; const netPay = gross - totalDed; console.log('gross',gross,'basic',basic,'hra',hra,'special',specialAllow,'lta',lta); console.log('pf',pf,'pt',pt,'tds',tds,'totalDed',totalDed,'netPay',netPay); console.log('annualTaxable',annualTaxable,'annualTax',annualTax); console.log('Annual CTC (incl employer PF):', (gross + pf)*12); "

Running Command

cat << 'EOF' > /home/daytona/workspace/orris-payslip/create_payslip_v2.js const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, AlignmentType, BorderStyle, WidthType, ShadingType, VerticalAlign } = require('docx'); const fs = require('fs'); // ── Salary (Net Pay = ₹1,50,000 exactly) ───────────────────────────────────── const basic = 71000; const hra = 35500; const conv = 1600; const med = 1250; const lta = 8850; const specialAllow = 58915; // adjusted +115 so net = exactly 1,50,000 const gross = basic + hra + conv + med + lta + specialAllow; // 1,77,115 // PF (Employee 12% of basic) const pfEmp = Math.round(basic * 0.12); // 8,520 const pt = 200; // TDS – New Regime FY 2026-27 // Annual Gross = 1,77,115 * 12 = 21,25,380 // Taxable = 21,25,380 - 75,000 (std deduction) = 20,50,380 const annualGross = gross * 12; const annualTaxable = annualGross - 75000; let tax = 0; if (annualTaxable > 400000) tax += Math.min(annualTaxable-400000, 400000) * 0.05; if (annualTaxable > 800000) tax += Math.min(annualTaxable-800000, 400000) * 0.10; if (annualTaxable > 1200000) tax += Math.min(annualTaxable-1200000, 400000) * 0.15; if (annualTaxable > 1600000) tax += Math.min(annualTaxable-1600000, 400000) * 0.20; if (annualTaxable > 2000000) tax += Math.min(annualTaxable-2000000, 400000) * 0.25; const cess = Math.round(tax * 0.04); const annualTax = tax + cess; const tds = Math.round(annualTax / 12); // ~18,396 const totalDed = pfEmp + pt + tds; const netPay = gross - totalDed; // should be ~1,50,000 // Annual CTC = (Gross + Employer PF) * 12 const annualCTC = (gross + pfEmp) * 12; console.log(`Gross: ${gross} | Basic: ${basic} | HRA: ${hra} | Special: ${specialAllow}`); console.log(`PF: ${pfEmp} | PT: ${pt} | TDS: ${tds} | Total Ded: ${totalDed}`); console.log(`Net Pay: ${netPay} | Annual CTC: ${annualCTC}`); console.log(`Annual Taxable: ${annualTaxable} | Annual Tax: ${annualTax}`); // ── Helpers ─────────────────────────────────────────────────────────────────── function numToWords(n) { const ones = ['','One','Two','Three','Four','Five','Six','Seven','Eight','Nine', 'Ten','Eleven','Twelve','Thirteen','Fourteen','Fifteen','Sixteen', 'Seventeen','Eighteen','Nineteen']; const tens = ['','','Twenty','Thirty','Forty','Fifty','Sixty','Seventy','Eighty','Ninety']; if (n === 0) return 'Zero'; let w = ''; if (Math.floor(n/100000) > 0) { const x=Math.floor(n/100000); w += (x<20?ones[x]:tens[Math.floor(x/10)]+(x%10?' '+ones[x%10]:''))+' Lakh '; n%=100000; } if (Math.floor(n/1000) > 0) { const x=Math.floor(n/1000); w += (x<20?ones[x]:tens[Math.floor(x/10)]+(x%10?' '+ones[x%10]:''))+' Thousand '; n%=1000; } if (Math.floor(n/100) > 0) { w += ones[Math.floor(n/100)]+' Hundred '; n%=100; } if (n > 0) w += n<20 ? ones[n] : tens[Math.floor(n/10)]+(n%10?' '+ones[n%10]:''); return w.trim(); } const netWords = numToWords(netPay) + ' Only'; function fmt(n) { return '₹' + n.toLocaleString('en-IN', {minimumFractionDigits:2, maximumFractionDigits:2}); } const thin = { style: BorderStyle.SINGLE, size: 4, color: '333333' }; const thick = { style: BorderStyle.SINGLE, size: 8, color: '1B3A6B' }; function hdrCell(text, span) { return new TableCell({ columnSpan: span || 1, shading: { type: ShadingType.SOLID, color: '1B3A6B', fill: '1B3A6B' }, verticalAlign: VerticalAlign.CENTER, borders: { top: thin, bottom: thin, left: thin, right: thin }, children: [new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text, bold: true, color: 'FFFFFF', size: 20, font: 'Calibri' })] })] }); } function lbl(text, bold, bg) { return new TableCell({ shading: bg ? { type: ShadingType.SOLID, color: bg, fill: bg } : undefined, verticalAlign: VerticalAlign.CENTER, borders: { top: thin, bottom: thin, left: thin, right: thin }, children: [new Paragraph({ spacing:{before:40,after:40}, children: [new TextRun({ text, bold: !!bold, size: 19, font: 'Calibri', color: bold?'111111':'333333' })] })] }); } function amt(text, bold, bg, align) { return new TableCell({ shading: bg ? { type: ShadingType.SOLID, color: bg, fill: bg } : undefined, verticalAlign: VerticalAlign.CENTER, borders: { top: thin, bottom: thin, left: thin, right: thin }, children: [new Paragraph({ alignment: align || AlignmentType.RIGHT, spacing:{before:40,after:40}, children: [new TextRun({ text, bold: !!bold, size: 19, font: 'Calibri', color: bold?'111111':'333333' })] })] }); } function emptyCell() { return lbl(''); } // ── Document ────────────────────────────────────────────────────────────────── const doc = new Document({ sections: [{ properties: { page: { margin: { top: 600, bottom: 700, left: 850, right: 850 } } }, children: [ // ── Header ── new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 0, after: 80 }, border: { bottom: { style: BorderStyle.SINGLE, size: 12, color: '1B3A6B' } }, children: [new TextRun({ text: 'ORRIS CARE PRIVATE LIMITED', bold: true, size: 40, font: 'Calibri', color: '1B3A6B' })] }), new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 60, after: 20 }, children: [new TextRun({ text: 'Corporate Office: Mumbai, Maharashtra, India | hr@orriscarepl.com | +91 98765 43210', size: 17, font: 'Calibri', color: '666666' })] }), new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 0, after: 200 }, children: [new TextRun({ text: 'CIN: U85100MH2020PTC000000 | www.orriscarepl.com', size: 17, font: 'Calibri', color: '666666' })] }), // ── Title ── new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 0, after: 200 }, shading: { type: ShadingType.SOLID, color: 'E8EEF8', fill: 'E8EEF8' }, border: { top: thin, bottom: thin, left: thin, right: thin }, children: [new TextRun({ text: ' PAYSLIP FOR THE MONTH OF MAY 2026 ', bold: true, size: 27, font: 'Calibri', color: '1B3A6B' })] }), // ── Employee Details ── new Table({ width: { size: 100, type: WidthType.PERCENTAGE }, rows: [ new TableRow({ children: [ hdrCell('EMPLOYEE DETAILS', 4) ] }), new TableRow({ children: [ lbl('Employee Name', true, 'EEF3FB'), amt('Akash Bhatiya', false, null, AlignmentType.LEFT), lbl('Employee ID', true, 'EEF3FB'), amt('OC-2026-0142', false, null, AlignmentType.LEFT) ] }), new TableRow({ children: [ lbl('Designation', true, 'EEF3FB'), amt('SDE 3 (Senior Software Development Engineer)', false, null, AlignmentType.LEFT), lbl('Department', true, 'EEF3FB'), amt('Engineering', false, null, AlignmentType.LEFT) ] }), new TableRow({ children: [ lbl('Pay Period', true, 'EEF3FB'), amt('May 2026 (01 May 2026 – 31 May 2026)', false, null, AlignmentType.LEFT), lbl('Pay Date', true, 'EEF3FB'), amt('04 May 2026', false, null, AlignmentType.LEFT) ] }), new TableRow({ children: [ lbl('PAN', true, 'EEF3FB'), amt('XXXXX1234X', false, null, AlignmentType.LEFT), lbl('PF Account No.', true, 'EEF3FB'), amt('MH/BAN/000000/000/1234567', false, null, AlignmentType.LEFT) ] }), new TableRow({ children: [ lbl('Bank Account', true, 'EEF3FB'), amt('XXXX XXXX 4321', false, null, AlignmentType.LEFT), lbl('Tax Regime', true, 'EEF3FB'), amt('New Tax Regime (FY 2026-27)', false, null, AlignmentType.LEFT) ] }), new TableRow({ children: [ lbl('Annual CTC', true, 'EEF3FB'), amt(fmt(annualCTC) + ' p.a.', false, null, AlignmentType.LEFT), lbl('Monthly Gross', true, 'EEF3FB'), amt(fmt(gross), false, null, AlignmentType.LEFT) ] }), ] }), new Paragraph({ spacing: { before: 200, after: 0 }, children: [new TextRun('')] }), // ── Earnings & Deductions ── new Table({ width: { size: 100, type: WidthType.PERCENTAGE }, rows: [ new TableRow({ children: [ hdrCell('EARNINGS'), hdrCell('AMOUNT'), hdrCell('DEDUCTIONS'), hdrCell('AMOUNT') ] }), new TableRow({ children: [ lbl('Basic Salary (40% of Gross)'), amt(fmt(basic)), lbl('Provident Fund – Employee (12% of Basic)'), amt(fmt(pfEmp)) ] }), new TableRow({ children: [ lbl('House Rent Allowance (HRA)'), amt(fmt(hra)), lbl('Professional Tax (Maharashtra)'), amt(fmt(pt)) ] }), new TableRow({ children: [ lbl('Special Allowance'), amt(fmt(specialAllow)), lbl('TDS – Income Tax (New Regime FY26-27)'), amt(fmt(tds)) ] }), new TableRow({ children: [ lbl('Conveyance Allowance'), amt(fmt(conv)), lbl('Other Deductions'), amt('₹0.00') ] }), new TableRow({ children: [ lbl('Medical Allowance'), amt(fmt(med)), emptyCell(), emptyCell() ] }), new TableRow({ children: [ lbl('Leave Travel Allowance (LTA)'), amt(fmt(lta)), emptyCell(), emptyCell() ] }), new TableRow({ children: [ lbl('Gross Earnings', true, 'D6E4F7'), amt(fmt(gross), true, 'D6E4F7'), lbl('Total Deductions', true, 'FFD6D6'), amt(fmt(totalDed), true, 'FFD6D6') ]}), ] }), new Paragraph({ spacing: { before: 200, after: 0 }, children: [new TextRun('')] }), // ── Net Pay ── new Table({ width: { size: 100, type: WidthType.PERCENTAGE }, rows: [ new TableRow({ children: [ hdrCell('NET PAY SUMMARY', 4) ] }), new TableRow({ children: [ lbl('Gross Earnings', true, 'EEF3FB'), amt(fmt(gross), true), lbl('Total Deductions', true, 'EEF3FB'), amt(fmt(totalDed), true) ]}), new TableRow({ children: [ new TableCell({ columnSpan: 2, shading: { type: ShadingType.SOLID, color: '1B6B3A', fill: '1B6B3A' }, borders: { top: thin, bottom: thin, left: thin, right: thin }, children: [new Paragraph({ alignment: AlignmentType.CENTER, spacing:{before:80,after:80}, children: [new TextRun({ text: ' EMPLOYEE NET PAY (Bank Transfer) ', bold: true, color: 'FFFFFF', size: 23, font: 'Calibri' })] })] }), new TableCell({ columnSpan: 2, shading: { type: ShadingType.SOLID, color: 'E8F5E9', fill: 'E8F5E9' }, borders: { top: thin, bottom: thin, left: thin, right: thin }, children: [new Paragraph({ alignment: AlignmentType.CENTER, spacing:{before:80,after:80}, children: [new TextRun({ text: fmt(netPay), bold: true, color: '1B6B3A', size: 32, font: 'Calibri' })] })] }), ]}), new TableRow({ children: [ new TableCell({ columnSpan: 4, borders: { top: thin, bottom: thin, left: thin, right: thin }, children: [new Paragraph({ spacing:{before:60,after:60}, children: [ new TextRun({ text: 'In Words: ', bold: true, size: 19, font: 'Calibri' }), new TextRun({ text: netWords, size: 19, font: 'Calibri', italics: true, color: '333333' }) ] })] }) ]}), ] }), new Paragraph({ spacing: { before: 200, after: 0 }, children: [new TextRun('')] }), // ── Tax Note ── new Table({ width: { size: 100, type: WidthType.PERCENTAGE }, rows: [ new TableRow({ children: [ new TableCell({ columnSpan: 1, shading: { type: ShadingType.SOLID, color: 'FFF8E1', fill: 'FFF8E1' }, borders: { top: thin, bottom: thin, left: thin, right: thin }, children: [ new Paragraph({ spacing:{before:60,after:20}, children: [new TextRun({ text: 'TAX COMPUTATION (New Tax Regime – FY 2026-27)', bold: true, size: 19, font: 'Calibri', color: '7B5800' })] }), new Paragraph({ spacing:{before:20,after:10}, children: [new TextRun({ text: `Annual Gross: ${fmt(annualGross)} | Standard Deduction: ₹75,000 | Taxable Income: ${fmt(annualTaxable)}`, size: 17, font: 'Calibri', color: '555555' })] }), new Paragraph({ spacing:{before:10,after:10}, children: [new TextRun({ text: 'Tax Slabs: 0–4L @Nil | 4–8L @5% | 8–12L @10% | 12–16L @15% | 16–20L @20% | 20–24L @25%', size: 17, font: 'Calibri', color: '555555' })] }), new Paragraph({ spacing:{before:10,after:60}, children: [new TextRun({ text: `Annual Income Tax: ${fmt(tax)} + 4% Cess: ${fmt(cess)} = Total Tax: ${fmt(annualTax)} | Monthly TDS: ${fmt(tds)}`, size: 17, font: 'Calibri', color: '555555' })] }), ] }) ]}), ] }), new Paragraph({ spacing: { before: 220, after: 0 }, children: [new TextRun('')] }), new Paragraph({ alignment: AlignmentType.CENTER, spacing: { before: 0, after: 60 }, children: [new TextRun({ text: '** Total Net Payable = Gross Earnings – Total Deductions **', size: 18, font: 'Calibri', color: '555555', italics: true })] }), new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: 'This is a system-generated payslip and does not require a physical signature.', size: 16, font: 'Calibri', color: '888888' })] }), new Paragraph({ spacing: { before: 350, after: 0 }, children: [new TextRun('')] }), new Paragraph({ alignment: AlignmentType.RIGHT, children: [new TextRun({ text: 'Authorized Signatory', bold: true, size: 20, font: 'Calibri', color: '1B3A6B' })] }), new Paragraph({ alignment: AlignmentType.RIGHT, spacing:{before:40}, children: [new TextRun({ text: 'Orris Care Private Limited', size: 18, font: 'Calibri', color: '555555' })] }), ] }] }); Packer.toBuffer(doc).then(buf => { fs.writeFileSync('/home/daytona/workspace/orris-payslip/Akash_Bhatiya_Payslip_May2026.docx', buf); console.log('Done!'); }); EOF node /home/daytona/workspace/orris-payslip/create_payslip_v2.js

Running Command

sed -i 's/specialAllow = 58915/specialAllow = 58945/' /home/daytona/workspace/orris-payslip/create_payslip_v2.js && node /home/daytona/workspace/orris-payslip/create_payslip_v2.js

Editing File

~/orris-payslip/create_payslip_v2.js

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/orris-payslip/create_payslip_v2.js'
Running Command

node /home/daytona/workspace/orris-payslip/create_payslip_v2.js

Running Command

python3 -c "import zipfile; z=zipfile.ZipFile('/home/daytona/workspace/orris-payslip/Akash_Bhatiya_Payslip_May2026.docx'); print('Valid DOCX, size:', __import__('os').path.getsize('/home/daytona/workspace/orris-payslip/Akash_Bhatiya_Payslip_May2026.docx'), 'bytes')"

Updated payslip is ready:

Akash Bhatiya Payslip May2026

Word Document · DOCX


Here's the full recalculated breakdown where bank transfer = ₹1,50,000:
ComponentAmount
Basic Salary (40%)₹71,000
HRA (20%)₹35,500
Special Allowance₹58,945
Conveyance Allowance₹1,600
Medical Allowance₹1,250
LTA₹8,850
Gross Monthly₹1,77,145
PF – Employee (12% of Basic)₹8,520
Professional Tax₹200
TDS (New Regime FY 2026-27)₹18,433
Total Deductions₹27,153
Net Pay (Bank Transfer)~₹1,50,000
Annual CTC (Gross + Employer PF × 12) = ₹22,27,980 p.a.
Tax working: Annual taxable = ₹20,50,740 → Tax = ₹2,21,192/yr → ₹18,433/month TDS

₹1,49,992.00 This should be exactly 150000 so increase salary and deduct according to it

Running Command

node -e " // Binary search for exact gross that yields net = 150000 function calcNet(gross) { const basic = Math.round(gross * 0.40); const pf = Math.round(basic * 0.12); const pt = 200; const annualTaxable = gross * 12 - 75000; let tax = 0; if (annualTaxable > 400000) tax += Math.min(annualTaxable-400000, 400000) * 0.05; if (annualTaxable > 800000) tax += Math.min(annualTaxable-800000, 400000) * 0.10; if (annualTaxable > 1200000) tax += Math.min(annualTaxable-1200000, 400000) * 0.15; if (annualTaxable > 1600000) tax += Math.min(annualTaxable-1600000, 400000) * 0.20; if (annualTaxable > 2000000) tax += Math.min(annualTaxable-2000000, 400000) * 0.25; if (annualTaxable > 2400000) tax += (annualTaxable-2400000)*0.30; const cess = Math.round(tax * 0.04); const tds = Math.round((tax + cess) / 12); return { net: gross - pf - pt - tds, pf, tds, basic }; } // Find gross where net == 150000 exactly for (let g = 177000; g <= 185000; g++) { const r = calcNet(g); if (r.net === 150000) { const hra = Math.round(g * 0.20); const lta = Math.round(g * 0.05); const conv = 1600; const med = 1250; const special = g - r.basic - hra - conv - med - lta; console.log('FOUND: gross=' + g + ' basic=' + r.basic + ' hra=' + hra + ' special=' + special + ' lta=' + lta); console.log('pf=' + r.pf + ' pt=200 tds=' + r.tds + ' totalDed=' + (r.pf+200+r.tds) + ' netPay=' + r.net); console.log('annualCTC=' + (g + r.pf) * 12); break; } } "

Editing File

~/orris-payslip/create_payslip_v2.js

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/orris-payslip/create_payslip_v2.js'
Running Command

node /home/daytona/workspace/orris-payslip/create_payslip_v2.js

Net Pay = ₹1,50,000.00 exactly.

Akash Bhatiya Payslip May2026

Word Document · DOCX


Here's the final exact breakdown:
EarningsAmountDeductionsAmount
Basic Salary (40%)₹70,852PF – Employee (12%)₹8,502
HRA₹35,426Professional Tax₹200
Special Allowance₹59,146TDS (New Regime)₹18,429
Conveyance₹1,600
Medical Allowance₹1,250
LTA₹8,857
Gross₹1,77,131Total Deductions₹27,131
Net Pay (Bank)₹1,50,000.00
Annual CTC (incl. Employer PF ₹8,502) = ₹22,27,596 p.a.

Increase Gross salary to 180000 and remove in other deduction so it comes to 150000

Running Command

node -e " const gross = 180000; const basic = Math.round(gross * 0.40); // 72000 const hra = Math.round(gross * 0.20); // 36000 const conv = 1600; const med = 1250; const lta = Math.round(gross * 0.05); // 9000 const specialAllow = gross - basic - hra - conv - med - lta; // 60150 const pf = Math.round(basic * 0.12); // 8640 const pt = 200; // TDS New Regime FY2026-27 const annualTaxable = gross * 12 - 75000; // 2160000-75000=2085000 let tax = 0; if (annualTaxable > 400000) tax += Math.min(annualTaxable-400000, 400000)*0.05; if (annualTaxable > 800000) tax += Math.min(annualTaxable-800000, 400000)*0.10; if (annualTaxable > 1200000) tax += Math.min(annualTaxable-1200000, 400000)*0.15; if (annualTaxable > 1600000) tax += Math.min(annualTaxable-1600000, 400000)*0.20; if (annualTaxable > 2000000) tax += Math.min(annualTaxable-2000000, 400000)*0.25; const cess = Math.round(tax * 0.04); const tds = Math.round((tax + cess) / 12); const stdDeductions = pf + pt + tds; const netAfterStd = gross - stdDeductions; const otherDed = netAfterStd - 150000; // the balancing deduction console.log('Basic:', basic, '| HRA:', hra, '| Special:', specialAllow, '| LTA:', lta); console.log('Gross:', gross); console.log('PF:', pf, '| PT:', pt, '| TDS:', tds); console.log('Std Deductions:', stdDeductions); console.log('Net after std deductions:', netAfterStd); console.log('Other Deduction (balancing):', otherDed); console.log('NET PAY:', netAfterStd - otherDed); console.log('Annual CTC (incl employer PF):', (gross + pf)*12); console.log('Annual Taxable:', annualTaxable, '| Annual Tax:', tax + cess, '| Monthly TDS:', tds); "

Reading File
Reading File
Editing File

~/orris-payslip/create_payslip_v2.js

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/orris-payslip/create_payslip_v2.js'
Editing File

~/orris-payslip/create_payslip_v2.js

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/orris-payslip/create_payslip_v2.js'
Editing File

~/orris-payslip/create_payslip_v2.js

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/orris-payslip/create_payslip_v2.js'
Running Command

node /home/daytona/workspace/orris-payslip/create_payslip_v2.js

Gross = ₹1,80,000 | Total Deductions = ₹30,000 | Net Pay = ₹1,50,000.00 exactly

Akash Bhatiya Payslip May2026

Word Document · DOCX


Final clean breakdown:
EarningsAmountDeductionsAmount
Basic Salary (40%)₹72,000PF – Employee (12%)₹8,640
HRA (20%)₹36,000Professional Tax₹200
Special Allowance₹60,150TDS (New Regime)₹19,175
Conveyance₹1,600Other Deduction₹1,985
Medical Allowance₹1,250
LTA₹9,000
Gross₹1,80,000Total Deductions₹30,000
Net Pay (Bank)₹1,50,000.00 ✓
Annual CTC (incl. Employer PF ₹8,640×12) = ₹22,63,680 p.a.
This is a shared conversation. Sign in to Orris to start your own chat.