@mudraforge/statutory 2.8.0 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +47 -0
- package/README.md +8 -7
- package/SECURITY.md +2 -2
- package/calculators.d.ts +1 -0
- package/calculators.js +1 -0
- package/docs/CATALOG.md +258 -63
- package/docs/CORPUS_QUALITY.md +12 -7
- package/docs/PROVENANCE.md +1 -1
- package/okf/corporate_ma_restructuring/loss_carryforward_sec79/circulars/cbdt_circular_09_2020_startup_loss_continuity.md +37 -0
- package/okf/corporate_ma_restructuring/loss_carryforward_sec79/forms/section_79_shareholding_continuity_schedule.json +51 -0
- package/okf/corporate_ma_restructuring/loss_carryforward_sec79/section.json +66 -0
- package/okf/corporate_ma_restructuring/slump_sale_50b/circulars/cbdt_notification_68_2021_rule_11uae_fmv.md +1 -1
- package/okf/corporate_ma_restructuring/slump_sale_50b/circulars/cbic_notification_12_2017_going_concern_exemption.md +1 -1
- package/okf/corporate_ma_restructuring/slump_sale_50b/section.json +2 -2
- package/okf/direct_tax/corporate_tax_115baa_115jb/circulars/cbdt_circular_29_2019_concessional_tax_regime.md +35 -0
- package/okf/direct_tax/corporate_tax_115baa_115jb/forms/form_10ic_concessional_tax_election.json +31 -0
- package/okf/direct_tax/corporate_tax_115baa_115jb/section.json +72 -0
- package/okf/direct_tax/special_rates_non_filer_206ab/circulars/cbdt_circular_11_2021_compliance_check.md +1 -1
- package/okf/direct_tax/special_rates_non_filer_206ab/section.json +8 -7
- package/okf/direct_tax/tcs_goods_206c_1h/circulars/finance_act_2025_sunset_memo.md +1 -1
- package/okf/direct_tax/tcs_goods_206c_1h/section.json +3 -3
- package/okf/direct_tax/tds_commission_194h/circulars/finance_act_2024_rate_cut_memo.md +1 -1
- package/okf/direct_tax/tds_commission_194h/section.json +6 -6
- package/okf/direct_tax/tds_contractor_194c/circulars/cbdt_circular_23_2017_gst_unbundling.md +1 -1
- package/okf/direct_tax/tds_contractor_194c/section.json +6 -6
- package/okf/direct_tax/tds_goods_194q/circulars/cbdt_circular_13_2021_guidelines.md +1 -1
- package/okf/direct_tax/tds_goods_194q/circulars/cbdt_circular_23_2017_gst_unbundling.md +1 -1
- package/okf/direct_tax/tds_goods_194q/section.json +3 -3
- package/okf/direct_tax/tds_goods_393/section.json +3 -3
- package/okf/direct_tax/tds_perquisites_194r/circulars/cbdt_circular_12_2022_perquisites.md +1 -1
- package/okf/direct_tax/tds_perquisites_194r/section.json +4 -4
- package/okf/direct_tax/tds_rent_194i/circulars/cbdt_circular_23_2017_gst_unbundling.md +1 -1
- package/okf/direct_tax/tds_rent_194i/section.json +6 -6
- package/okf/direct_tax/tds_services_194j/circulars/cbdt_circular_03_2020_fts_rate_cut.md +1 -1
- package/okf/direct_tax/tds_services_194j/section.json +3 -3
- package/okf/indirect_tax_gst/blocked_itc_17_5/circulars/cbic_circular_172_2022_employer_obligations.md +1 -1
- package/okf/indirect_tax_gst/blocked_itc_17_5/section.json +4 -4
- package/okf/indirect_tax_gst/composite_mixed_supplies_sec8/circulars/cbic_circular_47_2018_composite_mixed_supplies.md +1 -1
- package/okf/indirect_tax_gst/composite_mixed_supplies_sec8/section.json +3 -3
- package/okf/indirect_tax_gst/composition_levy_sec10/circulars/cbic_notification_14_2019_composition.md +1 -1
- package/okf/indirect_tax_gst/composition_levy_sec10/section.json +2 -2
- package/okf/indirect_tax_gst/credit_debit_notes_sec34/circulars/cbic_circular_137_2020_credit_notes.md +1 -1
- package/okf/indirect_tax_gst/credit_debit_notes_sec34/section.json +2 -2
- package/okf/indirect_tax_gst/e_invoicing_rule48_4/circulars/cbic_notification_10_2023_einvoicing.md +1 -1
- package/okf/indirect_tax_gst/e_invoicing_rule48_4/section.json +2 -2
- package/okf/indirect_tax_gst/export_services_lut_sec16/circulars/cbic_circular_161_2021_intermediary_clarification.md +37 -0
- package/okf/indirect_tax_gst/export_services_lut_sec16/forms/lut_form_gst_rfnd_11_declaration.json +58 -0
- package/okf/indirect_tax_gst/export_services_lut_sec16/section.json +66 -0
- package/okf/indirect_tax_gst/gst_tds_sec51/circulars/cbic_notification_50_2018_gst_tds.md +1 -1
- package/okf/indirect_tax_gst/gst_tds_sec51/section.json +6 -6
- package/okf/indirect_tax_gst/itc_eligibility_16_2/circulars/cbic_circular_170_2022_itc_reporting.md +1 -1
- package/okf/indirect_tax_gst/itc_eligibility_16_2/section.json +4 -4
- package/okf/indirect_tax_gst/rcm_liability_sec9_3/circulars/cbic_circular_102_2019_rcm_clarifications.md +1 -1
- package/okf/indirect_tax_gst/rcm_liability_sec9_3/section.json +3 -3
- package/okf/international_tax/cross_border_remittance_195/circulars/cbdt_circular_03_2022_form10f_electronic.md +1 -1
- package/okf/international_tax/cross_border_remittance_195/circulars/supreme_court_engineering_analysis_doctrine.md +1 -1
- package/okf/international_tax/cross_border_remittance_195/section.json +3 -3
- package/okf/international_tax/foreign_exchange_indas_21_109/circulars/mca_indas_21_foreign_exchange_rates.md +39 -0
- package/okf/international_tax/foreign_exchange_indas_21_109/forms/indas_109_cash_flow_hedge_reserve_schedule.json +45 -0
- package/okf/international_tax/foreign_exchange_indas_21_109/section.json +63 -0
- package/okf/international_tax/transfer_pricing_alp_92c/circulars/cbdt_notification_86_2015_range_concept_rule_10ca.md +54 -0
- package/okf/international_tax/transfer_pricing_alp_92c/forms/form_3ceb_transfer_pricing_report.json +67 -0
- package/okf/international_tax/transfer_pricing_alp_92c/section.json +72 -0
- package/okf/manifest.json +81 -56
- package/okf/msme_commercial/delayed_payments_15_16/circulars/msme_om_2021_trader_exclusion.md +1 -1
- package/okf/msme_commercial/delayed_payments_15_16/forms/schedule_iii_msme_disclosure.md +1 -1
- package/okf/msme_commercial/delayed_payments_15_16/section.json +5 -5
- package/okf/msme_commercial/enterprise_classification_sec7/circulars/msme_notification_2119_e_composite_criteria.md +1 -1
- package/okf/msme_commercial/enterprise_classification_sec7/section.json +2 -2
- package/okf/msme_commercial/mca_msme_1_filing/circulars/mca_order_2019_specified_companies.md +1 -1
- package/okf/msme_commercial/mca_msme_1_filing/section.json +2 -2
- package/okf/msme_commercial/statutory_disclosures_sec22/circulars/icai_guidance_note_schedule_iii_trade_payables.md +1 -1
- package/okf/msme_commercial/statutory_disclosures_sec22/section.json +3 -3
- package/okf.publication.json +1 -1
- package/package.json +31 -1
- package/src/calculators.js +780 -0
- package/src/index.js +146 -35
- package/types/index.d.ts +14 -0
package/src/index.js
CHANGED
|
@@ -12,19 +12,32 @@ import fs from 'node:fs';
|
|
|
12
12
|
import path from 'node:path';
|
|
13
13
|
import os from 'node:os';
|
|
14
14
|
import crypto from 'node:crypto';
|
|
15
|
+
import dns from 'node:dns';
|
|
15
16
|
import { fileURLToPath } from 'node:url';
|
|
17
|
+
import {
|
|
18
|
+
roundToPaisa,
|
|
19
|
+
roundSection288B,
|
|
20
|
+
calculateCorporateTaxMatVsConcessional,
|
|
21
|
+
evaluatePlaceOfSupplyAndLut,
|
|
22
|
+
calculateTransferPricingAlp,
|
|
23
|
+
evaluateSection79LossContinuity,
|
|
24
|
+
revalueForeignExchangeIndAs109
|
|
25
|
+
} from './calculators.js';
|
|
16
26
|
|
|
17
27
|
const __filename = fileURLToPath(import.meta.url);
|
|
18
28
|
const __dirname = path.dirname(__filename);
|
|
19
29
|
export const DEFAULT_LOCAL_OKF_DIR = path.resolve(__dirname, '..', 'okf');
|
|
20
30
|
export const DEFAULT_BASE_URL = 'https://api.mudraforge.in';
|
|
21
|
-
export const STATUTORY_CLIENT_VERSION = '2.
|
|
31
|
+
export const STATUTORY_CLIENT_VERSION = '2.9.0';
|
|
22
32
|
|
|
23
33
|
/**
|
|
24
34
|
* Pinned official release Merkle root digests.
|
|
25
35
|
* Prevents unauthorized bundle substitution attacks even if an attacker controls the remote endpoint.
|
|
26
36
|
*/
|
|
27
37
|
export const PINNED_RELEASE_ROOTS = new Set([
|
|
38
|
+
'sha256-4bbe36c3db841b833dd2bebbd6c1c5ed735498e7b20d1221c323ceb211529fe0', // v2.9.0 Corporate Finance 5 Domains Merkle Root (29 Sections across 5 Domains)
|
|
39
|
+
'sha256-3fb34bdcd34eec794b1f8e6abb2c0e0e87664746ec2f50ad2599c34bf57565b3', // v2.8.1 Finance Act, 2025 Section 206AB Sunset Root (24 Sections across 5 Domains)
|
|
40
|
+
'sha256-239641de2bef05917673f693f9ba4d14bd5e137d64554fba5db87e426bc13e14', // v2.8.0 Deep Semantic Citation Merkle Root (24 Sections across 5 Domains)
|
|
28
41
|
'sha256-6953ce79b63bb2a5809dc928178b4631f08448aa2dcde107dde10f84890bf5cb', // v2.7.0 Edge Sync Bundle Root (24 Sections across 5 Domains)
|
|
29
42
|
'sha256-ce88c2255df1c30c15bfe184c8117336ebc302c2ac5ef25e96a6957402ae11ae', // v2.6.0 Verified Citation Merkle Root (24 Sections across 5 Domains - 100% Complete AP)
|
|
30
43
|
'sha256-3f25fc3941d29de5b8befc0ddb24d1bb2632067f00b200680cf784961616424c', // v2.5.0 Verified Citation Merkle Root (18 Sections across 5 Domains)
|
|
@@ -1513,17 +1526,24 @@ export class StatutoryClient {
|
|
|
1513
1526
|
/**
|
|
1514
1527
|
* @param {Object} [options]
|
|
1515
1528
|
* @param {string} [options.apiKey] Enterprise API key (obtain from hello@mudraforge.in)
|
|
1516
|
-
* @param {'PUBLIC_COMMONS_FREE' | 'ENTERPRISE_PAID'} [options.tier] Client
|
|
1529
|
+
* @param {'PUBLIC_COMMONS_FREE' | 'ENTERPRISE_PAID'} [options.tier] Client-side telemetry tier hint. Note: Edge server authorizes and throttles strictly based on the Bearer token, ignoring client tier claims.
|
|
1517
1530
|
* @param {string} [options.baseUrl] Custom edge base URL
|
|
1518
1531
|
* @param {string} [options.okfDir] Path to local OKF directory
|
|
1519
1532
|
* @param {boolean} [options.offlineFirst=true] Query local filesystem before hitting edge
|
|
1533
|
+
* @param {boolean} [options.preferIpv4=false] Opt-in preference for IPv4 DNS resolution (calls node:dns.setDefaultResultOrder('ipv4first')). Note: In Node.js this operates at process scope to resolve Windows IPv6 Anycast timeouts.
|
|
1520
1534
|
*/
|
|
1521
1535
|
constructor(options = {}) {
|
|
1522
|
-
this.apiKey = options.apiKey || process.env?.MUDRA_STATUTORY_API_KEY || null;
|
|
1536
|
+
this.apiKey = options.apiKey || (typeof process !== 'undefined' ? process.env?.MUDRA_STATUTORY_API_KEY : null) || null;
|
|
1523
1537
|
this.tier = options.tier || (this.apiKey ? 'ENTERPRISE_PAID' : 'PUBLIC_COMMONS_FREE');
|
|
1524
|
-
this.baseUrl = options.baseUrl || process.env?.MUDRA_STATUTORY_BASE_URL || DEFAULT_BASE_URL;
|
|
1538
|
+
this.baseUrl = options.baseUrl || (typeof process !== 'undefined' ? process.env?.MUDRA_STATUTORY_BASE_URL : null) || DEFAULT_BASE_URL;
|
|
1525
1539
|
this.okfDir = options.okfDir || DEFAULT_LOCAL_OKF_DIR;
|
|
1526
1540
|
this.offlineFirst = options.offlineFirst !== false;
|
|
1541
|
+
this.preferIpv4 = options.preferIpv4 === true || (typeof process !== 'undefined' && process.env?.MUDRA_STATUTORY_PREFER_IPV4 === '1');
|
|
1542
|
+
if (this.preferIpv4 && typeof dns?.setDefaultResultOrder === 'function') {
|
|
1543
|
+
try {
|
|
1544
|
+
dns.setDefaultResultOrder('ipv4first');
|
|
1545
|
+
} catch (_) {}
|
|
1546
|
+
}
|
|
1527
1547
|
}
|
|
1528
1548
|
|
|
1529
1549
|
/**
|
|
@@ -1593,18 +1613,38 @@ export class StatutoryClient {
|
|
|
1593
1613
|
assertSecureEndpoint(this.baseUrl);
|
|
1594
1614
|
|
|
1595
1615
|
const url = new URL('/api/v1/statutory/calculate', this.baseUrl);
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1616
|
+
let res;
|
|
1617
|
+
try {
|
|
1618
|
+
res = await fetch(url.toString(), {
|
|
1619
|
+
method: 'POST',
|
|
1620
|
+
headers: {
|
|
1621
|
+
'Content-Type': 'application/json',
|
|
1622
|
+
'Accept': 'application/json',
|
|
1623
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
1624
|
+
'X-Mudra-Tier': this.tier,
|
|
1625
|
+
'User-Agent': `@mudraforge/statutory/${STATUTORY_CLIENT_VERSION} (${this.tier})`
|
|
1626
|
+
},
|
|
1627
|
+
body: JSON.stringify(payload),
|
|
1628
|
+
signal: AbortSignal.timeout(options.timeoutMs || 20000)
|
|
1629
|
+
});
|
|
1630
|
+
} catch (fetchErr) {
|
|
1631
|
+
const isTimeout = fetchErr.name === 'TimeoutError' ||
|
|
1632
|
+
fetchErr.code === 'UND_ERR_CONNECT_TIMEOUT' ||
|
|
1633
|
+
fetchErr.code === 'ETIMEDOUT' ||
|
|
1634
|
+
fetchErr.message?.includes('timeout') ||
|
|
1635
|
+
fetchErr.cause?.code === 'UND_ERR_CONNECT_TIMEOUT';
|
|
1636
|
+
if (isTimeout) {
|
|
1637
|
+
const timeoutErr = new Error(
|
|
1638
|
+
`[@mudraforge/statutory] Connection timeout reaching ${this.baseUrl}.\n` +
|
|
1639
|
+
`Diagnostic advice: On Windows environments, broken or unrouted IPv6 Anycast routing can cause connection timeouts to Cloudflare edge IPs.\n` +
|
|
1640
|
+
`To resolve, enable IPv4-first resolution on the client by passing { preferIpv4: true } to StatutoryClient or setting environment variable MUDRA_STATUTORY_PREFER_IPV4=1.`
|
|
1641
|
+
);
|
|
1642
|
+
timeoutErr.code = 'CONNECTION_TIMEOUT';
|
|
1643
|
+
timeoutErr.cause = fetchErr;
|
|
1644
|
+
throw timeoutErr;
|
|
1645
|
+
}
|
|
1646
|
+
throw fetchErr;
|
|
1647
|
+
}
|
|
1608
1648
|
|
|
1609
1649
|
if (!res.ok) {
|
|
1610
1650
|
const isJson = (res.headers.get('content-type') || '').toLowerCase().includes('application/json');
|
|
@@ -1675,6 +1715,41 @@ export class StatutoryClient {
|
|
|
1675
1715
|
async doctor(options = {}) {
|
|
1676
1716
|
return await runStatutoryDoctor(options);
|
|
1677
1717
|
}
|
|
1718
|
+
|
|
1719
|
+
/**
|
|
1720
|
+
* Evaluate Corporate Tax: Normal MAT (Section 115JB) vs Concessional Regime (Section 115BAA).
|
|
1721
|
+
*/
|
|
1722
|
+
calculateCorporateTaxMatVsConcessional(payload) {
|
|
1723
|
+
return calculateCorporateTaxMatVsConcessional(payload);
|
|
1724
|
+
}
|
|
1725
|
+
|
|
1726
|
+
/**
|
|
1727
|
+
* Evaluate Place of Supply (POS) & Zero-Rated Export of Services under LUT (IGST Sections 10, 12, 13, 16).
|
|
1728
|
+
*/
|
|
1729
|
+
evaluatePlaceOfSupplyAndLut(payload) {
|
|
1730
|
+
return evaluatePlaceOfSupplyAndLut(payload);
|
|
1731
|
+
}
|
|
1732
|
+
|
|
1733
|
+
/**
|
|
1734
|
+
* Compute Transfer Pricing Arm's Length Price (ALP) under Section 92C & Rule 10CA.
|
|
1735
|
+
*/
|
|
1736
|
+
calculateTransferPricingAlp(payload) {
|
|
1737
|
+
return calculateTransferPricingAlp(payload);
|
|
1738
|
+
}
|
|
1739
|
+
|
|
1740
|
+
/**
|
|
1741
|
+
* Evaluate Section 79 Loss Carry-Forward & Shareholding Continuity with unabsorbed depreciation protection.
|
|
1742
|
+
*/
|
|
1743
|
+
evaluateSection79LossContinuity(payload) {
|
|
1744
|
+
return evaluateSection79LossContinuity(payload);
|
|
1745
|
+
}
|
|
1746
|
+
|
|
1747
|
+
/**
|
|
1748
|
+
* Revalue foreign exchange monetary items at closing spot rates under Ind AS 21 and Ind AS 109.
|
|
1749
|
+
*/
|
|
1750
|
+
revalueForeignExchangeIndAs109(payload) {
|
|
1751
|
+
return revalueForeignExchangeIndAs109(payload);
|
|
1752
|
+
}
|
|
1678
1753
|
}
|
|
1679
1754
|
|
|
1680
1755
|
/**
|
|
@@ -2121,8 +2196,9 @@ export const STATUTORY_CROSSWALK_CATALOG = [
|
|
|
2121
2196
|
aliases: ['195', 'sec195', 'section 195', '393(2)', 'foreign remittance tds', 'non resident tds']
|
|
2122
2197
|
},
|
|
2123
2198
|
{
|
|
2124
|
-
id: '
|
|
2199
|
+
id: 'CROSSWALK_206AB_SUNSET',
|
|
2125
2200
|
domain: 'direct_tax',
|
|
2201
|
+
isOmittedSunset: true,
|
|
2126
2202
|
predecessor: {
|
|
2127
2203
|
act: 'Income-tax Act, 1961 (Act No. 43 of 1961)',
|
|
2128
2204
|
sectionCode: '206AB',
|
|
@@ -2135,24 +2211,24 @@ export const STATUTORY_CROSSWALK_CATALOG = [
|
|
|
2135
2211
|
returnForm: 'Form 26Q'
|
|
2136
2212
|
},
|
|
2137
2213
|
successor: {
|
|
2138
|
-
act: '
|
|
2139
|
-
sectionCode: '
|
|
2140
|
-
statutorySection: 'Section
|
|
2141
|
-
title: '
|
|
2142
|
-
effectiveDate: '
|
|
2143
|
-
threshold: '
|
|
2144
|
-
standardRate: '
|
|
2145
|
-
penaltyRate: '
|
|
2146
|
-
challan: '
|
|
2147
|
-
returnForm: '
|
|
2214
|
+
act: 'Finance Act, 2025 (Statutory Sunset & Omission)',
|
|
2215
|
+
sectionCode: '206AB [OMITTED]',
|
|
2216
|
+
statutorySection: 'Section 206AB Omitted',
|
|
2217
|
+
title: 'Formally omitted by Finance Act, 2025 effective 1 April 2025 (No higher rate for non-filers)',
|
|
2218
|
+
effectiveDate: '2025-04-01',
|
|
2219
|
+
threshold: 'N/A (Provision repealed; compliance check utility discontinued)',
|
|
2220
|
+
standardRate: '0.0%',
|
|
2221
|
+
penaltyRate: '0.0%',
|
|
2222
|
+
challan: 'N/A',
|
|
2223
|
+
returnForm: 'N/A'
|
|
2148
2224
|
},
|
|
2149
|
-
transitionCutoffDate: '
|
|
2225
|
+
transitionCutoffDate: '2025-04-01',
|
|
2150
2226
|
savingsAuthority: {
|
|
2151
|
-
statute: '
|
|
2152
|
-
subsidiary: 'General Clauses Act, 1897 Section 6
|
|
2153
|
-
legalPrinciple: '
|
|
2227
|
+
statute: 'Finance Act, 2025 Section 206AB Sunset Clause',
|
|
2228
|
+
subsidiary: 'General Clauses Act, 1897 Section 6',
|
|
2229
|
+
legalPrinciple: 'Deductions on or before 31 March 2025 remain assessable under Section 206AB. Deductions on or after 1 April 2025 attract ZERO non-filer penalty rate; standard statutory rates apply. Higher rates under Section 206AA for invalid/inoperative PAN remain independent and fully active at 20%.'
|
|
2154
2230
|
},
|
|
2155
|
-
aliases: ['206ab', 'sec206ab', 'section 206ab', '
|
|
2231
|
+
aliases: ['206ab', 'sec206ab', 'section 206ab', 'non filer higher tds', '206ab sunset', 'non filer sunset']
|
|
2156
2232
|
},
|
|
2157
2233
|
{
|
|
2158
2234
|
id: 'CROSSWALK_206C_1H_SUNSET',
|
|
@@ -2366,17 +2442,25 @@ export function crosswalkStatute(sectionCode, options = {}) {
|
|
|
2366
2442
|
let isOmitted = Boolean(entry.isOmittedSunset);
|
|
2367
2443
|
|
|
2368
2444
|
if (entry.isOmittedSunset) {
|
|
2369
|
-
// e.g. 206C(1H)
|
|
2445
|
+
// e.g. 206C(1H), 206AB
|
|
2370
2446
|
if (triggerDate < cutoff) {
|
|
2371
2447
|
governingAct = entry.predecessor.act;
|
|
2372
2448
|
applicableSection = entry.predecessor.statutorySection;
|
|
2373
2449
|
temporalStatus = 'GOVERNED_BY_1961_ACT';
|
|
2374
|
-
|
|
2450
|
+
if (entry.predecessor.sectionCode === '206AB') {
|
|
2451
|
+
legalAnalysis = `Trigger event crystallized on ${triggerDate} (prior to 1 April 2025 sunset). Governed by Section 206AB of the Income-tax Act, 1961. Higher withholding rate (twice applicable rate or 5%) applied to non-filer specified persons.`;
|
|
2452
|
+
} else {
|
|
2453
|
+
legalAnalysis = `Trigger event crystallized on ${triggerDate} (prior to 1 April 2025 sunset). Governed by ${entry.predecessor.statutorySection} of the ${entry.predecessor.act}. Seller was obligated to collect 0.1% TCS on receipts exceeding ₹50 Lakhs unless buyer was liable and deducted TDS u/s 194Q.`;
|
|
2454
|
+
}
|
|
2375
2455
|
} else {
|
|
2376
2456
|
governingAct = entry.successor.act;
|
|
2377
2457
|
applicableSection = entry.successor.statutorySection;
|
|
2378
2458
|
temporalStatus = 'SUNSET_OMITTED';
|
|
2379
|
-
|
|
2459
|
+
if (entry.predecessor.sectionCode === '206AB') {
|
|
2460
|
+
legalAnalysis = `Section 206AB was formally omitted by the Finance Act, 2025 w.e.f. 1 April 2025. No non-filer punitive TDS rate applies on or after 1 April 2025; standard statutory TDS rates apply. Higher rates under Section 206AA for missing/inoperative PAN remain independent and fully active at 20%.`;
|
|
2461
|
+
} else {
|
|
2462
|
+
legalAnalysis = `Section 206C(1H) was formally omitted by the Finance Act, 2025 w.e.f. 1 April 2025 to eliminate double-compliance overlap. No seller TCS liability attaches to transactions on or after 1 April 2025. Tax withholding on sale of goods is governed exclusively by buyer TDS under Section 194Q / Section 393.`;
|
|
2463
|
+
}
|
|
2380
2464
|
}
|
|
2381
2465
|
} else {
|
|
2382
2466
|
// Standard transition to 2025 Act
|
|
@@ -2488,6 +2572,21 @@ export const STATUTORY_AMENDMENTS_CHANGELOG = [
|
|
|
2488
2572
|
statutoryImpact: 'Payers must verify non-filer status using the Compliance Check functionality on the Income Tax Portal.',
|
|
2489
2573
|
aliases: ['206ab', 'non filer']
|
|
2490
2574
|
},
|
|
2575
|
+
{
|
|
2576
|
+
id: 'DIFF-2025-04-01-206AB',
|
|
2577
|
+
sectionCode: '206AB',
|
|
2578
|
+
domain: 'direct_tax',
|
|
2579
|
+
title: 'Statutory Sunset & Omission of Section 206AB Higher Non-Filer TDS',
|
|
2580
|
+
effectiveDate: '2025-04-01',
|
|
2581
|
+
amendmentType: 'STATUTORY_OMISSION',
|
|
2582
|
+
statute: 'Finance Act, 2025',
|
|
2583
|
+
legalAuthority: 'Finance Act, 2025 (Section 206AB Sunset Clause)',
|
|
2584
|
+
previousValue: 'Higher TDS rate (higher of 2x specified rate, 2x rates in force, or 5%) for non-filers',
|
|
2585
|
+
amendedValue: 'OMITTED (Section 206AB repealed; standard TDS rates apply without non-filer penalty)',
|
|
2586
|
+
changeSummary: 'Finance Act, 2025 formally omitted Section 206AB and Section 206CCA effective 1 April 2025 to relieve deductors from non-filer compliance checks.',
|
|
2587
|
+
statutoryImpact: 'Tax deductors are no longer required to run portal compliance checks for specified persons; standard statutory rates apply. Higher rates under Section 206AA for invalid/inoperative PAN remain active.',
|
|
2588
|
+
aliases: ['206ab', 'non filer sunset', '206ab omitted']
|
|
2589
|
+
},
|
|
2491
2590
|
{
|
|
2492
2591
|
id: 'DIFF-2022-07-01-194R',
|
|
2493
2592
|
sectionCode: '194R',
|
|
@@ -2645,4 +2744,16 @@ export function getStatutoryDiff(options = {}) {
|
|
|
2645
2744
|
};
|
|
2646
2745
|
}
|
|
2647
2746
|
|
|
2747
|
+
// ── Deterministic Zero-Dependency Statutory Calculators Export ──────────────
|
|
2748
|
+
export {
|
|
2749
|
+
roundToPaisa,
|
|
2750
|
+
roundSection288B,
|
|
2751
|
+
calculateCorporateTaxMatVsConcessional,
|
|
2752
|
+
evaluatePlaceOfSupplyAndLut,
|
|
2753
|
+
calculateTransferPricingAlp,
|
|
2754
|
+
evaluateSection79LossContinuity,
|
|
2755
|
+
revalueForeignExchangeIndAs109
|
|
2756
|
+
};
|
|
2757
|
+
|
|
2758
|
+
|
|
2648
2759
|
|
package/types/index.d.ts
CHANGED
|
@@ -193,6 +193,11 @@ export declare class StatutoryClient {
|
|
|
193
193
|
diff(options?: StatutoryDiffOptions): StatutoryDiffResult;
|
|
194
194
|
verify(targetDir?: string): any;
|
|
195
195
|
doctor(options?: any): Promise<any>;
|
|
196
|
+
calculateCorporateTaxMatVsConcessional(payload?: any): any;
|
|
197
|
+
evaluatePlaceOfSupplyAndLut(payload?: any): any;
|
|
198
|
+
calculateTransferPricingAlp(payload?: any): any;
|
|
199
|
+
evaluateSection79LossContinuity(payload?: any): any;
|
|
200
|
+
revalueForeignExchangeIndAs109(payload?: any): any;
|
|
196
201
|
}
|
|
197
202
|
|
|
198
203
|
export interface CrosswalkOptions {
|
|
@@ -315,3 +320,12 @@ export declare const PAN_ENTITY_TYPES: Record<string, { code: string; name: stri
|
|
|
315
320
|
export declare function isValidGstinChecksum(gstin: string): boolean;
|
|
316
321
|
export declare function decodeTaxIdentifier(rawId: string): TaxIdentifierResult;
|
|
317
322
|
|
|
323
|
+
export declare function roundToPaisa(amount: number | string): number;
|
|
324
|
+
export declare function roundSection288B(amount: number | string): number;
|
|
325
|
+
export declare function calculateCorporateTaxMatVsConcessional(payload?: any): any;
|
|
326
|
+
export declare function evaluatePlaceOfSupplyAndLut(payload?: any): any;
|
|
327
|
+
export declare function calculateTransferPricingAlp(payload?: any): any;
|
|
328
|
+
export declare function evaluateSection79LossContinuity(payload?: any): any;
|
|
329
|
+
export declare function revalueForeignExchangeIndAs109(payload?: any): any;
|
|
330
|
+
|
|
331
|
+
|