crmleaf/compliance-calendar

Month-by-month due dates for PF, ESI, TDS, GST, PT and Form 16.

Maintainers

Package info

github.com/CrmLeaf/compliance-calendar

Homepage

Issues

pkg:composer/crmleaf/compliance-calendar

Transparency log

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

v1.0.0 2026-08-14 11:04 UTC

This package is not auto-updated.

Last update: 2026-08-15 09:39:08 UTC


README

Month-by-month due dates for PF, ESI, TDS, GST, PT and Form 16.

Expands the statutory recurrence rules into dated obligations for a financial year, so a 2019-20 calendar is generated by the same code as a 2026-27 one rather than typed out by hand.

One of the CRMLeaf payroll tools. The arithmetic and the dated statutory rate tables live in crmleaf/payroll-core; this package is the thin skin that makes one calculator installable, mountable and embeddable on its own.

Note

A wrong figure or an out-of-date rate is almost always a payroll-core matter, since that is where the tables live. Anything about this tool's routes, views or browser asset belongs here.

Install

Composer - Laravel auto-discovers the service provider, so this is the whole setup:

composer require crmleaf/compliance-calendar

npm - the same calculation, re-exported from @crmleaf/payroll-js so you can install this one tool and nothing else:

npm install @crmleaf/compliance-calendar

Note

Not on npm yet. The script-tag route below needs no registry and works today. Installing this package straight from git will not resolve @crmleaf/payroll-js, which is not published yet either.

A plain script tag - no build step, no bundler, no server. Build the browser bundle once and serve the file yourself:

<script src="/js/payroll.min.js"></script>
<script>
const result = CrmleafPayroll.complianceCalendar({ financialYear: "2025-26" });
console.log(result.explain);
</script>

payroll.min.js is the single-file browser build. Get it by running npm run build in @crmleaf/payroll-js and copying dist/payroll.min.js into whatever your site serves as static assets.

A hosted CDN build is coming soon, which will reduce this to a single URL. Serving the file yourself works today and keeps working afterwards - it is the only option that needs no third-party request, so plenty of projects will want to stay on it.

See it working first

demo/index.html in this repository is a working copy of Compliance Calendar in one file: the form, the calculation and the working, with no build step and no server. Drop payroll.min.js beside it and open it from disk.

cp /path/to/payroll-js/dist/payroll.min.js demo/
open demo/index.html

Nothing on that page reaches the network, which is the point: it is a calculator people paste salary figures into.

Use it

Plain PHP, no framework and no container:

use Crmleaf\Payroll\Calculators\ComplianceCalendar;
use Crmleaf\Payroll\Money;

$result = (new ComplianceCalendar())->forFinancialYear(
    financialYear: '2025-26',
);

echo $result->explain();      // the formula with the real operands in it
echo $result->workings();     // every step, one per line, with its citation
print_r($result->toArray());  // snake_case, ready for JSON

Laravel - resolve it from the container, or type-hint it anywhere:

use Crmleaf\Payroll\Calculators\ComplianceCalendar;

public function show(ComplianceCalendar $calculator)
{
    return $calculator->forFinancialYear(
        financialYear: '2025-26',
    )->toArray();
}

Blade - one component, no controller:

<x-crmleaf::compliance-calendar />

HTTP - off by default. Publish the config and turn the route on:

php artisan vendor:publish --tag=compliance-calendar-config
// config/compliance-calendar.php
'route' => ['enabled' => true, 'prefix' => 'tools'],
curl -X POST https://example.test/tools/compliance-calendar \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -d '{"financial_year":"2025-26"}'

The JSON response carries the figures, the working and the statutory citations:

{
  "tool": "compliance-calendar",
  "data": { "…": "every figure, snake_case, with a *_formatted twin" },
  "explain": "the formula with the real operands substituted",
  "working": [{ "label": "", "amount": 0, "formula": "", "citation": "" }],
  "citations": [""]
}

JavaScript:

import { complianceCalendar } from '@crmleaf/compliance-calendar';

const result = complianceCalendar({ financialYear: "2025-26" });

Inputs

Field Type Required Default Notes
financial_year string Yes "2025-26" Written as 2025-26, not 2025-2026.
only array or JSON No - Codes to keep, for example PF_ECR or TDS_PAY. Leave empty for the full calendar.
qrmp boolean No false Swaps the monthly GST obligations for their quarterly variants.
as_of date (YYYY-MM-DD) No -

Optional fields you leave out are omitted from the call entirely, so the calculator's own documented defaults apply.

Every figure here rests on a statutory rate, so the call takes as_of. Set it and the calculation runs on the rates in force on that date, which is what makes a prior year recomputable rather than merely rememberable.

Statutory basis

EPF Scheme 1952 para 38; ESI (General) Regulations 1950 regulation 31; Income-tax Rules 1962 rules 30, 31A and 31; CGST Rules 2017; the professional tax and labour welfare fund enactments of each state.

Rates are data, not code: they live in dated tables with a cited source in crmleaf/payroll-core, so a rate change is a new dated entry rather than an edit to a constant.

Important

This package implements our reading of the applicable statutes and is provided without warranty. It is a calculation library, not tax advice. Verify against your own compliance obligations before relying on the output for statutory filing.

Publishing

Tag Publishes
compliance-calendar-config config/compliance-calendar.php
compliance-calendar-views resources/views/vendor/compliance-calendar
compliance-calendar-assets public/vendor/compliance-calendar

Licence

MIT © CRMLeaf. Use it commercially, embed it, fork it.