MSME vendor management, Udyam verification, 45-day payment SLA enforcement, interest calculation, and statutory half-yearly reporting under the MSMED Act, 2006 (Section 15).
The MSME Compliance System ensures that ProKure adheres to the Micro, Small and Medium Enterprises Development (MSMED) Act, 2006. Section 15 mandates that payments to MSME vendors must be made within 45 days of acceptance of goods/services or the agreed-upon date, whichever is earlier. Failure to comply results in compound interest at 3× the RBI Bank Rate.
Under the revised MSME classification (effective July 2020), enterprises are categorized based on investment in plant/machinery and annual turnover.
| Benefit | Micro | Small | Medium |
|---|---|---|---|
| EMD Exemption | Yes | Yes | Yes |
| 45-Day Payment SLA | Yes | Yes | Yes |
| Priority in Bid Evaluation | Yes (Highest) | Yes | Yes |
| Interest on Delayed Payment | 3× RBI Rate | 3× RBI Rate | 3× RBI Rate |
Stores MSME registration and classification data for each vendor
Tracks payment SLA compliance for MSME vendors, including due dates, actual payment dates, and interest calculations
Half-yearly statutory reports (Form MSME-1) submitted to the Ministry of MSME
Vendor enters their Udyam Registration Number during onboarding. Format: UDYAM-XX-00-0000000 (XX = State code, 00 = District code, 7-digit serial).
System validates the Udyam number format using regex pattern: UDYAM-[A-Z]{2}-\d{2}-\d{7}. Invalid formats are rejected with an error.
Vendor uploads the Udyam Registration Certificate (PDF). A procurement officer verifies the certificate details against the submitted information.
Upon verification, the system classifies the vendor (Micro/Small/Medium) and automatically applies benefits: EMD exemption, 45-day payment SLA, and priority bid evaluation flag.
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ GRN Accepted / │ │ Due Date = │ │ Track in │
│ Invoice Raised │────▶│ Acceptance + │────▶│ msme_payment_ │
│ │ │ 45 Days │ │ tracking │
└──────────────────┘ └──────────────────┘ └────────┬─────────┘
│
┌─────────────────────────────┤
│ │
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ Day 30: Warning │ │ Day 40: Urgent │
│ Alert to AP │ │ Escalation to │
│ Department │ │ Finance Head │
└──────────────────┘ └──────────────────┘
│
┌─────────────────────────────┤
│ │
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ Paid on Time │ │ Overdue: │
│ is_compliant = │ │ Calculate │
│ TRUE │ │ Interest │
└──────────────────┘ └──────────────────┘
| Day | Action | Recipient | Channel |
|---|---|---|---|
| Day 0 | Payment tracking record created | System | Automatic |
| Day 30 | Reminder: 15 days remaining | Accounts Payable | In-app + Email |
| Day 40 | Urgent: 5 days remaining | Finance Head + AP | In-app + Email + SMS |
| Day 45 | SLA breached, interest accrual starts | CFO + Finance Head | In-app + Email + SMS |
| Day 45+ | Daily interest calculation logged | System | Automatic |
Per Section 16 of the MSMED Act, the buyer must pay compound interest (with monthly rests) at three times the bank rate notified by the Reserve Bank of India.
-- Interest Rate Determination ANNUAL_RATE = RBI_Bank_Rate * 3 MONTHLY_RATE = ANNUAL_RATE / 12 -- Example: If RBI Bank Rate = 6.50% -- Annual Rate = 6.50% × 3 = 19.50% -- Monthly Rate = 19.50% / 12 = 1.625% -- Compound Interest Formula (Monthly Rests) INTEREST = Principal * ((1 + Monthly_Rate)n - 1) -- Where: -- Principal = Invoice Amount (unpaid) -- n = Number of months overdue -- Monthly_Rate = (RBI_Bank_Rate × 3) / 12 -- Example Calculation: -- Invoice = ₹10,00,000 | Overdue = 90 days (3 months) -- Interest = 10,00,000 × ((1 + 0.01625)³ - 1) -- = 10,00,000 × (1.04953 - 1) -- = 10,00,000 × 0.04953 -- = ₹49,530
public class MsmeInterestCalculator { public decimal CalculateInterest( decimal invoiceAmount, int daysOverdue, decimal rbiRate) { decimal annualRate = rbiRate * 3; decimal monthlyRate = annualRate / 12 / 100; int months = (int)Math.Ceiling(daysOverdue / 30.0); // Compound interest with monthly rests decimal factor = (decimal)Math.Pow( (double)(1 + monthlyRate), months); decimal interest = invoiceAmount * (factor - 1); return Math.Round(interest, 2); } }
Registered MSME vendors are exempt from submitting Earnest Money Deposit (EMD) when participating in RFQs and tenders. This is automatically applied during bid submission.
┌──────────────────┐ ┌──────────────────┐
│ Vendor submits │ │ Check vendor_ │ YES ┌──────────────────┐
│ bid for RFQ │────▶│ msme_details │───────────▶│ EMD Exempted │
│ │ │ .is_verified │ │ Skip EMD step │
└──────────────────┘ └────────┬─────────┘ └──────────────────┘
│ NO
▼
┌──────────────────┐
│ EMD Required │
│ Standard flow │
└──────────────────┘
MSME vendors receive priority consideration during bid comparison, per Government procurement guidelines. If an MSME vendor's bid is within a defined margin of the L1 (lowest) bid, they are given preference.
| Scenario | Rule | Action |
|---|---|---|
| MSME bid is L1 | Vendor wins directly | Award PO to MSME vendor |
| MSME bid within L1 + purchase preference margin | MSME vendor can match L1 price | Counter-offer sent to MSME vendor |
| MSME bid exceeds margin | Standard evaluation applies | No preference; lowest bid wins |
| Multiple MSME vendors within margin | Micro > Small > Medium priority | Highest category MSME gets first offer |
Under MSMED Act Section 22, buyers must file a half-yearly return (Form MSME-1) detailing payments to MSME suppliers. Reports are due by October 31 (Apr-Sep period) and April 30 (Oct-Mar period).
| Field | Source | Description |
|---|---|---|
| Total MSME Suppliers | vendor_msme_details | Count of verified MSME vendors with active POs |
| Total Payments Due | msme_payment_tracking | Sum of all invoice amounts due in the period |
| Payments Made on Time | msme_payment_tracking (is_compliant = true) | Count and amount of payments within 45 days |
| Delayed Payments | msme_payment_tracking (days_overdue > 0) | Count, amount, and days delayed for each |
| Interest Paid | msme_payment_tracking.interest_amount | Total interest paid on delayed payments |
| Reasons for Delay | Manual input | Justification for each delayed payment |
-- Report Generation Query SELECT COUNT(DISTINCT mpt.vendor_id) AS total_msme_vendors, SUM(mpt.invoice_amount) AS total_payments_due, SUM(CASE WHEN mpt.is_compliant = TRUE THEN mpt.invoice_amount ELSE 0 END) AS total_paid_on_time, SUM(CASE WHEN mpt.days_overdue > 0 THEN mpt.invoice_amount ELSE 0 END) AS total_delayed_amount, COUNT(CASE WHEN mpt.days_overdue > 0 THEN 1 END) AS delayed_payment_count, SUM(mpt.interest_amount) AS total_interest_paid, ROUND( SUM(CASE WHEN mpt.is_compliant = TRUE THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 2 ) AS compliance_percentage FROM rating.msme_payment_tracking mpt JOIN vendor.vendor_msme_details vmd ON mpt.vendor_id = vmd.vendor_id WHERE mpt.acceptance_date BETWEEN @period_start AND @period_end AND vmd.is_verified = TRUE;
ProKure Database Documentation - MSME Compliance Logic v1.0
Part of the ProKure Procurement Management System