crmleaf / compliance-calendar
Month-by-month due dates for PF, ESI, TDS, GST, PT and Form 16.
Requires
- php: ^8.2
- crmleaf/payroll-core: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.58
- orchestra/testbench: ^8.0 || ^9.0 || ^10.0
- phpstan/phpstan: ^1.11 || ^2.0
- phpunit/phpunit: ^10.5 || ^11.0
Suggests
- crmleaf/laravel-payroll: Installs the whole CRMLeaf payroll suite behind one config file, one Blade namespace and one optional JSON API.
- illuminate/support: Only needed for the Laravel service provider, routes and Blade component. The calculator itself is framework-agnostic.
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.