Back to ER Diagrams
MSME Compliance Logic

MSME Compliance System

MSME vendor management, Udyam verification, 45-day payment SLA enforcement, interest calculation, and statutory half-yearly reporting under the MSMED Act, 2006 (Section 15).

3 Primary Tables
MSMED Act 2006
45-Day SLA
Half-Yearly Reporting

1. Overview

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.

Key Compliance Features

  • Udyam Registration Certificate verification (format: UDYAM-XX-00-0000000)
  • Automatic MSME classification: Micro, Small, Medium
  • 45-day payment SLA tracking with automated alerts
  • Compound interest calculation at 3× RBI Bank Rate on delayed payments
  • EMD (Earnest Money Deposit) exemption for registered MSME vendors
  • Priority evaluation in bid comparison
  • Half-yearly statutory report generation (Form MSME-1)

2. MSME Classification

Under the revised MSME classification (effective July 2020), enterprises are categorized based on investment in plant/machinery and annual turnover.

Micro
Investment ≤ ₹1 Crore
Turnover ≤ ₹5 Crore
Small
Investment ≤ ₹10 Crore
Turnover ≤ ₹50 Crore
Medium
Investment ≤ ₹50 Crore
Turnover ≤ ₹250 Crore
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

3. Database Tables Involved

vendor.vendor_msme_details

Stores MSME registration and classification data for each vendor

id (PK)
vendor_id (FK)
udyam_number
msme_category
enterprise_type
date_of_registration
certificate_file_path
is_verified
verified_by (FK)
verified_at
investment_amount
annual_turnover
is_emd_exempt
validity_date
created_at
updated_at
is_deleted

rating.msme_payment_tracking

Tracks payment SLA compliance for MSME vendors, including due dates, actual payment dates, and interest calculations

id (PK)
vendor_id (FK)
po_id (FK)
invoice_id (FK)
acceptance_date
due_date
actual_payment_date
invoice_amount
days_overdue
interest_rate
interest_amount
is_compliant
report_period_id (FK)
created_at

rating.msme_statutory_reports

Half-yearly statutory reports (Form MSME-1) submitted to the Ministry of MSME

id (PK)
organization_id (FK)
report_period
period_start
period_end
total_msme_vendors
total_payments_due
total_payments_made
total_delayed_payments
total_interest_paid
compliant_percentage
report_status
generated_by (FK)
generated_at
approved_by (FK)
approved_at
submitted_at

4. Udyam Registration Verification

1

Vendor Submits Udyam Number

Vendor enters their Udyam Registration Number during onboarding. Format: UDYAM-XX-00-0000000 (XX = State code, 00 = District code, 7-digit serial).

2

Format Validation

System validates the Udyam number format using regex pattern: UDYAM-[A-Z]{2}-\d{2}-\d{7}. Invalid formats are rejected with an error.

3

Certificate Upload & Manual Verification

Vendor uploads the Udyam Registration Certificate (PDF). A procurement officer verifies the certificate details against the submitted information.

4

Classification & Benefits Applied

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.

5. 45-Day Payment SLA Enforcement

Legal Mandate (MSMED Act Section 15)

  • Payment must be made within 45 days from the date of acceptance of goods/services
  • If the buyer and supplier agree on a payment date, that date applies (but cannot exceed 45 days)
  • Failure to pay within the stipulated period attracts compound interest with monthly rests
  • Interest rate = 3× the RBI Bank Rate notified on the date of payment
┌──────────────────┐     ┌──────────────────┐     ┌──────────────────┐
│  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        │
                    └──────────────────┘         └──────────────────┘

Alert Schedule

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

6. Interest Calculation Logic

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);
    }
}

7. EMD Exemption Logic

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   │
                         └──────────────────┘

8. MSME Priority in Bid Evaluation

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

9. Half-Yearly Statutory Reporting

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).

H1 Report

  • Period: April 1 - September 30
  • Due: October 31
  • Submit to: Ministry of MSME portal

H2 Report

  • Period: October 1 - March 31
  • Due: April 30
  • Submit to: Ministry of MSME portal

Report Contents (Form MSME-1)

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;

10. Best Practices & Compliance Risks

Compliance Risks

  • Non-filing penalty: Failure to file MSME-1 form attracts penalties under the Companies Act
  • Interest liability: Delayed payments compound monthly — even short delays accumulate significant interest
  • Audit exposure: MSME payment compliance is a statutory audit point; non-compliance is flagged in audit reports
  • Vendor relationship: Persistent delays can result in vendor complaints to MSME Facilitation Council

Recommended Practices

  • Configure automated 30-day and 40-day payment reminders
  • Maintain up-to-date RBI Bank Rate in system configuration
  • Verify Udyam registration validity annually
  • Generate draft MSME-1 reports monthly for early issue detection
  • Maintain separate MSME payment queue with priority processing
  • Train AP team on MSME compliance requirements

ProKure Database Documentation - MSME Compliance Logic v1.0

Part of the ProKure Procurement Management System