iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more
Calculate PF, ESI and professional tax as three different statutory rules, not as one payroll deduction. PF uses provident-fund wages (normally basic pay plus applicable dearness allowance), employee and employer rates, and an effective-dated EPFO ceiling. ESI applies only to covered employees and uses ESI wages, a configured wage ceiling, 3.25% employer and 0.75% employee shares, plus an exemption from the employee share when average daily wages are up to ₹176. Professional tax comes from the employee’s state or local authority, so its slabs, exemptions and periodicity must be configured by jurisdiction.
The safest implementation uses Decimal arithmetic, versioned rules, explicit rounding and a component-level audit trail. The PF ceiling announced for mandatory coverage changes from ₹15,000 to ₹25,000 per month effective 17 September 2026; treat that as an effective-dated rule and verify the operative Gazette notification and EPFO implementation circular before deploying it.
| # | Preview | Product | Price | |
|---|---|---|---|---|
| 1 |
|
Payroll Accounting: 2013 Edition | $13.59 | Buy on Amazon |
| 2 |
|
Payroll Accounting 2014 | $6.52 | Buy on Amazon |
| 3 |
|
Payroll Accounting 2009 | $40.00 | Buy on Amazon |
| 4 |
|
Payroll Accounting 2010 (with Computerized Payroll Accounting Software CD-ROM) | $47.08 | Buy on Amazon |
What PF, ESI and professional tax each calculate
These deductions are often displayed together on a payslip, but they have different authorities, eligibility tests, wage definitions and filing outputs. A payroll engine should calculate them in separate modules and combine the results only when producing the payslip and payroll journal.
| Item | Authority and purpose | Who is covered | Wage basis and ceiling | Employee share | Employer share | Operational output |
|---|---|---|---|---|---|---|
| PF (EPF and allied components) | Employees’ Provident Fund Organisation; retirement and linked social-security savings | Employees of covered establishments, subject to enrolment, wage and statutory conditions | Configured PF wages, usually basic pay plus applicable dearness allowance; mandatory-coverage ceiling is ₹15,000 before 17 September 2026 and ₹25,000 from that effective date under the announced change, subject to operative rules | Often 12% of applicable PF wages; retain the rate in configuration | A Haryana government release describes 13% against the applicable ceiling; split between employer components such as provident fund, pension and administration must be configured | Monthly ECR, challan, payment and reconciliation records |
| ESI | Employees’ State Insurance Corporation; medical and cash social-insurance benefits | Covered employees during the applicable contribution period | ESI wages capped by the active notification; ESIC payroll material uses ₹21,000 per month, but the engine must source the current ceiling from the governing notification | 0.75%; employee share is exempt when average daily wages are up to ₹176 | 3.25% | Online contribution record, payment reference and period reconciliation |
| Professional tax | State or municipal authority; a local tax on professions, trades and employment | Employees or other taxpayers according to the jurisdiction’s law | Local slab, salary definition, periodicity and any annual maximum; no single nationwide table | Amount prescribed by the local slab | Usually withheld and remitted by the employer when the employer is the collecting person; employer-paid treatment has separate income-tax consequences | Jurisdiction-specific return, payment and deduction evidence |
The Income Tax Department treats professional tax as a salary deduction and explains how an employer-paid amount is handled. That treatment does not turn professional tax into a national payroll rate: the underlying slab still comes from the relevant state or local notification.
#1 Best Overall
How PF is calculated from basic salary
Choose the PF wage base
Do not feed gross salary blindly into a PF formula. Store each component and mark whether the applicable PF rule includes it. Basic pay and dearness allowance are the principal inputs in many implementations; other allowances may be included or excluded depending on the statutory interpretation, establishment practice and a valid higher-wage arrangement. The engine should therefore receive a resolved pf_wages value together with the components that produced it.
Apply coverage, enrolment and the ceiling
First evaluate establishment coverage and the employee’s enrolment status. An employee earning above the ceiling is not automatically outside PF: coverage, joining status and any permitted higher-wage joint option remain explicit inputs. For a rule that caps contributions, use the lower of PF wages and the rule ceiling. For a rule or approved option that uses actual higher wages, do not silently cap the amount.
The announced 2026 change must be represented as two rule versions:
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
- For contribution dates before 17 September 2026, retain the ₹15,000 monthly mandatory-coverage ceiling where that rule applies.
- From 17 September 2026, use ₹25,000 or actual salary/wages, whichever is lower, subject to the applicable statutory provisions and scheme rules.
The Cabinet and Press Information Bureau said the change was expected to bring more than 51 lakh additional employees into mandatory EPFO coverage. That is a policy estimate, not a reason to enroll every person without checking the operative notification, establishment coverage and employee status.
Calculate employee and employer shares
For a simple configured rule, the formulas are:
- Employee PF = rounded(applicable PF wages × employee rate).
- Employer PF package = rounded(applicable PF wages × employer rate), then allocate that package to the pension, provident-fund and administrative components required by the current scheme rules.
A Haryana government release describes a 12% employee contribution and a 13% employer contribution against the applicable ceiling. Keep both rates and every employer sub-component in the rule table rather than assuming those percentages apply identically to every establishment or component.
PF examples across the 2026 effective date
Assume monthly basic pay plus applicable dearness allowance is ₹30,000, the employee is covered, the rule caps wages, and the configured rates are 12% employee and 13% employer. These examples show the effective-date mechanics; they do not replace the contribution split required for the establishment.
| Contribution date | Rule ceiling | PF wages used | Employee at 12% | Employer at 13% |
|---|---|---|---|---|
| 16 September 2026 or earlier | ₹15,000 | ₹15,000 | ₹1,800 | ₹1,950 |
| 17 September 2026 or later | ₹25,000 | ₹25,000 | ₹3,000 | ₹3,250 |
If actual PF wages are ₹12,000, the applicable wage base is ₹12,000 under either ceiling, so the effective-date change does not increase that employee’s capped base. If the employee has a valid higher-wage option, pass that option into the rule evaluation instead of forcing the ceiling.
Rank #2
PF calculation in Python
from dataclasses import dataclass
from decimal import Decimal, ROUND_HALF_UP
D = Decimal
def money(value: Decimal) -> Decimal:
return value.quantize(D("0.01"), rounding=ROUND_HALF_UP)
@dataclass(frozen=True)
class PFRule:
rule_id: str
effective_from: str
ceiling: Decimal
cap_to_ceiling: bool
employee_rate: Decimal
employer_rate: Decimal
def calculate_pf(employee, rule: PFRule):
if not employee["covered"]:
return {
"rule_id": rule.rule_id,
"wages": D("0.00"),
"employee": D("0.00"),
"employer": D("0.00"),
"status": "not_covered",
}
wages = D(str(employee["pf_wages"]))
if rule.cap_to_ceiling:
wages = min(wages, rule.ceiling)
employee_share = money(wages * rule.employee_rate)
employer_share = money(wages * rule.employer_rate)
return {
"rule_id": rule.rule_id,
"wages": wages,
"employee": employee_share,
"employer": employer_share,
"status": "calculated",
}
Use a date lookup to select the pre-17-September or post-17-September rule before calling this function. In production, return the EPS allocation, employer administrative component, higher-wage option decision and source reference as separate fields so an ECR adapter can construct the required filing data.
How to calculate ESI in Python
Check coverage and the contribution period
ESI is calculated only for a covered employee and the relevant contribution period. The engine should evaluate the employee’s insurance coverage, joining and exit dates, wage period and any rule that keeps coverage active for the remainder of a contribution period. Do not infer ESI eligibility solely from whether PF is present; the schemes have different tests.
Use ESI wages and the active ceiling
Resolve ESI wages from the components recognized by the active ESIC rule. ESIC payroll material uses a ₹21,000 monthly wage ceiling. Because that figure is tied to particular ESIC material, store it as configuration and obtain the active ceiling from the current notification before production use. For a capped rule, covered wages are the lower of ESI wages and that ceiling.
Apply the 3.25% and 0.75% shares
ESIC guidance states that the contribution rate is 4% of wages: 3.25% is the employer’s share and 0.75% is the employee’s share. The employee share is exempt when average daily wages are up to ₹176. Calculate the average daily wage using the period and day-count convention required by the active rule; do not substitute a monthly wage divided by an arbitrary number of days.
Recommended Free Tools
The principal employer initially pays both shares. The employer may recover the employee share through the payroll deduction for the relevant wage period. Record the amount recovered separately from the employer liability so the ledger and the ESIC filing reconcile.
ESI examples
Assume capped ESI wages of ₹18,000 for a contribution period. At an average daily wage of ₹600, the employee share is ₹135 (₹18,000 × 0.75%) and the employer share is ₹585 (₹18,000 × 3.25%). At an average daily wage of ₹170, the employee share is ₹0 because it is at or below ₹176, while the employer share remains ₹585. The exemption changes only the employee share; it does not remove the employer contribution.
ESI calculation in Python
from decimal import Decimal, ROUND_HALF_UP
D = Decimal
def money(value: Decimal) -> Decimal:
return value.quantize(D("0.01"), rounding=ROUND_HALF_UP)
def calculate_esi(employee, rule):
if not employee["covered"]:
return {
"rule_id": rule["rule_id"],
"wages": D("0.00"),
"employee": D("0.00"),
"employer": D("0.00"),
"status": "not_covered",
}
esi_wages = D(str(employee["esi_wages"]))
ceiling = D(str(rule["ceiling"]))
covered_wages = min(esi_wages, ceiling)
average_daily_wage = D(str(employee["average_daily_wage"]))
if average_daily_wage <= D("176"):
employee_share = D("0.00")
else:
employee_share = money(covered_wages * D("0.0075"))
employer_share = money(covered_wages * D("0.0325"))
return {
"rule_id": rule["rule_id"],
"wages": covered_wages,
"employee": employee_share,
"employer": employer_share,
"status": "calculated",
}
Keep the ₹176 threshold in the rule record, even though it is supplied by current ESIC guidance, so a later notification can be introduced without changing historical payslips.
Rank #3
How to calculate professional tax
Why there is no single Indian professional-tax formula
Professional tax is jurisdiction-specific. A payroll engine cannot safely hard-code one national rate or assume that a slab from one state applies in another. The authority may prescribe monthly, quarterly or other periodic slabs, an annual maximum, salary components to include, exemptions, disability or age concessions, and separate rules for particular employee categories.
Free tools Windows power users keep installed
One-click scans. No signup required.
What to store in a professional-tax rule
- State, municipality or other local jurisdiction identifier.
- Rule ID, notification reference and effective-from and effective-to dates.
- Taxable salary components and exclusions.
- Periodic slabs and the amount for each slab.
- Annual maximum where the local law imposes one.
- Exemptions and concessions, including disability or age conditions.
- Payment frequency, return type and due-date calendar.
At payroll close, return both the deduction and the rule identifier. That lets an auditor prove which slab was used after a jurisdiction changes its schedule.
Professional-tax calculation pattern
from decimal import Decimal, ROUND_HALF_UP
D = Decimal
def money(value: Decimal) -> Decimal:
return value.quantize(D("0.01"), rounding=ROUND_HALF_UP)
def calculate_professional_tax(employee, slab_table):
taxable_wages = D(str(employee["taxable_period_wages"]))
slab = slab_table.lookup(
jurisdiction=employee["jurisdiction"],
wages=taxable_wages,
effective_date=employee["effective_date"],
periodicity=employee["periodicity"],
attributes=employee.get("attributes", {}),
)
amount = money(D(str(slab.amount)))
return {
"jurisdiction": employee["jurisdiction"],
"rule_id": slab.rule_id,
"deduction": amount,
"periodicity": employee["periodicity"],
}
The lookup must fail closed when no active jurisdictional rule exists. Producing zero because a table is missing is more dangerous than stopping payroll for an explicit configuration error.
Designing an auditable payroll-rule engine
Represent every rule as data
A common rule shape is:
{
"jurisdiction": "IN-PT-EXAMPLE",
"effective_from": "2026-04-01",
"effective_to": null,
"wage_components": ["basic", "dearness_allowance"],
"eligibility_predicate": "employee.is_covered and establishment.is_registered",
"employee_rate": "0.12",
"employer_rate": "0.13",
"ceiling": "25000.00",
"rounding": "half_up_2dp",
"source_reference": "operative notification identifier"
}
Use separate records for PF, ESI and professional tax rather than overloading one schema. PF needs establishment coverage, enrolment, higher-wage option, EPS allocation and employer administrative components. ESI needs contribution-period coverage, average daily wage and the active wage ceiling. Professional tax needs jurisdiction, slab and concession attributes.
Choose the rule before calculating money
- Normalize the employee, establishment, jurisdiction and pay-period dates.
- Resolve wage components into PF wages, ESI wages and professional-tax wages independently.
- Find the rule whose effective interval contains the contribution or deduction date.
- Evaluate eligibility and exemptions.
- Apply ceilings, rates and rounding using
Decimal. - Persist the rule ID, source reference, input components, intermediate wage base and resulting shares.
- Post employee deductions and employer liabilities to separate ledger accounts.
- Generate payslip details and pass normalized records to filing adapters.
Persisting the rule version on each payslip is essential. A later notification must not rewrite a historical result when payroll is rerun for an old period.
Do these 3 things before closing this tab:
1Fix the driver behind crashes, sound loss and screen glitches2Clear out junk files and repair common Windows errors3Scan for outdated or missing drivers - takes under a minuteRound deliberately and only once
Binary floating-point arithmetic can create one-paise differences at boundaries. Parse monetary inputs as strings into Decimal, use a documented mode such as half-up to two decimal places, and define whether rounding occurs per component, per employee or at the filing total. Match the authority’s filing specification and preserve unrounded intermediate values when an audit requires them.
Separate calculation from filing
The calculation service should return a stable result independent of transport. An EPFO adapter can then create monthly ECR and challan data, while an ESIC adapter handles online contribution records and payment. Filing records should include employee count, wage totals, employee and employer totals, challan number, payment date, filing ID, response payload hash and reconciliation status.
Rank #4
- Used Book in Good Condition
Filing and payment operations
EPFO workflow
EPFO employer services support registration, monthly ECR submission and online payment. A practical close process is:
- Freeze the contribution-period payroll after attendance and wage adjustments are approved.
- Export employee-level PF wages and component allocations from the calculation ledger.
- Validate member identifiers, joining and exit dates, NCP or unpaid-leave days and totals.
- Submit the ECR, capture the filing response and generate the challan.
- Pay the challan and store payment date, bank reference and amount.
- Reconcile the challan total to the payroll liability and mark exceptions for correction.
ESIC workflow
ESIC guidance describes online contribution handling and payment within 15 days after the month in which the contribution falls due. Store the applicable period, employee and employer shares, exemption decisions, online submission ID, payment reference and reconciliation result. If an employee share was exempt because average daily wages were at or below ₹176, retain the wage and threshold evidence rather than only storing a zero amount.
Professional-tax workflow
Use the jurisdiction’s own return and payment calendar. The workflow must identify the collecting employer, aggregate deductions by local authority, apply any annual maximum at the prescribed point, submit the return, and retain the acknowledgement. Never aggregate employees from different jurisdictions into one slab calculation merely because they are paid in the same payroll run.
Why a payroll deduction changed
When an employee asks why a deduction changed, compare the current and prior calculation snapshots field by field:
- PF effective date: the 17 September 2026 ceiling transition can increase the capped wage base for an employee previously limited to ₹15,000.
- PF wage components: a basic-pay, dearness-allowance or allowance classification changed.
- PF status: establishment coverage, enrolment or a higher-wage option changed.
- ESI ceiling or wages: the active ESIC ceiling or covered wage components changed.
- ESI average daily wage: the employee moved above or below the ₹176 threshold, changing only the employee share.
- Joining, exit or unpaid leave: the covered days or contribution period changed.
- Professional-tax jurisdiction: a transfer, work-location change or local registration changed the applicable slab.
- Professional-tax effective date: a new slab, exemption or annual maximum became active.
- Rounding: component-level versus total-level rounding changed a small amount.
- Correction or arrear: a retroactive wage adjustment was included in the current period.
Expose these fields in an admin comparison view. Showing only “old deduction” and “new deduction” forces payroll staff to reconstruct the decision manually.
Testing checklist for PF, ESI and professional tax
Automated tests should cover both arithmetic and rule selection:
- PF wages exactly at, one paise below and one paise above ₹15,000.
- PF wages at the ₹25,000 ceiling on 16 and 17 September 2026 to verify the effective-date boundary.
- Actual wages below both ceilings.
- Employees above the ceiling with and without an approved higher-wage option.
- Establishment not covered, employee not enrolled and employee who joins or exits mid-period.
- ESI wages exactly at and above the configured ceiling.
- Average daily wages of ₹176.00, ₹176.01 and a low wage with a partial month.
- ESI employee-share exemption while retaining the employer share.
- Professional-tax slab boundaries, annual maximum and each exemption or concession.
- Mid-period jurisdiction transfer and effective-date changes.
- Unpaid leave, negative arrears, reversals and zero-wage periods.
- Rounding at component and employee totals.
- Idempotent reruns: recalculating the same input and rule version must not duplicate ledger entries or filing records.
- Historical reruns after a new rule is published must continue to use the stored historical rule ID.
Recommended payslip and audit breakdown
Display each scheme separately rather than presenting one “statutory deduction” line. For PF, show PF wage base, employee share, employer package and component allocation. For ESI, show ESI wage base, employee share, employer share and the average-daily-wage exemption decision when applicable. For professional tax, show jurisdiction, taxable-period wages, slab identifier and deduction amount. Keep source reference, effective dates and calculation timestamp in the audit record.
This structure answers the employee’s question, lets payroll reconcile statutory totals, and gives an implementation team enough evidence to reproduce a result without relying on mutable configuration.
Practical implementation sequence
- Build component mapping: maintain a single source of truth for salary components, then map each component independently to PF, ESI and professional-tax wage bases.
- Load versioned rules: include effective dates, ceilings, rates, exemptions, rounding and source references; load both sides of the PF 2026 transition.
- Resolve employee status: evaluate establishment coverage, enrolment, ESI coverage, jurisdiction, joining and exit dates, and approved options before arithmetic.
- Calculate with Decimal: cap wages where the rule requires it, apply the correct rate, round according to policy and preserve intermediate values.
- Produce an audit object: include inputs, rule IDs, wage bases, exemptions, shares and ledger postings.
- Reconcile and file: compare employee-level totals with EPFO ECR, ESIC contribution and local professional-tax returns before payment.
- Monitor changes: review EPFO, ESIC and state or municipal notifications, then add a new rule version instead of editing an old one.
With this design, the engine can answer “How is PF calculated from basic salary?”, “What is the current PF wage ceiling?”, “How do I calculate ESI in Python?”, “Is ESI deducted from gross salary?” and “How do I calculate professional tax?” from the same reproducible calculation record—while keeping each statutory scheme’s distinct rules intact.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.
The Tool Desk
Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →

