diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..cca4a3a504c53d420688210b71e20435b3e5c6ea 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,35 +1 @@ -*.7z filter=lfs diff=lfs merge=lfs -text -*.arrow filter=lfs diff=lfs merge=lfs -text -*.bin filter=lfs diff=lfs merge=lfs -text -*.bz2 filter=lfs diff=lfs merge=lfs -text -*.ckpt filter=lfs diff=lfs merge=lfs -text -*.ftz filter=lfs diff=lfs merge=lfs -text -*.gz filter=lfs diff=lfs merge=lfs -text -*.h5 filter=lfs diff=lfs merge=lfs -text -*.joblib filter=lfs diff=lfs merge=lfs -text -*.lfs.* filter=lfs diff=lfs merge=lfs -text -*.mlmodel filter=lfs diff=lfs merge=lfs -text -*.model filter=lfs diff=lfs merge=lfs -text -*.msgpack filter=lfs diff=lfs merge=lfs -text -*.npy filter=lfs diff=lfs merge=lfs -text -*.npz filter=lfs diff=lfs merge=lfs -text -*.onnx filter=lfs diff=lfs merge=lfs -text -*.ot filter=lfs diff=lfs merge=lfs -text -*.parquet filter=lfs diff=lfs merge=lfs -text -*.pb filter=lfs diff=lfs merge=lfs -text -*.pickle filter=lfs diff=lfs merge=lfs -text -*.pkl filter=lfs diff=lfs merge=lfs -text -*.pt filter=lfs diff=lfs merge=lfs -text -*.pth filter=lfs diff=lfs merge=lfs -text -*.rar filter=lfs diff=lfs merge=lfs -text -*.safetensors filter=lfs diff=lfs merge=lfs -text -saved_model/**/* filter=lfs diff=lfs merge=lfs -text -*.tar.* filter=lfs diff=lfs merge=lfs -text -*.tar filter=lfs diff=lfs merge=lfs -text -*.tflite filter=lfs diff=lfs merge=lfs -text -*.tgz filter=lfs diff=lfs merge=lfs -text -*.wasm filter=lfs diff=lfs merge=lfs -text -*.xz filter=lfs diff=lfs merge=lfs -text -*.zip filter=lfs diff=lfs merge=lfs -text -*.zst filter=lfs diff=lfs merge=lfs -text -*tfevents* filter=lfs diff=lfs merge=lfs -text +*.json filter= diff= merge= -text diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..2adb14ecfe3fa8c8903f1481a0be3029b732344f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,39 @@ +# PrimaryDraft: one image, backend serves the built frontend. +# +# Deliberately does NOT ship the annual-report PDF cache (859 MB). The extracted +# records are 620 KB and the pipeline runs entirely from them; PDFs are only +# needed to RE-extract, and live ingest downloads what it needs on demand. + +# ---- stage 1: build the UI ------------------------------------------------- +FROM node:22-slim AS ui +WORKDIR /ui +COPY app/frontend/package*.json ./ +RUN npm ci --no-audit --no-fund +COPY app/frontend/ ./ +RUN npm run build + +# ---- stage 2: runtime ------------------------------------------------------ +FROM python:3.12-slim +ENV PYTHONUNBUFFERED=1 PIP_NO_CACHE_DIR=1 PORT=8000 + +WORKDIR /app +COPY app/backend/pyproject.toml ./ +COPY app/backend/primarydraft ./primarydraft +RUN pip install --no-cache-dir \ + "fastapi>=0.115" "uvicorn[standard]>=0.32" "pydantic>=2.9" "httpx>=0.27" \ + "pdfplumber>=0.11" "python-docx>=1.1" "python-multipart>=0.0.12" + +# The BSE scrip master (1.8 MB) so search works on the first request, and +# instantly, even if the exchange is slow or blocks the host. +# Shipped as seed_cache/ because the Hub refuses paths under .cache/, then +# mapped back to the runtime cache location inside the image. +COPY app/backend/seed_cache/bse/scrip_master.json ./.cache/bse/scrip_master.json +COPY app/backend/seed_cache/mca ./.cache/mca + +COPY --from=ui /ui/dist ../frontend/dist + +# Writable for run snapshots, exports and any live ingest. +RUN mkdir -p .runs .exports .cache/bse && chmod -R 777 .runs .exports .cache + +EXPOSE 8000 +CMD ["sh","-c","uvicorn primarydraft.main:app --host 0.0.0.0 --port ${PORT:-8000}"] diff --git a/README.md b/README.md index ed4c73e8a3e7539c07dec8126984880e73917058..020ae5ed768dd56208fd22629d12577b06807ee3 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,18 @@ --- -title: Primarydraft -emoji: ๐Ÿ“‰ -colorFrom: gray -colorTo: red +title: PrimaryDraft +emoji: ๐Ÿ“Š +colorFrom: blue +colorTo: green sdk: docker +app_port: 8000 pinned: false +license: mit +short_description: The IPO offer document that checks itself --- -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference +# PrimaryDraft + +Pre-filing consistency gate for Indian SME IPO offer documents. +27 deterministic checks, no language model in the correctness loop. + +Rename this file to `README.md` in the Space repository root. diff --git a/app/backend/primarydraft/__init__.py b/app/backend/primarydraft/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app/backend/primarydraft/cin.py b/app/backend/primarydraft/cin.py new file mode 100644 index 0000000000000000000000000000000000000000..7ad4d24aace8b7707eb4a3c9efdd67be3c92682b --- /dev/null +++ b/app/backend/primarydraft/cin.py @@ -0,0 +1,179 @@ +"""Decompose a Corporate Identity Number. + +A CIN is 21 characters and every one of them means something. Reading it costs +nothing and settles several eligibility questions before a single financial +statement is opened: + + U 62090 KA 2025 PTC 207753 + โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ registration number with the ROC + โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ownership class: PTC is a private limited company + โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ year of incorporation + โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ state of the registrar + โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ NIC industry code + โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ L listed, U unlisted + +This is pure parsing of a real identifier. Nothing is inferred that the CIN does +not actually encode, and anything unrecognised is reported as unrecognised. +""" + +from __future__ import annotations + +import datetime as _dt +import re +from dataclasses import dataclass + +CIN_RE = re.compile( + r"^(?P[LU])" + r"(?P\d{5})" + r"(?P[A-Z]{2})" + r"(?P\d{4})" + r"(?P[A-Z]{3})" + r"(?P\d{6})$" +) + +#: Ownership classes as used by the MCA. +OWNERSHIP: dict[str, str] = { + "PLC": "Public Limited Company", + "PTC": "Private Limited Company", + "OPC": "One Person Company", + "FLC": "Financial Lease Company (public)", + "FTC": "Subsidiary of a foreign company (private)", + "GAP": "General association (public)", + "GAT": "General association (private)", + "GOI": "Government of India company", + "SGC": "State government company", + "NPL": "Not-for-profit company under section 8", + "ULL": "Unlimited liability company (public)", + "ULT": "Unlimited liability company (private)", +} + +#: Ownership classes that are already a public company for Companies Act purposes. +PUBLIC_CLASSES = {"PLC", "FLC", "GAP", "GOI", "SGC", "ULL"} + +STATES: dict[str, str] = { + "AP": "Andhra Pradesh", "AR": "Arunachal Pradesh", "AS": "Assam", "BR": "Bihar", + "CH": "Chandigarh", "CT": "Chhattisgarh", "DL": "Delhi", "GA": "Goa", + "GJ": "Gujarat", "HR": "Haryana", "HP": "Himachal Pradesh", "JH": "Jharkhand", + "JK": "Jammu and Kashmir", "KA": "Karnataka", "KL": "Kerala", "LD": "Lakshadweep", + "MH": "Maharashtra", "ML": "Meghalaya", "MN": "Manipur", "MP": "Madhya Pradesh", + "MZ": "Mizoram", "NL": "Nagaland", "OR": "Odisha", "PB": "Punjab", + "PY": "Puducherry", "RJ": "Rajasthan", "SK": "Sikkim", "TN": "Tamil Nadu", + "TG": "Telangana", "TS": "Telangana", "TR": "Tripura", "UP": "Uttar Pradesh", + "UR": "Uttarakhand", "UT": "Uttarakhand", "WB": "West Bengal", + "AN": "Andaman and Nicobar Islands", "DN": "Dadra and Nagar Haveli", +} + +#: NIC 2008 divisions, by the first two digits of the industry code. +NIC_DIVISIONS: dict[str, str] = { + "01": "Crop and animal production", "10": "Manufacture of food products", + "11": "Manufacture of beverages", "13": "Manufacture of textiles", + "14": "Manufacture of wearing apparel", "17": "Manufacture of paper products", + "20": "Manufacture of chemicals", "21": "Manufacture of pharmaceuticals", + "22": "Manufacture of rubber and plastic products", + "23": "Manufacture of other non-metallic mineral products", + "24": "Manufacture of basic metals", + "25": "Manufacture of fabricated metal products", + "26": "Manufacture of computer, electronic and optical products", + "27": "Manufacture of electrical equipment", + "28": "Manufacture of machinery and equipment", + "29": "Manufacture of motor vehicles", "30": "Manufacture of other transport equipment", + "35": "Electricity, gas and air conditioning supply", + "41": "Construction of buildings", "42": "Civil engineering", + "43": "Specialised construction activities", + "45": "Wholesale and retail trade of motor vehicles", + "46": "Wholesale trade", "47": "Retail trade", + "49": "Land transport", "52": "Warehousing and support for transportation", + "55": "Accommodation", "56": "Food and beverage service activities", + "58": "Publishing activities", "59": "Motion picture and television production", + "61": "Telecommunications", + "62": "Computer programming, consultancy and related activities", + "63": "Information service activities", + "64": "Financial service activities", "65": "Insurance and pension funding", + "66": "Activities auxiliary to financial services", "68": "Real estate activities", + "69": "Legal and accounting activities", + "70": "Activities of head offices and management consultancy", + "71": "Architecture and engineering, technical testing and analysis", + "72": "Scientific research and development", "73": "Advertising and market research", + "77": "Rental and leasing activities", "78": "Employment activities", + "80": "Security and investigation activities", "82": "Business support activities", + "85": "Education", "86": "Human health activities", +} + + +@dataclass +class ParsedCIN: + raw: str + valid: bool + listing: str = "" + is_listed: bool | None = None + industry_code: str = "" + nic_division: str = "" + nic_division_name: str = "" + state_code: str = "" + state: str = "" + year: int | None = None + age_years: int | None = None + ownership_code: str = "" + ownership: str = "" + is_public_company: bool | None = None + registration_number: str = "" + error: str = "" + + def to_dict(self) -> dict[str, object]: + return self.__dict__.copy() + + +def parse_cin(cin: str, today: _dt.date | None = None) -> ParsedCIN: + """Parse a real CIN. Reports what it cannot recognise rather than guessing.""" + raw = (cin or "").strip().upper().replace(" ", "").replace("-", "") + m = CIN_RE.match(raw) + if not m: + return ParsedCIN( + raw=raw, valid=False, + error=("A Corporate Identity Number is 21 characters in the form " + "U99999AA9999AAA999999: a listing letter, a five digit NIC code, " + "a two letter state code, the year of incorporation, a three letter " + "ownership class and a six digit registration number."), + ) + + g = m.groupdict() + year = int(g["year"]) + today = today or _dt.date.today() + own = g["ownership"] + div = g["industry"][:2] + + return ParsedCIN( + raw=raw, + valid=True, + listing=g["listing"], + is_listed=(g["listing"] == "L"), + industry_code=g["industry"], + nic_division=div, + nic_division_name=NIC_DIVISIONS.get(div, "NIC division not in the local table"), + state_code=g["state"], + state=STATES.get(g["state"], "state code not recognised"), + year=year, + age_years=max(0, today.year - year), + ownership_code=own, + ownership=OWNERSHIP.get(own, "ownership class not recognised"), + is_public_company=(own in PUBLIC_CLASSES) if own in OWNERSHIP else None, + registration_number=g["registration"], + ) + + +def completed_financial_years(year_of_incorporation: int, + today: _dt.date | None = None) -> int: + """How many full Indian financial years the company can possibly have closed. + + An Indian financial year ends on 31 March. A company incorporated during + FY N-1/N cannot have closed more than one year by the following 31 March. + This bounds the track record available for Regulation 229(6); it does not + assert that audited accounts for those years exist. + """ + today = today or _dt.date.today() + # The FY ending 31 March of `fy_end_year` is the last one fully closed. + fy_end_year = today.year if today.month > 3 else today.year - 1 + # A company incorporated in calendar year Y closes its first FY on 31 March + # of Y+1 at the earliest. + first_close = year_of_incorporation + 1 + return max(0, fy_end_year - first_close + 1) diff --git a/app/backend/primarydraft/data/companies/537669.json b/app/backend/primarydraft/data/companies/537669.json new file mode 100644 index 0000000000000000000000000000000000000000..fa5e7938f1eb7db316a04727786d498eb6a57128 --- /dev/null +++ b/app/backend/primarydraft/data/companies/537669.json @@ -0,0 +1,791 @@ +{ + "scrip_code": "537669", + "bse": { + "scrip_name": "Laxmipati Engineering Works Ltd", + "issuer_name": "LAXMIPATI ENGINEERING WORKS LIMITED", + "group": "MT", + "segment": "Equity", + "isin": "INE920P01019", + "face_value": "10.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Capital Goods", + "market_cap": "259.56", + "eps_reported": "47.00", + "pe_reported": "9.60", + "security_id": "LAXMIPATI" + }, + "annual_report": { + "year": "2026", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/cfdf14dc-e542-478a-b4cd-e22ce988d43b.pdf", + "authorised_at": "2026-06-23T10:51:34.153", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_537669_2026.pdf", + "available_years": [ + "2026", + "2025", + "2024", + "2023", + "2022", + "2021", + "2020", + "2019" + ] + }, + "extraction": { + "scrip_code": "537669", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_537669_2026.pdf", + "pages": 117, + "cin": "L35111GJ2012PLC068922", + "isin": "INE920P01019", + "company_name": "Laxmipati Engineering Works Limited", + "emails": [ + "cs@laxmipatiengineering.com", + "evoting@nsdl.co.in", + "helpdesk.evoting@cdslindia.com", + "info@bigshareonline.com", + "investor@bigshareonline.com", + "rbksurat@gmail.com" + ], + "dins": [ + "00005468", + "00005665", + "01685738", + "02227413" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 719937000.0, + "page": 98, + "line": "I Revenue from Operations 18 7,199.37 5,009.29", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 500929000.0, + "page": 98, + "line": "I Revenue from Operations 18 7,199.37 5,009.29", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 3886000.0, + "page": 98, + "line": "II Other income 19 38.86 5.12", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 512000.0, + "page": 98, + "line": "II Other income 19 38.86 5.12", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 723823000.0, + "page": 98, + "line": "III TOTAL INCOME 7,238.23 5,014.41", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 501441000.0, + "page": 98, + "line": "III TOTAL INCOME 7,238.23 5,014.41", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 293561000.0, + "page": 98, + "line": "Cost of Material Consumed 20 2,935.61 1,998.55", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "cost_of_materials", + "value": 199855000.0, + "page": 98, + "line": "Cost of Material Consumed 20 2,935.61 1,998.55", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 160151000.0, + "page": 98, + "line": "Employee benefit expense 22 1,601.51 1,284.42", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "employee_benefits", + "value": 128442000.0, + "page": 98, + "line": "Employee benefit expense 22 1,601.51 1,284.42", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 24618000.0, + "page": 98, + "line": "Finance costs 23 246.18 423.23", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 42323000.0, + "page": 98, + "line": "Finance costs 23 246.18 423.23", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 14109000.0, + "page": 98, + "line": "Depreciation & Amortization Exp. 12 141.09 122.01", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 12201000.0, + "page": 98, + "line": "Depreciation & Amortization Exp. 12 141.09 122.01", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 118058999.99999999, + "page": 98, + "line": "Other expenses 24 1,180.59 741.94", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_expenses", + "value": 74194000.0, + "page": 98, + "line": "Other expenses 24 1,180.59 741.94", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 632686000.0, + "page": 98, + "line": "V TOTAL EXPENSES 6,326.86 4,547.56", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 454756000.00000006, + "page": 98, + "line": "V TOTAL EXPENSES 6,326.86 4,547.56", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 91137000.0, + "page": 98, + "line": "VI Profit before Exceptional & Extraordinary items & tax 911.37 466.85", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 46685000.0, + "page": 98, + "line": "VI Profit before Exceptional & Extraordinary items & tax 911.37 466.85", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 35812000.0, + "page": 98, + "line": "Current Tax 358.12 -", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 21718000.0, + "page": 98, + "line": "Deferred Tax / (Benefit) 217.18 (183.06)", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": -18306000.0, + "page": 98, + "line": "Deferred Tax / (Benefit) 217.18 (183.06)", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 47.0, + "page": 98, + "line": "Basic 47.00 11.30", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "eps_basic", + "value": 11.3, + "page": 98, + "line": "Basic 47.00 11.30", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 47.0, + "page": 98, + "line": "Diluted 47.00 11.30", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "eps_diluted", + "value": 11.3, + "page": 98, + "line": "Diluted 47.00 11.30", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + } + }, + "directors_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 719937000.0, + "page": 31, + "line": "Revenue from operations 7199.37 5009.29", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "revenue_from_operations", + "value": 500929000.0, + "page": 31, + "line": "Revenue from operations 7199.37 5009.29", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 3886000.0, + "page": 31, + "line": "Other Income 38.86 5.12", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "other_income", + "value": 512000.0, + "page": 31, + "line": "Other Income 38.86 5.12", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 723823000.0, + "page": 31, + "line": "Total Income 7238.23 5014.41", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "total_income", + "value": 501441000.0, + "page": 31, + "line": "Total Income 7238.23 5014.41", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 618577000.0, + "page": 31, + "line": "Expenses Before Depreciation & Amortization 6185.77 4425.55", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "depreciation", + "value": 442555000.0, + "page": 31, + "line": "Expenses Before Depreciation & Amortization 6185.77 4425.55", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 35812000.0, + "page": 31, + "line": "- Current Tax 358.12 --", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 21718000.0, + "page": 31, + "line": "- Deferred Tax 217.18 (183.06)", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "tax_deferred", + "value": -18306000.0, + "page": 31, + "line": "- Deferred Tax 217.18 (183.06)", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 632686000.0, + "page": 31, + "line": "financial year. The total expenditure during the year was Rs. 6326.86 lakhs against Rs. 4547.56 lakhs in the", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "total_expenses", + "value": 454756000.00000006, + "page": 31, + "line": "financial year. The total expenditure during the year was Rs. 6326.86 lakhs against Rs. 4547.56 lakhs in the", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 327889000.0, + "page": 31, + "line": "previous financial year. The profit before tax for the year under review recorded to Rs. 3278.89 lakhs compared", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + } + }, + "balance_sheet": { + "share_capital": { + "current": { + "field": "share_capital", + "value": 57520000.00000001, + "page": 97, + "line": "Share Capital 3 575.20 575.20", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "share_capital", + "value": 57520000.00000001, + "page": 97, + "line": "Share Capital 3 575.20 575.20", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "reserves_surplus": { + "current": { + "field": "reserves_surplus", + "value": 298562000.0, + "page": 97, + "line": "Reserve and Surplus 4 2 ,985.62 282.03", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "reserves_surplus", + "value": 28202999.999999996, + "page": 97, + "line": "Reserve and Surplus 4 2 ,985.62 282.03", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "borrowings_non_current": { + "current": { + "field": "borrowings_non_current", + "value": 76679000.0, + "page": 97, + "line": "Long term Borrowings 5 766.79 3,958.80", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "borrowings_non_current", + "value": 395880000.0, + "page": 97, + "line": "Long term Borrowings 5 766.79 3,958.80", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "deferred_tax_liability": { + "current": { + "field": "deferred_tax_liability", + "value": 600000.0, + "page": 97, + "line": "Deferred Tax Liabilities (net) 6 106.96 -", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "deferred_tax_liability", + "value": 10696000.0, + "page": 97, + "line": "Deferred Tax Liabilities (net) 6 106.96 -", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "borrowings_current": { + "current": { + "field": "borrowings_current", + "value": 89681000.0, + "page": 97, + "line": "Short term Borrowings 8 896.81 552.44", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "borrowings_current", + "value": 55244000.00000001, + "page": 97, + "line": "Short term Borrowings 8 896.81 552.44", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "other_current_liabilities": { + "current": { + "field": "other_current_liabilities", + "value": 23544000.0, + "page": 97, + "line": "Other Current Liabilities 10 235.44 141.43", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "other_current_liabilities", + "value": 14143000.0, + "page": 97, + "line": "Other Current Liabilities 10 235.44 141.43", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "short_term_provisions": { + "current": { + "field": "short_term_provisions", + "value": 28620999.999999996, + "page": 97, + "line": "Short Term Provisions 11 286.21 24.53", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "short_term_provisions", + "value": 2453000.0, + "page": 97, + "line": "Short Term Provisions 11 286.21 24.53", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "total_equity_liabilities": { + "current": { + "field": "total_equity_liabilities", + "value": 647092000.0, + "page": 97, + "line": "Total Equity and Liabilities 6 ,470.92 5,954.94", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "total_equity_liabilities", + "value": 595494000.0, + "page": 97, + "line": "Total Equity and Liabilities 6 ,470.92 5,954.94", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "ppe": { + "current": { + "field": "ppe", + "value": 232673999.99999997, + "page": 97, + "line": "- Property, Plant and Equipment 12 2 ,326.74 3,150.56", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "ppe", + "value": 315056000.0, + "page": 97, + "line": "- Property, Plant and Equipment 12 2 ,326.74 3,150.56", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "trade_receivables": { + "current": { + "field": "trade_receivables", + "value": 156797000.0, + "page": 97, + "line": "Trade receivables 15 1 ,567.97 996.15", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "trade_receivables", + "value": 99615000.0, + "page": 97, + "line": "Trade receivables 15 1 ,567.97 996.15", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "cash_and_equivalents": { + "current": { + "field": "cash_and_equivalents", + "value": 188000.0, + "page": 97, + "line": "Cash and bank balances 16 1.88 3.82", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "cash_and_equivalents", + "value": 382000.0, + "page": 97, + "line": "Cash and bank balances 16 1.88 3.82", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "total_assets": { + "current": { + "field": "total_assets", + "value": 647092000.0, + "page": 97, + "line": "Total Assets 6 ,470.92 5,954.94", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "total_assets", + "value": 595494000.0, + "page": 97, + "line": "Total Assets 6 ,470.92 5,954.94", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + } + }, + "shareholding": [], + "related_party": [ + { + "label": "", + "amount": 9.0, + "page": 59, + "line": "9. Scrutiny of inter-corporate loans and investments." + }, + { + "label": "", + "amount": 21.0, + "page": 59, + "line": "21. Reviewing the utilization of loans and/ or advances from/investment by the holding company in the" + }, + { + "label": "", + "amount": 4.0, + "page": 59, + "line": "4. The appointment, removal and terms of remuneration of the chief internal auditor shall be subject" + } + ], + "auditors": [ + "(Revised 2024 Edition) issued by the Institute of Chartered Accountants of India, which", + "Chartered Accountants", + "Chartered Accountants of India together with the ethical requirements that are relevant to our audit of the", + "Chartered Accountants sd/- sd/-" + ], + "page_index": { + "pl": [ + 17, + 88, + 98, + 102 + ], + "directors_report": [ + 7, + 13, + 31, + 48, + 52, + 72, + 87 + ], + "balance_sheet": [ + 86, + 97 + ], + "shareholding": [ + 68 + ], + "related_party": [ + 13, + 36, + 59, + 66, + 70, + 71, + 104 + ] + }, + "warnings": [], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "directors_pl_identities": [ + "total_income = revenue + other_income" + ], + "balance_sheet_identities": [ + "total assets = total equity and liabilities" + ], + "statement_pages": { + "audited_pl": 98, + "directors_report": 31 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/540652.json b/app/backend/primarydraft/data/companies/540652.json new file mode 100644 index 0000000000000000000000000000000000000000..640ad9d715b83731ba1fd65ff6eb675def07e020 --- /dev/null +++ b/app/backend/primarydraft/data/companies/540652.json @@ -0,0 +1,304 @@ +{ + "scrip_code": "540652", + "bse": { + "scrip_name": "Captain Technocast Ltd", + "issuer_name": "Captain Technocast Limited", + "group": "M", + "segment": "Equity", + "isin": "INE931X01010", + "face_value": "10.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Capital Goods", + "market_cap": "617.42", + "eps_reported": "4.39", + "pe_reported": "60.57", + "security_id": "CTCL" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/023dd632-f21a-4540-a2fc-aa14bd073178.pdf", + "authorised_at": "2025-09-06T12:30:50.477", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_540652_2025.pdf", + "available_years": [ + "2025", + "2024", + "2023", + "2023", + "2022", + "2022", + "2021", + "2020" + ] + }, + "extraction": { + "scrip_code": "540652", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_540652_2025.pdf", + "pages": 139, + "cin": "L27300GJ2010PLC061678", + "isin": "INE931X01010", + "company_name": "For, Captain Technocast Limited", + "emails": [ + "bssahd2@bigshareonline.com", + "bssahd3@bigshareonline.com", + "bssahd@bigshareonline.com", + "compliance@captaintechnocast.com", + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com" + ], + "dins": [ + "03159038", + "03324485" + ], + "audited_pl": {}, + "directors_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 921562000.0000001, + "page": 14, + "line": "Revenue from operations 9215.62 6422.91 8156.64 6266.98", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 642291000.0, + "page": 14, + "line": "Revenue from operations 9215.62 6422.91 8156.64 6266.98", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 13593000.0, + "page": 14, + "line": "Other Income 135.93 90.52 126.74 89.38", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 9052000.0, + "page": 14, + "line": "Other Income 135.93 90.52 126.74 89.38", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 935154999.9999999, + "page": 14, + "line": "Total Revenue 9351.55 6513.43 8283.38 6356.36", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 651343000.0, + "page": 14, + "line": "Total Revenue 9351.55 6513.43 8283.38 6356.36", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 130680000.0, + "page": 14, + "line": "Operating Profit before finance costs, Depreciation and 1306.8 731.39 1240.40 728.52", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 73139000.0, + "page": 14, + "line": "Operating Profit before finance costs, Depreciation and 1306.8 731.39 1240.40 728.52", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 12968000.0, + "page": 14, + "line": "Less: Depreciation and Amortization expenses 129.68 129.45 128.28 129.43", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 12944999.999999998, + "page": 14, + "line": "Less: Depreciation and Amortization expenses 129.68 129.45 128.28 129.43", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 108985999.99999999, + "page": 14, + "line": "Profit Before Tax (PBT) 1089.86 490.15 1029.36 487.30", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 49015000.0, + "page": 14, + "line": "Profit Before Tax (PBT) 1089.86 490.15 1029.36 487.30", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 26954000.000000004, + "page": 14, + "line": "Provision for Tax (Including Deferred Tax) 269.54 111.79 261.28 116.99", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": 11179000.0, + "page": 14, + "line": "Provision for Tax (Including Deferred Tax) 269.54 111.79 261.28 116.99", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 83962000.0, + "page": 14, + "line": "Profit after Tax 839.62 385.30 768.08 370.31", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pat", + "value": 38530000.0, + "page": 14, + "line": "Profit after Tax 839.62 385.30 768.08 370.31", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "FINANCIAL YEAR ENDED MARCH", + "amount": 31.0, + "page": 3, + "line": "FINANCIAL YEAR ENDED MARCH 31, 2025 AND THE REPORTS OF THE BOARD OF DIRECTORS AND AUDITORS THEREON; AND" + }, + { + "label": "", + "amount": 31.0, + "page": 3, + "line": "31, 2025 and the reports of the Board of Directors and Auditors thereon, as circulated to the Members, be and are" + }, + { + "label": "", + "amount": 2.0, + "page": 3, + "line": "2. TO APPOINT A DIRECTOR IN PLACE OF MR. SHAILESH KARSHANBHAI BHUT (DIN: 03324485), WHO RETIRES BY ROTATION" + }, + { + "label": "\u201cRESOLVED THAT MR. SHAILESH KARSHANBHAI BHUT (DIN:", + "amount": 3324485.0, + "page": 3, + "line": "\u201cRESOLVED THAT MR. SHAILESH KARSHANBHAI BHUT (DIN: 03324485), director of the company, who retires by rotation be" + }, + { + "label": "Pursuant to Regulation", + "amount": 24.0, + "page": 12, + "line": "Pursuant to Regulation 24A of the SEBI (LODR) Regulations, 2015, the Board of Directors at its Meeting held on 8TH MAY" + }, + { + "label": "", + "amount": 3.0, + "page": 12, + "line": "3. Details of proposed RPTs relating to any loans, inter-corporate deposits, advances or investments made or given by" + }, + { + "label": "", + "amount": 5.0, + "page": 12, + "line": "5. Name of the Director or Key Managerial Personnel (\u2018KMP\u2019) NA" + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants of India is not applicable as the Company has mainly one business segment i.e." + ], + "page_index": { + "pl": [], + "directors_report": [ + 14, + 34 + ], + "balance_sheet": [], + "shareholding": [ + 35, + 37 + ], + "related_party": [ + 3, + 4, + 12, + 13, + 16, + 31, + 32, + 33, + 39 + ] + }, + "warnings": [ + "audited P&L not machine-readable in this filing", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [], + "directors_pl_identities": [ + "total_income = revenue + other_income" + ], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 0, + "directors_report": 14 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/540718.json b/app/backend/primarydraft/data/companies/540718.json new file mode 100644 index 0000000000000000000000000000000000000000..f0c53afc7adddf41d4972b809fb16c164474f936 --- /dev/null +++ b/app/backend/primarydraft/data/companies/540718.json @@ -0,0 +1,624 @@ +{ + "scrip_code": "540718", + "bse": { + "scrip_name": "Aayush Art And Bullion Ltd", + "issuer_name": "AAYUSH ART AND BULLION LIMITED", + "group": "M", + "segment": "Equity", + "isin": "INE777X01017", + "face_value": "10.00", + "industry": "", + "sector": "Consumer Discretionary", + "industry_new": "Textiles", + "market_cap": "1882.63", + "eps_reported": "5.15", + "pe_reported": "238.74", + "security_id": "AAYUSHBULL" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/03dd0a8c-b2df-4c5d-a8c6-eaa897799507.pdf", + "authorised_at": "2025-09-04T13:27:17.653", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_540718_2025.pdf", + "available_years": [ + "2025", + "2024", + "2023", + "2022", + "2021", + "2020", + "2019", + "2018" + ] + }, + "extraction": { + "scrip_code": "540718", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_540718_2025.pdf", + "pages": 91, + "cin": "L74110DL2009PLC196375", + "isin": "INE777X01017", + "company_name": "Aayush Art And Bullion Limited", + "emails": [ + "akmcreationlimited@gmail.com", + "akmlace@gmail.com", + "evoting@nsdl.co.in", + "helpdesk.evoting@cdslindia.com" + ], + "dins": [ + "07578813", + "09588467", + "09634827", + "10168242", + "10297944", + "10429758", + "10429763", + "10692712", + "11048317", + "11189994" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 737730000.0, + "page": 73, + "line": "i) Revenue from operations 18 7,377.30 733.20", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 73320000.0, + "page": 73, + "line": "i) Revenue from operations 18 7,377.30 733.20", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 98000.0, + "page": 73, + "line": "ii) Other income 19 0.98 41.20", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 4120000.0000000005, + "page": 73, + "line": "ii) Other income 19 0.98 41.20", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 737828000.0, + "page": 73, + "line": "Total Revenue 7,378.28 774.40", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 77440000.0, + "page": 73, + "line": "Total Revenue 7,378.28 774.40", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 706661000.0, + "page": 73, + "line": "i) Cost of material consumed 20 7,066.61 713.56", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "cost_of_materials", + "value": 71356000.0, + "page": 73, + "line": "i) Cost of material consumed 20 7,066.61 713.56", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 1319000.0, + "page": 73, + "line": "ii) Employee benefit expenses 21 13.19 6.59", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "employee_benefits", + "value": 659000.0, + "page": 73, + "line": "ii) Employee benefit expenses 21 13.19 6.59", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 467000.0, + "page": 73, + "line": "iv) Depreciation and amortisation expenses 3 4.67 2.75", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 275000.0, + "page": 73, + "line": "iv) Depreciation and amortisation expenses 3 4.67 2.75", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 5257000.0, + "page": 73, + "line": "v) Other expenses 23 52.57 28.33", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_expenses", + "value": 2833000.0, + "page": 73, + "line": "v) Other expenses 23 52.57 28.33", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 713704000.0, + "page": 73, + "line": "Total expenses (II) 7,137.04 751.23", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 75123000.0, + "page": 73, + "line": "Total expenses (II) 7,137.04 751.23", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 24124000.0, + "page": 73, + "line": "III.Profit before exceptional items and tax 241.24 23.17", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 2317000.0, + "page": 73, + "line": "III.Profit before exceptional items and tax 241.24 23.17", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 6145000.0, + "page": 73, + "line": "i) Current tax 61.45 8.33", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 833000.0, + "page": 73, + "line": "i) Current tax 61.45 8.33", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": -88000.0, + "page": 73, + "line": "iii) Deferred tax (0.88) (0.39)", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": -39000.0, + "page": 73, + "line": "iii) Deferred tax (0.88) (0.39)", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_total": { + "current": { + "field": "tax_total", + "value": 6057000.0, + "page": 73, + "line": "Total Tax expense (VII) 60.57 (3.06)", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_total", + "value": -306000.0, + "page": 73, + "line": "Total Tax expense (VII) 60.57 (3.06)", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 18067000.0, + "page": 73, + "line": "VIII. Profit after tax (VI) - (VII) 180.67 26.23", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pat", + "value": 2623000.0, + "page": 73, + "line": "VIII. Profit after tax (VI) - (VII) 180.67 26.23", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 1.29, + "page": 73, + "line": "Basic (in Rs.) 1.29 0.41", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "eps_basic", + "value": 0.41, + "page": 73, + "line": "Basic (in Rs.) 1.29 0.41", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 1.29, + "page": 73, + "line": "Diluted (in Rs.) 1.29 0.27", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "eps_diluted", + "value": 0.27, + "page": 73, + "line": "Diluted (in Rs.) 1.29 0.27", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + } + }, + "directors_pl": {}, + "balance_sheet": { + "ppe": { + "current": { + "field": "ppe", + "value": 100000.0, + "page": 72, + "line": "a) Property, plant and equipment 3 1 7.56 1 1.83", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "ppe", + "value": 756000.0, + "page": 72, + "line": "a) Property, plant and equipment 3 1 7.56 1 1.83", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "inventories": { + "current": { + "field": "inventories", + "value": 178563000.0, + "page": 72, + "line": "a) Inventories 1 ,785.63 3 3.71", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "inventories", + "value": 300000.0, + "page": 72, + "line": "a) Inventories 1 ,785.63 3 3.71", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "trade_receivables": { + "current": { + "field": "trade_receivables", + "value": 273954000.0, + "page": 72, + "line": "(i) Trade receivables 7 2 ,739.54 1 .26", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "trade_receivables", + "value": 126000.0, + "page": 72, + "line": "(i) Trade receivables 7 2 ,739.54 1 .26", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "cash_and_equivalents": { + "current": { + "field": "cash_and_equivalents", + "value": 7672000.0, + "page": 72, + "line": "(ii) Cash and cash equivalents 8 76.72 140.64", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "cash_and_equivalents", + "value": 14063999.999999998, + "page": 72, + "line": "(ii) Cash and cash equivalents 8 76.72 140.64", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "total_assets": { + "current": { + "field": "total_assets", + "value": 579464000.0, + "page": 72, + "line": "TOTAL ASSETS (I + II) 5 ,794.64 2 ,508.02", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "total_assets", + "value": 250802000.0, + "page": 72, + "line": "TOTAL ASSETS (I + II) 5 ,794.64 2 ,508.02", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "share_capital": { + "current": { + "field": "share_capital", + "value": 153122000.0, + "page": 72, + "line": "a) Equity share capital 11 1,531.22 1,241.22", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "share_capital", + "value": 124122000.0, + "page": 72, + "line": "a) Equity share capital 11 1,531.22 1,241.22", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "reserves_surplus": { + "current": { + "field": "reserves_surplus", + "value": 375747000.0, + "page": 72, + "line": "b) Other equity 12 3,757.47 939.51", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "reserves_surplus", + "value": 93951000.0, + "page": 72, + "line": "b) Other equity 12 3,757.47 939.51", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "short_term_provisions": { + "current": { + "field": "short_term_provisions", + "value": 1500000.0, + "page": 72, + "line": "b) Short-term provisions 15 3.00 -", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "short_term_provisions", + "value": 300000.0, + "page": 72, + "line": "b) Short-term provisions 15 3.00 -", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "other_current_liabilities": { + "current": { + "field": "other_current_liabilities", + "value": 540000.0, + "page": 72, + "line": "c) Other current liabilities 16 5 .40 3 .16", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "other_current_liabilities", + "value": 316000.0, + "page": 72, + "line": "c) Other current liabilities 16 5 .40 3 .16", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "total_equity_liabilities": { + "current": { + "field": "total_equity_liabilities", + "value": 579464000.0, + "page": 72, + "line": "TOTAL LIABILITIES AND EQUITY (I + II + III) 5,794.64 2,508.02", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "total_equity_liabilities", + "value": 250802000.0, + "page": 72, + "line": "TOTAL LIABILITIES AND EQUITY (I + II + III) 5,794.64 2,508.02", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + } + }, + "shareholding": [], + "related_party": [ + { + "label": "(Appointment and Remuneration of Managerial Personnel) Rules,", + "amount": 2014.0, + "page": 39, + "line": "(Appointment and Remuneration of Managerial Personnel) Rules, 2014, is provided in a separate" + }, + { + "label": "", + "amount": 26.0, + "page": 39, + "line": "26. DIRECTORS\u2019 RESPONSIBILITY STATEMENT:" + } + ], + "auditors": [ + "Auditing, issued by the Institute of Chartered Accountants of India (\u201cICAI\u201d) and deemed to be prescribed", + "Chartered Accountants", + "Chartered Accountants AAYUSH ART AND BULLION LIMITED", + "Controls over Financial Reporting issued by the Institute of Chartered Accountants of India. These" + ], + "page_index": { + "pl": [ + 60, + 63, + 73, + 77 + ], + "directors_report": [ + 61, + 89 + ], + "balance_sheet": [ + 60, + 72 + ], + "shareholding": [], + "related_party": [ + 39, + 47, + 68, + 83 + ] + }, + "warnings": [], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [ + "total assets = total equity and liabilities" + ], + "statement_pages": { + "audited_pl": 73, + "directors_report": 0 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/543172.json b/app/backend/primarydraft/data/companies/543172.json new file mode 100644 index 0000000000000000000000000000000000000000..ee26eece4fb174f4ffccbe5634150920c07147bc --- /dev/null +++ b/app/backend/primarydraft/data/companies/543172.json @@ -0,0 +1,731 @@ +{ + "scrip_code": "543172", + "bse": { + "scrip_name": "Cospower Engineering Ltd", + "issuer_name": "Cospower Engineering Limited", + "group": "MT", + "segment": "Equity", + "isin": "INE0CQB01010", + "face_value": "10.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Capital Goods", + "market_cap": "350.77", + "eps_reported": "70.91", + "pe_reported": "26.94", + "security_id": "COSPOWER" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/b6a1f14d-481a-4eee-918f-cd0ccbb1449f.pdf", + "authorised_at": null, + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543172_2025.pdf", + "available_years": [ + "2025", + "2025", + "2024", + "2023", + "2022", + "2022", + "2021", + "2020" + ] + }, + "extraction": { + "scrip_code": "543172", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543172_2025.pdf", + "pages": 92, + "cin": "L31908MH2010PLC208016", + "isin": null, + "company_name": "For Cospower Engineering Limited", + "emails": [ + "cfo@cel.net.in", + "contact@cel.net.in", + "cs@cel.net.in", + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "info@csjmco.com" + ], + "dins": [ + "02711251", + "02880294", + "06699876" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 277015000.0, + "page": 72, + "line": "I.Revenue from operations 21 2 ,770.15 2 ,229.27", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 222927000.0, + "page": 72, + "line": "I.Revenue from operations 21 2 ,770.15 2 ,229.27", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 400000.0, + "page": 72, + "line": "II.Other income 22 4 0.70 6 1.12", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 70000.0, + "page": 72, + "line": "II.Other income 22 4 0.70 6 1.12", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 281086000.0, + "page": 72, + "line": "III.Total Income (I + II) 2,810.86 2,290.39", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 229039000.0, + "page": 72, + "line": "III.Total Income (I + II) 2,810.86 2,290.39", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 219212000.0, + "page": 72, + "line": "Cost of Raw Material Consumed 23 2 ,192.12 1 ,591.64", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "cost_of_materials", + "value": 159164000.0, + "page": 72, + "line": "Cost of Raw Material Consumed 23 2 ,192.12 1 ,591.64", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 21565000.0, + "page": 72, + "line": "Employee benefit expense 25 215.65 217.71", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "employee_benefits", + "value": 21771000.0, + "page": 72, + "line": "Employee benefit expense 25 215.65 217.71", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 23569000.0, + "page": 72, + "line": "Finance costs 26 235.69 187.55", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 18755000.0, + "page": 72, + "line": "Finance costs 26 235.69 187.55", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 18701000.0, + "page": 72, + "line": "Depreciation and amortization 27 187.01 176.54", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 17654000.0, + "page": 72, + "line": "Depreciation and amortization 27 187.01 176.54", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 38873000.0, + "page": 72, + "line": "Other expenses 28 388.73 299.10", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_expenses", + "value": 29910000.000000004, + "page": 72, + "line": "Other expenses 28 388.73 299.10", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 259723999.99999997, + "page": 72, + "line": "Total expenses 2,597.24 2,270.84", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 227084000.0, + "page": 72, + "line": "Total expenses 2,597.24 2,270.84", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 21362000.0, + "page": 72, + "line": "V.Profit before exceptional and extraordinary items and tax (III-IV) 213.62 19.56", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 1955999.9999999998, + "page": 72, + "line": "V.Profit before exceptional and extraordinary items and tax (III-IV) 213.62 19.56", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_total": { + "current": { + "field": "tax_total", + "value": 6497000.0, + "page": 72, + "line": "Total Tax Expense 64.97 8.08", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_total", + "value": 808000.0, + "page": 72, + "line": "Total Tax Expense 64.97 8.08", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 15328000.0, + "page": 72, + "line": "XIProfit (Loss) for the period from continuing operations (VII-VIII) 153.28 11.48", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pat", + "value": 1148000.0, + "page": 72, + "line": "XIProfit (Loss) for the period from continuing operations (VII-VIII) 153.28 11.48", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + } + }, + "directors_pl": {}, + "balance_sheet": { + "share_capital": { + "current": { + "field": "share_capital", + "value": 16744999.999999998, + "page": 71, + "line": "(a) Share capital 2 167.45 150.00", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "share_capital", + "value": 15000000.0, + "page": 71, + "line": "(a) Share capital 2 167.45 150.00", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "reserves_surplus": { + "current": { + "field": "reserves_surplus", + "value": 165034000.0, + "page": 71, + "line": "(b) Reserves and surplus 3 1,650.34 572.21", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "reserves_surplus", + "value": 57221000.0, + "page": 71, + "line": "(b) Reserves and surplus 3 1,650.34 572.21", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "borrowings_non_current": { + "current": { + "field": "borrowings_non_current", + "value": 93113000.0, + "page": 71, + "line": "(a) Long-term borrowings 4 931.13 1,109.29", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "borrowings_non_current", + "value": 110929000.0, + "page": 71, + "line": "(a) Long-term borrowings 4 931.13 1,109.29", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "borrowings_current": { + "current": { + "field": "borrowings_current", + "value": 89531000.0, + "page": 71, + "line": "(a) Short-term borrowings 7 895.31 847.85", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "borrowings_current", + "value": 84785000.0, + "page": 71, + "line": "(a) Short-term borrowings 7 895.31 847.85", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "other_current_liabilities": { + "current": { + "field": "other_current_liabilities", + "value": 36574000.0, + "page": 71, + "line": "(c) Other current liabilities 9 365.74 126.40", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "other_current_liabilities", + "value": 12640000.0, + "page": 71, + "line": "(c) Other current liabilities 9 365.74 126.40", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "short_term_provisions": { + "current": { + "field": "short_term_provisions", + "value": 23859000.0, + "page": 71, + "line": "(d) Short-term provisions 10 238.59 1 25.35", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "short_term_provisions", + "value": 100000.0, + "page": 71, + "line": "(d) Short-term provisions 10 238.59 1 25.35", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "total_equity_liabilities": { + "current": { + "field": "total_equity_liabilities", + "value": 534653000.0, + "page": 71, + "line": "TOTAL 5,346.53 3,483.93", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "total_equity_liabilities", + "value": 348393000.0, + "page": 71, + "line": "TOTAL 5,346.53 3,483.93", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "ppe": { + "current": { + "field": "ppe", + "value": 115199000.0, + "page": 71, + "line": "(i) Tangible assets 1,151.99 1,165.69", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "ppe", + "value": 116569000.0, + "page": 71, + "line": "(i) Tangible assets 1,151.99 1,165.69", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "long_term_loans_advances": { + "current": { + "field": "long_term_loans_advances", + "value": 1018000.0, + "page": 71, + "line": "(b) Long-term loans and advances 12 10.18 9.83", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "long_term_loans_advances", + "value": 983000.0, + "page": 71, + "line": "(b) Long-term loans and advances 12 10.18 9.83", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "trade_receivables": { + "current": { + "field": "trade_receivables", + "value": 16738000.0, + "page": 71, + "line": "(c) Trade receivables - non current 13 167.38 236.52", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "trade_receivables", + "value": 23652000.0, + "page": 71, + "line": "(c) Trade receivables - non current 13 167.38 236.52", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "inventories": { + "current": { + "field": "inventories", + "value": 182415000.0, + "page": 71, + "line": "(a) Inventories 16 1,824.15 1,183.82", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "inventories", + "value": 118382000.0, + "page": 71, + "line": "(a) Inventories 16 1,824.15 1,183.82", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "cash_and_equivalents": { + "current": { + "field": "cash_and_equivalents", + "value": 87940000.0, + "page": 71, + "line": "(c) Cash and cash equivalents 18 879.40 24.26", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "cash_and_equivalents", + "value": 2426000.0, + "page": 71, + "line": "(c) Cash and cash equivalents 18 879.40 24.26", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "total_assets": { + "current": { + "field": "total_assets", + "value": 534653000.0, + "page": 71, + "line": "TOTAL 5,346.53 3,483.93", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "total_assets", + "value": 348393000.0, + "page": 71, + "line": "TOTAL 5,346.53 3,483.93", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + } + }, + "shareholding": [], + "related_party": [ + { + "label": "", + "amount": 2014.0, + "page": 23, + "line": "2014 is furnished as Annexure A to Director\u2019s Report." + }, + { + "label": "", + "amount": 12.0, + "page": 23, + "line": "12. PARTICULARS OF LOANS, GUARANTEES OR INVESTMENTS MADE UNDER SECTION 186 OF THE" + }, + { + "label": "", + "amount": 17.0, + "page": 23, + "line": "17. DIRECTORS\u2019 RESPONSIBILITY STATEMENT" + }, + { + "label": "In terms of Section", + "amount": 134.0, + "page": 23, + "line": "In terms of Section 134(5) of the Companies Act, 2013 The Board of Directors of the Company hereby confirm:" + }, + { + "label": "", + "amount": 1.0, + "page": 31, + "line": "1. Name (s) of the related party & nature of relationship Oswald D'Souza Director" + }, + { + "label": "", + "amount": 3.0, + "page": 31, + "line": "3. Nature of contracts/arrangements/transaction Director Remuneration" + }, + { + "label": "", + "amount": 7.0, + "page": 31, + "line": "7. Amount paid as advances, if any" + }, + { + "label": "", + "amount": 1.0, + "page": 31, + "line": "1. Name (s) of the related party & nature of relationship Felix Shridhar Kadam Director" + }, + { + "label": "", + "amount": 3.0, + "page": 31, + "line": "3. Nature of contracts/arrangements/transaction Director Remuneration" + }, + { + "label": "", + "amount": 7.0, + "page": 31, + "line": "7. Amount paid as advances, if any" + }, + { + "label": "", + "amount": 1.0, + "page": 31, + "line": "1. Name (s) of the related party & nature of relationship Janet Dsouza Director" + }, + { + "label": "", + "amount": 3.0, + "page": 31, + "line": "3. Nature of contracts/arrangements/transaction Director Remuneration" + }, + { + "label": "", + "amount": 7.0, + "page": 31, + "line": "7. Amount paid as advances, if any" + }, + { + "label": "", + "amount": 3.0, + "page": 31, + "line": "3. Nature of contracts/arrangements/transaction Director Remuneration" + }, + { + "label": "", + "amount": 7.0, + "page": 31, + "line": "7. Amount paid as advances, if any" + }, + { + "label": "", + "amount": 1.0, + "page": 89, + "line": "1. Oswald Rosario Dsouza Whole Time Director" + }, + { + "label": "", + "amount": 2.0, + "page": 89, + "line": "2. Felix Shridhar Kadam Managing Director" + }, + { + "label": "", + "amount": 3.0, + "page": 89, + "line": "3. Christbell Felix Kadam Director" + }, + { + "label": "", + "amount": 4.0, + "page": 89, + "line": "4. Janet Dsouza Director" + }, + { + "label": "", + "amount": 5.0, + "page": 89, + "line": "5. Edwin E R Cotta Director" + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants (CIN: L31908MH2010PLC208016)", + "Financial Controls Over Financial Reporting issued by the Institute of Chartered Accountants of India.", + "M/s. NBT & Co (Formerly known as A. Biyani & Co)., Chartered Accountants, Mumbai were appointed as statutory" + ], + "page_index": { + "pl": [ + 4, + 62, + 64, + 72, + 74, + 75, + 76, + 77, + 78, + 80, + 85 + ], + "directors_report": [ + 27, + 34 + ], + "balance_sheet": [ + 62, + 71 + ], + "shareholding": [], + "related_party": [ + 23, + 31, + 89 + ] + }, + "warnings": [], + "audited_pl_identities": [ + "pbt = total_income - total_expenses" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [ + "total assets = total equity and liabilities" + ], + "statement_pages": { + "audited_pl": 72, + "directors_report": 0 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/543363.json b/app/backend/primarydraft/data/companies/543363.json new file mode 100644 index 0000000000000000000000000000000000000000..0c2e90198f99eb85d326dcba0872ce6ec1caffd7 --- /dev/null +++ b/app/backend/primarydraft/data/companies/543363.json @@ -0,0 +1,621 @@ +{ + "scrip_code": "543363", + "bse": { + "scrip_name": "Prevest Denpro Ltd", + "issuer_name": "Prevest Denpro Limited", + "group": "M", + "segment": "Equity", + "isin": "INE0GAO01018", + "face_value": "10.00", + "industry": "", + "sector": "Healthcare", + "industry_new": "Healthcare", + "market_cap": "457.07", + "eps_reported": "17.84", + "pe_reported": "21.35", + "security_id": "PREVEST" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/03f23d79-13f1-470e-a04d-f5d4aa47ad3d.pdf", + "authorised_at": "2025-08-14T18:16:19.41", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543363_2025.pdf", + "available_years": [ + "2025", + "2024", + "2023", + "2022" + ] + }, + "extraction": { + "scrip_code": "543363", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543363_2025.pdf", + "pages": 177, + "cin": "L85199JK1999PLC001969", + "isin": "INE0GAO01018", + "company_name": "1 Name Of The Company Prevest Denpro Limited", + "emails": [ + "cs@prevestdenpro.com", + "csnikitakedia@gmail.com", + "customercare@prevestdenpro.com", + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "info@prevestdenpro.com" + ], + "dins": [ + "00788266", + "00788272", + "07330470" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 630677000.0, + "page": 112, + "line": "Revenue from Operations 16 6,306.77 5,643.98", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "revenue_from_operations", + "value": 564398000.0, + "page": 112, + "line": "Revenue from Operations 16 6,306.77 5,643.98", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 41099000.0, + "page": 112, + "line": "Other Incomes 17 410.99 286.16", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "other_income", + "value": 28616000.000000004, + "page": 112, + "line": "Other Incomes 17 410.99 286.16", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 671776000.0, + "page": 112, + "line": "Total Income 6,717.76 5,930.14", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "total_income", + "value": 593014000.0, + "page": 112, + "line": "Total Income 6,717.76 5,930.14", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 140792000.0, + "page": 112, + "line": "Cost of Raw Materials Consumed 18 1 ,407.92 1 ,417.33", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "cost_of_materials", + "value": 141733000.0, + "page": 112, + "line": "Cost of Raw Materials Consumed 18 1 ,407.92 1 ,417.33", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 102652000.0, + "page": 112, + "line": "Employee Benefits Expenses 20 1 ,026.52 9 53.99", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "employee_benefits", + "value": 900000.0, + "page": 112, + "line": "Employee Benefits Expenses 20 1 ,026.52 9 53.99", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 100000.0, + "page": 112, + "line": "Depreciation and amortization expenses 21 1 90.20 1 27.63", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "depreciation", + "value": 9020000.0, + "page": 112, + "line": "Depreciation and amortization expenses 21 1 90.20 1 27.63", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 169151000.0, + "page": 112, + "line": "Other Expenses 22 1,691.51 1,307.72", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "other_expenses", + "value": 130772000.0, + "page": 112, + "line": "Other Expenses 22 1,691.51 1,307.72", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 429049000.0, + "page": 112, + "line": "Total Expenses 4,290.49 3,788.69", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "total_expenses", + "value": 378869000.0, + "page": 112, + "line": "Total Expenses 4,290.49 3,788.69", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 242727000.0, + "page": 112, + "line": "III Profit before Exceptional Items & Tax 2,427.27 2,141.46", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "pbt", + "value": 214146000.0, + "page": 112, + "line": "III Profit before Exceptional Items & Tax 2,427.27 2,141.46", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "pat": { + "current": { + "field": "pat", + "value": 182013000.0, + "page": 112, + "line": "VI Profit for the period 1,820.13 1,612.37", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "pat", + "value": 161237000.0, + "page": 112, + "line": "VI Profit for the period 1,820.13 1,612.37", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 15.16, + "page": 112, + "line": "Basic & Diluted 23 15.16 13.44", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "eps_basic", + "value": 13.44, + "page": 112, + "line": "Basic & Diluted 23 15.16 13.44", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + } + }, + "directors_pl": {}, + "balance_sheet": { + "share_capital": { + "current": { + "field": "share_capital", + "value": 120030000.0, + "page": 111, + "line": "a.Share Capital 2 1 ,200.30 1 ,200.30", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "share_capital", + "value": 120030000.0, + "page": 111, + "line": "a.Share Capital 2 1 ,200.30 1 ,200.30", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "reserves_surplus": { + "current": { + "field": "reserves_surplus", + "value": 936021999.9999999, + "page": 111, + "line": "b.Reserves and Surplus 3 9 ,360.22 7 ,660.12", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "reserves_surplus", + "value": 766012000.0, + "page": 111, + "line": "b.Reserves and Surplus 3 9 ,360.22 7 ,660.12", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "deferred_tax_liability": { + "current": { + "field": "deferred_tax_liability", + "value": 900000.0, + "page": 111, + "line": "b.Deferred Tax Liabilities (net) 4 9 9.51 68.69", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "deferred_tax_liability", + "value": 951000.0, + "page": 111, + "line": "b.Deferred Tax Liabilities (net) 4 9 9.51 68.69", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "other_current_liabilities": { + "current": { + "field": "other_current_liabilities", + "value": 400000.0, + "page": 111, + "line": "c.Other Current Liabilities 6 4 38.10 3 87.10", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "other_current_liabilities", + "value": 3810000.0, + "page": 111, + "line": "c.Other Current Liabilities 6 4 38.10 3 87.10", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "short_term_provisions": { + "current": { + "field": "short_term_provisions", + "value": 897000.0000000001, + "page": 111, + "line": "d.Short Term Provisions 7 8 .97 3 5.29", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "short_term_provisions", + "value": 300000.0, + "page": 111, + "line": "d.Short Term Provisions 7 8 .97 3 5.29", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "total_equity_liabilities": { + "current": { + "field": "total_equity_liabilities", + "value": 1126748000.0, + "page": 111, + "line": "Total 11,267.48 9,481.44", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "total_equity_liabilities", + "value": 948144000.0, + "page": 111, + "line": "Total 11,267.48 9,481.44", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "non_current_investments": { + "current": { + "field": "non_current_investments", + "value": 4772000.0, + "page": 111, + "line": "b.Non-Current Investments 9 47.72 5.00", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "non_current_investments", + "value": 500000.0, + "page": 111, + "line": "b.Non-Current Investments 9 47.72 5.00", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "current_investments": { + "current": { + "field": "current_investments", + "value": 47004000.0, + "page": 111, + "line": "a.Current Investments 10 470.04 165.90", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "current_investments", + "value": 16590000.0, + "page": 111, + "line": "a.Current Investments 10 470.04 165.90", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "inventories": { + "current": { + "field": "inventories", + "value": 700000.0, + "page": 111, + "line": "b.Inventories 11 7 89.38 6 22.04", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "inventories", + "value": 8938000.0, + "page": 111, + "line": "b.Inventories 11 7 89.38 6 22.04", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "trade_receivables": { + "current": { + "field": "trade_receivables", + "value": 78112000.0, + "page": 111, + "line": "c.Trade Receivables 12 781.12 816.93", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "trade_receivables", + "value": 81693000.0, + "page": 111, + "line": "c.Trade Receivables 12 781.12 816.93", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "cash_and_equivalents": { + "current": { + "field": "cash_and_equivalents", + "value": 604629000.0, + "page": 111, + "line": "d.Cash and Cash Equivalents 13 6 ,046.29 4 ,842.79", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "cash_and_equivalents", + "value": 484279000.0, + "page": 111, + "line": "d.Cash and Cash Equivalents 13 6 ,046.29 4 ,842.79", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "total_assets": { + "current": { + "field": "total_assets", + "value": 1126748000.0, + "page": 111, + "line": "Total 11,267.48 9,481.44", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "total_assets", + "value": 948144000.0, + "page": 111, + "line": "Total 11,267.48 9,481.44", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + } + }, + "shareholding": [], + "related_party": [ + { + "label": "a. in current accounts", + "amount": 172.47, + "page": 118, + "line": "a. in current accounts 172.47 668.43" + }, + { + "label": "Note", + "amount": -14.0, + "page": 118, + "line": "Note-14: Short Term Loans & Advances" + }, + { + "label": "Advances to Suppliers", + "amount": 204.89, + "page": 118, + "line": "Advances to Suppliers 204.89 1 09.20" + }, + { + "label": "Advances to employee", + "amount": 5.15, + "page": 118, + "line": "Advances to employee 5.15 3 .02" + }, + { + "label": "Advances to Related Party*", + "amount": 12.85, + "page": 118, + "line": "Advances to Related Party* 12.85 1 2.51" + }, + { + "label": "Note", + "amount": -15.0, + "page": 118, + "line": "Note-15: Other Current Assets" + }, + { + "label": "Advance Income Tax & TDS (net of provision for income tax)", + "amount": -9.26, + "page": 118, + "line": "Advance Income Tax & TDS (net of provision for income tax) - 9 .26" + } + ], + "auditors": [ + "Chartered Accountant", + "Chartered Accountants", + "For Mittal & AssociatesChartered Accountants", + "For Mittal & AssociatesChartered Accountants For and on behalf of the Board of Directors" + ], + "page_index": { + "pl": [ + 98, + 112, + 120, + 132, + 140, + 152, + 153, + 155, + 157, + 158, + 160, + 161 + ], + "directors_report": [ + 12, + 67, + 108, + 162, + 173 + ], + "balance_sheet": [ + 98, + 111, + 131, + 161 + ], + "shareholding": [], + "related_party": [ + 77, + 78, + 118, + 122, + 123, + 142 + ] + }, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld." + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [ + "total assets = total equity and liabilities" + ], + "statement_pages": { + "audited_pl": 112, + "directors_report": 67 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/543378.json b/app/backend/primarydraft/data/companies/543378.json new file mode 100644 index 0000000000000000000000000000000000000000..9ae08cd9c1e485c5ff965c070fc4f89953cc0e03 --- /dev/null +++ b/app/backend/primarydraft/data/companies/543378.json @@ -0,0 +1,775 @@ +{ + "scrip_code": "543378", + "bse": { + "scrip_name": "CWD Ltd", + "issuer_name": "CWD Limited", + "group": "MS", + "segment": "Equity", + "isin": "INE0H8H01019", + "face_value": "10.00", + "industry": "", + "sector": "Consumer Discretionary", + "industry_new": "Consumer Durables", + "market_cap": "766.63", + "eps_reported": "-", + "pe_reported": "-", + "security_id": "CWD" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/430163db-d947-476d-9a08-63f744321eb5.pdf", + "authorised_at": null, + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543378_2025.pdf", + "available_years": [ + "2025", + "2025", + "2024", + "2023", + "2023", + "2022" + ] + }, + "extraction": { + "scrip_code": "543378", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543378_2025.pdf", + "pages": 142, + "cin": "U31900MH2016PLC281796", + "isin": null, + "company_name": "For Cwd Limited", + "emails": [ + "compliance@cwdin.com", + "csmayurirupareliya@gmail.com", + "einward.ris@kfintech.com", + "evoting@nsdl.co.in", + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com" + ], + "dins": [ + "01308288", + "03166884" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 329032000.0, + "page": 82, + "line": "I. Revenue from operations 21 3,290.32 2,098.05", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "revenue_from_operations", + "value": 209805000.00000003, + "page": 82, + "line": "I. Revenue from operations 21 3,290.32 2,098.05", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 9161000.0, + "page": 82, + "line": "II. Other Income 22 91.61 27.74", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "other_income", + "value": 2774000.0, + "page": 82, + "line": "II. Other Income 22 91.61 27.74", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 338193000.0, + "page": 82, + "line": "III. Total Income (I + II) 3,381.93 2,125.79", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "total_income", + "value": 212579000.0, + "page": 82, + "line": "III. Total Income (I + II) 3,381.93 2,125.79", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 125566000.00000001, + "page": 82, + "line": "Cost of material consumed 23 1 ,255.66 1 ,112.39", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "cost_of_materials", + "value": 111239000.00000001, + "page": 82, + "line": "Cost of material consumed 23 1 ,255.66 1 ,112.39", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 45137000.0, + "page": 82, + "line": "Employee benefits expenses 25 451.37 271.58", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "employee_benefits", + "value": 27158000.0, + "page": 82, + "line": "Employee benefits expenses 25 451.37 271.58", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 29020000.0, + "page": 82, + "line": "Depreciation and amortization expens 12 290.20 292.02", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "depreciation", + "value": 29202000.0, + "page": 82, + "line": "Depreciation and amortization expens 12 290.20 292.02", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 16948000.0, + "page": 82, + "line": "Financial cost 26 169.48 108.02", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "finance_costs", + "value": 10802000.0, + "page": 82, + "line": "Financial cost 26 169.48 108.02", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 92584000.0, + "page": 82, + "line": "Other expenses 27 925.84 188.07", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "other_expenses", + "value": 18807000.0, + "page": 82, + "line": "Other expenses 27 925.84 188.07", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 303697000.0, + "page": 82, + "line": "Total expenses 3,036.97 1,965.96", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "total_expenses", + "value": 196596000.0, + "page": 82, + "line": "Total expenses 3,036.97 1,965.96", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 34496000.0, + "page": 82, + "line": "VII. Profit before tax (V \u2010 VI) 344.96 159.83", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "pbt", + "value": 15983000.000000002, + "page": 82, + "line": "VII. Profit before tax (V \u2010 VI) 344.96 159.83", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + } + }, + "directors_pl": { + "total_income": { + "current": { + "field": "total_income", + "value": 338193000.0, + "page": 18, + "line": "Total Income 3381.93 2125.79 3381.93 2125.79", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 212579000.0, + "page": 18, + "line": "Total Income 3381.93 2125.79 3381.93 2125.79", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 29020000.0, + "page": 18, + "line": "Less: Depreciation 290.20 292.02 290.20 292.02", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 29202000.0, + "page": 18, + "line": "Less: Depreciation 290.20 292.02 290.20 292.02", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 34473000.0, + "page": 18, + "line": "Profit before Tax 344.73 159.83 344.96 159.83", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 15983000.000000002, + "page": 18, + "line": "Profit before Tax 344.73 159.83 344.96 159.83", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": -27574000.0, + "page": 18, + "line": "Current Tax (275.74) (50.60) (275.74) (50.60)", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": -5060000.0, + "page": 18, + "line": "Current Tax (275.74) (50.60) (275.74) (50.60)", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 18182000.0, + "page": 18, + "line": "Deferred Tax 181.82 4.07 181.82 4.07", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": 407000.0, + "page": 18, + "line": "Deferred Tax 181.82 4.07 181.82 4.07", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 25081000.0, + "page": 18, + "line": "Profit after Tax 250.81 113.30 251.04 113.30", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pat", + "value": 11330000.0, + "page": 18, + "line": "Profit after Tax 250.81 113.30 251.04 113.30", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": { + "share_capital": { + "current": { + "field": "share_capital", + "value": 37973000.0, + "page": 81, + "line": "(a) Share capital 3 379.73 361.14", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "share_capital", + "value": 36114000.0, + "page": 81, + "line": "(a) Share capital 3 379.73 361.14", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "reserves_surplus": { + "current": { + "field": "reserves_surplus", + "value": 315394000.0, + "page": 81, + "line": "(b) Reserves and surplus 4 3,153.94 1,865.19", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "reserves_surplus", + "value": 186519000.0, + "page": 81, + "line": "(b) Reserves and surplus 4 3,153.94 1,865.19", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "borrowings_non_current": { + "current": { + "field": "borrowings_non_current", + "value": 35228000.0, + "page": 81, + "line": "(a) Long-term borrowings 5 352.28 266.73", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "borrowings_non_current", + "value": 26673000.0, + "page": 81, + "line": "(a) Long-term borrowings 5 352.28 266.73", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "deferred_tax_liability": { + "current": { + "field": "deferred_tax_liability", + "value": 600000.0, + "page": 81, + "line": "(b) Deferred tax liability 6 21.15", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "deferred_tax_liability", + "value": 2115000.0, + "page": 81, + "line": "(b) Deferred tax liability 6 21.15", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "borrowings_current": { + "current": { + "field": "borrowings_current", + "value": 50391000.0, + "page": 81, + "line": "(a) Short-term borrowings 8 503.91 884.02", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "borrowings_current", + "value": 88402000.0, + "page": 81, + "line": "(a) Short-term borrowings 8 503.91 884.02", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "other_current_liabilities": { + "current": { + "field": "other_current_liabilities", + "value": 13994000.0, + "page": 81, + "line": "(c) Other current liabilities 10 139.94 321.81", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "other_current_liabilities", + "value": 32181000.0, + "page": 81, + "line": "(c) Other current liabilities 10 139.94 321.81", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "short_term_provisions": { + "current": { + "field": "short_term_provisions", + "value": 200000.0, + "page": 81, + "line": "(d) Short-term provisions 11 2 85.83 79.14", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "short_term_provisions", + "value": 8583000.0, + "page": 81, + "line": "(d) Short-term provisions 11 2 85.83 79.14", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "total_equity_liabilities": { + "current": { + "field": "total_equity_liabilities", + "value": 836171999.9999999, + "page": 81, + "line": "TOTAL 8 ,361.72 4 ,513.25", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "total_equity_liabilities", + "value": 451325000.0, + "page": 81, + "line": "TOTAL 8 ,361.72 4 ,513.25", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "ppe": { + "current": { + "field": "ppe", + "value": 300000.0, + "page": 81, + "line": "(i) Tangible assets 12A 3 92.77 2 58.04", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "ppe", + "value": 9277000.0, + "page": 81, + "line": "(i) Tangible assets 12A 3 92.77 2 58.04", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "current_investments": { + "current": { + "field": "current_investments", + "value": 392000.0, + "page": 81, + "line": "(c) Non- current investments 13 3 .92 2 .92", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "current_investments", + "value": 292000.0, + "page": 81, + "line": "(c) Non- current investments 13 3 .92 2 .92", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "inventories": { + "current": { + "field": "inventories", + "value": 186092000.0, + "page": 81, + "line": "(b) Inventories 16 1,860.92 1,046.78", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "inventories", + "value": 104678000.0, + "page": 81, + "line": "(b) Inventories 16 1,860.92 1,046.78", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "trade_receivables": { + "current": { + "field": "trade_receivables", + "value": 161863000.0, + "page": 81, + "line": "(c) Trade receivables 17 1,618.63 1,233.89", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "trade_receivables", + "value": 123389000.00000001, + "page": 81, + "line": "(c) Trade receivables 17 1,618.63 1,233.89", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "cash_and_equivalents": { + "current": { + "field": "cash_and_equivalents", + "value": 272455000.0, + "page": 81, + "line": "(d) Cash and cash equivalents 18 2,724.55 533.57", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "cash_and_equivalents", + "value": 53357000.00000001, + "page": 81, + "line": "(d) Cash and cash equivalents 18 2,724.55 533.57", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "total_assets": { + "current": { + "field": "total_assets", + "value": 836171999.9999999, + "page": 81, + "line": "TOTAL 8 ,361.72 4 ,513.24", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "total_assets", + "value": 451324000.0, + "page": 81, + "line": "TOTAL 8 ,361.72 4 ,513.24", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + } + }, + "shareholding": [], + "related_party": [ + { + "label": "", + "amount": 1.0, + "page": 24, + "line": "1 Mr. Parvin Kharwa Independent Director Chairman 03 out of 03" + }, + { + "label": "", + "amount": 2.0, + "page": 24, + "line": "2 Jt. Managing Director & Member 03 out of 03" + }, + { + "label": "", + "amount": 3.0, + "page": 24, + "line": "3 Ms. Himani Bhootra Director Member 03 out of 03" + }, + { + "label": "In compliance with Section", + "amount": 178.0, + "page": 24, + "line": "In compliance with Section 178 of the Act, the Board has constituted the Nomination and Remuneration" + }, + { + "label": "", + "amount": 2.0, + "page": 24, + "line": "2 Ms. Himani Bhootra Director Member 03 out of 03" + }, + { + "label": "", + "amount": 3.0, + "page": 24, + "line": "3 Mrs. Amishi Kothari Non-Executive Director Member 03 out of 03" + }, + { + "label": "", + "amount": 30.0, + "page": 28, + "line": "30. PARTICULARS OF EMPLOYEES AND REMUNERATION" + }, + { + "label": "Disclosures pertaining to remuneration and other details as required under Section", + "amount": 197.0, + "page": 28, + "line": "Disclosures pertaining to remuneration and other details as required under Section 197(12) of the Act" + }, + { + "label": "read with Rule", + "amount": 5.0, + "page": 28, + "line": "read with Rule 5(1) of the Companies (Appointment and Remuneration of Managerial Personnel) Rules," + }, + { + "label": "", + "amount": 5.0, + "page": 28, + "line": "5(2) of the Companies (Appointment and Remuneration) Rules, 2014." + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants CWD Limited", + "Chartered Accountants Chartered Accountants", + "Chartered Accountants Limited" + ], + "page_index": { + "pl": [ + 65, + 69, + 82, + 88, + 90, + 104, + 109, + 116, + 124, + 127 + ], + "directors_report": [ + 18, + 67, + 106 + ], + "balance_sheet": [ + 65, + 81, + 115 + ], + "shareholding": [], + "related_party": [ + 24, + 28, + 77, + 99, + 138 + ] + }, + "warnings": [], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "directors_pl_identities": [ + "pat = pbt - tax" + ], + "balance_sheet_identities": [ + "total assets = total equity and liabilities" + ], + "statement_pages": { + "audited_pl": 82, + "directors_report": 18 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/543391.json b/app/backend/primarydraft/data/companies/543391.json new file mode 100644 index 0000000000000000000000000000000000000000..0a1e574a7ef1f7d7f5904bb7ddc724c5729d3a6f --- /dev/null +++ b/app/backend/primarydraft/data/companies/543391.json @@ -0,0 +1,345 @@ +{ + "scrip_code": "543391", + "bse": { + "scrip_name": "Suyog Gurbaxani Funicular Ropeways Ltd", + "issuer_name": "Suyog Gurbaxani Funicular Ropeways Limited", + "group": "M", + "segment": "Equity", + "isin": "INE07GA01011", + "face_value": "10.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Construction", + "market_cap": "236.19", + "eps_reported": "4.16", + "pe_reported": "22.84", + "security_id": "SGFRL" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/3d2c6eaa-dc20-4976-a3cb-253fd0be507b.pdf", + "authorised_at": null, + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543391_2025.pdf", + "available_years": [ + "2025", + "2025", + "2024", + "2024", + "2023", + "2022" + ] + }, + "extraction": { + "scrip_code": "543391", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543391_2025.pdf", + "pages": 83, + "cin": "L45203MH2010PLC200005", + "isin": null, + "company_name": "Bse Limited", + "emails": [ + "amruta@csamrutagiradkar.com", + "einward.ris@kfintech.com", + "evoting@nsdl.co.in", + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "investor@sgfrl.com" + ], + "dins": [ + "00324101", + "00324142", + "02090972", + "07921070" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 5300847.88, + "page": 64, + "line": "I. Revenue from Operations 17 5,300,847.88 6,311,893.51", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 6311893.51, + "page": 64, + "line": "I. Revenue from Operations 17 5,300,847.88 6,311,893.51", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 1166.16, + "page": 64, + "line": "II. Other Income 18 1,166.16 5,042.53", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 5042.53, + "page": 64, + "line": "II. Other Income 18 1,166.16 5,042.53", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 5302014.04, + "page": 64, + "line": "III. Total Income ( I + II ) ` \u2026\u2026 5,302,014.04 6,316,936.04", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 6316936.04, + "page": 64, + "line": "III. Total Income ( I + II ) ` \u2026\u2026 5,302,014.04 6,316,936.04", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 725711.3, + "page": 64, + "line": "Employee Benefits Expenses 20 725,711.30 498,863.26", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "employee_benefits", + "value": 498863.26, + "page": 64, + "line": "Employee Benefits Expenses 20 725,711.30 498,863.26", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 273705.44, + "page": 64, + "line": "Finance Costs 21 273,705.44 710,733.30", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 710733.3, + "page": 64, + "line": "Finance Costs 21 273,705.44 710,733.30", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 660314.92, + "page": 64, + "line": "Depreciation and Amortization 22 660,314.92 21,672.37", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 21672.37, + "page": 64, + "line": "Depreciation and Amortization 22 660,314.92 21,672.37", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 2591375.24, + "page": 64, + "line": "Other Expenses 23 2,591,375.24 4,628,907.94", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_expenses", + "value": 4628907.94, + "page": 64, + "line": "Other Expenses 23 2,591,375.24 4,628,907.94", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 4485473.45, + "page": 64, + "line": "Total Expenses ` \u2026\u2026. 4,485,473.45 5,532,961.84", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 5532961.84, + "page": 64, + "line": "Total Expenses ` \u2026\u2026. 4,485,473.45 5,532,961.84", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 816540.59, + "page": 64, + "line": "IX. Profit Before Tax ( VII - VIII ) 816,540.59 783,974.20", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 783974.2, + "page": 64, + "line": "IX. Profit Before Tax ( VII - VIII ) 816,540.59 783,974.20", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 869126.5, + "page": 64, + "line": "XV. Profit/(Loss) for the period ( XI + XIV ) 869,126.50 558,527.77", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pat", + "value": 558527.77, + "page": 64, + "line": "XV. Profit/(Loss) for the period ( XI + XIV ) 869,126.50 558,527.77", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + } + }, + "directors_pl": {}, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "Your Company has taken loan from the Directors during the year", + "amount": 2024.0, + "page": 31, + "line": "Your Company has taken loan from the Directors during the year 2024-2025 and details are given in the Notes to" + }, + { + "label": "As on March", + "amount": 31.0, + "page": 32, + "line": "As on March 31, 2025, the Board of Directors of your Company comprises Nine (9) Directors consisting of a One" + }, + { + "label": "Whole Time Director and Eight Non-Executive Directors, out of which four", + "amount": -4.0, + "page": 32, + "line": "Whole Time Director and Eight Non-Executive Directors, out of which four (4) are Independent Directors including" + }, + { + "label": "Mr. Shivshankar Lature (DIN:", + "amount": 2090972.0, + "page": 32, + "line": "Mr. Shivshankar Lature (DIN:02090972) and Mr. Omprakash Dwarkadas Gurbaxani (DIN:00324142), Directors" + }, + { + "label": "Regulations,", + "amount": 2015.0, + "page": 32, + "line": "Regulations, 2015 (\u201cSEBI Listing Regulation\u201d). Also, the Non-Executive Directors of the Company had no" + }, + { + "label": "including proficiency in terms of Section", + "amount": 150.0, + "page": 32, + "line": "including proficiency in terms of Section 150(1) of the Act and applicable rules thereunder of Independent Director" + }, + { + "label": "directors which was held on March", + "amount": 19.0, + "page": 32, + "line": "directors which was held on March 19, 2025 performance of non-independent directors, the Board as a whole" + } + ], + "auditors": [ + "2014 and on the recommendation of the Audit Committee, M/s. SKSS & Associates, Chartered Accountants, Firm", + "Aniket Kulkarni & Associates, Chartered Accountants,", + "Chartered Accountants", + "Chartered Accountants Director Director" + ], + "page_index": { + "pl": [ + 3, + 55, + 64 + ], + "directors_report": [ + 30, + 53 + ], + "balance_sheet": [ + 53 + ], + "shareholding": [], + "related_party": [ + 31, + 32, + 68, + 69 + ] + }, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 64, + "directors_report": 30 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/543542.json b/app/backend/primarydraft/data/companies/543542.json new file mode 100644 index 0000000000000000000000000000000000000000..20f1dd6fb7f95c44ac162e3ff7510a72b37fd658 --- /dev/null +++ b/app/backend/primarydraft/data/companies/543542.json @@ -0,0 +1,819 @@ +{ + "scrip_code": "543542", + "bse": { + "scrip_name": "Kesar India Ltd", + "issuer_name": "KESAR INDIA LIMITED", + "group": "M", + "segment": "Equity", + "isin": "INE0L1C01019", + "face_value": "10.00", + "industry": "", + "sector": "Consumer Discretionary", + "industry_new": "Realty", + "market_cap": "3771.26", + "eps_reported": "1.23", + "pe_reported": "1016.22", + "security_id": "KESAR" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/8f915c63-6b4e-425b-828c-21d5074ee6f0.pdf", + "authorised_at": "2025-08-06T20:17:10.293", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543542_2025.pdf", + "available_years": [ + "2025", + "2024", + "2023" + ] + }, + "extraction": { + "scrip_code": "543542", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543542_2025.pdf", + "pages": 114, + "cin": "L51220MH2003PLC142989", + "isin": "INE0L1C01019", + "company_name": "Bse Limited", + "emails": [ + "cs@kesarlands.com", + "evoting@nsdl.co.in", + "helpdesk.evoting@cdslindia.com", + "info@kesarlands.com", + "kesarindia.ipo@kfintech.com", + "seml.ipo@kfintech.com" + ], + "dins": [ + "00834590", + "02331896", + "07289877", + "10121169" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 806638000.0, + "page": 70, + "line": "(a) Revenue from operations 18 8,066.38 5,263.30", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 526330000.0, + "page": 70, + "line": "(a) Revenue from operations 18 8,066.38 5,263.30", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 21053000.0, + "page": 70, + "line": "(b) Other income 19 210.53 57.91", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 5791000.0, + "page": 70, + "line": "(b) Other income 19 210.53 57.91", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 827691000.0, + "page": 70, + "line": "Total Income (A) 8,276.91 5,321.21", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 532121000.0, + "page": 70, + "line": "Total Income (A) 8,276.91 5,321.21", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 32999000.0, + "page": 70, + "line": "(b) Employee benefits expense 21 329.99 217.53", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "employee_benefits", + "value": 21753000.0, + "page": 70, + "line": "(b) Employee benefits expense 21 329.99 217.53", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 9780000.0, + "page": 70, + "line": "(c) Finance cost 22 97.80 14.47", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 1447000.0, + "page": 70, + "line": "(c) Finance cost 22 97.80 14.47", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 6904000.000000001, + "page": 70, + "line": "(d) Depreciation and amortisation expense 11 69.04 36.34", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 3634000.0000000005, + "page": 70, + "line": "(d) Depreciation and amortisation expense 11 69.04 36.34", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 104092000.0, + "page": 70, + "line": "(e) Other expenses 23 1,040.92 842.53", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_expenses", + "value": 84253000.0, + "page": 70, + "line": "(e) Other expenses 23 1,040.92 842.53", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 578675000.0, + "page": 70, + "line": "Total Expenses (B) 5,786.75 3,915.61", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 391561000.0, + "page": 70, + "line": "Total Expenses (B) 5,786.75 3,915.61", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 249016000.0, + "page": 70, + "line": "Profit before tax (A-B) 2,490.16 1,405.60", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 140560000.0, + "page": 70, + "line": "Profit before tax (A-B) 2,490.16 1,405.60", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 66040000.0, + "page": 70, + "line": "(a) Current tax 660.40 397.52", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 39752000.0, + "page": 70, + "line": "(a) Current tax 660.40 397.52", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": -2270000.0, + "page": 70, + "line": "(b) Deferred tax Liabilities/(Assets) 5 (22.70) 1.04", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": 104000.0, + "page": 70, + "line": "(b) Deferred tax Liabilities/(Assets) 5 (22.70) 1.04", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 185247000.0, + "page": 70, + "line": "Profit after tax (B-C) 1,852.47 1,007.04", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pat", + "value": 100704000.0, + "page": 70, + "line": "Profit after tax (B-C) 1,852.47 1,007.04", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 7.44, + "page": 70, + "line": "(a) Basic 7.44 20.95", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "eps_basic", + "value": 20.95, + "page": 70, + "line": "(a) Basic 7.44 20.95", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 7.44, + "page": 70, + "line": "(b) Diluted 7.44 20.95", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "eps_diluted", + "value": 20.95, + "page": 70, + "line": "(b) Diluted 7.44 20.95", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + } + }, + "directors_pl": {}, + "balance_sheet": { + "share_capital": { + "current": { + "field": "share_capital", + "value": 247128000.00000003, + "page": 69, + "line": "(a) Share capital 2 2,471.28 2,471.28", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "share_capital", + "value": 247128000.00000003, + "page": 69, + "line": "(a) Share capital 2 2,471.28 2,471.28", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "reserves_surplus": { + "current": { + "field": "reserves_surplus", + "value": 231255000.00000003, + "page": 69, + "line": "(b) Reserves and surplus 3 2,312.55 452.51", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "reserves_surplus", + "value": 45251000.0, + "page": 69, + "line": "(b) Reserves and surplus 3 2,312.55 452.51", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "borrowings_non_current": { + "current": { + "field": "borrowings_non_current", + "value": 17635000.0, + "page": 69, + "line": "(a) Long Term Borrowings 4 176.35 133.82", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "borrowings_non_current", + "value": 13382000.0, + "page": 69, + "line": "(a) Long Term Borrowings 4 176.35 133.82", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "borrowings_current": { + "current": { + "field": "borrowings_current", + "value": 248144000.0, + "page": 69, + "line": "(a) Short Term Borrowings 7 2,481.44 2,017.75", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "borrowings_current", + "value": 201775000.0, + "page": 69, + "line": "(a) Short Term Borrowings 7 2,481.44 2,017.75", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "other_current_liabilities": { + "current": { + "field": "other_current_liabilities", + "value": 113869000.0, + "page": 69, + "line": "(c) Other current liabilities 9 1,138.69 1,494.00", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "other_current_liabilities", + "value": 149400000.0, + "page": 69, + "line": "(c) Other current liabilities 9 1,138.69 1,494.00", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "short_term_provisions": { + "current": { + "field": "short_term_provisions", + "value": 66040000.0, + "page": 69, + "line": "(d) Short Term Provisions 10 660.40 397.52", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "short_term_provisions", + "value": 39752000.0, + "page": 69, + "line": "(d) Short Term Provisions 10 660.40 397.52", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "total_equity_liabilities": { + "current": { + "field": "total_equity_liabilities", + "value": 953210000.0, + "page": 69, + "line": "TOTAL 9,532.10 9,892.05", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "total_equity_liabilities", + "value": 989204999.9999999, + "page": 69, + "line": "TOTAL 9,532.10 9,892.05", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "ppe": { + "current": { + "field": "ppe", + "value": 27376000.0, + "page": 69, + "line": "Tangible assets 11 273.76 70.16", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "ppe", + "value": 7016000.0, + "page": 69, + "line": "Tangible assets 11 273.76 70.16", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "long_term_loans_advances": { + "current": { + "field": "long_term_loans_advances", + "value": 28829000.000000004, + "page": 69, + "line": "(d) Long-term loans and advances 12 288.29 10.49", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "long_term_loans_advances", + "value": 1049000.0, + "page": 69, + "line": "(d) Long-term loans and advances 12 288.29 10.49", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "current_investments": { + "current": { + "field": "current_investments", + "value": 2761000.0, + "page": 69, + "line": "(a) Current Investments 13 27.61 172.32", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "current_investments", + "value": 17232000.0, + "page": 69, + "line": "(a) Current Investments 13 27.61 172.32", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "inventories": { + "current": { + "field": "inventories", + "value": 444221000.0, + "page": 69, + "line": "(b) Inventory 14 4,442.21 5,618.59", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "inventories", + "value": 561859000.0, + "page": 69, + "line": "(b) Inventory 14 4,442.21 5,618.59", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "trade_receivables": { + "current": { + "field": "trade_receivables", + "value": 13849000.0, + "page": 69, + "line": "(c) Trade Receivables 15 138.49 246.62", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "trade_receivables", + "value": 24662000.0, + "page": 69, + "line": "(c) Trade Receivables 15 138.49 246.62", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "cash_and_equivalents": { + "current": { + "field": "cash_and_equivalents", + "value": 311574000.0, + "page": 69, + "line": "(d) Cash and cash equivalents 16 3,115.74 3,623.65", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "cash_and_equivalents", + "value": 362365000.0, + "page": 69, + "line": "(d) Cash and cash equivalents 16 3,115.74 3,623.65", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "total_assets": { + "current": { + "field": "total_assets", + "value": 953210000.0, + "page": 69, + "line": "TOTAL 9,532.10 9,892.05", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "total_assets", + "value": 989204999.9999999, + "page": 69, + "line": "TOTAL 9,532.10 9,892.05", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + } + }, + "shareholding": [ + { + "label": "through following methods:", + "numbers": [ + 4.0 + ], + "percent": 4.0, + "page": 32, + "line": "through following methods: 4 Sangeeta Gopalchand Gupta Promoter Group Promoter Group" + }, + { + "label": "i. In terms of the provisions of Regulation", + "numbers": [ + 164.0, + 6.0 + ], + "percent": 6.0, + "page": 32, + "line": "i. In terms of the provisions of Regulation 164 of the SEBI ICDR Regulations. - Not Applicable as the shares of the 6 Shweta Sachin Gupta Promoter Group Promoter Group" + }, + { + "label": "Company are in-frequently traded at BSE as per the provisions of Regulation", + "numbers": [ + 164.0, + -5.0, + 7.0 + ], + "percent": 7.0, + "page": 32, + "line": "Company are in-frequently traded at BSE as per the provisions of Regulation 164(5) of Chapter V of the SEBI 7 Kesar Lands Private Limited Promoter Group Promoter Group" + }, + { + "label": "ICDR Regulations,", + "numbers": [ + 2018.8 + ], + "percent": null, + "page": 32, + "line": "ICDR Regulations, 2018. 8 Kesar Infracon Private Limited Promoter Group Promoter Group" + }, + { + "label": "Limited, (Registration No.: IBBI/RV/-E/", + "numbers": [ + 2019.0, + 106.0, + 349.61, + 10.0 + ], + "percent": 10.0, + "page": 32, + "line": "Limited, (Registration No.: IBBI/RV/-E/02/2019/106). i.e., Rs. 349.61/- per Equity Share. The said report is 10 Femika Amar Doshi Non-Promoter Non-Promoter" + }, + { + "label": "On March", + "numbers": [ + 31.0, + 2025.0 + ], + "percent": 31.0, + "page": 58, + "line": "On March 31st, 2025, no shares of Company were held in physical form. The Promoters & Promoters-group" + } + ], + "related_party": [ + { + "label": "remuneration payable to Mr. Sachin Gopal Gupta, Managing Director of the Company with effect from August", + "amount": 1.0, + "page": 22, + "line": "remuneration payable to Mr. Sachin Gopal Gupta, Managing Director of the Company with effect from August 01, 2025" + }, + { + "label": "for the remaining period of his present term of appointment upto April", + "amount": 7.0, + "page": 22, + "line": "for the remaining period of his present term of appointment upto April 07, 2027, including the remuneration to be paid" + }, + { + "label": "more persons for carrying out any or all of the activities that the Board of Directors is authorised to do for", + "amount": 10.0, + "page": 22, + "line": "more persons for carrying out any or all of the activities that the Board of Directors is authorised to do for the purpose 10. To consider and approve the material related party tr" + }, + { + "label": "", + "amount": 8.0, + "page": 22, + "line": "8. To consider and if thought fit, approve the change in remuneration of Mr. Yash Gopal Gupta, Whole-time Director" + }, + { + "label": "", + "amount": 9.0, + "page": 22, + "line": "9. To consider and if thought fit, approve the change in remuneration of Mr. Sachin Gopal Gupta, Managing Director and in this regard to consider and if thought fit, to pass the fo" + }, + { + "label": "Members of the Company be and is hereby accorded to the Board of Directors of the Company (\u201cBoard\u201d), for enter", + "amount": 2013.0, + "page": 23, + "line": "Members of the Company be and is hereby accorded to the Board of Directors of the Company (\u201cBoard\u201d), for entering Act, 2013 read with rules framed thereunder and Regulation 24A of " + }, + { + "label": "the aggregate value of all these transaction(s), whether undertaken directly by the Company or along with its ", + "amount": -26.0, + "page": 23, + "line": "the aggregate value of all these transaction(s), whether undertaken directly by the Company or along with its subsid- to conduct the Secretarial Audit of five consecutive financial" + }, + { + "label": "", + "amount": 12.0, + "page": 23, + "line": "12. To consider and approve the material related party transaction(s) proposed to be entered into by the Company RESOLVED FURTHER THAT the Board of Directors be and are hereby auth" + }, + { + "label": "Managing Director possesses a Bachelor\u2019s degree in Commerce and is an alumnus of IIM Bangalore. With over", + "amount": 8.0, + "page": 37, + "line": "Managing Director possesses a Bachelor\u2019s degree in Commerce and is an alumnus of IIM Bangalore. With over 8" + }, + { + "label": "Section", + "amount": 196.0, + "page": 37, + "line": "Section 196(3) of the Act for his appointment. He is not disqualified from being appointed as a Director in terms of" + }, + { + "label": "by the provisions contained in Section", + "amount": 166.0, + "page": 37, + "line": "by the provisions contained in Section 166 of the Act with regard to duties of directors." + }, + { + "label": "iv. The office of the Managing Director may be terminated by the Company or by him by giving", + "amount": 3.0, + "page": 37, + "line": "iv. The office of the Managing Director may be terminated by the Company or by him by giving 3 (three) months\u2019" + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants KESAR INDIA LIMITED", + "RHAD & Co. Chartered Accountants (Firm Registration No. 102588W) the Statutory Auditors of the company", + "Reporting issued by the Institute of Chartered Accountants of India." + ], + "page_index": { + "pl": [ + 62, + 63, + 70, + 71, + 72, + 91, + 95, + 96, + 97 + ], + "directors_report": [ + 42, + 57, + 58, + 59, + 89, + 90 + ], + "balance_sheet": [ + 69, + 94 + ], + "shareholding": [ + 29, + 32, + 58 + ], + "related_party": [ + 22, + 23, + 37, + 38, + 39, + 40, + 45, + 53, + 54, + 56, + 57 + ] + }, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld." + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [ + "total assets = total equity and liabilities" + ], + "statement_pages": { + "audited_pl": 70, + "directors_report": 42 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/543543.json b/app/backend/primarydraft/data/companies/543543.json new file mode 100644 index 0000000000000000000000000000000000000000..eab384f3ca1987be930e773775e295fd6178eb58 --- /dev/null +++ b/app/backend/primarydraft/data/companies/543543.json @@ -0,0 +1,379 @@ +{ + "scrip_code": "543543", + "bse": { + "scrip_name": "B-Right Realestate Ltd", + "issuer_name": "B-RIGHT REALESTATE LIMITED", + "group": "M", + "segment": "Equity", + "isin": "INE0IZQ01016", + "face_value": "10.00", + "industry": "", + "sector": "Consumer Discretionary", + "industry_new": "Realty", + "market_cap": "909.15", + "eps_reported": "35.74", + "pe_reported": "24.62", + "security_id": "BRRL" + }, + "annual_report": { + "year": "2026", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/e1aff24a-e16c-4449-a1f4-4d443b6be59b.pdf", + "authorised_at": null, + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543543_2026.pdf", + "available_years": [ + "2026", + "2026", + "2025", + "2024", + "2023", + "2022" + ] + }, + "extraction": { + "scrip_code": "543543", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543543_2026.pdf", + "pages": 179, + "cin": "L70100MH2007PLC282631", + "isin": null, + "company_name": "B-Right Realestate Limited", + "emails": [ + "cs@b-rightgroup.com", + "evoting@nsdl.com", + "evoting@purvashare.com", + "helpdesk.evoting@cdslindia.com", + "info@b-rightgroup.com" + ], + "dins": [ + "00003142", + "00003412", + "05212829", + "10044437" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 1677941999.9999998, + "page": 153, + "line": "Revenue from operations 21 16,779.42 10,343.14", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "revenue_from_operations", + "value": 1034314000.0, + "page": 153, + "line": "Revenue from operations 21 16,779.42 10,343.14", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 200000.0, + "page": 153, + "line": "Other income 22 2 13.18 146.92", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "other_income", + "value": 1318000.0, + "page": 153, + "line": "Other income 22 2 13.18 146.92", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 1699259999.9999998, + "page": 153, + "line": "TOTAL INCOME 16,992.60 10,490.06", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "total_income", + "value": 1049006000.0, + "page": 153, + "line": "TOTAL INCOME 16,992.60 10,490.06", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 1007331000.0, + "page": 153, + "line": "Cost of materials consumed 10,073.31 4,478.60", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "cost_of_materials", + "value": 447860000.00000006, + "page": 153, + "line": "Cost of materials consumed 10,073.31 4,478.60", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 400000.0, + "page": 153, + "line": "Employee benefit expense 23 4 25.52 195.11", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "employee_benefits", + "value": 2552000.0, + "page": 153, + "line": "Employee benefit expense 23 4 25.52 195.11", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 600000.0, + "page": 153, + "line": "Financial costs 24 6 88.77 220.73", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "finance_costs", + "value": 8877000.0, + "page": 153, + "line": "Financial costs 24 6 88.77 220.73", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 100000.0, + "page": 153, + "line": "Depreciation and Amortisation Expenses 25 1 77.94 129.98", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "depreciation", + "value": 7794000.0, + "page": 153, + "line": "Depreciation and Amortisation Expenses 25 1 77.94 129.98", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 100000.0, + "page": 153, + "line": "Other expenses 26 1 42.69 181.27", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "other_expenses", + "value": 4269000.0, + "page": 153, + "line": "Other expenses 26 1 42.69 181.27", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 1108298000.0, + "page": 153, + "line": "TOTAL EXPENSES 11,082.98 9,387.00", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "total_expenses", + "value": 938700000.0, + "page": 153, + "line": "TOTAL EXPENSES 11,082.98 9,387.00", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 590962000.0, + "page": 153, + "line": "Profit before exceptional and extraordinary items and tax 5,909.62 1,103.06", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "pbt", + "value": 110306000.0, + "page": 153, + "line": "Profit before exceptional and extraordinary items and tax 5,909.62 1,103.06", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 134924000.0, + "page": 153, + "line": "Current tax 1 ,349.24 4 03.16", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "tax_current", + "value": 400000.0, + "page": 153, + "line": "Current tax 1 ,349.24 4 03.16", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 171000.0, + "page": 153, + "line": "Deferred tax 1.71 (1.65)", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "tax_deferred", + "value": -165000.0, + "page": 153, + "line": "Deferred tax 1.71 (1.65)", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "pat": { + "current": { + "field": "pat", + "value": 455867000.0, + "page": 153, + "line": "Profit for the period from continuing operations 4 ,558.67 4 36.97", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "pat", + "value": 400000.0, + "page": 153, + "line": "Profit for the period from continuing operations 4 ,558.67 4 36.97", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + } + }, + "directors_pl": {}, + "balance_sheet": {}, + "shareholding": [], + "related_party": [], + "auditors": [ + "2014, M/s. DMS & Co, Chartered Accountant Firm (Firm Registration Number: 001169C)", + "Brief Profile Mr. Sanjay Shah is a Chartered Accountant and Commerce", + "Chartered Accountants", + "Chartered Accountants B-RIGHT REALESTATE LIMITED" + ], + "page_index": { + "pl": [ + 109, + 111, + 118, + 122, + 125, + 133, + 134, + 135, + 142, + 143, + 146, + 153, + 157, + 167, + 168, + 169 + ], + "directors_report": [ + 110, + 144 + ], + "balance_sheet": [ + 24, + 109, + 121, + 143, + 152 + ], + "shareholding": [], + "related_party": [ + 117, + 137, + 139, + 171, + 173 + ] + }, + "warnings": [ + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 153, + "directors_report": 0 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/543619.json b/app/backend/primarydraft/data/companies/543619.json new file mode 100644 index 0000000000000000000000000000000000000000..05a4a454f7065f409644bbd26d822bfe54b56587 --- /dev/null +++ b/app/backend/primarydraft/data/companies/543619.json @@ -0,0 +1,307 @@ +{ + "scrip_code": "543619", + "bse": { + "scrip_name": "Concord Control Systems Ltd", + "issuer_name": "Concord Control Systems Limited", + "group": "M", + "segment": "Equity", + "isin": "INE0N0J01014", + "face_value": "10.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Capital Goods", + "market_cap": "2614.33", + "eps_reported": "30.51", + "pe_reported": "82.52", + "security_id": "CNCRD" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/f82ecf3c-6aab-41b8-9ecc-a81b7549fbe8.pdf", + "authorised_at": "2025-09-08T21:41:29.293", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543619_2025.pdf", + "available_years": [ + "2025", + "2024", + "2023" + ] + }, + "extraction": { + "scrip_code": "543619", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543619_2025.pdf", + "pages": 226, + "cin": "L31908UP2011PLC043229", + "isin": "INE0N0J01014", + "company_name": "For Concord Control Systems Limited", + "emails": [ + "adminoffice@concordgroup.in", + "cs@concordgroup.in", + "dhruv@sethspro.com", + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "ivote@bigshareonline.com" + ], + "dins": [ + "00272007", + "00581405", + "03385362", + "09255627", + "09688771", + "09718679", + "09720531", + "10835726" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 739199000.0, + "page": 118, + "line": "I. Revenue from Operations 26 7,391.99 6,551.70", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "revenue_from_operations", + "value": 655170000.0, + "page": 118, + "line": "I. Revenue from Operations 26 7,391.99 6,551.70", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 39200000.0, + "page": 118, + "line": "II. Other Income 27 392 108.87", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "other_income", + "value": 10887000.0, + "page": 118, + "line": "II. Other Income 27 392 108.87", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 778399000.0, + "page": 118, + "line": "III. Total Income (I+II) 7,783.99 6,660.57", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "total_income", + "value": 666057000.0, + "page": 118, + "line": "III. Total Income (I+II) 7,783.99 6,660.57", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 411847000.0, + "page": 118, + "line": "Cost of materials consumed 28 4,118.47 3,596.46", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "cost_of_materials", + "value": 359646000.0, + "page": 118, + "line": "Cost of materials consumed 28 4,118.47 3,596.46", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "purchases_stock_in_trade": { + "current": { + "field": "purchases_stock_in_trade", + "value": 0.0, + "page": 118, + "line": "Purchase of Stock in Trade 0 0", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "purchases_stock_in_trade", + "value": 0.0, + "page": 118, + "line": "Purchase of Stock in Trade 0 0", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 71624000.0, + "page": 118, + "line": "Employee benefit expenses 31 716.24 550.99", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "employee_benefits", + "value": 55099000.0, + "page": 118, + "line": "Employee benefit expenses 31 716.24 550.99", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 1367000.0, + "page": 118, + "line": "Finance Cost 32 13.67 14.55", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "finance_costs", + "value": 1455000.0, + "page": 118, + "line": "Finance Cost 32 13.67 14.55", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 60754999.99999999, + "page": 118, + "line": "Other expenses 33 607.55 478.89", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "other_expenses", + "value": 47889000.0, + "page": 118, + "line": "Other expenses 33 607.55 478.89", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 579374000.0, + "page": 118, + "line": "Total expenses 5,793.74 4,901.34", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "total_expenses", + "value": 490134000.0, + "page": 118, + "line": "Total expenses 5,793.74 4,901.34", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + } + }, + "directors_pl": {}, + "balance_sheet": {}, + "shareholding": [ + { + "label": "Promoter and", + "numbers": [ + 7.0, + 4225000.0, + 4225000.0, + 67.06 + ], + "percent": 67.06, + "page": 90, + "line": "Promoter and 7 4,225,000 4,225,000 67.06" + } + ], + "related_party": [], + "auditors": [ + "Associates, Chartered Accountants, FRN: Annexure -C. The Secretarial Audit Report", + "CHARTERED ACCOUNTANTS", + "CONCORD CONTROL SYSTEMS LIMITED Institute of Chartered Accountants of", + "Chartered Accountants" + ], + "page_index": { + "pl": [ + 102, + 118, + 167 + ], + "directors_report": [ + 39, + 47, + 75, + 93, + 99, + 103, + 164 + ], + "balance_sheet": [ + 115, + 163, + 175 + ], + "shareholding": [ + 90 + ], + "related_party": [ + 57, + 91, + 154, + 212, + 213, + 215 + ] + }, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 118, + "directors_report": 39 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/543746.json b/app/backend/primarydraft/data/companies/543746.json new file mode 100644 index 0000000000000000000000000000000000000000..a51724b76a9806b90af9b407c02d940912571d3b --- /dev/null +++ b/app/backend/primarydraft/data/companies/543746.json @@ -0,0 +1,418 @@ +{ + "scrip_code": "543746", + "bse": { + "scrip_name": "Logica Infoway Ltd", + "issuer_name": "LOGICA INFOWAY LIMITED", + "group": "M", + "segment": "Equity", + "isin": "INE0BSU01018", + "face_value": "10.00", + "industry": "", + "sector": "Consumer Discretionary", + "industry_new": "Consumer Services", + "market_cap": "274.08", + "eps_reported": "7.97", + "pe_reported": "19.32", + "security_id": "LOGICA" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/435201ad-699e-4730-855e-8fbc57e2c435.pdf", + "authorised_at": "2025-09-03T00:07:35.027", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543746_2025.pdf", + "available_years": [ + "2025", + "2024", + "2023" + ] + }, + "extraction": { + "scrip_code": "543746", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543746_2025.pdf", + "pages": 131, + "cin": "L30007WB1995PLC073218", + "isin": "INE0BSU01018", + "company_name": "Bse Limited", + "emails": [ + "cs@logicainfoway.com", + "easternlogica.ipo@kfintech.com", + "evoting@nsdl.com", + "fcsaltabkazi@gmail.com", + "helpdesk.evoting@cdslindia.com", + "info@logicainfoway.com" + ], + "dins": [ + "00320923", + "00432340", + "00434584" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 218000.00000000003, + "page": 105, + "line": "Revenue from operations 2.18 1,11,163.09 1 ,06,423.68", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 11116309000.0, + "page": 105, + "line": "Revenue from operations 2.18 1,11,163.09 1 ,06,423.68", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 219000.0, + "page": 105, + "line": "Other Income 2.19 3 31.97 2 88.11", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 300000.0, + "page": 105, + "line": "Other Income 2.19 3 31.97 2 88.11", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 200000.0, + "page": 105, + "line": "Total Income (1+2) 1,11,495.06 1 ,06,711.79", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 11149506000.0, + "page": 105, + "line": "Total Income (1+2) 1,11,495.06 1 ,06,711.79", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "purchases_stock_in_trade": { + "current": { + "field": "purchases_stock_in_trade", + "value": 220000.00000000003, + "page": 105, + "line": "Purchase of Stock-in-Trade 2.20 1,06,277.42 1 ,05,857.60", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "purchases_stock_in_trade", + "value": 10627742000.0, + "page": 105, + "line": "Purchase of Stock-in-Trade 2.20 1,06,277.42 1 ,05,857.60", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 222000.00000000003, + "page": 105, + "line": "Employee benefit expense 2.22 992.35 7 52.25", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "employee_benefits", + "value": 99235000.0, + "page": 105, + "line": "Employee benefit expense 2.22 992.35 7 52.25", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 223000.0, + "page": 105, + "line": "Financial costs 2.23 1,208.40 9 06.78", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 120840000.00000001, + "page": 105, + "line": "Financial costs 2.23 1,208.40 9 06.78", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 290000.0, + "page": 105, + "line": "Depreciation and amortization expense 2.9 43.32 1 4.45", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 4332000.0, + "page": 105, + "line": "Depreciation and amortization expense 2.9 43.32 1 4.45", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 224000.00000000003, + "page": 105, + "line": "Other expenses 2.24 2,205.22 1 ,818.22", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_expenses", + "value": 220521999.99999997, + "page": 105, + "line": "Other expenses 2.24 2,205.22 1 ,818.22", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 800000.0, + "page": 105, + "line": "Total Expenses (3+8) 1,10,075.24 1 ,05,616.16", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 11007524000.0, + "page": 105, + "line": "Total Expenses (3+8) 1,10,075.24 1 ,05,616.16", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 141982000.0, + "page": 105, + "line": "Profit before tax 1,419.82 1 ,095.63", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 109563000.00000001, + "page": 105, + "line": "Profit before tax 1,419.82 1 ,095.63", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 37023000.0, + "page": 105, + "line": "Current tax 370.23 2 80.28", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 200000.0, + "page": 105, + "line": "Current tax 370.23 2 80.28", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": -112999.99999999999, + "page": 105, + "line": "Deferred tax (Net) ( 1.13) 2 .13", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": 213000.0, + "page": 105, + "line": "Deferred tax (Net) ( 1.13) 2 .13", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 105072000.0, + "page": 105, + "line": "Profit/(Loss) for the period 1,050.72 8 09.63", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pat", + "value": 800000.0, + "page": 105, + "line": "Profit/(Loss) for the period 1,050.72 8 09.63", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + } + }, + "directors_pl": {}, + "balance_sheet": {}, + "shareholding": [ + { + "label": "Promoter Category, pursuant to the approval of the Board of Directors on January", + "numbers": [ + 14.0, + 2025.0 + ], + "percent": 14.0, + "page": 51, + "line": "Promoter Category, pursuant to the approval of the Board of Directors on January 14, 2025, and the" + }, + { + "label": "Promoter Group, on December", + "numbers": [ + 22.0, + 2024.15, + 0.0 + ], + "percent": 0.0, + "page": 51, + "line": "Promoter Group, on December 22, 2024. 15,000 shares held by him were transmitted to his nominee," + } + ], + "related_party": [ + { + "label": "FY", + "amount": 2029.0, + "page": 33, + "line": "FY 2029-30, at a remuneration of Rs. 10,000/- (Rupees Ten Thousand Only) plus applicable taxes and" + }, + { + "label": "", + "amount": 24.0, + "page": 37, + "line": "24. The Register of Directors and Key Managerial Personnel and their shareholding under Section 170" + }, + { + "label": "Directors are interested under Section", + "amount": 189.0, + "page": 37, + "line": "Directors are interested under Section 189 of the Act, will be available for inspection through" + }, + { + "label": "In line with the amended requirements, the Board of Directors, at its meeting held on May", + "amount": 30.0, + "page": 46, + "line": "In line with the amended requirements, the Board of Directors, at its meeting held on May 30, 2025, based" + }, + { + "label": "The remuneration payable for FY", + "amount": 2025.0, + "page": 46, + "line": "The remuneration payable for FY 2025-26 is proposed at Rs. 10,000/- (Rupees Ten Thousand Only) plus" + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants Sd/- Sd/-", + "Chartered Accountants of India (ICAI). These responsibilities include the design,", + "Chartered Accountants of India. Those Standards and the Guidance Note require that we" + ], + "page_index": { + "pl": [ + 32, + 89, + 93, + 105 + ], + "directors_report": [ + 50, + 61, + 91 + ], + "balance_sheet": [], + "shareholding": [ + 51 + ], + "related_party": [ + 33, + 37, + 46, + 47, + 48, + 68, + 69, + 70, + 71, + 72 + ] + }, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "pat = pbt - tax" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 105, + "directors_report": 50 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/543782.json b/app/backend/primarydraft/data/companies/543782.json new file mode 100644 index 0000000000000000000000000000000000000000..40725547cbe167e9e6e2a9acdabcc72ec80fc9f2 --- /dev/null +++ b/app/backend/primarydraft/data/companies/543782.json @@ -0,0 +1,517 @@ +{ + "scrip_code": "543782", + "bse": { + "scrip_name": "Sealmatic India Ltd", + "issuer_name": "Sealmatic India Limited", + "group": "M", + "segment": "Equity", + "isin": "INE0O4601016", + "face_value": "10.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Capital Goods", + "market_cap": "438.20", + "eps_reported": "9.50", + "pe_reported": "42.47", + "security_id": "SEALMATIC" + }, + "annual_report": { + "year": "2026", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/2f199cc3-48be-4af7-bfe7-65b2c247fe6d.pdf", + "authorised_at": "2026-06-30T19:36:44.647", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543782_2026.pdf", + "available_years": [ + "2026", + "2025", + "2024", + "2023", + "2023" + ] + }, + "extraction": { + "scrip_code": "543782", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543782_2026.pdf", + "pages": 167, + "cin": "U26900MH2009PLC197524", + "isin": null, + "company_name": "Sealmatic India Limited", + "emails": [ + "einward.risk@kfintech.com", + "info@csnayan.com", + "info@sealmaticindia.com", + "ng@cdslindia.com", + "ng@kfintech.com", + "ng@nsdl.co.in" + ], + "dins": [ + "00142258", + "02817594" + ], + "audited_pl": { + "other_income": { + "current": { + "field": "other_income", + "value": 28899000.0, + "page": 84, + "line": "Other Income 22 288.99 174.31", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "other_income", + "value": 17431000.0, + "page": 84, + "line": "Other Income 22 288.99 174.31", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 1059577000.0, + "page": 84, + "line": "TOTAL INCOME 10,595.77 10271.27", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "total_income", + "value": 1027127000.0, + "page": 84, + "line": "TOTAL INCOME 10,595.77 10271.27", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 442596000.0, + "page": 84, + "line": "Cost of Materials Consumed 23 4,425.96 3,895.15", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "cost_of_materials", + "value": 389515000.0, + "page": 84, + "line": "Cost of Materials Consumed 23 4,425.96 3,895.15", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 194592000.0, + "page": 84, + "line": "Employee Benefit Expenses 25 1,945.92 1,701.73", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "employee_benefits", + "value": 170173000.0, + "page": 84, + "line": "Employee Benefit Expenses 25 1,945.92 1,701.73", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 4858000.0, + "page": 84, + "line": "Finance Costs 26 48.58 38.55", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "finance_costs", + "value": 3854999.9999999995, + "page": 84, + "line": "Finance Costs 26 48.58 38.55", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 245729000.0, + "page": 84, + "line": "Other Expenses 27 2,457.29 2,151.30", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "other_expenses", + "value": 215130000.00000003, + "page": 84, + "line": "Other Expenses 27 2,457.29 2,151.30", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 918765000.0, + "page": 84, + "line": "TOTAL EXPENSES 9,187.65 8,144.76", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "total_expenses", + "value": 814476000.0, + "page": 84, + "line": "TOTAL EXPENSES 9,187.65 8,144.76", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 140812000.0, + "page": 84, + "line": "Profit Before Tax 1,408.12 2,126.51", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "pbt", + "value": 212651000.00000003, + "page": 84, + "line": "Profit Before Tax 1,408.12 2,126.51", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 39000000.0, + "page": 84, + "line": "Current Tax 390.00 510.00", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "tax_current", + "value": 51000000.0, + "page": 84, + "line": "Current Tax 390.00 510.00", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": -963000.0000000001, + "page": 84, + "line": "Deferred Tax (9.63) 32.20", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "tax_deferred", + "value": 3220000.0000000005, + "page": 84, + "line": "Deferred Tax (9.63) 32.20", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "pat": { + "current": { + "field": "pat", + "value": 103206000.0, + "page": 84, + "line": "Profit For The Year 1,032.06 1,591.22", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "pat", + "value": 159122000.0, + "page": 84, + "line": "Profit For The Year 1,032.06 1,591.22", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + } + }, + "directors_pl": { + "other_income": { + "current": { + "field": "other_income", + "value": 28899000.0, + "page": 35, + "line": "Other Income 288.99 174.31 288.99", + "scale": 100000.0, + "section": "directors_report", + "basis": "consolidated" + }, + "previous": { + "field": "other_income", + "value": 17431000.0, + "page": 35, + "line": "Other Income 288.99 174.31 288.99", + "scale": 100000.0, + "section": "directors_report", + "basis": "consolidated" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 1059577000.0, + "page": 35, + "line": "Total Revenue 10,595.77 10,271.27 10,595.77", + "scale": 100000.0, + "section": "directors_report", + "basis": "consolidated" + }, + "previous": { + "field": "total_income", + "value": 1027127000.0, + "page": 35, + "line": "Total Revenue 10,595.77 10,271.27 10,595.77", + "scale": 100000.0, + "section": "directors_report", + "basis": "consolidated" + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 440321000.0, + "page": 35, + "line": "Other Expenses 4,403.21 3,853.03 4,465.97", + "scale": 100000.0, + "section": "directors_report", + "basis": "consolidated" + }, + "previous": { + "field": "other_expenses", + "value": 385303000.0, + "page": 35, + "line": "Other Expenses 4,403.21 3,853.03 4,465.97", + "scale": 100000.0, + "section": "directors_report", + "basis": "consolidated" + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 4858000.0, + "page": 35, + "line": "Interest/Finance Cost 48.58 38.55 48.58", + "scale": 100000.0, + "section": "directors_report", + "basis": "consolidated" + }, + "previous": { + "field": "finance_costs", + "value": 3854999.9999999995, + "page": 35, + "line": "Interest/Finance Cost 48.58 38.55 48.58", + "scale": 100000.0, + "section": "directors_report", + "basis": "consolidated" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 918765000.0, + "page": 35, + "line": "Total Expenses 9,187.65 8,144.76 9,265.03", + "scale": 100000.0, + "section": "directors_report", + "basis": "consolidated" + }, + "previous": { + "field": "total_expenses", + "value": 814476000.0, + "page": 35, + "line": "Total Expenses 9,187.65 8,144.76 9,265.03", + "scale": 100000.0, + "section": "directors_report", + "basis": "consolidated" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 140812000.0, + "page": 35, + "line": "Profit Before Tax 1,408.12 2,126.51 1,330.74", + "scale": 100000.0, + "section": "directors_report", + "basis": "consolidated" + }, + "previous": { + "field": "pbt", + "value": 212651000.00000003, + "page": 35, + "line": "Profit Before Tax 1,408.12 2,126.51 1,330.74", + "scale": 100000.0, + "section": "directors_report", + "basis": "consolidated" + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 9.5, + "page": 35, + "line": "EPS in Rs. (Basic/Diluted) 9.50 17.58 8.85", + "scale": 1.0, + "section": "directors_report", + "basis": "consolidated" + }, + "previous": { + "field": "eps_basic", + "value": 17.58, + "page": 35, + "line": "EPS in Rs. (Basic/Diluted) 9.50 17.58 8.85", + "scale": 1.0, + "section": "directors_report", + "basis": "consolidated" + } + } + }, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "advance. None of the transac\u0000ons entered into with Related Par\u0000es fall under the scope of Sec\u0000on", + "amount": 188.0, + "page": 39, + "line": "advance. None of the transac\u0000ons entered into with Related Par\u0000es fall under the scope of Sec\u0000on 188(1) of" + }, + { + "label": "", + "amount": 14.0, + "page": 39, + "line": "14. PARTICULARS OF LOANS, GUARANTEES OR INVESTMENTS" + }, + { + "label": "Directors are interested, which were covered under Sec\u0000on", + "amount": 186.0, + "page": 39, + "line": "Directors are interested, which were covered under Sec\u0000on 186 of the Act." + }, + { + "label": "directors and employees in confirma\u0000on with Sec\u0000on", + "amount": 177.0, + "page": 39, + "line": "directors and employees in confirma\u0000on with Sec\u0000on 177 of the Act and Regula\u0000on 22 of SEBI Lis\u0000ng" + }, + { + "label": "", + "amount": 24.0, + "page": 42, + "line": "24. NOMINATION AND REMUNERATION COMMITTEE" + }, + { + "label": "Director) provisions of sub-sec\u0000on", + "amount": -3.0, + "page": 42, + "line": "Director) provisions of sub-sec\u0000on (3) of Sec\u0000on 178" + } + ], + "auditors": [ + "4. Appointment of M/s. YRKDAJ & Associates LLP, Chartered Accountants (Firm Registra\u0000on No. W100288) as", + "Chartered Accountants", + "Chartered Accountants For and on behalf of the Board of Directors", + "Controls and, both issued by the Ins\u0000tute of Chartered Accountants of India. Those Standards and the" + ], + "page_index": { + "pl": [ + 5, + 69, + 72, + 84, + 90, + 91, + 97, + 106, + 115, + 121, + 125, + 132, + 139, + 140, + 145, + 154, + 162 + ], + "directors_report": [ + 35, + 70 + ], + "balance_sheet": [ + 69, + 82, + 121, + 130 + ], + "shareholding": [], + "related_party": [ + 39, + 42, + 58, + 109, + 157 + ] + }, + "warnings": [ + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "directors_pl_identities": [ + "pbt = total_income - total_expenses" + ], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 84, + "directors_report": 35 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/543831.json b/app/backend/primarydraft/data/companies/543831.json new file mode 100644 index 0000000000000000000000000000000000000000..f4d21b3df85c005708b1e1e6cc5a901046c944f1 --- /dev/null +++ b/app/backend/primarydraft/data/companies/543831.json @@ -0,0 +1,329 @@ +{ + "scrip_code": "543831", + "bse": { + "scrip_name": "Bright Outdoor Media Ltd", + "issuer_name": "Bright Outdoor Media Limited", + "group": "M", + "segment": "Equity", + "isin": "INE0OMI01019", + "face_value": "10.00", + "industry": "", + "sector": "Consumer Discretionary", + "industry_new": "Media, Entertainment & Publication", + "market_cap": "785.63", + "eps_reported": "11.02", + "pe_reported": "32.67", + "security_id": "BRIGHT" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/ec0ca0f5-7361-4c40-8662-06e94759defe.pdf", + "authorised_at": "2025-09-06T17:47:25.383", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543831_2025.pdf", + "available_years": [ + "2025", + "2024", + "2023" + ] + }, + "extraction": { + "scrip_code": "543831", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543831_2025.pdf", + "pages": 76, + "cin": "L74300MH2005PLC156444", + "isin": "INE0OMI01019", + "company_name": "For Bright Outdoor Media Limited", + "emails": [ + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "info@brightoutdoor.com", + "investor@brightoutdoor.com", + "ivote@bigshareonline.com", + "tds@bigshareonline.com" + ], + "dins": [ + "00845616", + "08961213" + ], + "audited_pl": {}, + "directors_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 1267455000.0, + "page": 27, + "line": "Revenue from Operations 12,674.55 10,667.89", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 1066789000.0, + "page": 27, + "line": "Revenue from Operations 12,674.55 10,667.89", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 13056000.0, + "page": 27, + "line": "Other Income 130.56 62.08", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 6208000.0, + "page": 27, + "line": "Other Income 130.56 62.08", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 1280512000.0, + "page": 27, + "line": "Total Income 12,805.12 10,729.97", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 1072996999.9999999, + "page": 27, + "line": "Total Income 12,805.12 10,729.97", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 41986000.0, + "page": 27, + "line": "Employee Benefit Expenses 419.86 335.33", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "employee_benefits", + "value": 33533000.0, + "page": 27, + "line": "Employee Benefit Expenses 419.86 335.33", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 1996000.0, + "page": 27, + "line": "Financial Cost 19.96 58.21", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 5821000.0, + "page": 27, + "line": "Financial Cost 19.96 58.21", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 19923000.0, + "page": 27, + "line": "Depreciation and amortisation expenses 199.23 114.74", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 11474000.0, + "page": 27, + "line": "Depreciation and amortisation expenses 199.23 114.74", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 65213000.0, + "page": 27, + "line": "Other Expenses 652.13 798.09", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "other_expenses", + "value": 79809000.0, + "page": 27, + "line": "Other Expenses 652.13 798.09", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 1028675000.0, + "page": 27, + "line": "Total Expenses 10,286.75 8,575.38", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 857537999.9999999, + "page": 27, + "line": "Total Expenses 10,286.75 8,575.38", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 251837000.0, + "page": 27, + "line": "Profit/(Loss) before Tax 2,518.37 2,154.58", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 215458000.0, + "page": 27, + "line": "Profit/(Loss) before Tax 2,518.37 2,154.58", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "tax_total": { + "current": { + "field": "tax_total", + "value": 61087000.0, + "page": 27, + "line": "Total Tax Expenses 610.87 550.75", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_total", + "value": 55075000.0, + "page": 27, + "line": "Total Tax Expenses 610.87 550.75", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 190750000.0, + "page": 27, + "line": "Profit/(Loss) after tax 1,907.50 1,603.83", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pat", + "value": 160383000.0, + "page": 27, + "line": "Profit/(Loss) after tax 1,907.50 1,603.83", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "Pursuant to the provisions of Section", + "amount": 204.0, + "page": 34, + "line": "Pursuant to the provisions of Section 204 of the Act and the Companies (Appointment and Remuneration of" + }, + { + "label": "Managerial Personnel) Rules,", + "amount": 2014.0, + "page": 34, + "line": "Managerial Personnel) Rules, 2014, the Board of Directors has appointed M/s. Nikunj Kanabar & Associates," + } + ], + "auditors": [ + "CHARTERED ACCOUNTANTS", + "Chartered Accountants", + "Company in accordance with the Code of Ethics issued by the Institute of Chartered Accountants of India", + "Financial Controls Over Financial Reporting issued by the Institute of Chartered Accountants of India." + ], + "page_index": { + "pl": [ + 36, + 51, + 53 + ], + "directors_report": [ + 27, + 28 + ], + "balance_sheet": [ + 36, + 51 + ], + "shareholding": [], + "related_party": [ + 34, + 72 + ] + }, + "warnings": [ + "audited P&L not machine-readable in this filing", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [], + "directors_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 0, + "directors_report": 27 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/543916.json b/app/backend/primarydraft/data/companies/543916.json new file mode 100644 index 0000000000000000000000000000000000000000..4b63ceaed6406402815eb6634d20160f272d186e --- /dev/null +++ b/app/backend/primarydraft/data/companies/543916.json @@ -0,0 +1,616 @@ +{ + "scrip_code": "543916", + "bse": { + "scrip_name": "Hemant Surgical Industries Ltd", + "issuer_name": "Hemant Surgical Industries Limited", + "group": "MT", + "segment": "Equity", + "isin": "INE0GYI01028", + "face_value": "10.00", + "industry": "", + "sector": "Healthcare", + "industry_new": "Healthcare", + "market_cap": "517.90", + "eps_reported": "12.54", + "pe_reported": "28.41", + "security_id": "HSIL" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/2cbeac6c-72df-4174-a681-cfd9e9801442.pdf", + "authorised_at": "2025-08-29T16:10:21.47", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543916_2025.pdf", + "available_years": [ + "2025", + "2024", + "2023" + ] + }, + "extraction": { + "scrip_code": "543916", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543916_2025.pdf", + "pages": 158, + "cin": "L33110MH1989PLC051133", + "isin": null, + "company_name": "Bse Limited", + "emails": [ + "cs@hemantsurgical.com", + "csnikitakedia@gmail.com", + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "info@bigshareonline.com", + "info@hemantsurgical.com" + ], + "dins": [ + "00215972", + "00215994", + "01483743", + "06876514", + "07662396", + "07777901", + "09833311", + "09845001", + "10894209" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 1065266000.0, + "page": 117, + "line": "I. Revenue from Operations 20 10,652.66 10,560.75", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "revenue_from_operations", + "value": 1056075000.0, + "page": 117, + "line": "I. Revenue from Operations 20 10,652.66 10,560.75", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 51124000.0, + "page": 117, + "line": "II.Other Incomes 21 511.24 430.85", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "other_income", + "value": 43085000.0, + "page": 117, + "line": "II.Other Incomes 21 511.24 430.85", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 1116390000.0, + "page": 117, + "line": "III.Total Revenue (a) 11,163.90 10,991.60", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "total_income", + "value": 1099160000.0, + "page": 117, + "line": "III.Total Revenue (a) 11,163.90 10,991.60", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 1010837000.0000001, + "page": 117, + "line": "V.Total Expenses (b) 10,108.37 9,713.47", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "total_expenses", + "value": 971346999.9999999, + "page": 117, + "line": "V.Total Expenses (b) 10,108.37 9,713.47", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 105553000.0, + "page": 117, + "line": "Profit before Exceptional and Extraordinary Items and Tax (a-b) 1,055.53 1,278.13", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "pbt", + "value": 127813000.00000001, + "page": 117, + "line": "Profit before Exceptional and Extraordinary Items and Tax (a-b) 1,055.53 1,278.13", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "pat": { + "current": { + "field": "pat", + "value": 81321000.0, + "page": 117, + "line": "XI.Profit for the period from Continuing Operations 813.21 979.99", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "pat", + "value": 97999000.0, + "page": 117, + "line": "XI.Profit for the period from Continuing Operations 813.21 979.99", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 7.79, + "page": 117, + "line": "(a) Basic EPS 7.79 9.85", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "eps_basic", + "value": 9.85, + "page": 117, + "line": "(a) Basic EPS 7.79 9.85", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 7.79, + "page": 117, + "line": "(b)Diluted EPS 7.79 9.85", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "eps_diluted", + "value": 9.85, + "page": 117, + "line": "(b)Diluted EPS 7.79 9.85", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + } + }, + "directors_pl": {}, + "balance_sheet": { + "share_capital": { + "current": { + "field": "share_capital", + "value": 104400000.0, + "page": 116, + "line": "a. Share Capital 2 1,044.00 1,044.00", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "share_capital", + "value": 104400000.0, + "page": 116, + "line": "a. Share Capital 2 1,044.00 1,044.00", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "reserves_surplus": { + "current": { + "field": "reserves_surplus", + "value": 525503000.0, + "page": 116, + "line": "b. Reserves and Surplus 3 5,255.03 4,441.83", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "reserves_surplus", + "value": 444183000.0, + "page": 116, + "line": "b. Reserves and Surplus 3 5,255.03 4,441.83", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "borrowings_non_current": { + "current": { + "field": "borrowings_non_current", + "value": 233321999.99999997, + "page": 116, + "line": "a. Long-Term Borrowings 4 2,333.22 354.22", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "borrowings_non_current", + "value": 35422000.0, + "page": 116, + "line": "a. Long-Term Borrowings 4 2,333.22 354.22", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "borrowings_current": { + "current": { + "field": "borrowings_current", + "value": 75111000.0, + "page": 116, + "line": "a. Short Term Borrowings 7 751.11 321.08", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "borrowings_current", + "value": 32108000.0, + "page": 116, + "line": "a. Short Term Borrowings 7 751.11 321.08", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "other_current_liabilities": { + "current": { + "field": "other_current_liabilities", + "value": 106088000.00000001, + "page": 116, + "line": "c. Other Current Liabilities 9 1,060.88 1,047.23", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "other_current_liabilities", + "value": 104723000.0, + "page": 116, + "line": "c. Other Current Liabilities 9 1,060.88 1,047.23", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "short_term_provisions": { + "current": { + "field": "short_term_provisions", + "value": 38455000.0, + "page": 116, + "line": "d. Short Term Provisions 10 384.55 290.56", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "short_term_provisions", + "value": 29056000.0, + "page": 116, + "line": "d. Short Term Provisions 10 384.55 290.56", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "total_equity_liabilities": { + "current": { + "field": "total_equity_liabilities", + "value": 1476434000.0, + "page": 116, + "line": "Total 14,764.34 10,004.04", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "total_equity_liabilities", + "value": 1000404000.0000001, + "page": 116, + "line": "Total 14,764.34 10,004.04", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "non_current_investments": { + "current": { + "field": "non_current_investments", + "value": 14546000.0, + "page": 116, + "line": "b. Non-Current Investments 12 145.46 492.82", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "non_current_investments", + "value": 49282000.0, + "page": 116, + "line": "b. Non-Current Investments 12 145.46 492.82", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "long_term_loans_advances": { + "current": { + "field": "long_term_loans_advances", + "value": 50262000.0, + "page": 116, + "line": "d. Long Term Loans and Advances 13 502.62 475.08", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "long_term_loans_advances", + "value": 47508000.0, + "page": 116, + "line": "d. Long Term Loans and Advances 13 502.62 475.08", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "inventories": { + "current": { + "field": "inventories", + "value": 424751000.0, + "page": 116, + "line": "b. Inventories 15 4,247.51 2,105.04", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "inventories", + "value": 210504000.0, + "page": 116, + "line": "b. Inventories 15 4,247.51 2,105.04", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "trade_receivables": { + "current": { + "field": "trade_receivables", + "value": 203115000.0, + "page": 116, + "line": "c. Trade Receivables 16 2,031.15 2,173.66", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "trade_receivables", + "value": 217366000.0, + "page": 116, + "line": "c. Trade Receivables 16 2,031.15 2,173.66", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "cash_and_equivalents": { + "current": { + "field": "cash_and_equivalents", + "value": 94569000.0, + "page": 116, + "line": "d. Cash and Cash Equivalents 17 945.69 1,317.06", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "cash_and_equivalents", + "value": 131706000.0, + "page": 116, + "line": "d. Cash and Cash Equivalents 17 945.69 1,317.06", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "total_assets": { + "current": { + "field": "total_assets", + "value": 1476434000.0, + "page": 116, + "line": "Total 14,764.34 10,004.04", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "total_assets", + "value": 1000404000.0000001, + "page": 116, + "line": "Total 14,764.34 10,004.04", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + } + }, + "shareholding": [], + "related_party": [ + { + "label": "Mrs. Pooja Kirti Kothari Independent Director Member", + "amount": 4.0, + "page": 64, + "line": "Mrs. Pooja Kirti Kothari Independent Director Member 4 4" + }, + { + "label": "Mr. Ketan Chandrakant Dave Independent Director Member", + "amount": 1.0, + "page": 64, + "line": "Mr. Ketan Chandrakant Dave Independent Director Member 1 Nil" + }, + { + "label": "Mr. Kaushik Hanskumar Shah Whole-time Director Member", + "amount": 5.0, + "page": 64, + "line": "Mr. Kaushik Hanskumar Shah Whole-time Director Member 5 5" + }, + { + "label": "", + "amount": 2.0, + "page": 64, + "line": "2) Recommending to the Board for the appointment, re-appointment, replacement, remuneration and" + }, + { + "label": "", + "amount": 9.0, + "page": 64, + "line": "9) Scrutiny of inter-corporate loans and investments;" + }, + { + "label": "", + "amount": 12.0, + "page": 64, + "line": "12) Establishing a vigil mechanism for directors and employees to report their genuine concerns or" + }, + { + "label": "", + "amount": 20.0, + "page": 69, + "line": "20. PARTICULARS OF LOANS, GUARANTEES OR INVESTMENTS BY COMPANY" + }, + { + "label": "Requirements) Regulations,", + "amount": 2015.0, + "page": 69, + "line": "Requirements) Regulations, 2015, the details of loans and advances given to subsidiaries have also" + }, + { + "label": "", + "amount": 22.0, + "page": 69, + "line": "22. REMUNERATION POLICY FOR DIRECTORS, KEY MANAGERIAL PERSONNEL AND SENIOR" + }, + { + "label": "", + "amount": 26.0, + "page": 70, + "line": "26. DIRECTORS' RESPONSIBILITY STATEMENT" + }, + { + "label": "Pursuant to the provisions of section", + "amount": 134.0, + "page": 70, + "line": "Pursuant to the provisions of section 134(5) of the Companies Act, 2013, the Directors confirm that;" + } + ], + "auditors": [ + "Auditors) Rules, 2014, A D V & Associates., Chartered Accountants (Firm Registration No. (FRN No.", + "Chartered Accountants", + "Chartered Accountants of India (ICAI) together with the independence requirements that are relevant to our", + "Chartered Accountants of India." + ], + "page_index": { + "pl": [ + 29, + 99, + 107, + 109, + 117, + 130, + 138, + 140, + 142, + 151 + ], + "directors_report": [ + 14, + 15, + 55, + 58, + 108, + 140 + ], + "balance_sheet": [ + 29, + 97, + 107, + 116, + 119, + 137, + 140 + ], + "shareholding": [], + "related_party": [ + 64, + 69, + 70, + 73, + 121, + 127, + 133, + 141, + 148, + 154 + ] + }, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld." + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [ + "total assets = total equity and liabilities" + ], + "statement_pages": { + "audited_pl": 117, + "directors_report": 58 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/543928.json b/app/backend/primarydraft/data/companies/543928.json new file mode 100644 index 0000000000000000000000000000000000000000..dd1cd5544fbf0cbb0160c58bbd3f8c80170af41c --- /dev/null +++ b/app/backend/primarydraft/data/companies/543928.json @@ -0,0 +1,592 @@ +{ + "scrip_code": "543928", + "bse": { + "scrip_name": "Cosmic CRF Ltd", + "issuer_name": "Cosmic CRF Limited", + "group": "MT", + "segment": "Equity", + "isin": "INE0ORA01015", + "face_value": "10.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Capital Goods", + "market_cap": "1226.14", + "eps_reported": "28.55", + "pe_reported": "46.74", + "security_id": "COSMICCRF" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/2e320aa7-cbd2-440e-ba50-8bdd213f3cdc.pdf", + "authorised_at": "2025-08-30T18:18:07.977", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543928_2025.pdf", + "available_years": [ + "2025", + "2024" + ] + }, + "extraction": { + "scrip_code": "543928", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543928_2025.pdf", + "pages": 144, + "cin": "L27100WB2021PLC250447", + "isin": "INEQORAOI015", + "company_name": "1G Cosmic Crf Limited", + "emails": [ + "cs@cosmiccrf.com", + "cs@cosmicerf.com", + "evoting@nsal.co.in", + "evoting@nsdl.co.in", + "evoting@nsdl.com", + "info@cosmiccrf.com" + ], + "dins": [ + "01056704", + "01713323", + "02488423", + "06422518", + "06613927" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 3016370000.0, + "page": 88, + "line": "(a) Revenue from Operations 21 30,163.70 25,347.69", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 2534769000.0, + "page": 88, + "line": "(a) Revenue from Operations 21 30,163.70 25,347.69", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 1666000.0, + "page": 88, + "line": "(b) Other Income 22 16.66 16.23", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 1623000.0, + "page": 88, + "line": "(b) Other Income 22 16.66 16.23", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 3018036000.0, + "page": 88, + "line": "Total Income 30,180.36 25,363.92", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 2536392000.0, + "page": 88, + "line": "Total Income 30,180.36 25,363.92", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 2558326000.0, + "page": 88, + "line": "(a) Cost of Raw Materials and Components Consumed 23 25,583.26 23,102.79", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "cost_of_materials", + "value": 2310279000.0, + "page": 88, + "line": "(a) Cost of Raw Materials and Components Consumed 23 25,583.26 23,102.79", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 42834000.0, + "page": 88, + "line": "(c) Employee Benefit Expenses 25 428.34 416.64", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "employee_benefits", + "value": 41664000.0, + "page": 88, + "line": "(c) Employee Benefit Expenses 25 428.34 416.64", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 61945000.00000001, + "page": 88, + "line": "(e) Finance Costs 27 619.45 333.51", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 33351000.0, + "page": 88, + "line": "(e) Finance Costs 27 619.45 333.51", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 40844000.0, + "page": 88, + "line": "(f) Depreciation & Amortisation Expenses 28 408.44 357.07", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 35707000.0, + "page": 88, + "line": "(f) Depreciation & Amortisation Expenses 28 408.44 357.07", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 74960000.0, + "page": 88, + "line": "(g) Other Expenses 29 749.60 482.96", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_expenses", + "value": 48296000.0, + "page": 88, + "line": "(g) Other Expenses 29 749.60 482.96", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 2766914000.0, + "page": 88, + "line": "Total Expenses 27,669.14 23,793.52", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 2379352000.0, + "page": 88, + "line": "Total Expenses 27,669.14 23,793.52", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 251121999.99999997, + "page": 88, + "line": "Profit/(Loss) Before Tax 2,511.22 1,570.40", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 157040000.0, + "page": 88, + "line": "Profit/(Loss) Before Tax 2,511.22 1,570.40", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 56010000.0, + "page": 88, + "line": "- Current Tax 560.10 376.00", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 37600000.0, + "page": 88, + "line": "- Current Tax 560.10 376.00", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 8087000.0, + "page": 88, + "line": "- Deferred Tax 80.87 (82.31)", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": -8231000.0, + "page": 88, + "line": "- Deferred Tax 80.87 (82.31)", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 187025000.0, + "page": 88, + "line": "Profit/(Loss) After Tax 1,870.25 1,275.49", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pat", + "value": 127549000.0, + "page": 88, + "line": "Profit/(Loss) After Tax 1,870.25 1,275.49", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + } + }, + "directors_pl": { + "total_income": { + "current": { + "field": "total_income", + "value": 3018036000.0, + "page": 48, + "line": "Total Revenue 30,180.36 25,363.92 40,196.99", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 2536392000.0, + "page": 48, + "line": "Total Revenue 30,180.36 25,363.92 40,196.99", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 353911000.0, + "page": 48, + "line": "Profit Before Finance Cost, Tax, Depreciation/Amortization 3,539.11 2,260.98 5,029.48", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 226098000.0, + "page": 48, + "line": "Profit Before Finance Cost, Tax, Depreciation/Amortization 3,539.11 2,260.98 5,029.48", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 291966000.0, + "page": 48, + "line": "Profit Before Tax, Depreciation/Amortization 2,919.66 1,927.47 4,410.03", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 192747000.0, + "page": 48, + "line": "Profit Before Tax, Depreciation/Amortization 2,919.66 1,927.47 4,410.03", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 251121999.99999997, + "page": 48, + "line": "Net Profit Before Taxation 2,511.22 1,570.40 3,740.94", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 157040000.0, + "page": 48, + "line": "Net Profit Before Taxation 2,511.22 1,570.40 3,740.94", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 8087000.0, + "page": 48, + "line": "Less: Deferred Tax 80.87 (82.31) 89.37", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": -8231000.0, + "page": 48, + "line": "Less: Deferred Tax 80.87 (82.31) 89.37", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 56010000.0, + "page": 48, + "line": "Less: Current Tax 560.10 377.22 570.10", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 37722000.0, + "page": 48, + "line": "Less: Current Tax 560.10 377.22 570.10", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 187025000.0, + "page": 48, + "line": "Profit/(Loss) After Tax 1,870.25 1,275.49 3,081.47", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pat", + "value": 127549000.0, + "page": 48, + "line": "Profit/(Loss) After Tax 1,870.25 1,275.49 3,081.47", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 22.65, + "page": 48, + "line": "Basic (\u00ae) 22.65 19.35 37.32", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "eps_basic", + "value": 19.35, + "page": 48, + "line": "Basic (\u00ae) 22.65 19.35 37.32", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 22.6, + "page": 48, + "line": "Diluted (%) 22.60 19.35 37.23", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "eps_diluted", + "value": 19.35, + "page": 48, + "line": "Diluted (%) 22.60 19.35 37.23", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "", + "amount": 15.0, + "page": 50, + "line": "15. PARTICULARS OF MANAGERIAL REMUNERATION PAYABLE TO EXECUTIVE DIRECTORS OF THE COMPANY:" + }, + { + "label": "During the year under review, the managerial remuneration payable to Mr. Aditya Vikram Birla (DIN:", + "amount": 6613927.0, + "page": 50, + "line": "During the year under review, the managerial remuneration payable to Mr. Aditya Vikram Birla (DIN: 06613927)," + }, + { + "label": "Managing Director and Mrs. Purvi Birla (DIN:", + "amount": 2488423.0, + "page": 50, + "line": "Managing Director and Mrs. Purvi Birla (DIN: 02488423), Whole-Time Director of the Company is in compliance" + }, + { + "label": "Moreover, Mrs. Purvi Birla (DIN:", + "amount": 2488423.0, + "page": 50, + "line": "Moreover, Mrs. Purvi Birla (DIN: 02488423), Whole-Time Director of the Company w.e.f October, 2024 also" + }, + { + "label": "", + "amount": 7.0, + "page": 62, + "line": "7. {Amount paid as advances if any NA" + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants For Cosmic CRF Limited", + "Chartered Accountants P.O Molla Simla,", + "Kolkata and is a fellow member of the Institute of Chartered Accountants" + ], + "page_index": { + "pl": [ + 3, + 77, + 79, + 88, + 92, + 95, + 115, + 120, + 122, + 124, + 128 + ], + "directors_report": [ + 39, + 42, + 48, + 72, + 73, + 78, + 113 + ], + "balance_sheet": [ + 77, + 112 + ], + "shareholding": [], + "related_party": [ + 50, + 62, + 77, + 78, + 103, + 109, + 112, + 113, + 135 + ] + }, + "warnings": [ + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "directors_pl_identities": [ + "pat = pbt - tax" + ], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 88, + "directors_report": 48 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/543931.json b/app/backend/primarydraft/data/companies/543931.json new file mode 100644 index 0000000000000000000000000000000000000000..7dd363f616c904f74457b38d652b2d8a5b8f2895 --- /dev/null +++ b/app/backend/primarydraft/data/companies/543931.json @@ -0,0 +1,981 @@ +{ + "scrip_code": "543931", + "bse": { + "scrip_name": "Veefin Solutions Ltd", + "issuer_name": "VEEFIN SOLUTIONS LIMITED", + "group": "M", + "segment": "Equity", + "isin": "INE0Q0M01015", + "face_value": "10.00", + "industry": "", + "sector": "Information Technology", + "industry_new": "Information Technology", + "market_cap": "731.19", + "eps_reported": "6.33", + "pe_reported": "45.23", + "security_id": "VEEFIN" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/f102c0bd-09b6-4d7c-aada-30e8b1c1cdd5.pdf", + "authorised_at": "2025-09-04T22:25:39.51", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543931_2025.pdf", + "available_years": [ + "2025", + "2024", + "2023" + ] + }, + "extraction": { + "scrip_code": "543931", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543931_2025.pdf", + "pages": 201, + "cin": "L72900MH2020PLC347893", + "isin": "INE0Q0M01015", + "company_name": "Bse Limited", + "emails": [ + "evoting@nsdl.co.in", + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "investors@veefin.com" + ], + "dins": [ + "03081749", + "07658567", + "08204851", + "08216993", + "10726531" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 785976000.0, + "page": 163, + "line": "I Revenue from Operations 23 7,859.76 2,497.21", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "revenue_from_operations", + "value": 249721000.0, + "page": 163, + "line": "I Revenue from Operations 23 7,859.76 2,497.21", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 18461000.0, + "page": 163, + "line": "II Other Incomes 24 184.61 2.21", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "other_income", + "value": 221000.0, + "page": 163, + "line": "II Other Incomes 24 184.61 2.21", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 804437000.0, + "page": 163, + "line": "III Total Revenue 8 ,044.37 2,499.42", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "total_income", + "value": 249942000.0, + "page": 163, + "line": "III Total Revenue 8 ,044.37 2,499.42", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 273854000.0, + "page": 163, + "line": "Employee Benefits Expenses 25 2,738.54 6 15.30", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "employee_benefits", + "value": 600000.0, + "page": 163, + "line": "Employee Benefits Expenses 25 2,738.54 6 15.30", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 600000.0, + "page": 163, + "line": "Finance Costs 28 6 8.84 27.54", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "finance_costs", + "value": 884000.0, + "page": 163, + "line": "Finance Costs 28 6 8.84 27.54", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 50999000.0, + "page": 163, + "line": "Depreciation & Amortization Expense 29 509.99 94.09", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "depreciation", + "value": 9409000.0, + "page": 163, + "line": "Depreciation & Amortization Expense 29 509.99 94.09", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 182078000.0, + "page": 163, + "line": "Other Expenses 30 1,820.78 7 10.27", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "other_expenses", + "value": 700000.0, + "page": 163, + "line": "Other Expenses 30 1,820.78 7 10.27", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 599290000.0, + "page": 163, + "line": "Total Expenses 5 ,992.90 1,532.59", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "total_expenses", + "value": 153259000.0, + "page": 163, + "line": "Total Expenses 5 ,992.90 1,532.59", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 205146999.99999997, + "page": 163, + "line": "VII Profit before tax (V-VI) 2 ,051.47 966.83", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "pbt", + "value": 96683000.0, + "page": 163, + "line": "VII Profit before tax (V-VI) 2 ,051.47 966.83", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 16343000.0, + "page": 163, + "line": "Current Tax 163.43 -", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 24077000.0, + "page": 163, + "line": "Deferred Tax Expenses 240.77 2 27.49", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "tax_deferred", + "value": 200000.0, + "page": 163, + "line": "Deferred Tax Expenses 240.77 2 27.49", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "tax_total": { + "current": { + "field": "tax_total", + "value": 42555000.0, + "page": 163, + "line": "Total Tax Expenses 425.55 227.49", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "tax_total", + "value": 22749000.0, + "page": 163, + "line": "Total Tax Expenses 425.55 227.49", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "pat": { + "current": { + "field": "pat", + "value": 162592000.0, + "page": 163, + "line": "IX Profit for the period (VII-VIII) 1 ,625.92 739.34", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "pat", + "value": 73934000.0, + "page": 163, + "line": "IX Profit for the period (VII-VIII) 1 ,625.92 739.34", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 5.92, + "page": 163, + "line": "Basic EPS (in \u20b9) 5.92 3.27", + "scale": 1.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "eps_basic", + "value": 3.27, + "page": 163, + "line": "Basic EPS (in \u20b9) 5.92 3.27", + "scale": 1.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 5.41, + "page": 163, + "line": "Diluted EPS (in \u20b9) 5.41 2.99", + "scale": 1.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "eps_diluted", + "value": 2.99, + "page": 163, + "line": "Diluted EPS (in \u20b9) 5.41 2.99", + "scale": 1.0, + "section": "audited_pl", + "basis": "consolidated" + } + } + }, + "directors_pl": { + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 237538000.0, + "page": 71, + "line": "Total expenses 2375.38 1287.13 5,992.90 1532.58", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 128713000.00000001, + "page": 71, + "line": "Total expenses 2375.38 1287.13 5,992.90 1532.58", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 174285000.0, + "page": 71, + "line": "Profit before interest, depreciation & Taxes 1742.85 902.51 2614.23 1081.70 Solutions Private Limited) completed on 14th June, 2024. Estorifi Solutions Limited is a related", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 90251000.0, + "page": 71, + "line": "Profit before interest, depreciation & Taxes 1742.85 902.51 2614.23 1081.70 Solutions Private Limited) completed on 14th June, 2024. Estorifi Solutions Limited is a related", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 140517000.0, + "page": 71, + "line": "Profit before tax 1,405.17 791.08 2,051.47 966.84 into non-financial platforms and applications. Pursuant to this", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 79108000.0, + "page": 71, + "line": "Profit before tax 1,405.17 791.08 2,051.47 966.84 into non-financial platforms and applications. Pursuant to this", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 111504000.0, + "page": 71, + "line": "Profit after tax 1,115.04 563.85 1,625.92 739.35", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pat", + "value": 56385000.0, + "page": 71, + "line": "Profit after tax 1,115.04 563.85 1,625.92 739.35", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 4.93, + "page": 71, + "line": "Basic \u20b9 4.93 2.74 5.92 3.60", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "eps_basic", + "value": 2.74, + "page": 71, + "line": "Basic \u20b9 4.93 2.74 5.92 3.60", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 4.51, + "page": 71, + "line": "Diluted \u20b9 4.51 2.51 5.42 3.29 Systems Private Limited) party of the Company engaged in the business of Fraud and Risk", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "eps_diluted", + "value": 2.51, + "page": 71, + "line": "Diluted \u20b9 4.51 2.51 5.42 3.29 Systems Private Limited) party of the Company engaged in the business of Fraud and Risk", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 378055000.0, + "page": 71, + "line": "Standalone Financial The Total Revenue of the Company stood at Rs. 3,780.55 Lakhs for the", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": { + "share_capital": { + "current": { + "field": "share_capital", + "value": 227490000.0, + "page": 118, + "line": "a Share Capital 3 2,274.90 2 ,257.27", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "share_capital", + "value": 225727000.0, + "page": 118, + "line": "a Share Capital 3 2,274.90 2 ,257.27", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "reserves_surplus": { + "current": { + "field": "reserves_surplus", + "value": 1294248000.0, + "page": 118, + "line": "b Reserves and Surplus 5 12,942.48 9 ,639.04", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "reserves_surplus", + "value": 963904000.0000001, + "page": 118, + "line": "b Reserves and Surplus 5 12,942.48 9 ,639.04", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "borrowings_non_current": { + "current": { + "field": "borrowings_non_current", + "value": 236057000.00000003, + "page": 118, + "line": "a Long-Term Borrowings 6 2,360.57 564.54", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "borrowings_non_current", + "value": 56454000.0, + "page": 118, + "line": "a Long-Term Borrowings 6 2,360.57 564.54", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "deferred_tax_liability": { + "current": { + "field": "deferred_tax_liability", + "value": 600000.0, + "page": 118, + "line": "b Deferred Tax Liabilities (Net) 7 6 19.08 328.95", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "deferred_tax_liability", + "value": 1907999.9999999998, + "page": 118, + "line": "b Deferred Tax Liabilities (Net) 7 6 19.08 328.95", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "borrowings_current": { + "current": { + "field": "borrowings_current", + "value": 400000.0, + "page": 118, + "line": "a Short Term Borrowings 9 4 47.91 95.31", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "borrowings_current", + "value": 4791000.0, + "page": 118, + "line": "a Short Term Borrowings 9 4 47.91 95.31", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "other_current_liabilities": { + "current": { + "field": "other_current_liabilities", + "value": 400000.0, + "page": 118, + "line": "c Other Current Liabilities 11 4 45.87 408.75", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "other_current_liabilities", + "value": 4587000.0, + "page": 118, + "line": "c Other Current Liabilities 11 4 45.87 408.75", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "short_term_provisions": { + "current": { + "field": "short_term_provisions", + "value": 1630000.0, + "page": 118, + "line": "d Short Term Provisions 12 16.30 13.48", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "short_term_provisions", + "value": 1348000.0, + "page": 118, + "line": "d Short Term Provisions 12 16.30 13.48", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "total_equity_liabilities": { + "current": { + "field": "total_equity_liabilities", + "value": 1977986000.0, + "page": 118, + "line": "Total Equity & Liabilities 19,779.86 14,140.28", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "total_equity_liabilities", + "value": 1414028000.0, + "page": 118, + "line": "Total Equity & Liabilities 19,779.86 14,140.28", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "ppe": { + "current": { + "field": "ppe", + "value": 1549739000.0, + "page": 118, + "line": "(ii) Intangible Assets 13 (ii) 15,497.39 9 ,077.70", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "ppe", + "value": 907770000.0000001, + "page": 118, + "line": "(ii) Intangible Assets 13 (ii) 15,497.39 9 ,077.70", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "non_current_investments": { + "current": { + "field": "non_current_investments", + "value": 400000.0, + "page": 118, + "line": "b Non-Current Investments 14 4 38.74 18.68", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "non_current_investments", + "value": 3874000.0, + "page": 118, + "line": "b Non-Current Investments 14 4 38.74 18.68", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "trade_receivables": { + "current": { + "field": "trade_receivables", + "value": 179846000.0, + "page": 118, + "line": "a Trade Receivables 17 1,798.46 958.61", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "trade_receivables", + "value": 95861000.0, + "page": 118, + "line": "a Trade Receivables 17 1,798.46 958.61", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "cash_and_equivalents": { + "current": { + "field": "cash_and_equivalents", + "value": 600000.0, + "page": 118, + "line": "b Cash and Cash Equivalents 18 6 66.74 3 ,105.08", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "cash_and_equivalents", + "value": 6673999.999999999, + "page": 118, + "line": "b Cash and Cash Equivalents 18 6 66.74 3 ,105.08", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + }, + "total_assets": { + "current": { + "field": "total_assets", + "value": 1977986000.0, + "page": 118, + "line": "Total Assets 19,779.86 14,140.28", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + }, + "previous": { + "field": "total_assets", + "value": 1414028000.0, + "page": 118, + "line": "Total Assets 19,779.86 14,140.28", + "scale": 100000.0, + "section": "balance_sheet", + "basis": "standalone" + } + } + }, + "shareholding": [], + "related_party": [ + { + "label": "for the financial year ended March", + "amount": 31.0, + "page": 16, + "line": "for the financial year ended March 31, 2025, together with the report of the Board of Directors and shall be deemed to include the Audit Committee or any other Committee constitute" + }, + { + "label": "", + "amount": 2.0, + "page": 16, + "line": "2. To appoint a Director in place of Mr. Raja Debnath (DIN No. 07658567), Managing Director, who" + }, + { + "label": "", + "amount": 2013.0, + "page": 16, + "line": "2013, Rule 9 of the Companies (Appointment and Remuneration of Managerial Personnel) Rules, 2014" + }, + { + "label": "Related Party Transaction to be entered into with related parties for FY", + "amount": 2025.0, + "page": 17, + "line": "Related Party Transaction to be entered into with related parties for FY 2025-2026 is as follows RESOLVED FURTHER THAT the Board of Directors of the Company (which shall be deemed " + }, + { + "label": "Raja Debnath Promoter and Director Availing of revolving loan facility (To take", + "amount": 50.0, + "page": 17, + "line": "Raja Debnath Promoter and Director Availing of revolving loan facility (To take 50" + }, + { + "label": "Gautam Udani Promoter and Director Availing of revolving loan facility (To take", + "amount": 50.0, + "page": 17, + "line": "Gautam Udani Promoter and Director Availing of revolving loan facility (To take 50 and to take all such decisions from powers herein conferred; and delegate all or any of the power" + }, + { + "label": "Availing and rendering of revolving loan", + "amount": 100.0, + "page": 17, + "line": "Availing and rendering of revolving loan 100 this resolution.\u201d" + }, + { + "label": "Availing and rendering of revolving loan", + "amount": 100.0, + "page": 17, + "line": "Availing and rendering of revolving loan 100" + }, + { + "label": "Availing and rendering of revolving loan", + "amount": 50.0, + "page": 17, + "line": "Availing and rendering of revolving loan 50 applicable provisions, if any, of the Companies Act, 2013 read with applicable Rules under Companies" + }, + { + "label": "Availing and rendering of revolving loan", + "amount": 50.0, + "page": 17, + "line": "Availing and rendering of revolving loan 50 approval of the Audit Committee and the Board of the Directors, consent of the Members of the Company" + }, + { + "label": "Availing and rendering of revolving loan", + "amount": 50.0, + "page": 17, + "line": "Availing and rendering of revolving loan 50" + }, + { + "label": "Availing and rendering of revolving loan", + "amount": 50.0, + "page": 17, + "line": "Availing and rendering of revolving loan 50" + }, + { + "label": "Availing and rendering of revolving loan", + "amount": 20.0, + "page": 17, + "line": "Availing and rendering of revolving loan 20" + }, + { + "label": "Availing and rendering of revolving loan", + "amount": 50.0, + "page": 17, + "line": "Availing and rendering of revolving loan 50" + }, + { + "label": "Related Party Transaction to be entered into with related parties for FY", + "amount": 2025.0, + "page": 18, + "line": "Related Party Transaction to be entered into with related parties for FY 2025-2026 is as follows: RESOLVED FURTHER THAT the Board of Directors of the Company (which shall be deemed" + }, + { + "label": "Raja Debnath Promoter and Director Availing of revolving loan facility (To take", + "amount": 50.0, + "page": 18, + "line": "Raja Debnath Promoter and Director Availing of revolving loan facility (To take 50" + }, + { + "label": "Gautam Udani Promoter and Director Availing of revolving loan facility (To take", + "amount": 50.0, + "page": 18, + "line": "Gautam Udani Promoter and Director Availing of revolving loan facility (To take 50 powers herein conferred; and delegate all or any of the powers herein conferred to any Director, " + }, + { + "label": "Availing and rendering of revolving loan", + "amount": 100.0, + "page": 18, + "line": "Availing and rendering of revolving loan 100" + }, + { + "label": "Availing and rendering of revolving loan", + "amount": 20.0, + "page": 18, + "line": "Availing and rendering of revolving loan 20" + }, + { + "label": "Availing and rendering of revolving loan", + "amount": 20.0, + "page": 18, + "line": "Availing and rendering of revolving loan 20" + } + ], + "auditors": [ + "Chartered Accountant", + "Chartered Accountants", + "Financial Controls over Financial Reporting issued by the Institute of Chartered Accountants of India. These", + "by the Institute of Chartered Accountants of India (the \u201cICAI\u201d) together with the" + ], + "page_index": { + "pl": [ + 105, + 107, + 119, + 120, + 123, + 128, + 135, + 136, + 137, + 143, + 144, + 146, + 149, + 150, + 152, + 163, + 164, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 176, + 181, + 183, + 186, + 194, + 195, + 196, + 197, + 198, + 199, + 200 + ], + "directors_report": [ + 71, + 73, + 106, + 153 + ], + "balance_sheet": [ + 105, + 118, + 152, + 162 + ], + "shareholding": [], + "related_party": [ + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 32, + 33, + 35, + 36, + 39, + 40, + 43, + 44, + 45, + 47, + 48, + 49, + 51, + 52, + 53, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 65, + 66, + 67, + 81, + 84, + 87, + 93, + 130, + 139, + 184 + ] + }, + "warnings": [], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "directors_pl_identities": [ + "pbt = total_income - total_expenses" + ], + "balance_sheet_identities": [ + "total assets = total equity and liabilities" + ], + "statement_pages": { + "audited_pl": 163, + "directors_report": 71 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/543943.json b/app/backend/primarydraft/data/companies/543943.json new file mode 100644 index 0000000000000000000000000000000000000000..18918a127ea85b22134709c3c01afb061b90fb18 --- /dev/null +++ b/app/backend/primarydraft/data/companies/543943.json @@ -0,0 +1,465 @@ +{ + "scrip_code": "543943", + "bse": { + "scrip_name": "Asarfi Hospital Ltd", + "issuer_name": "ASARFI HOSPITAL LIMITED", + "group": "M", + "segment": "Equity", + "isin": "INE0DN001027", + "face_value": "10.00", + "industry": "", + "sector": "Healthcare", + "industry_new": "Healthcare", + "market_cap": "436.54", + "eps_reported": "8.68", + "pe_reported": "25.56", + "security_id": "ASARFI" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/fd8fd703-44a2-4bc6-aae0-879b89d76707.pdf", + "authorised_at": "2025-08-21T17:42:13.713", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543943_2025.pdf", + "available_years": [ + "2025", + "2024", + "2023" + ] + }, + "extraction": { + "scrip_code": "543943", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543943_2025.pdf", + "pages": 217, + "cin": "L85110JH2005PLC011673", + "isin": null, + "company_name": "Bse Limited", + "emails": [ + "asarfieducationalfoundation@gmail.com", + "asarfihospital@hotmail.com", + "cadchanchani@gmail.com", + "cameo@cameoindia.com", + "cs@asarfihospital.com", + "csriruritolia@gmail.com" + ], + "dins": [ + "00484115", + "06562038", + "08453794", + "09039421", + "09538512" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 1205657000.0, + "page": 172, + "line": "Revenue from Operations 21 12,056.57 8,440.04", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "revenue_from_operations", + "value": 844004000.0000001, + "page": 172, + "line": "Revenue from Operations 21 12,056.57 8,440.04", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 75199000.0, + "page": 172, + "line": "Other Income 22 751.99 167.01", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "other_income", + "value": 16701000.0, + "page": 172, + "line": "Other Income 22 751.99 167.01", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 1280856000.0, + "page": 172, + "line": "Total Income 12,808.56 8,607.05", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "total_income", + "value": 860704999.9999999, + "page": 172, + "line": "Total Income 12,808.56 8,607.05", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 193998000.0, + "page": 172, + "line": "Cost of Material Consumed 23 1 ,939.98 1,620.94", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "cost_of_materials", + "value": 162094000.0, + "page": 172, + "line": "Cost of Material Consumed 23 1 ,939.98 1,620.94", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "purchases_stock_in_trade": { + "current": { + "field": "purchases_stock_in_trade", + "value": 90931000.0, + "page": 172, + "line": "Purchases of Stock in Trade 24 909.31 430.91", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "purchases_stock_in_trade", + "value": 43091000.0, + "page": 172, + "line": "Purchases of Stock in Trade 24 909.31 430.91", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 186323000.0, + "page": 172, + "line": "Employee Benefit Expenses 26 1 ,863.23 1,413.13", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "employee_benefits", + "value": 141313000.0, + "page": 172, + "line": "Employee Benefit Expenses 26 1 ,863.23 1,413.13", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 40809000.0, + "page": 172, + "line": "Finance Costs 27 408.09 270.69", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "finance_costs", + "value": 27069000.0, + "page": 172, + "line": "Finance Costs 27 408.09 270.69", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 126759999.99999999, + "page": 172, + "line": "Depreciation and Amortization Expenses 28 1 ,267.60 878.75", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "depreciation", + "value": 87875000.0, + "page": 172, + "line": "Depreciation and Amortization Expenses 28 1 ,267.60 878.75", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 505262000.0, + "page": 172, + "line": "Other Expenses 29 5 ,052.62 3,388.28", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "other_expenses", + "value": 338828000.0, + "page": 172, + "line": "Other Expenses 29 5 ,052.62 3,388.28", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 1137747000.0, + "page": 172, + "line": "Total expenses 11,377.47 7,982.93", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "total_expenses", + "value": 798293000.0, + "page": 172, + "line": "Total expenses 11,377.47 7,982.93", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 143109000.0, + "page": 172, + "line": "Profit/(Loss) before Tax 1 ,431.09 624.12", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "pbt", + "value": 62412000.0, + "page": 172, + "line": "Profit/(Loss) before Tax 1 ,431.09 624.12", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 30756000.0, + "page": 172, + "line": "- Current Tax 307.56 -", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 6545999.999999999, + "page": 172, + "line": "- Deferred Tax 65.46 190.56", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "tax_deferred", + "value": 19056000.0, + "page": 172, + "line": "- Deferred Tax 65.46 190.56", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "pat": { + "current": { + "field": "pat", + "value": 105760999.99999999, + "page": 172, + "line": "Profit/(Loss) after Tax 1,057.61 416.16", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "pat", + "value": 41616000.0, + "page": 172, + "line": "Profit/(Loss) after Tax 1,057.61 416.16", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 5.37, + "page": 172, + "line": "-Basic (In Rs) 31 5.37 2 .31", + "scale": 1.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "eps_basic", + "value": 2.31, + "page": 172, + "line": "-Basic (In Rs) 31 5.37 2 .31", + "scale": 1.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 5.37, + "page": 172, + "line": "-Diluted (In Rs) 31 5.37 2 .31", + "scale": 1.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "eps_diluted", + "value": 2.31, + "page": 172, + "line": "-Diluted (In Rs) 31 5.37 2 .31", + "scale": 1.0, + "section": "audited_pl", + "basis": "consolidated" + } + } + }, + "directors_pl": {}, + "balance_sheet": {}, + "shareholding": [ + { + "label": "A. PROMOTERS", + "numbers": [ + 0.0 + ], + "percent": 0.0, + "page": 84, + "line": "A. PROMOTERS 0.00%" + } + ], + "related_party": [ + { + "label": "", + "amount": 30.0, + "page": 77, + "line": "30. PARTICULARS OF LOANS, GUARANTEES OR" + }, + { + "label": "\u20b9", + "amount": 318.38, + "page": 133, + "line": "\u20b9 318.38 Lakh during the current financial year." + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants ASARFI EDUCATIONAL FOUNDATION", + "Chartered Accountants Asarfi Hospital Limited", + "Chartered Accountants of India. These responsibilities include the design, implementation and" + ], + "page_index": { + "pl": [ + 128, + 141, + 142, + 144, + 148, + 167, + 172, + 176, + 177, + 179, + 181, + 183, + 206, + 207 + ], + "directors_report": [ + 61, + 126, + 165, + 198 + ], + "balance_sheet": [ + 125, + 137, + 164, + 171, + 197, + 202 + ], + "shareholding": [ + 80, + 84, + 90 + ], + "related_party": [ + 77, + 104, + 133, + 145, + 160, + 161, + 180, + 193, + 194, + 209, + 214 + ] + }, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 172, + "directors_report": 61 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/543953.json b/app/backend/primarydraft/data/companies/543953.json new file mode 100644 index 0000000000000000000000000000000000000000..98c94ebbc54e6795161c0b7053b25c12a794e877 --- /dev/null +++ b/app/backend/primarydraft/data/companies/543953.json @@ -0,0 +1,405 @@ +{ + "scrip_code": "543953", + "bse": { + "scrip_name": "Khazanchi Jewellers Ltd", + "issuer_name": "Khazanchi Jewellers Limited", + "group": "M", + "segment": "Equity", + "isin": "INE0OWC01011", + "face_value": "10.00", + "industry": "", + "sector": "Consumer Discretionary", + "industry_new": "Consumer Durables", + "market_cap": "1821.12", + "eps_reported": "36.13", + "pe_reported": "20.37", + "security_id": "KHAZANCHI" + }, + "annual_report": { + "year": "2026", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/a191243a-5e84-4016-8ca1-d1bf2ca5bfe8.pdf", + "authorised_at": "2026-07-17T16:20:35.72", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543953_2026.pdf", + "available_years": [ + "2026", + "2025", + "2024" + ] + }, + "extraction": { + "scrip_code": "543953", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543953_2026.pdf", + "pages": 105, + "cin": "L36911TN1996PLC034918", + "isin": "INE0OWC01011", + "company_name": "Bse Limited", + "emails": [ + "cs@khazanchi.co.in", + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "info@khazanchi.co.in" + ], + "dins": [ + "01234768", + "01642002", + "07605326", + "08102162", + "10307277", + "10332355" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 17719269000.0, + "page": 100, + "line": "Revenue From Operations 1,77,192.69 - 1,77,192.69", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": -17719269000.0, + "page": 100, + "line": "Revenue From Operations 1,77,192.69 - 1,77,192.69", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 6056000.0, + "page": 100, + "line": "Other income 60.56 - 60.56", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_income", + "value": -6056000.0, + "page": 100, + "line": "Other income 60.56 - 60.56", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 17725325000.0, + "page": 100, + "line": "Total Income 1,77,253.25 - 1,77,253.25", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_income", + "value": -17725325000.0, + "page": 100, + "line": "Total Income 1,77,253.25 - 1,77,253.25", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "purchases_stock_in_trade": { + "current": { + "field": "purchases_stock_in_trade", + "value": 17582175000.0, + "page": 100, + "line": "Purchases of stock-in-trade 1,75,821.75 - 1,75,821.75", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "purchases_stock_in_trade", + "value": -17582175000.0, + "page": 100, + "line": "Purchases of stock-in-trade 1,75,821.75 - 1,75,821.75", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 16044000.0, + "page": 100, + "line": "Employee benefits expense 37( E) 160.44 3.16 163.60", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "employee_benefits", + "value": 316000.0, + "page": 100, + "line": "Employee benefits expense 37( E) 160.44 3.16 163.60", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 37624000.0, + "page": 100, + "line": "Finance costs 37(D) 376.24 0.18 376.43", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 18000.0, + "page": 100, + "line": "Finance costs 37(D) 376.24 0.18 376.43", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 3385000.0, + "page": 100, + "line": "Depreciation and amortization expense 33.85 - 33.85", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": -3385000.0, + "page": 100, + "line": "Depreciation and amortization expense 33.85 - 33.85", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 39175000.0, + "page": 100, + "line": "Other expenses 391.75 - 391.75", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_expenses", + "value": -39175000.0, + "page": 100, + "line": "Other expenses 391.75 - 391.75", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 608566000.0, + "page": 100, + "line": "Profit before tax 6,085.66 (3.35) 6,082.32", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pbt", + "value": -335000.0, + "page": 100, + "line": "Profit before tax 6,085.66 (3.35) 6,082.32", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 160717000.0, + "page": 100, + "line": "Current tax 1,607.17 - 1,607.17", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": -160717000.0, + "page": 100, + "line": "Current tax 1,607.17 - 1,607.17", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": -1907999.9999999998, + "page": 100, + "line": "Deferred tax 37(C) (19.08) (7.60) (26.68)", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": -760000.0, + "page": 100, + "line": "Deferred tax 37(C) (19.08) (7.60) (26.68)", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 449212000.0, + "page": 100, + "line": "Profit for the year 4,492.12 4.25 4,496.37", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pat", + "value": 425000.0, + "page": 100, + "line": "Profit for the year 4,492.12 4.25 4,496.37", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + } + }, + "directors_pl": {}, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "the review and therefore details mentioned in Rule", + "amount": 8.0, + "page": 40, + "line": "the review and therefore details mentioned in Rule 8(5)(v) & Jain Director" + }, + { + "label": "(i) Mr. Naressh M Jain (DIN:", + "amount": 8102162.0, + "page": 42, + "line": "(i) Mr. Naressh M Jain (DIN: 08102162) - Chairman (Independent Director)" + }, + { + "label": "(ii) Mr. Tanuj Jain Susilkumar (DIN:", + "amount": 10332355.0, + "page": 42, + "line": "(ii) Mr. Tanuj Jain Susilkumar (DIN: 10332355) \u2013 Member (Independent Director)" + }, + { + "label": "(iii) Mrs Rithika Bohra (DIN:", + "amount": 10307277.0, + "page": 42, + "line": "(iii) Mrs Rithika Bohra (DIN: 10307277) \u2013 Member (Non-executive Director)" + }, + { + "label": "", + "amount": -2026.0, + "page": 50, + "line": "1 Rent received 2025-2026 May 23, 2025 -" + }, + { + "label": "of Director is agreement", + "amount": -36.0, + "page": 50, + "line": "of Director is agreement - 36.00" + }, + { + "label": "", + "amount": -2026.0, + "page": 50, + "line": "3 Ltd (Common Sale of goods 2025-2026 May 23, 2025 -" + }, + { + "label": "", + "amount": -2026.0, + "page": 50, + "line": "5 Rent Paid 2025-2026 May 23, 2025 -" + } + ], + "auditors": [ + "& Co LLP, Chartered accountants, FRN: 001086S / S000045 (b) not made any application for One Time Settlement", + "Chartered Accountants", + "Institute of Chartered Accountants of India." + ], + "page_index": { + "pl": [ + 39, + 55, + 56, + 65, + 71, + 72, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 100, + 101 + ], + "directors_report": [], + "balance_sheet": [ + 55, + 63, + 64 + ], + "shareholding": [], + "related_party": [ + 40, + 42, + 50, + 51, + 54, + 81, + 86 + ] + }, + "warnings": [ + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pat = pbt - tax" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 100, + "directors_report": 0 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/543971.json b/app/backend/primarydraft/data/companies/543971.json new file mode 100644 index 0000000000000000000000000000000000000000..7643051afbfda8b8259290f6eefba8da44da9439 --- /dev/null +++ b/app/backend/primarydraft/data/companies/543971.json @@ -0,0 +1,586 @@ +{ + "scrip_code": "543971", + "bse": { + "scrip_name": "Bondada Engineering Ltd", + "issuer_name": "Bondada Engineering Limited", + "group": "M", + "segment": "Equity", + "isin": "INE0Q8P01029", + "face_value": "2.00", + "industry": "", + "sector": "Telecommunication", + "industry_new": "Telecommunication", + "market_cap": "3313.29", + "eps_reported": "16.50", + "pe_reported": "17.98", + "security_id": "BONDADA" + }, + "annual_report": { + "year": "2026", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/f9f79aaf-da37-4e5f-9092-d39161a9f77c.pdf", + "authorised_at": "2026-07-30T21:07:30.283", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543971_2026.pdf", + "available_years": [ + "2026", + "2025", + "2024" + ] + }, + "extraction": { + "scrip_code": "543971", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_543971_2026.pdf", + "pages": 249, + "cin": "L28910TG2012PLC080018", + "isin": null, + "company_name": "Bse Limited", + "emails": [ + "cs@bondada.net", + "einward.ris@kfintech.com", + "evoting@kfintech.com", + "info@bondada.net" + ], + "dins": [ + "00009801", + "01883766", + "02610755", + "05220852", + "06442029" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 26349382000.0, + "page": 124, + "line": "I Revenue From Operations 32 2,63,493.82 1,40,713.49", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "revenue_from_operations", + "value": 14071349000.0, + "page": 124, + "line": "I Revenue From Operations 32 2,63,493.82 1,40,713.49", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 105209999.99999999, + "page": 124, + "line": "II Other Income 33 1,052.10 1,312.58", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "other_income", + "value": 131258000.0, + "page": 124, + "line": "II Other Income 33 1,052.10 1,312.58", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 26454592000.0, + "page": 124, + "line": "III TOTAL INCOME (I+II) 2,64,545.92 1,42,026.07", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "total_income", + "value": 14202607000.0, + "page": 124, + "line": "III TOTAL INCOME (I+II) 2,64,545.92 1,42,026.07", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 17445590000.0, + "page": 124, + "line": "Cost of material consumed 34 1,74,455.90 76,483.08", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "cost_of_materials", + "value": 7648308000.0, + "page": 124, + "line": "Cost of material consumed 34 1,74,455.90 76,483.08", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 378189000.0, + "page": 124, + "line": "Employee Benefits Expenses 37 3,781.89 2,380.92", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "employee_benefits", + "value": 238092000.0, + "page": 124, + "line": "Employee Benefits Expenses 37 3,781.89 2,380.92", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 376344000.0, + "page": 124, + "line": "Finance Costs 38 3,763.44 1,953.58", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "finance_costs", + "value": 195358000.0, + "page": 124, + "line": "Finance Costs 38 3,763.44 1,953.58", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 50142000.0, + "page": 124, + "line": "Depreciation and amortization expense 39 501.42 410.55", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "depreciation", + "value": 41055000.0, + "page": 124, + "line": "Depreciation and amortization expense 39 501.42 410.55", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 401600000.0, + "page": 124, + "line": "Other Expenses 40 4,016.00 2,854.76", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "other_expenses", + "value": 285476000.0, + "page": 124, + "line": "Other Expenses 40 4,016.00 2,854.76", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 23962626000.0, + "page": 124, + "line": "Total Expenses 2,39,626.26 1,28,327.31", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "total_expenses", + "value": 12832731000.0, + "page": 124, + "line": "Total Expenses 2,39,626.26 1,28,327.31", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 2491966000.0, + "page": 124, + "line": "VIII Profit before tax (V-VII) 24,919.66 13,698.76", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "pbt", + "value": 1369876000.0, + "page": 124, + "line": "VIII Profit before tax (V-VII) 24,919.66 13,698.76", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 636234000.0, + "page": 124, + "line": "Current Tax 6,362.34 3,652.87", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "tax_current", + "value": 365287000.0, + "page": 124, + "line": "Current Tax 6,362.34 3,652.87", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 2265000.0, + "page": 124, + "line": "Deferred Tax 22.65 (78.75)", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "tax_deferred", + "value": -7875000.0, + "page": 124, + "line": "Deferred Tax 22.65 (78.75)", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "tax_total": { + "current": { + "field": "tax_total", + "value": 649829000.0, + "page": 124, + "line": "IX Total Tax Expenses 6,498.29 3,574.12", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "tax_total", + "value": 357412000.0, + "page": 124, + "line": "IX Total Tax Expenses 6,498.29 3,574.12", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "pat": { + "current": { + "field": "pat", + "value": 1842137000.0, + "page": 124, + "line": "X Profit (Loss) for the period from continuing operations (VIII-IX) 18,421.37 10,124.64", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "pat", + "value": 1012464000.0, + "page": 124, + "line": "X Profit (Loss) for the period from continuing operations (VIII-IX) 18,421.37 10,124.64", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 16.55, + "page": 124, + "line": "- Basic 16.55 9.35", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "eps_basic", + "value": 9.35, + "page": 124, + "line": "- Basic 16.55 9.35", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 16.52, + "page": 124, + "line": "- Diluted 16.52 9.29", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "eps_diluted", + "value": 9.29, + "page": 124, + "line": "- Diluted 16.52 9.29", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + } + }, + "directors_pl": {}, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "Maximum Value: Rs.", + "amount": 5.0, + "page": 50, + "line": "Maximum Value: Rs. 5 Crores (Individually for Directors)" + }, + { + "label": "", + "amount": 13.0, + "page": 50, + "line": "13 director or his/her relative is a" + }, + { + "label": "", + "amount": 16.0, + "page": 50, + "line": "16 Satyanarayana Baratam Whole Time Director" + }, + { + "label": "", + "amount": 17.0, + "page": 50, + "line": "17 Neelima Bondada Non-Executive Director" + }, + { + "label": "", + "amount": 18.0, + "page": 50, + "line": "18 Jathin Chandra Bondada Relative of Director" + }, + { + "label": "", + "amount": 5.0, + "page": 60, + "line": "5. RATIFICATION OF REMUNERATION OF COST AUDITOR:" + }, + { + "label": "of the Company as may be required for cost audit under the Companies Act,", + "amount": 2013.0, + "page": 60, + "line": "of the Company as may be required for cost audit under the Companies Act, 2013, and Rules made thereunder, at a remuneration of" + }, + { + "label": "In accordance with the provisions of Section", + "amount": 148.0, + "page": 60, + "line": "In accordance with the provisions of Section 148 of the Act read with the Companies (Audit and Auditors) Rules, 2014, the remuneration" + }, + { + "label": "The Board of Directors and Audit Committee recommends the Ordinary Resolution set out at Item Nos.", + "amount": 5.0, + "page": 60, + "line": "The Board of Directors and Audit Committee recommends the Ordinary Resolution set out at Item Nos. 5 of the Notice for approval" + }, + { + "label": "Maximum Value: Rs.", + "amount": 5.0, + "page": 60, + "line": "Maximum Value: Rs. 5 Crores (Individually for Directors)" + }, + { + "label": "", + "amount": 13.0, + "page": 61, + "line": "13 director or their relative is a" + }, + { + "label": "", + "amount": 16.0, + "page": 61, + "line": "16 Satyanarayana Baratam Whole Time Director" + }, + { + "label": "", + "amount": 17.0, + "page": 61, + "line": "17 Neelima Bondada Non-Executive Director" + }, + { + "label": "", + "amount": 18.0, + "page": 61, + "line": "18 Jathin Chandra Bondada Relative of Director" + }, + { + "label": "", + "amount": 7.0, + "page": 61, + "line": "7. APPOINTMENT OF MR. P. DINAKARA RAO (DIN: 00009801) AS INDEPENDENT DIRECTOR OF THE COMPANY" + }, + { + "label": "appointed Mr. P. Dinakara Rao (DIN:", + "amount": 9801.0, + "page": 61, + "line": "appointed Mr. P. Dinakara Rao (DIN: 00009801) as an Additional Director in the category of Independent Director with effect from" + }, + { + "label": "Requirements) Regulations,", + "amount": 2015.0, + "page": 61, + "line": "Requirements) Regulations, 2015 (\u201cSEBI LODR\u201d), an Independent Director shall be appointed for a term of up to five consecutive" + }, + { + "label": "i. Consent in writing to act as a Director in Form DIR", + "amount": -2.0, + "page": 61, + "line": "i. Consent in writing to act as a Director in Form DIR-2 pursuant to Section 152 of the Act;" + }, + { + "label": "ii. Intimation in Form DIR", + "amount": -8.0, + "page": 61, + "line": "ii. Intimation in Form DIR-8 confirming that he is not disqualified to act as a Director under the Act;" + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants (Firm Regn. No. 018573S) as an Internal Auditor of the Company", + "Chartered Accountants CIN: L28910TG2012PLC080018", + "Sreedar Mohan & Associates, Chartered Accountants, Hyderabad (Firm Registration" + ], + "page_index": { + "pl": [ + 114, + 117, + 124, + 128, + 129, + 130, + 131, + 132, + 133, + 135, + 136, + 137, + 144, + 157, + 164, + 165, + 177, + 179, + 182, + 195, + 196, + 197, + 198, + 199, + 202, + 206, + 207, + 208, + 209, + 215, + 216, + 226, + 232, + 241 + ], + "directors_report": [ + 4, + 64, + 116, + 184 + ], + "balance_sheet": [ + 114, + 123, + 127, + 140, + 141, + 142, + 144, + 189, + 194, + 212, + 213, + 214, + 215 + ], + "shareholding": [], + "related_party": [ + 50, + 60, + 61, + 84, + 151, + 158, + 169, + 170, + 176, + 235 + ] + }, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 124, + "directors_report": 64 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544001.json b/app/backend/primarydraft/data/companies/544001.json new file mode 100644 index 0000000000000000000000000000000000000000..4665a0f07597a14ccbb67f79c94fb934bb5a259b --- /dev/null +++ b/app/backend/primarydraft/data/companies/544001.json @@ -0,0 +1,451 @@ +{ + "scrip_code": "544001", + "bse": { + "scrip_name": "Sunita Tools Ltd", + "issuer_name": "Sunita Tools Limited", + "group": "MT", + "segment": "Equity", + "isin": "INE0Q1S01010", + "face_value": "10.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Capital Goods", + "market_cap": "610.99", + "eps_reported": "10.28", + "pe_reported": "94.64", + "security_id": "SUNITATOOL" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/73049bae-c986-4351-8398-acf67c20fa8f.pdf", + "authorised_at": null, + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544001_2025.pdf", + "available_years": [ + "2025", + "2025", + "2024" + ] + }, + "extraction": { + "scrip_code": "544001", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544001_2025.pdf", + "pages": 108, + "cin": "U29220MH1988PLC045850", + "isin": null, + "company_name": "Bse Limited", + "emails": [ + "cakmaco2016@gmail.com", + "cs.smishra@gmail.com", + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "info@sunitatools.com", + "inward.ris@kfintech.com" + ], + "dins": [ + "00158327", + "00739482" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 296212000.0, + "page": 67, + "line": "I. Revenue from operations 9 2,962.12 2,609.06", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 260906000.0, + "page": 67, + "line": "I. Revenue from operations 9 2,962.12 2,609.06", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 5272000.0, + "page": 67, + "line": "II. Other Income 10 52.72 18.94", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 1894000.0000000002, + "page": 67, + "line": "II. Other Income 10 52.72 18.94", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 301483000.0, + "page": 67, + "line": "III. Total Income (I +II) 3,014.83 2 ,628.00", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 262800000.0, + "page": 67, + "line": "III. Total Income (I +II) 3,014.83 2 ,628.00", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 200000.0, + "page": 67, + "line": "Employee benefit expense 12 2 85.27 267.26", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "employee_benefits", + "value": 8527000.0, + "page": 67, + "line": "Employee benefit expense 12 2 85.27 267.26", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 5161000.0, + "page": 67, + "line": "Financial costs 13 51.61 112.24", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 11224000.0, + "page": 67, + "line": "Financial costs 13 51.61 112.24", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 9355000.0, + "page": 67, + "line": "Depreciation and amortization expense 14 93.55 63.35", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 6335000.0, + "page": 67, + "line": "Depreciation and amortization expense 14 93.55 63.35", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 300000.0, + "page": 67, + "line": "Other expenses 15 3 15.61 231.16", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_expenses", + "value": 1561000.0, + "page": 67, + "line": "Other expenses 15 3 15.61 231.16", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 233290000.0, + "page": 67, + "line": "Total Expenses 2,332.90 2 ,014.23", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 201423000.0, + "page": 67, + "line": "Total Expenses 2,332.90 2 ,014.23", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 68193000.0, + "page": 67, + "line": "IX. Profit before tax (VII - VIII) 681.93 613.77", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 61377000.0, + "page": 67, + "line": "IX. Profit before tax (VII - VIII) 681.93 613.77", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_total": { + "current": { + "field": "tax_total", + "value": 17281000.0, + "page": 67, + "line": "Total Tax expense 172.81 128.77", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_total", + "value": 12877000.000000002, + "page": 67, + "line": "Total Tax expense 172.81 128.77", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 50912000.0, + "page": 67, + "line": "XV. Profit/(Loss) for the period (XI + XIV) 509.12 484.99", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pat", + "value": 48499000.0, + "page": 67, + "line": "XV. Profit/(Loss) for the period (XI + XIV) 509.12 484.99", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + } + }, + "directors_pl": {}, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "Directors under sub-section", + "amount": -12.0, + "page": 31, + "line": "Directors under sub-section (12) of section 143 of the Companies Act, 2013 during the financial year." + }, + { + "label": "Your Directors further state that pursuant to the requirements of Section", + "amount": 22.0, + "page": 31, + "line": "Your Directors further state that pursuant to the requirements of Section 22 of Sexual Harassment of Women at Work" + }, + { + "label": "", + "amount": 9.0, + "page": 63, + "line": "9) REPAYMENT OF LOANS" + }, + { + "label": "Loans. Accordingly, the provisions of clause", + "amount": 3.0, + "page": 63, + "line": "Loans. Accordingly, the provisions of clause 3 (ix) of the Order are not" + }, + { + "label": "Loan Taken", + "amount": -5.52, + "page": 80, + "line": "Loan Taken - 5.52" + }, + { + "label": "Loan Repaid", + "amount": -89.22, + "page": 80, + "line": "Loan Repaid ( 89.22) ( 16.64)" + }, + { + "label": "Loan Repaid -", + "amount": -0.03, + "page": 80, + "line": "Loan Repaid - (0.03)" + }, + { + "label": "Loan Taken", + "amount": 24.0, + "page": 80, + "line": "Loan Taken 24.00 108.86" + }, + { + "label": "Loan Repaid", + "amount": -51.89, + "page": 80, + "line": "Loan Repaid ( 51.89) (128.47)" + }, + { + "label": "Loan Taken", + "amount": 129.33, + "page": 80, + "line": "Loan Taken 129.33 147.63" + }, + { + "label": "Loan Repaid", + "amount": -132.51, + "page": 80, + "line": "Loan Repaid (132.51) (144.45)" + }, + { + "label": "Loan Taken", + "amount": 67.35, + "page": 80, + "line": "Loan Taken 67.35 162.24" + }, + { + "label": "Loan Repaid", + "amount": -71.26, + "page": 80, + "line": "Loan Repaid ( 71.26) (174.21)" + }, + { + "label": "Loan Taken", + "amount": 26.47, + "page": 80, + "line": "Loan Taken 26.47" + }, + { + "label": "Loan Repaid", + "amount": -22.73, + "page": 80, + "line": "Loan Repaid ( 22.73)" + }, + { + "label": "Advance Given", + "amount": 25.96, + "page": 80, + "line": "Advance Given 25.96" + }, + { + "label": "Advance Given", + "amount": 113.88, + "page": 80, + "line": "Advance Given 113.88" + }, + { + "label": "Advance Received", + "amount": -79.2, + "page": 80, + "line": "Advance Received ( 79.20)" + }, + { + "label": "Advance Given", + "amount": 0.2, + "page": 80, + "line": "Advance Given 0.20 -" + }, + { + "label": "Advance Received", + "amount": -0.6, + "page": 80, + "line": "Advance Received ( 0.60) -" + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants Selenium Tower-B, Plot 31 & 32, Gachibowli,", + "K. M. A. & Co., Chartered Accountants (Firm Registration No. 111899W), be and are hereby re-appointed as the", + "Reporting issued by the Institute of Chartered Accountant of India (\u2018ICAI\u2019). These" + ], + "page_index": { + "pl": [ + 53, + 54, + 55, + 67, + 70, + 71, + 83, + 84, + 85, + 93, + 96, + 97 + ], + "directors_report": [ + 22, + 53 + ], + "balance_sheet": [ + 53, + 66, + 83, + 92 + ], + "shareholding": [], + "related_party": [ + 31, + 63, + 80, + 106 + ] + }, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 67, + "directors_report": 22 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544023.json b/app/backend/primarydraft/data/companies/544023.json new file mode 100644 index 0000000000000000000000000000000000000000..83016853ae319e92d88e90c1bfa50311e4a2732e --- /dev/null +++ b/app/backend/primarydraft/data/companies/544023.json @@ -0,0 +1,685 @@ +{ + "scrip_code": "544023", + "bse": { + "scrip_name": "Kalyani Cast-Tech Ltd", + "issuer_name": "Kalyani Cast-Tech Limited", + "group": "M", + "segment": "Equity", + "isin": "INE0N6U01018", + "face_value": "10.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Capital Goods", + "market_cap": "549.99", + "eps_reported": "23.75", + "pe_reported": "32.25", + "security_id": "KALYANI" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/84c5635a-0bb0-43a4-8472-96dde80f82d4.pdf", + "authorised_at": "2025-09-05T18:11:54.247", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544023_2025.pdf", + "available_years": [ + "2025", + "2024" + ] + }, + "extraction": { + "scrip_code": "544023", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544023_2025.pdf", + "pages": 124, + "cin": "L26990DL2012PLC242760", + "isin": "INE0N6U01018", + "company_name": "Kalyani Cast Tech Limited", + "emails": [ + "cs@kalyanicasttech.com", + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "info@bigshareonline.com" + ], + "dins": [ + "02933321", + "03302133", + "08065475" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 13922.29, + "page": 81, + "line": "Revenue From Operations 24 13922.29 9447.71", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "revenue_from_operations", + "value": 9447.71, + "page": 81, + "line": "Revenue From Operations 24 13922.29 9447.71", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 66.41, + "page": 81, + "line": "Other Income 25 66.41 63.64", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "other_income", + "value": 63.64, + "page": 81, + "line": "Other Income 25 66.41 63.64", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 13988.69, + "page": 81, + "line": "Total Income 13988.69 9511.35", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "total_income", + "value": 9511.35, + "page": 81, + "line": "Total Income 13988.69 9511.35", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 10871.15, + "page": 81, + "line": "Cost of Materials Consumed 26 10871.15 7408.29", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "cost_of_materials", + "value": 7408.29, + "page": 81, + "line": "Cost of Materials Consumed 26 10871.15 7408.29", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 17.82, + "page": 81, + "line": "Financial Costs 29 17.82 16.61", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "finance_costs", + "value": 16.61, + "page": 81, + "line": "Financial Costs 29 17.82 16.61", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 103.7, + "page": 81, + "line": "Depreciation & Amortization Expenses 30 103.70 80.20", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "depreciation", + "value": 80.2, + "page": 81, + "line": "Depreciation & Amortization Expenses 30 103.70 80.20", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 470.37, + "page": 81, + "line": "Other Expenses 31 470.37 303.59", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "other_expenses", + "value": 303.59, + "page": 81, + "line": "Other Expenses 31 470.37 303.59", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 12080.86, + "page": 81, + "line": "Total Expenses 12080.86 8194.27", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "total_expenses", + "value": 8194.27, + "page": 81, + "line": "Total Expenses 12080.86 8194.27", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": -490.02, + "page": 81, + "line": "Current Tax (490.02) 335.51", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "tax_current", + "value": 335.51, + "page": 81, + "line": "Current Tax (490.02) 335.51", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 4.46, + "page": 81, + "line": "Deferred Tax 4.46 1.37", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "tax_deferred", + "value": 1.37, + "page": 81, + "line": "Deferred Tax 4.46 1.37", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "tax_total": { + "current": { + "field": "tax_total", + "value": -483.44, + "page": 81, + "line": "Total Tax Expenses (483.44) 356.88", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "tax_total", + "value": 356.88, + "page": 81, + "line": "Total Tax Expenses (483.44) 356.88", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + } + }, + "directors_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 1392229000.0, + "page": 28, + "line": "a) Revenue from Operations 13922.29 9447.71", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "revenue_from_operations", + "value": 944770999.9999999, + "page": 28, + "line": "a) Revenue from Operations 13922.29 9447.71", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 6641000.0, + "page": 28, + "line": "b) Other Income 66.41 63.64", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "other_income", + "value": 6364000.0, + "page": 28, + "line": "b) Other Income 66.41 63.64", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 1398870000.0, + "page": 28, + "line": "Total Income 13988.70 9511.35", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "total_income", + "value": 951135000.0, + "page": 28, + "line": "Total Income 13988.70 9511.35", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 1087115000.0, + "page": 28, + "line": "a) Cost of Material Consumed 10871.15 7408.29", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "cost_of_materials", + "value": 740829000.0, + "page": 28, + "line": "a) Cost of Material Consumed 10871.15 7408.29", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 39787000.0, + "page": 28, + "line": "c) Employee Benefit Expenses 397.87 291.46", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "employee_benefits", + "value": 29145999.999999996, + "page": 28, + "line": "c) Employee Benefit Expenses 397.87 291.46", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 1782000.0, + "page": 28, + "line": "d) Finance Cost 17.82 16.61", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "finance_costs", + "value": 1661000.0, + "page": 28, + "line": "d) Finance Cost 17.82 16.61", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 10370000.0, + "page": 28, + "line": "e) Depreciation and Amortization Expense 103.70 80.20", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "depreciation", + "value": 8020000.0, + "page": 28, + "line": "e) Depreciation and Amortization Expense 103.70 80.20", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 47037000.0, + "page": 28, + "line": "f) Other Expenses 470.37 303.59", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "other_expenses", + "value": 30358999.999999996, + "page": 28, + "line": "f) Other Expenses 470.37 303.59", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 1208086000.0, + "page": 28, + "line": "Total Expenses 12080.86 8194.27", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "total_expenses", + "value": 819427000.0, + "page": 28, + "line": "Total Expenses 12080.86 8194.27", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 190784000.0, + "page": 28, + "line": "III PROFIT BEFORE TAX 1907.84 1317.08", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "pbt", + "value": 131708000.0, + "page": 28, + "line": "III PROFIT BEFORE TAX 1907.84 1317.08", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 49002000.0, + "page": 28, + "line": "a) Current Tax 490.02 335.51", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "tax_current", + "value": 33551000.0, + "page": 28, + "line": "a) Current Tax 490.02 335.51", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 446000.0, + "page": 28, + "line": "b) Deferred Tax Expense/ (Income) 4.46 1.37", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "tax_deferred", + "value": 137000.0, + "page": 28, + "line": "b) Deferred Tax Expense/ (Income) 4.46 1.37", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "pat": { + "current": { + "field": "pat", + "value": 142440000.0, + "page": 28, + "line": "V PROFIT AFTER TAXES 1424.40 960.21", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "pat", + "value": 96021000.0, + "page": 28, + "line": "V PROFIT AFTER TAXES 1424.40 960.21", + "scale": 100000.0, + "section": "directors_report", + "basis": "standalone" + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 19.84, + "page": 28, + "line": "a) Basic 19.84 16.43", + "scale": 1.0, + "section": "directors_report", + "basis": "standalone" + }, + "previous": { + "field": "eps_basic", + "value": 16.43, + "page": 28, + "line": "a) Basic 19.84 16.43", + "scale": 1.0, + "section": "directors_report", + "basis": "standalone" + } + } + }, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "For other transactions of the Directors with the Company, please refer the Note No.", + "amount": 33.12, + "page": 26, + "line": "For other transactions of the Directors with the Company, please refer the Note No. 33.12 in the" + }, + { + "label": "Board of Directors recommend the passing of the Resolution as set out at Item No.", + "amount": 6.0, + "page": 26, + "line": "Board of Directors recommend the passing of the Resolution as set out at Item No. 6 as a Special" + }, + { + "label": "Ms. Jayashree Kumar is the Whole Time Director (\u201cWTD\u201d) (DIN:", + "amount": 2933321.0, + "page": 26, + "line": "Ms. Jayashree Kumar is the Whole Time Director (\u201cWTD\u201d) (DIN: 02933321) of the Company whose" + }, + { + "label": "appointment for the post of Whole Time Director was approved w.e.f. April", + "amount": 5.0, + "page": 26, + "line": "appointment for the post of Whole Time Director was approved w.e.f. April 05, 2022 by the shareholders" + }, + { + "label": "Remuneration Committee in their meeting held on September", + "amount": 30.0, + "page": 26, + "line": "Remuneration Committee in their meeting held on September 30, 2024 recommended revision of the" + }, + { + "label": "remuneration and the Board of Directors in their meeting held on September", + "amount": 30.0, + "page": 26, + "line": "remuneration and the Board of Directors in their meeting held on September 30, 2024 approved the" + }, + { + "label": "revised remuneration of Ms. Jayashree Kumar w.e.f", + "amount": 1.0, + "page": 26, + "line": "revised remuneration of Ms. Jayashree Kumar w.e.f 01st May, 2024 subject to the approval of the" + }, + { + "label": "shareholder, Gross Salary: Rs.", + "amount": 175000.0, + "page": 26, + "line": "shareholder, Gross Salary: Rs. 1,75,000 /- (Rupees One Lakh Seventy-Five Thousand) per month" + }, + { + "label": "meeting held on August", + "amount": 2025.0, + "page": 26, + "line": "meeting held on August 30, 2025 and Nomination & Remuneration Committee held on August 30, 2025" + }, + { + "label": ", subject to the approval of the shareholders in this Annual General meeting, Gross Salary Rs.", + "amount": 250000.0, + "page": 26, + "line": ", subject to the approval of the shareholders in this Annual General meeting, Gross Salary Rs. 2,50,000" + }, + { + "label": "Remuneration Committee (NRC) in its meeting held on September", + "amount": 2024.0, + "page": 26, + "line": "Remuneration Committee (NRC) in its meeting held on September 30, 2024 and August 30, 2025. NRC" + }, + { + "label": "Mr. Naresh Remuneration Annual", + "amount": 48.0, + "page": 44, + "line": "Mr. Naresh Remuneration Annual 48.00 - NA" + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants KALYANI CAST-TECH LIMITED", + "Ethics\u2019 issued by the Institute of Chartered Accountants of India together with the ethical requirements", + "M/s Goel Mintri & Associates., Chartered Accountants, having their office at L-76, Ground Floor," + ], + "page_index": { + "pl": [ + 60, + 63, + 76, + 81, + 85, + 87, + 95, + 102, + 107, + 110, + 119 + ], + "directors_report": [ + 7, + 26, + 28 + ], + "balance_sheet": [ + 60, + 73, + 80, + 101 + ], + "shareholding": [], + "related_party": [ + 26, + 37, + 44, + 68, + 69 + ] + }, + "warnings": [ + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income" + ], + "directors_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 81, + "directors_report": 28 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544037.json b/app/backend/primarydraft/data/companies/544037.json new file mode 100644 index 0000000000000000000000000000000000000000..1d16281acc7131d3ed1a1cf5b7d03099865e4bcf --- /dev/null +++ b/app/backend/primarydraft/data/companies/544037.json @@ -0,0 +1,515 @@ +{ + "scrip_code": "544037", + "bse": { + "scrip_name": "Amic Forging Ltd", + "issuer_name": "Amic Forging Limited", + "group": "M", + "segment": "Equity", + "isin": "INE0P9J01013", + "face_value": "10.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Capital Goods", + "market_cap": "2084.47", + "eps_reported": "26.96", + "pe_reported": "71.93", + "security_id": "AMIC" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/03259024-fade-44f4-9f6b-be6d26ee7cb6.pdf", + "authorised_at": "2025-08-25T16:15:43.57", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544037_2025.pdf", + "available_years": [ + "2025", + "2024" + ] + }, + "extraction": { + "scrip_code": "544037", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544037_2025.pdf", + "pages": 112, + "cin": "L27100WB2007PLC116674", + "isin": "INE0P9J01013", + "company_name": "Bsh Limited", + "emails": [ + "cs@amicforgings.com", + "evoting@nsdl.co.in", + "helpdesk.evoting@cdslindia.comor", + "info@amicforgings.com", + "ivote@bigshareonline.com" + ], + "dins": [ + "00513552", + "06586643", + "09810941", + "09824428" + ], + "audited_pl": {}, + "directors_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 1213158000.0, + "page": 18, + "line": "Revenue from operation 12131.58 12614.67 12131.58 12614.67", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 1261467000.0, + "page": 18, + "line": "Revenue from operation 12131.58 12614.67 12131.58 12614.67", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 207091000.0, + "page": 18, + "line": "Other Income 2070.91 335.16 2070.91 336.81", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 33516000.000000004, + "page": 18, + "line": "Other Income 2070.91 335.16 2070.91 336.81", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 487068999.99999994, + "page": 18, + "line": "Profit before depreciation, 4870.69 1983.87 4870.69 1985.52", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 198387000.0, + "page": 18, + "line": "Profit before depreciation, 4870.69 1983.87 4870.69 1985.52", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 454257000.0, + "page": 18, + "line": "Profit before Exceptional 4542.57 1860.04 4542.57 1861.69", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 186004000.0, + "page": 18, + "line": "Profit before Exceptional 4542.57 1860.04 4542.57 1861.69", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 94420000.0, + "page": 18, + "line": "Less: Current Tax 944.20 452.89 944.20 452.89", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 45289000.0, + "page": 18, + "line": "Less: Current Tax 944.20 452.89 944.20 452.89", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 1205000.0, + "page": 18, + "line": "Deferred Tax 12.05 4.21 12.05 4.21", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": 421000.0, + "page": 18, + "line": "Deferred Tax 12.05 4.21 12.05 4.21", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 355570000.0, + "page": 18, + "line": "Profit after Tax 3555.70 1383.31 3555.70 1384.96", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pat", + "value": 138331000.0, + "page": 18, + "line": "Profit after Tax 3555.70 1383.31 3555.70 1384.96", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 33.9, + "page": 18, + "line": "Basic and Diluted Earnings 33.90 16.06 33.90 16.06", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "eps_basic", + "value": 16.06, + "page": 18, + "line": "Basic and Diluted Earnings 33.90 16.06 33.90 16.06", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": { + "share_capital": { + "current": { + "field": "share_capital", + "value": 104883999.99999999, + "page": 57, + "line": "(a) Share Capital 1 1,048.84 1,048.84", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "share_capital", + "value": 104883999.99999999, + "page": 57, + "line": "(a) Share Capital 1 1,048.84 1,048.84", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "reserves_surplus": { + "current": { + "field": "reserves_surplus", + "value": 896879999.9999999, + "page": 57, + "line": "(b) Reserves and Surplus 2 8,968.80 5,411.44", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "reserves_surplus", + "value": 541144000.0, + "page": 57, + "line": "(b) Reserves and Surplus 2 8,968.80 5,411.44", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "borrowings_non_current": { + "current": { + "field": "borrowings_non_current", + "value": 300000.0, + "page": 57, + "line": "(a) Long-Term Borrowings 3 - 273.44", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "borrowings_non_current", + "value": -27344000.0, + "page": 57, + "line": "(a) Long-Term Borrowings 3 - 273.44", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "borrowings_current": { + "current": { + "field": "borrowings_current", + "value": 500000.0, + "page": 57, + "line": "(a) Short Term Borrowings 5 - 112.76", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "borrowings_current", + "value": -11276000.0, + "page": 57, + "line": "(a) Short Term Borrowings 5 - 112.76", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "other_current_liabilities": { + "current": { + "field": "other_current_liabilities", + "value": 29844000.0, + "page": 57, + "line": "(c) Other Current Liabilities 7 298.44 211.80", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "other_current_liabilities", + "value": 21180000.0, + "page": 57, + "line": "(c) Other Current Liabilities 7 298.44 211.80", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "total_equity_liabilities": { + "current": { + "field": "total_equity_liabilities", + "value": 1526837000.0, + "page": 57, + "line": "TOTAL 15,268.37 9,213.02", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "total_equity_liabilities", + "value": 921302000.0, + "page": 57, + "line": "TOTAL 15,268.37 9,213.02", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "inventories": { + "current": { + "field": "inventories", + "value": 160995000.0, + "page": 57, + "line": "(a) Inventories 13 1,609.95 31.11", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "inventories", + "value": 3111000.0, + "page": 57, + "line": "(a) Inventories 13 1,609.95 31.11", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "trade_receivables": { + "current": { + "field": "trade_receivables", + "value": 274364000.0, + "page": 57, + "line": "(b) Trade Receivables 14 2,743.64 2,916.22", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "trade_receivables", + "value": 291622000.0, + "page": 57, + "line": "(b) Trade Receivables 14 2,743.64 2,916.22", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "total_assets": { + "current": { + "field": "total_assets", + "value": 1526837000.0, + "page": 57, + "line": "TOTAL 15,268.37 9,213.02", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "total_assets", + "value": 921302000.0, + "page": 57, + "line": "TOTAL 15,268.37 9,213.02", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + } + }, + "shareholding": [], + "related_party": [ + { + "label": "In terms of Section", + "amount": 134.0, + "page": 29, + "line": "In terms of Section 134(3) (c) of the Companies Act, 2013 the director would like to state that :" + }, + { + "label": "Mr Girdhari Remuneration Annual", + "amount": 36.0, + "page": 37, + "line": "Mr Girdhari Remuneration Annual 36.00 - -" + }, + { + "label": "Mr Anshul Remuneration Annual", + "amount": 36.0, + "page": 37, + "line": "Mr Anshul Remuneration Annual 36.00 - -" + }, + { + "label": "Mrs Rashmi Remuneration Annual", + "amount": 12.0, + "page": 37, + "line": "Mrs Rashmi Remuneration Annual 12.00 - -" + }, + { + "label": "", + "amount": 11.0, + "page": 70, + "line": "11 LONG TERM LOANS & ADVANCES" + }, + { + "label": "Advance against Land", + "amount": 86.0, + "page": 70, + "line": "Advance against Land 86.00 54.00" + }, + { + "label": "Advances for capital goods", + "amount": 306.19, + "page": 70, + "line": "Advances for capital goods 306.19 25.00" + }, + { + "label": "Advance against Purchase Order", + "amount": -19.96, + "page": 70, + "line": "Advance against Purchase Order - 19.96" + }, + { + "label": "Other Advances", + "amount": 3.0, + "page": 70, + "line": "Other Advances 3.00" + }, + { + "label": "", + "amount": 12.0, + "page": 70, + "line": "12 OTHER NON CURRENT ASSETS" + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants Amic Forging Limited", + "Chartered Accountants Managing Director Director & CFO", + "Chartered Accountants of India. Those Standards and the Guidance Note require that we" + ], + "page_index": { + "pl": [ + 45, + 47, + 58, + 62, + 65, + 82, + 84, + 90, + 94, + 97 + ], + "directors_report": [ + 18, + 46, + 83 + ], + "balance_sheet": [ + 45, + 57, + 82, + 89 + ], + "shareholding": [], + "related_party": [ + 29, + 37, + 70, + 72, + 77, + 101, + 104, + 108 + ] + }, + "warnings": [ + "Statement of Profit and Loss: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "audited P&L not machine-readable in this filing" + ], + "audited_pl_identities": [], + "directors_pl_identities": [ + "pat = pbt - tax" + ], + "balance_sheet_identities": [ + "total assets = total equity and liabilities" + ], + "statement_pages": { + "audited_pl": 90, + "directors_report": 18 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544141.json b/app/backend/primarydraft/data/companies/544141.json new file mode 100644 index 0000000000000000000000000000000000000000..f5f0a3887bd05a589975f6ad420d530955ddbd3b --- /dev/null +++ b/app/backend/primarydraft/data/companies/544141.json @@ -0,0 +1,674 @@ +{ + "scrip_code": "544141", + "bse": { + "scrip_name": "Pune E - Stock Broking Ltd", + "issuer_name": "Pune E - Stock Broking Limited", + "group": "M", + "segment": "Equity", + "isin": "INE510U01018", + "face_value": "10.00", + "industry": "", + "sector": "Financial Services", + "industry_new": "Financial Services", + "market_cap": "393.77", + "eps_reported": "11.47", + "pe_reported": "21.80", + "security_id": "PESB" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/3339bca1-8af4-417d-ba5d-e82f15ae6ae7.pdf", + "authorised_at": "2025-08-25T17:21:41.867", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544141_2025.pdf", + "available_years": [ + "2025", + "2024" + ] + }, + "extraction": { + "scrip_code": "544141", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544141_2025.pdf", + "pages": 141, + "cin": "L67120PN2007PLC130374", + "isin": null, + "company_name": null, + "emails": [ + "cs@pesb.co.in", + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "indapurkarcs@gmail.com", + "info@pesb.co.in", + "ivote@bigshareonline.com" + ], + "dins": [ + "00184961", + "00201136", + "02966578", + "07285425", + "08107626" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 631420000.0, + "page": 62, + "line": "I Revenue from Operations 21 6314.20 6643.12", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "revenue_from_operations", + "value": 664312000.0, + "page": 62, + "line": "I Revenue from Operations 21 6314.20 6643.12", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 135018000.0, + "page": 62, + "line": "II Other Income 22 1350.18 982.37", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "other_income", + "value": 98237000.0, + "page": 62, + "line": "II Other Income 22 1350.18 982.37", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 766438000.0, + "page": 62, + "line": "III Total Income (I + II) 7664.38 7625.49", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "total_income", + "value": 762549000.0, + "page": 62, + "line": "III Total Income (I + II) 7664.38 7625.49", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 51463000.0, + "page": 62, + "line": "(a) Employee Benefits Expenses 23 514.63 363.43", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "employee_benefits", + "value": 36343000.0, + "page": 62, + "line": "(a) Employee Benefits Expenses 23 514.63 363.43", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 46204000.0, + "page": 62, + "line": "(b) Finance Costs 24 462.04 163.84", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "finance_costs", + "value": 16384000.0, + "page": 62, + "line": "(b) Finance Costs 24 462.04 163.84", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 11824000.0, + "page": 62, + "line": "(c) Depreciation and Amortisation Expenses 12 118.24 68.30", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "depreciation", + "value": 6830000.0, + "page": 62, + "line": "(c) Depreciation and Amortisation Expenses 12 118.24 68.30", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 517147000.0, + "page": 62, + "line": "Total Expenses 5171.47 5954.38", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "total_expenses", + "value": 595438000.0, + "page": 62, + "line": "Total Expenses 5171.47 5954.38", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 249292000.0, + "page": 62, + "line": "V Profit before exceptional and extraordinary items 2492.92 1671.10", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "pbt", + "value": 167110000.0, + "page": 62, + "line": "V Profit before exceptional and extraordinary items 2492.92 1671.10", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 58291999.99999999, + "page": 62, + "line": "(a) Current Tax 582.92 408.07", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "tax_current", + "value": 40807000.0, + "page": 62, + "line": "(a) Current Tax 582.92 408.07", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": -851000.0, + "page": 62, + "line": "(b) Deferred Tax -8.51 -2.57", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "tax_deferred", + "value": -256999.99999999997, + "page": 62, + "line": "(b) Deferred Tax -8.51 -2.57", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "tax_total": { + "current": { + "field": "tax_total", + "value": 57441000.0, + "page": 62, + "line": "Total Tax Expense 574.41 405.50", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "tax_total", + "value": 40550000.0, + "page": 62, + "line": "Total Tax Expense 574.41 405.50", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "pat": { + "current": { + "field": "pat", + "value": 191850000.0, + "page": 62, + "line": "VIII Profit After Tax (VI - VII) 1918.50 1265.60", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "pat", + "value": 126559999.99999999, + "page": 62, + "line": "VIII Profit After Tax (VI - VII) 1918.50 1265.60", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 2.3, + "page": 62, + "line": "(a) Basic 2.30 1 1.70 11.04", + "scale": 1.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "eps_basic", + "value": 1.0, + "page": 62, + "line": "(a) Basic 2.30 1 1.70 11.04", + "scale": 1.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 2.3, + "page": 62, + "line": "(b) Diluted 2.30 1 1.70 11.04", + "scale": 1.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "eps_diluted", + "value": 1.0, + "page": 62, + "line": "(b) Diluted 2.30 1 1.70 11.04", + "scale": 1.0, + "section": "audited_pl", + "basis": "consolidated" + } + } + }, + "directors_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 608831000.0, + "page": 25, + "line": "Revenue from Operations 6,088.31 6,472.08 6,314.20 6,643.12", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 647208000.0, + "page": 25, + "line": "Revenue from Operations 6,088.31 6,472.08 6,314.20 6,643.12", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 108591000.00000001, + "page": 25, + "line": "Other Income 1,085.91 988.73 1,350.18 982.37", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 98873000.0, + "page": 25, + "line": "Other Income 1,085.91 988.73 1,350.18 982.37", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 717422000.0, + "page": 25, + "line": "Total Income 7,174.22 7,460.81 7,664.38 7,625.49", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 746081000.0, + "page": 25, + "line": "Total Income 7,174.22 7,460.81 7,664.38 7,625.49", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 50712000.0, + "page": 25, + "line": "Less: Employee Benefits Expenses 507.12 353.49 514.63 364.20", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "employee_benefits", + "value": 35349000.0, + "page": 25, + "line": "Less: Employee Benefits Expenses 507.12 353.49 514.63 364.20", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 260589000.0, + "page": 25, + "line": "Depreciation & Taxes 2,605.89 1,757.70 3,073.19 1,903.24", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 175770000.0, + "page": 25, + "line": "Depreciation & Taxes 2,605.89 1,757.70 3,073.19 1,903.24", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 46203000.0, + "page": 25, + "line": "Less: Finance Costs 462.03 163.84 462.04 163.84", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 16384000.0, + "page": 25, + "line": "Less: Finance Costs 462.03 163.84 462.04 163.84", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 202562000.0, + "page": 25, + "line": "Profit Before Exceptional Items & 2,025.62 1,525.86 2,492.91 1,671.10", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 152586000.0, + "page": 25, + "line": "Profit Before Exceptional Items & 2,025.62 1,525.86 2,492.91 1,671.10", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 52883000.00000001, + "page": 25, + "line": "Less: Current Tax 528.83 371.63 582.92 408.07", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 37163000.0, + "page": 25, + "line": "Less: Current Tax 528.83 371.63 582.92 408.07", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 869000.0, + "page": 25, + "line": "Less: Deferred Tax (Credit) 8.69 2.69 8.51 -2.57", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": 269000.0, + "page": 25, + "line": "Less: Deferred Tax (Credit) 8.69 2.69 8.51 -2.57", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 150548000.0, + "page": 25, + "line": "Profit After Tax 1,505.48 1,156.92 1,918.50 1,265.60", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pat", + "value": 115692000.0, + "page": 25, + "line": "Profit After Tax 1,505.48 1,156.92 1,918.50 1,265.60", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 9.62, + "page": 25, + "line": "(a) Basic 9.62 10.28 11.70 11.04", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "eps_basic", + "value": 10.28, + "page": 25, + "line": "(a) Basic 9.62 10.28 11.70 11.04", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 9.62, + "page": 25, + "line": "(b) Diluted 9.62 10.28 11.70 11.04", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "eps_diluted", + "value": 10.28, + "page": 25, + "line": "(b) Diluted 9.62 10.28 11.70 11.04", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "", + "amount": 15.0, + "page": 31, + "line": "15. PERFORMANCE OF ITS COMMITTEES AND INDIVIDUAL DIRECTORS" + }, + { + "label": "its Committees and each Director was carried out for the financial year", + "amount": 2024.0, + "page": 31, + "line": "its Committees and each Director was carried out for the financial year 2024-2025 by Nomination and" + }, + { + "label": "", + "amount": 18.0, + "page": 31, + "line": "18. PARTICULARS OF LOANS, GUARANTEES OR INVESTMENTS MADE BY THE COMPANY UNDER" + }, + { + "label": "Particulars of advance given to employees as per the policy of the company have been given in Note no.", + "amount": 18.0, + "page": 31, + "line": "Particulars of advance given to employees as per the policy of the company have been given in Note no. 18 of the" + }, + { + "label": "During the year the company has paid the lease rentals amounting to INR", + "amount": 9.32, + "page": 72, + "line": "During the year the company has paid the lease rentals amounting to INR 9.32 lakhs (Previous year INR 7.80" + }, + { + "label": "non-cash transactions with directors or persons connected with them as referred to in section", + "amount": 192.0, + "page": 103, + "line": "non-cash transactions with directors or persons connected with them as referred to in section 192 of the Act. Thus," + } + ], + "auditors": [ + "Chartered Accountants", + "M/s. S. H. Sane & Co. Chartered Accountants as Statutory Auditors of the Company to hold office till the" + ], + "page_index": { + "pl": [ + 3, + 51, + 55, + 62, + 66, + 67, + 68, + 69, + 76, + 99, + 108, + 112, + 113, + 114, + 115, + 122 + ], + "directors_report": [ + 25, + 53, + 54, + 98 + ], + "balance_sheet": [ + 51, + 96 + ], + "shareholding": [], + "related_party": [ + 31, + 72, + 103, + 118 + ] + }, + "warnings": [ + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "directors_pl_identities": [ + "total_income = revenue + other_income", + "pat = pbt - tax" + ], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 62, + "directors_report": 25 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544150.json b/app/backend/primarydraft/data/companies/544150.json new file mode 100644 index 0000000000000000000000000000000000000000..ed714529f14d6f7908ca9208772960eaafc312bd --- /dev/null +++ b/app/backend/primarydraft/data/companies/544150.json @@ -0,0 +1,369 @@ +{ + "scrip_code": "544150", + "bse": { + "scrip_name": "KP Green Engineering Ltd", + "issuer_name": "KP GREEN ENGINEERING LIMITED", + "group": "M", + "segment": "Equity", + "isin": "INE0QVH01025", + "face_value": "5.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Capital Goods", + "market_cap": "1673.25", + "eps_reported": "27.15", + "pe_reported": "12.33", + "security_id": "KPGEL" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/66a26542-2fbc-4de2-953b-637edb443e4a.pdf", + "authorised_at": "2025-09-06T01:13:04.68", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544150_2025.pdf", + "available_years": [ + "2025", + "2024" + ] + }, + "extraction": { + "scrip_code": "544150", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544150_2025.pdf", + "pages": 192, + "cin": "L40100GJ2001PLC039763", + "isin": null, + "company_name": "Bse Limited", + "emails": [ + "compliance@kpgroup.co", + "evoting@nsdl.co.in", + "helpdesk.evoting@cdslindia.com", + "info@bigshareonline.com", + "info@kpgroup.co" + ], + "dins": [ + "00414045", + "00533049", + "07661317", + "08144273", + "09739235" + ], + "audited_pl": {}, + "directors_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 6946419000.0, + "page": 38, + "line": "Revenue from operations 69,464.19 34,904.86 69,464.19 34,904.86", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 3490486000.0, + "page": 38, + "line": "Revenue from operations 69,464.19 34,904.86 69,464.19 34,904.86", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 73656000.0, + "page": 38, + "line": "Other Income 736.56 292.20 736.56 292.20", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 29220000.0, + "page": 38, + "line": "Other Income 736.56 292.20 736.56 292.20", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 7020075000.0, + "page": 38, + "line": "Total Income 70,200.75 35,197.05 70,200.75 35,197.05", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 3519705000.0000005, + "page": 38, + "line": "Total Income 70,200.75 35,197.05 70,200.75 35,197.05", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 1146159000.0, + "page": 38, + "line": "Profit Earnings before interest, tax, depreciation and 11,461.59 5,651.41 11,460.90 5,651.41", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 565141000.0, + "page": 38, + "line": "Profit Earnings before interest, tax, depreciation and 11,461.59 5,651.41 11,460.90 5,651.41", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 89148000.0, + "page": 38, + "line": "Finance Cost 891.48 537.27 891.49 537.27", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 53727000.0, + "page": 38, + "line": "Finance Cost 891.48 537.27 891.49 537.27", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 998370000.0000001, + "page": 38, + "line": "Profit Before Taxation 9,983.70 4,742.93 9,983.00 4,742.93", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 474293000.0, + "page": 38, + "line": "Profit Before Taxation 9,983.70 4,742.93 9,983.00 4,742.93", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 734962000.0, + "page": 38, + "line": "Profit for the period 7,349.62 3,513.35 7,349.10 3,513.35", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pat", + "value": 351335000.0, + "page": 38, + "line": "Profit for the period 7,349.62 3,513.35 7,349.10 3,513.35", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "The Stakeholders Relationship Committee of Directors (\"SRC\") comprises of", + "amount": 3.0, + "page": 42, + "line": "The Stakeholders Relationship Committee of Directors (\"SRC\") comprises of 3 (three) members, with a majority of Non-Executive Directors." + }, + { + "label": "Mr. Amit Subhashchandra Khandelwal Non-Executive Non-Independent Director", + "amount": 1.0, + "page": 42, + "line": "Mr. Amit Subhashchandra Khandelwal Non-Executive Non-Independent Director 1 1" + }, + { + "label": "Mr. Tejpalsingh Jagatsingh Bisht (Member) Non-Executive Independent Director", + "amount": 1.0, + "page": 42, + "line": "Mr. Tejpalsingh Jagatsingh Bisht (Member) Non-Executive Independent Director 1 0" + }, + { + "label": "Mr. Surinder Kumar Negi", + "amount": 1.0, + "page": 42, + "line": "Mr. Surinder Kumar Negi1 (Member) Non-Executive Independent Director 1 1" + }, + { + "label": "Mr. Muinulhaque Iqbalhusen Kadva", + "amount": 2.0, + "page": 42, + "line": "Mr. Muinulhaque Iqbalhusen Kadva2 (Member) Executive Director, Whole-Time Director NA NA" + }, + { + "label": "The Corporate Social Responsibility (\"CSR\") Committee comprise of", + "amount": 3.0, + "page": 42, + "line": "The Corporate Social Responsibility (\"CSR\") Committee comprise of 3 (three) members, with a majority of Non-Executive Directors. During the" + }, + { + "label": "Mr. Muinulhaque Iqbalhusen Kadva (Chairman) Executive Director,", + "amount": 2.0, + "page": 42, + "line": "Mr. Muinulhaque Iqbalhusen Kadva (Chairman) Executive Director, 2 2" + }, + { + "label": "Mrs. Indu Gupta Rao (Member) Non-Executive Independent Director", + "amount": 2.0, + "page": 42, + "line": "Mrs. Indu Gupta Rao (Member) Non-Executive Independent Director 2 2" + }, + { + "label": "The Independent Directors met on March", + "amount": 10.0, + "page": 42, + "line": "The Independent Directors met on March 10, 2025, without the" + }, + { + "label": "", + "amount": 2025.0, + "page": 43, + "line": "2025-26. The remuneration payable to the Cost Auditor is subject" + }, + { + "label": "appointed M/s. Chirag Shah & Associates, Practicing Company rule", + "amount": 5.0, + "page": 43, + "line": "appointed M/s. Chirag Shah & Associates, Practicing Company rule 5(1) of the Companies (Appointment and Remuneration" + }, + { + "label": "for FY", + "amount": 25.0, + "page": 43, + "line": "for FY25. The Secretarial Audit Report for the year under review is increase in remuneration, ratio of remuneration of each Director" + }, + { + "label": "for FY", + "amount": 25.0, + "page": 43, + "line": "for FY25 is unqualified and does not contain any observation. remuneration are provided in Annexure-E of this report. The statement" + }, + { + "label": "Secretaries in Practice, (Peer Review Number:", + "amount": 2025.0, + "page": 43, + "line": "Secretaries in Practice, (Peer Review Number: 6543/2025), as the has received remuneration above the limits specified in the rule 5(2)" + }, + { + "label": "Secretarial Auditors of the Company for a period of five consecutive &", + "amount": -3.0, + "page": 43, + "line": "Secretarial Auditors of the Company for a period of five consecutive & (3) of the Companies (Appointment & Remuneration of Managerial" + }, + { + "label": "(iii) The Board of Directors at its meeting held on", + "amount": 2024.0, + "page": 95, + "line": "(iii) The Board of Directors at its meeting held on 6th November,2024 has declared an interim dividend at ` 0.20 per share for the F.Y. 2024-" + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants (Formerly known as K P Buildcon Private Limited)", + "Chartered Accountants of India. Those Standards and the Guidance", + "M/s. K A Sanghavi & Co. LLP, Chartered Accountants, bearing" + ], + "page_index": { + "pl": [ + 57, + 59, + 73, + 74, + 75, + 77, + 78, + 80, + 81, + 85, + 112, + 120, + 127, + 136, + 138, + 139, + 140, + 141, + 143, + 144, + 145, + 147, + 151, + 179, + 186, + 187 + ], + "directors_report": [ + 3, + 38, + 58 + ], + "balance_sheet": [ + 57, + 84, + 120, + 125, + 150, + 186 + ], + "shareholding": [], + "related_party": [ + 42, + 43, + 95, + 112, + 122, + 162, + 179, + 188 + ] + }, + "warnings": [ + "Statement of Profit and Loss: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "audited P&L not machine-readable in this filing", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [], + "directors_pl_identities": [ + "total_income = revenue + other_income" + ], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 136, + "directors_report": 38 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544189.json b/app/backend/primarydraft/data/companies/544189.json new file mode 100644 index 0000000000000000000000000000000000000000..7916702629c0a8b5869f4c9bc03dcffdb745a4cf --- /dev/null +++ b/app/backend/primarydraft/data/companies/544189.json @@ -0,0 +1,453 @@ +{ + "scrip_code": "544189", + "bse": { + "scrip_name": "Sattrix Information Security Ltd", + "issuer_name": "SATTRIX INFORMATION SECURITY LIMITED", + "group": "M", + "segment": "Equity", + "isin": "INE0QUV01010", + "face_value": "10.00", + "industry": "", + "sector": "Information Technology", + "industry_new": "Information Technology", + "market_cap": "417.39", + "eps_reported": "7.78", + "pe_reported": "47.28", + "security_id": "SATTRIX" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/8d7c9c21-46d1-4483-ac3b-902144822870.pdf", + "authorised_at": "2025-09-04T16:50:38.637", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544189_2025.pdf", + "available_years": [ + "2025", + "2024" + ] + }, + "extraction": { + "scrip_code": "544189", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544189_2025.pdf", + "pages": 193, + "cin": "U72200GJ2013PLC076845", + "isin": null, + "company_name": "Scrip Code: - 544189 \u2013 Sattrix Infromation Security Limited", + "emails": [ + "bssahd@bigshareonline.com", + "cs@sattrix.com", + "evoting@nsdl.co.in", + "helpdesk.evoting@cdslindia.com", + "info@bigshareonline.com", + "info@sattrix.com" + ], + "dins": [ + "06688019", + "07737921", + "09013533" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 446317000.0, + "page": 154, + "line": "Revenue from operations 18 4463.17 4037.09", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "revenue_from_operations", + "value": 403709000.0, + "page": 154, + "line": "Revenue from operations 18 4463.17 4037.09", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 4358000.0, + "page": 154, + "line": "Other Income 19 43.58 96.20", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "other_income", + "value": 9620000.0, + "page": 154, + "line": "Other Income 19 43.58 96.20", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 450675000.0, + "page": 154, + "line": "Total Income 4506.75 4133.29", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "total_income", + "value": 413329000.0, + "page": 154, + "line": "Total Income 4506.75 4133.29", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 50331000.0, + "page": 154, + "line": "Employee Benefits Expenses 21 503.31 891.63", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "employee_benefits", + "value": 89163000.0, + "page": 154, + "line": "Employee Benefits Expenses 21 503.31 891.63", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 2818000.0, + "page": 154, + "line": "Finance Cost 22 28.18 35.16", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "finance_costs", + "value": 3515999.9999999995, + "page": 154, + "line": "Finance Cost 22 28.18 35.16", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 11680000.0, + "page": 154, + "line": "Depreciation and Amortisation Expense 23 116.80 34.75", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "depreciation", + "value": 3475000.0, + "page": 154, + "line": "Depreciation and Amortisation Expense 23 116.80 34.75", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 47641000.0, + "page": 154, + "line": "Other Expenses 24 476.41 370.79", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "other_expenses", + "value": 37079000.0, + "page": 154, + "line": "Other Expenses 24 476.41 370.79", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 391870000.0, + "page": 154, + "line": "Total Expenses 3918.70 3856.42", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "total_expenses", + "value": 385642000.0, + "page": 154, + "line": "Total Expenses 3918.70 3856.42", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 58804999.99999999, + "page": 154, + "line": "Profit before tax 588.05 276.87", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "pbt", + "value": 27687000.0, + "page": 154, + "line": "Profit before tax 588.05 276.87", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "pat": { + "current": { + "field": "pat", + "value": 40461000.0, + "page": 154, + "line": "Profit/(Loss) for the period 404.61 180.30", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "pat", + "value": 18030000.0, + "page": 154, + "line": "Profit/(Loss) for the period 404.61 180.30", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + } + }, + "directors_pl": { + "other_income": { + "current": { + "field": "other_income", + "value": 4328000.0, + "page": 47, + "line": "Other Income 43.28 96.18 43.58 96.20", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 9618000.0, + "page": 47, + "line": "Other Income 43.28 96.18 43.58 96.20", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 443537000.0, + "page": 47, + "line": "Total Revenue 4,435.37 3,968.12 4,506.75 4,133.29", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 396812000.0, + "page": 47, + "line": "Total Revenue 4,435.37 3,968.12 4,506.75 4,133.29", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 2770000.0, + "page": 47, + "line": "Depreciation & 27.70 34.75 116.80 34.75", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 3475000.0, + "page": 47, + "line": "Depreciation & 27.70 34.75 116.80 34.75", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 382766000.0, + "page": 47, + "line": "Total Expenses 3827.66 3,603.37 3,918.70 3,856.42", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 360337000.0, + "page": 47, + "line": "Total Expenses 3827.66 3,603.37 3,918.70 3,856.42", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 60771000.0, + "page": 47, + "line": "Profit Before Tax 607.71 364.75 588.05 276.87", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 36475000.0, + "page": 47, + "line": "Profit Before Tax 607.71 364.75 588.05 276.87", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 9600000.0, + "page": 47, + "line": "(a)Current Tax 155.00 96.00 155.00 96.00", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 15500000.0, + "page": 47, + "line": "(a)Current Tax 155.00 96.00 155.00 96.00", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "The Nomination and Remuneration Committee is duly constituted in accordance Section", + "amount": 178.0, + "page": 56, + "line": "The Nomination and Remuneration Committee is duly constituted in accordance Section 178 of the" + }, + { + "label": "The Nomination and Remuneration Committee was constituted on", + "amount": 9.0, + "page": 56, + "line": "The Nomination and Remuneration Committee was constituted on 09/11/2023." + }, + { + "label": "cash transactions with directors or persons connected with him. Accordingly, paragraph", + "amount": 3.0, + "page": 99, + "line": "cash transactions with directors or persons connected with him. Accordingly, paragraph 3(xv) of" + } + ], + "auditors": [ + "(\u201cVC\u201d/Other Audio Visual Means & Co, Chartered Accountants,", + "Chairman & Managing Director Chartered Accountants, Ahmedabad", + "Chartered Accountants", + "Chartered Accountants of India (\u2019ICAI\u2019). These responsibilities include the design, implementation and" + ], + "page_index": { + "pl": [ + 5, + 89, + 93, + 106, + 112, + 113, + 132, + 134, + 138, + 142, + 146, + 154, + 160, + 161, + 186 + ], + "directors_report": [ + 47, + 74, + 90 + ], + "balance_sheet": [ + 89, + 142 + ], + "shareholding": [], + "related_party": [ + 56, + 77, + 99, + 138, + 186 + ] + }, + "warnings": [ + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "directors_pl_identities": [ + "pbt = total_income - total_expenses" + ], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 154, + "directors_report": 47 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544224.json b/app/backend/primarydraft/data/companies/544224.json new file mode 100644 index 0000000000000000000000000000000000000000..ff5fa5362a795fe50d99e253bdefc8704d07a3aa --- /dev/null +++ b/app/backend/primarydraft/data/companies/544224.json @@ -0,0 +1,281 @@ +{ + "scrip_code": "544224", + "bse": { + "scrip_name": "Afcom Holdings Ltd", + "issuer_name": "Afcom Holdings Limited", + "group": "M", + "segment": "Equity", + "isin": "INE0OXY01013", + "face_value": "10.00", + "industry": "", + "sector": "Services", + "industry_new": "Services", + "market_cap": "4099.02", + "eps_reported": "29.46", + "pe_reported": "48.48", + "security_id": "AFCOM" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/34664ad5-f4e5-4e1e-b2b6-66955b95307b.pdf", + "authorised_at": "2025-09-03T20:19:40.02", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544224_2025.pdf", + "available_years": [ + "2025" + ] + }, + "extraction": { + "scrip_code": "544224", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544224_2025.pdf", + "pages": 68, + "cin": "L51201TN2013PLC089652", + "isin": "INE0OXY01013", + "company_name": "For Afcom Holdings Limited", + "emails": [ + "afcomholdings.ipo@linkintime.co.in", + "ajith@afcomcargo.com", + "corporate@afcomcargo.com", + "evoting@nsdl.com", + "info@afcomcargo.com", + "info@ppnaco.com" + ], + "dins": [ + "00206099", + "00699855", + "03139809", + "08202306", + "09177619" + ], + "audited_pl": {}, + "directors_pl": {}, + "balance_sheet": {}, + "shareholding": [ + { + "label": "A Promoters & Promoter Group Body Corporate", + "numbers": [ + 425724.0, + 1.71, + 524235.0, + 1.92 + ], + "percent": 1.92, + "page": 29, + "line": "A Promoters & Promoter Group Body Corporate 4,25,724 1.71 5,24,235 1.92" + }, + { + "label": "a) Individual", + "numbers": [ + 10586211.0, + 42.59, + 10961211.0, + 40.21 + ], + "percent": 40.21, + "page": 29, + "line": "a) Individual 1,05,86,211 42.59 1,09,61,211 40.21 Total Public Shareholding (B)" + }, + { + "label": "Total Promoters & Promoter", + "numbers": [ + 10586211.0, + 42.59, + 10961211.0, + 40.21 + ], + "percent": 40.21, + "page": 29, + "line": "Total Promoters & Promoter 1,05,86,211 42.59 1,09,61,211 40.21 There will be no change in control in the Company consequent to the completion of the preferential issue to the" + }, + { + "label": "Promoter & Promoter Group(A)", + "numbers": [ + 5.0, + 10622211.0, + 42.71, + 17.0 + ], + "percent": 17.0, + "page": 48, + "line": "Promoter & Promoter Group(A) 5 10622211 42.71 Maximum number of Directorships 17A Yes" + } + ], + "related_party": [ + { + "label": "ii. During the FY", + "amount": 3.0, + "page": 37, + "line": "ii. During the FY 2024-25, the Nomination and Remuneration Committee met 3 times on 19th June, 2024, etc. The performance of the Committees was" + }, + { + "label": "", + "amount": 17.0, + "page": 37, + "line": "17. PARTICULARS OF LOANS, GUARANTEES AND" + }, + { + "label": "attendance of the committee is as tabled below:", + "amount": 15.0, + "page": 37, + "line": "attendance of the committee is as tabled below: 15. DIRECTORS RESPONSIBILITY STATEMENT" + }, + { + "label": "eligible CSR activity under Schedule VII of the Act. provisions of Secretarial Standards", + "amount": 1.0, + "page": 38, + "line": "eligible CSR activity under Schedule VII of the Act. provisions of Secretarial Standards 1 and 2 issued Companies (Appointment and Remuneration" + }, + { + "label": "ensuring full compliance with the applicable legal REPORT", + "amount": 28.0, + "page": 38, + "line": "ensuring full compliance with the applicable legal REPORT 28. REMUNERATION POLICY the requirement of obtaining a Secretarial Audit" + }, + { + "label": "", + "amount": 20.0, + "page": 38, + "line": "20. VIGIL MECHANISM / WHISTLE-BLOWER POLICY FOR Report pursuant to Regulation 34(2) (f) of SEBI Nomination & Remuneration Committee, framed and meet the prescribed thresholds of pa" + }, + { + "label": "Section", + "amount": 177.0, + "page": 38, + "line": "Section 177(9) and Section 177(10) of the Companies 25. MEETING OF INDEPENDENT DIRECTORS key managerial personnel and senior management" + }, + { + "label": "Audit Committee of the Company. The mechanism Regulations,", + "amount": 2015.0, + "page": 38, + "line": "Audit Committee of the Company. The mechanism Regulations, 2015, a separate meeting of the 29. NON-EXECUTIVE DIRECTORS\u2019 COMPENSATION AND Internal Auditors of the Company." + }, + { + "label": "provides adequate safeguards against victimisation of Independent Directors was held on", + "amount": 13.0, + "page": 38, + "line": "provides adequate safeguards against victimisation of Independent Directors was held on 13th March, 2025. DISCLOSURES" + }, + { + "label": "Directors or employees who avail of the mechanism. The Independent Directors at the meeting, inter-alia,", + "amount": 32.0, + "page": 38, + "line": "Directors or employees who avail of the mechanism. The Independent Directors at the meeting, inter-alia, 32. AUDITORS\u2019 REPORT" + }, + { + "label": "", + "amount": 21.0, + "page": 38, + "line": "21. DISCLOSURE OF ORDERS PASSED BY REGULATORS Board as a whole. may affect the independence of the Director. secretarial auditor\u2019s report. The Auditors have not" + }, + { + "label": "by any Regulator or Court or Tribunal which can Directors and Non-Executive Director. The information required", + "amount": 197.0, + "page": 38, + "line": "by any Regulator or Court or Tribunal which can Directors and Non-Executive Director. The information required under Section 197 of the 33. MAINTENANCE OF COST RECORDS" + }, + { + "label": "All the Independent Directors of the Company have Female", + "amount": 8.0, + "page": 38, + "line": "All the Independent Directors of the Company have Female 8 The Company has a Proper Risk Management Policy" + }, + { + "label": "and Section", + "amount": 92.0, + "page": 38, + "line": "and Section 92(3) of the Act read with Rule 12 of Corporate Affairs (\u2018IICA\u2019) towards the inclusion of Company. The Directors review the Policy at regular" + }, + { + "label": "Disclosure u/s", + "amount": -12.0, + "page": 41, + "line": "Disclosure u/s 197(12) and Rule 5(1) of each director to the median remuneration of the employees of the company for" + }, + { + "label": "", + "amount": 8.0, + "page": 41, + "line": "1. Ratio of remuneration of each director to the median remuneration of the employees of the company and (Pursuant to clause (h) of sub-section (3) of Section 134 of the Act and Ru" + }, + { + "label": "Remuneration", + "amount": 1.0, + "page": 41, + "line": "Remuneration 1. The Company has not entered into any contract/arrangement with related parties referred to in sub-section" + }, + { + "label": "", + "amount": 3.0, + "page": 41, + "line": "3 Mr. Jaganmohan Manthena, No remuneration was paid during the financial year 2024-25. Therefore, the" + }, + { + "label": "", + "amount": 4.0, + "page": 41, + "line": "4 Dr. Lalit Gupta, No remuneration was paid during the financial year 2024\u201325, except for sitting" + }, + { + "label": "", + "amount": 5.0, + "page": 41, + "line": "5 Mr. Natarajan Srinivasan, No remuneration was paid during the financial year 2024\u201325, except for sitting" + } + ], + "auditors": [ + "AFCOM HOLDINGS LIMITED Chartered Accountants", + "Chartered Accountants report that: such banks are in agreement with the books of", + "Note) issued by the Institute of Chartered Accountants (3) Provide reasonable assurance regarding prevention", + "issued by the Institute of Chartered Accountants of India." + ], + "page_index": { + "pl": [ + 50, + 51, + 55, + 62, + 63, + 65 + ], + "directors_report": [ + 4, + 11, + 12, + 14, + 46, + 50 + ], + "balance_sheet": [ + 50 + ], + "shareholding": [ + 29, + 46, + 48 + ], + "related_party": [ + 37, + 38, + 41, + 42, + 44, + 47, + 48, + 49, + 65 + ] + }, + "warnings": [ + "Statement of Profit and Loss: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "audited P&L not machine-readable in this filing", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [], + "directors_pl_identities": [], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 55, + "directors_report": 0 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544267.json b/app/backend/primarydraft/data/companies/544267.json new file mode 100644 index 0000000000000000000000000000000000000000..d65bf678c79a8b75225e933feea0608d5c0654ba --- /dev/null +++ b/app/backend/primarydraft/data/companies/544267.json @@ -0,0 +1,624 @@ +{ + "scrip_code": "544267", + "bse": { + "scrip_name": "Subam Papers Ltd", + "issuer_name": "SUBAM PAPERS LIMITED", + "group": "M", + "segment": "Equity", + "isin": "INE0U6201010", + "face_value": "10.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Capital Goods", + "market_cap": "595.75", + "eps_reported": "6.99", + "pe_reported": "31.02", + "security_id": "SUBAM" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/4f33ecac-2007-4a76-b5c5-3817744c547f.pdf", + "authorised_at": "2025-09-05T18:45:37.943", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544267_2025.pdf", + "available_years": [ + "2025" + ] + }, + "extraction": { + "scrip_code": "544267", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544267_2025.pdf", + "pages": 162, + "cin": "U21012TN2004PLC054403", + "isin": null, + "company_name": "Subam Papers Limited", + "emails": [ + "accounts@subampapers.com", + "atinfo@subampapers.com", + "cs@subampapers.com", + "evoting@nsdl.co.in", + "finance@subampapers.com", + "helpdesk.evoting@cdslindia.com" + ], + "dins": [ + "00440500", + "00951835", + "01515113", + "10617158" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 4481331000.0, + "page": 93, + "line": "Revenue from Operations 21 44,813.31 44,767.83", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 4476783000.0, + "page": 93, + "line": "Revenue from Operations 21 44,813.31 44,767.83", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 56554999.99999999, + "page": 93, + "line": "Other Income 22 565.55 599.99", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 59999000.0, + "page": 93, + "line": "Other Income 22 565.55 599.99", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 4537886000.0, + "page": 93, + "line": "Total Income 45,378.86 45,367.82", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 4536782000.0, + "page": 93, + "line": "Total Income 45,378.86 45,367.82", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 3610887999.9999995, + "page": 93, + "line": "Cost of Material Consumed 23 36,108.88 35,064.45", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "cost_of_materials", + "value": 3506444999.9999995, + "page": 93, + "line": "Cost of Material Consumed 23 36,108.88 35,064.45", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 156011000.0, + "page": 93, + "line": "Employee Benefit Expenses 25 1,560.11 1,531.68", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "employee_benefits", + "value": 153168000.0, + "page": 93, + "line": "Employee Benefit Expenses 25 1,560.11 1,531.68", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 115346000.0, + "page": 93, + "line": "Finance Costs 26 1,153.46 1,258.70", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 125870000.0, + "page": 93, + "line": "Finance Costs 26 1,153.46 1,258.70", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 130108000.0, + "page": 93, + "line": "Depreciation and Amortization Expenses 1,301.08 964.72", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 96472000.0, + "page": 93, + "line": "Depreciation and Amortization Expenses 1,301.08 964.72", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 179391000.0, + "page": 93, + "line": "Other Expenses 27 1,793.91 2,429.22", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_expenses", + "value": 242921999.99999997, + "page": 93, + "line": "Other Expenses 27 1,793.91 2,429.22", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 4193628000.0, + "page": 93, + "line": "Total expenses 41,936.28 41,448.32", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 4144832000.0, + "page": 93, + "line": "Total expenses 41,936.28 41,448.32", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 344258000.0, + "page": 93, + "line": "Profit/(Loss) before Tax 3,442.58 3,848.67", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 384867000.0, + "page": 93, + "line": "Profit/(Loss) before Tax 3,442.58 3,848.67", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 55577000.0, + "page": 93, + "line": "-Current Tax 555.77 668.22", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 66822000.0, + "page": 93, + "line": "-Current Tax 555.77 668.22", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 33039000.0, + "page": 93, + "line": "-Deferred Tax 330.39 300.41", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": 30041000.000000004, + "page": 93, + "line": "-Deferred Tax 330.39 300.41", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 255642000.0, + "page": 93, + "line": "Profit/(Loss) for the period 2,556.42 2,880.04", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pat", + "value": 288004000.0, + "page": 93, + "line": "Profit/(Loss) for the period 2,556.42 2,880.04", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 14.62, + "page": 93, + "line": "-Basic (In Rs) 14.62 176.94", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "eps_basic", + "value": 176.94, + "page": 93, + "line": "-Basic (In Rs) 14.62 176.94", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 14.62, + "page": 93, + "line": "-Diluted (In Rs) 14.62 176.94", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "eps_diluted", + "value": 176.94, + "page": 93, + "line": "-Diluted (In Rs) 14.62 176.94", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + } + }, + "directors_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 4481331000.0, + "page": 49, + "line": "Revenue from operations 44813.31 44767.83 53916.71 49386.46", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 4476783000.0, + "page": 49, + "line": "Revenue from operations 44813.31 44767.83 53916.71 49386.46", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 56554999.99999999, + "page": 49, + "line": "Other income 565.55 599.99 701.29 341.68", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 59999000.0, + "page": 49, + "line": "Other income 565.55 599.99 701.29 341.68", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 4537886000.0, + "page": 49, + "line": "Total income 45378.86 45367.82 54618.00 49728.14", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 4536782000.0, + "page": 49, + "line": "Total income 45378.86 45367.82 54618.00 49728.14", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 130108000.0, + "page": 49, + "line": "Depreciation and amortisation expense 1301.08 964.72 1639.69 1296.72", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 96472000.0, + "page": 49, + "line": "Depreciation and amortisation expense 1301.08 964.72 1639.69 1296.72", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 4193628000.0, + "page": 49, + "line": "Total expenses 41936.28 40189.62 50919.01 43968.86", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 4018962000.0000005, + "page": 49, + "line": "Total expenses 41936.28 40189.62 50919.01 43968.86", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 457604000.0, + "page": 49, + "line": "Profit before finance costs, exceptional 4576.04 5178.2 5677.60 5758.28", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 517820000.0, + "page": 49, + "line": "Profit before finance costs, exceptional 4576.04 5178.2 5677.60 5758.28", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 342258000.0, + "page": 49, + "line": "Profit before exceptional item and 3422.58 3919.50 3698.99 3991.77", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 391950000.0, + "page": 49, + "line": "Profit before exceptional item and 3422.58 3919.50 3698.99 3991.77", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 255642000.0, + "page": 49, + "line": "Profit for the year 2556.42 2880.04 2687.64 2825.81", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pat", + "value": 288004000.0, + "page": 49, + "line": "Profit for the year 2556.42 2880.04 2687.64 2825.81", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "Item No.", + "amount": 7.0, + "page": 5, + "line": "Item No.7-Increasing Inter Corporate Loans, Investments etc. Limits up to RS. 300 CR." + }, + { + "label": "(DIN:", + "amount": 1515113.0, + "page": 20, + "line": "(DIN: 01515113) as a Director of the" + }, + { + "label": "(DIN:", + "amount": 951835.0, + "page": 20, + "line": "(DIN: 00951835) as a Director of the" + }, + { + "label": "", + "amount": 5.0, + "page": 20, + "line": "5. Advancing of Loan or giving of" + }, + { + "label": "", + "amount": 6.0, + "page": 20, + "line": "6. Increasing Inter Corporate Loans," + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants [CIN: U21012TN2004PLC054403]", + "Code of Ethics issued by the Institute of Chartered Accountants of India (\u201cICAI\u201d) together with the", + "Controls Over Financial Reporting issued by the Institute of Chartered Accountants of India (ICAI)." + ], + "page_index": { + "pl": [ + 24, + 81, + 83, + 93, + 95, + 96, + 102, + 127, + 132, + 134, + 135, + 141 + ], + "directors_report": [ + 49, + 82, + 125 + ], + "balance_sheet": [ + 24, + 81, + 124, + 131 + ], + "shareholding": [], + "related_party": [ + 5, + 16, + 20, + 31, + 42, + 46, + 60, + 61, + 65, + 66, + 71, + 72, + 73, + 90, + 115, + 116, + 117, + 133, + 142, + 154, + 155, + 157 + ] + }, + "warnings": [ + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "directors_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 93, + "directors_report": 49 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544291.json b/app/backend/primarydraft/data/companies/544291.json new file mode 100644 index 0000000000000000000000000000000000000000..13bd8bf67d9993fbc0cf0c4416a7d05a5c1f0204 --- /dev/null +++ b/app/backend/primarydraft/data/companies/544291.json @@ -0,0 +1,386 @@ +{ + "scrip_code": "544291", + "bse": { + "scrip_name": "Rajesh Power Services Ltd", + "issuer_name": "RAJESH POWER SERVICES LIMITED", + "group": "M", + "segment": "Equity", + "isin": "INE0VN801010", + "face_value": "10.00", + "industry": "", + "sector": "Utilities", + "industry_new": "Utilities", + "market_cap": "1546.83", + "eps_reported": "76.38", + "pe_reported": "11.25", + "security_id": "RAJESH" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/cd2d3138-b50f-49f3-a0ec-7f8d32e52a80.pdf", + "authorised_at": "2025-08-09T16:52:08.77", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544291_2025.pdf", + "available_years": [ + "2025" + ] + }, + "extraction": { + "scrip_code": "544291", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544291_2025.pdf", + "pages": 76, + "cin": "L31300GJ2010PLC059536", + "isin": "INEOVN801010", + "company_name": "Bse Limited", + "emails": [ + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "ivote@bigshareonline.com" + ], + "dins": [ + "00111130", + "00111158", + "00137280", + "00137308", + "00469390", + "00773528", + "03216073", + "07177208", + "07634816", + "08486317", + "10089087" + ], + "audited_pl": { + "other_income": { + "current": { + "field": "other_income", + "value": 2400000.0, + "page": 60, + "line": "III Other Income 24 722.38", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "other_income", + "value": 72238000.0, + "page": 60, + "line": "III Other Income 24 722.38", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 11146601000.0, + "page": 60, + "line": "Total Income 1,11,466.01", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 2600000.0, + "page": 60, + "line": "(b) Deferred Tax Liabilities (Net) - (b) Changes in inventories of finished goods, work-in-progress and stock-in-trade 26 (2,562.56)", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "tax_deferred", + "value": -256256000.0, + "page": 60, + "line": "(b) Deferred Tax Liabilities (Net) - (b) Changes in inventories of finished goods, work-in-progress and stock-in-trade 26 (2,562.56)", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 2900000.0, + "page": 60, + "line": "(e) Depreciation and amortization expense 29 120.66", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "depreciation", + "value": 12066000.0, + "page": 60, + "line": "(e) Depreciation and amortization expense 29 120.66", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 3000000.0, + "page": 60, + "line": "(f) Other expenses 30 3,200.04", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "other_expenses", + "value": 320004000.0, + "page": 60, + "line": "(f) Other expenses 30 3,200.04", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 9915421000.0, + "page": 60, + "line": "Total expenses 99,154.21", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 1231180000.0, + "page": 60, + "line": "IX Profit before tax (VII - VIII) 12,311.80", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 3100000.0, + "page": 60, + "line": "(a) Current tax 31 3,241.68", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "tax_current", + "value": 324168000.0, + "page": 60, + "line": "(a) Current tax 31 3,241.68", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "pat": { + "current": { + "field": "pat", + "value": 933662999.9999999, + "page": 60, + "line": "XV Profit/(Loss) for the year (XI + XIV) 9,336.63", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + } + }, + "directors_pl": {}, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "", + "amount": 11.0, + "page": 25, + "line": "11. Approval of Related Party Transactions pursuant to provisions of Section 188 of Companies Act 2013: Notes: Currently, there are multiple e-voting service providers" + }, + { + "label": "", + "amount": 1.0, + "page": 25, + "line": "1. Sale, Purchase or supply of any Transaction with Entity over which Directors/ ` 636 Crores but also enhancing ease and convenience of participating" + }, + { + "label": "", + "amount": 1.0, + "page": 25, + "line": "1 HKRP Innovations Limited Sale of Goods ` 95 Crores its shareholders, in respect of all shareholders\u2019 resolutions. to vote through their demat account maintained with" + }, + { + "label": "", + "amount": 2.0, + "page": 25, + "line": "2 HKRP Innovations Limited Purchase of Goods ` 500 Crores However, it has been observed that the participation by the Depositories and Depository Participants. Shareholders" + }, + { + "label": "", + "amount": 3.0, + "page": 25, + "line": "3 Shashwat Bio Polyplast LLP Purchase of Goods ` 1.00 Crore public non-institutional shareholders/retail shareholders is are advised to update their mobile number and email Id in" + }, + { + "label": "", + "amount": 4.0, + "page": 25, + "line": "4 Marc Electro Infra Pvt Ltd Purchase of Goods ` 10.00 Crores at a negligible level. their demat accounts in order to access e-Voting facility." + }, + { + "label": "", + "amount": 5.0, + "page": 25, + "line": "5 Shashwat Composite LLP Purchase of Goods ` 20.00 Crores" + }, + { + "label": "", + "amount": 6.0, + "page": 25, + "line": "6 Polycoat Electra Purchase of Goods ` 5.00 Crores" + }, + { + "label": "", + "amount": 7.0, + "page": 25, + "line": "7 Sarthak Enterprise Purchase of Goods ` 5.00 Crores 1. Pursuant to above said SEBI Circular, Login method for e-Voting and joining virtual meetings for Individual shareholders" + }, + { + "label": "", + "amount": 2.0, + "page": 25, + "line": "2. Related party's appointment Appointment of Related Party of the Directors ` 9.50 Crore Type of Login Method" + }, + { + "label": "", + "amount": 2.0, + "page": 25, + "line": "2 Vishal Patel Remuneration ` 2.00 Crore" + }, + { + "label": "", + "amount": 3.0, + "page": 25, + "line": "3 Beena Panchal Remuneration ` 1.00 Crore e-Voting period. Additionally, there is also links provided to access the system of all e-Voting Service" + }, + { + "label": "", + "amount": 4.0, + "page": 25, + "line": "4 Nehal Panchal Remuneration ` 1.00 Crore Providers i.e. BIGSHARE, so that the user can visit the e-Voting service providers\u2019 website directly." + }, + { + "label": "", + "amount": 5.0, + "page": 25, + "line": "5 Ketali Makwana Remuneration ` 0.50 Crore" + }, + { + "label": "", + "amount": 6.0, + "page": 25, + "line": "6 Daxesh Panchal Remuneration ` 1.00 Crore" + }, + { + "label": "", + "amount": 7.0, + "page": 25, + "line": "7 Krunal Panchal Remuneration ` 0.50 Crore" + }, + { + "label": "", + "amount": 8.0, + "page": 25, + "line": "8 Praful Patel Remuneration ` 1.00 Crore" + }, + { + "label": "", + "amount": 9.0, + "page": 25, + "line": "9 Minoli Patel Remuneration ` 0.50 Crore" + }, + { + "label": "\u2022 Custodian can \u201cCHANGE PASSWORD\u201d or \u201cVIEW/UPDATE PROFILE\u201d under \u201cPROFILE\u201d option on custodian portal. Hence, ", + "amount": 2013.0, + "page": 27, + "line": "\u2022 Custodian can \u201cCHANGE PASSWORD\u201d or \u201cVIEW/UPDATE PROFILE\u201d under \u201cPROFILE\u201d option on custodian portal. Hence, the consent of the members is being sought to adopt the Act, 2013. At " + }, + { + "label": "The Board of Directors at the meeting held on August", + "amount": 7.0, + "page": 27, + "line": "The Board of Directors at the meeting held on August 7 , 2025 borrowing powers of the Board of Directors up to ` 1000 Crores" + } + ], + "auditors": [ + "(CA Pranav N. Shah) on the assessed risk. The procedures selected depend on the Chartered Accountants", + "Chartered Accountants", + "Chartered Accountants (Formerly known as Rajesh Power Services Private Limited)", + "Current Liability Chartered Accountants (Formerly known as Rajesh Power Services Private Limited)" + ], + "page_index": { + "pl": [ + 38, + 39, + 42, + 44, + 45, + 46, + 54, + 55, + 57, + 58, + 60, + 62, + 63, + 64, + 71, + 72, + 73 + ], + "directors_report": [ + 28, + 29, + 31, + 38, + 57 + ], + "balance_sheet": [ + 38, + 57 + ], + "shareholding": [], + "related_party": [ + 25, + 27, + 28, + 31, + 37, + 51, + 69 + ] + }, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "pbt = total_income - total_expenses" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 60, + "directors_report": 28 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544296.json b/app/backend/primarydraft/data/companies/544296.json new file mode 100644 index 0000000000000000000000000000000000000000..a179c4c807e09a1a65443b8ba12c1dd1c0662386 --- /dev/null +++ b/app/backend/primarydraft/data/companies/544296.json @@ -0,0 +1,650 @@ +{ + "scrip_code": "544296", + "bse": { + "scrip_name": "Nisus Finance Services Co Ltd", + "issuer_name": "NISUS FINANCE SERVICES CO LIMITED", + "group": "M", + "segment": "Equity", + "isin": "INE0DQN01013", + "face_value": "10.00", + "industry": "", + "sector": "Financial Services", + "industry_new": "Financial Services", + "market_cap": "407.12", + "eps_reported": "11.17", + "pe_reported": "15.26", + "security_id": "NISUS" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/b7444f62-9a5f-425a-989e-4614c48b7428.pdf", + "authorised_at": "2025-08-01T17:52:00.77", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544296_2025.pdf", + "available_years": [ + "2025" + ] + }, + "extraction": { + "scrip_code": "544296", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544296_2025.pdf", + "pages": 105, + "cin": "L65923MH2013PLC247317", + "isin": "INE0DQN01013", + "company_name": "Bse Limited", + "emails": [ + "company_secretary@mjawadwala.com", + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "info@nisusfin.com", + "investor.relations@nisusfin.com", + "ipo@skylinerta.com" + ], + "dins": [ + "02778565", + "06624732", + "06879950", + "06882149", + "07654007" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 307112000.0, + "page": 70, + "line": "Revenue from Operations 19 3,071.12 2,794.43 31st March, 2025 3311sstt MMaarrcchh,, 2200224", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "revenue_from_operations", + "value": 279443000.0, + "page": 70, + "line": "Revenue from Operations 19 3,071.12 2,794.43 31st March, 2025 3311sstt MMaarrcchh,, 2200224", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 56794000.00000001, + "page": 70, + "line": "Other Income 20 567.94 786.40 (Audited) (Audited)", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "other_income", + "value": 78640000.0, + "page": 70, + "line": "Other Income 20 567.94 786.40 (Audited) (Audited)", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 363906000.0, + "page": 70, + "line": "Total Income 3,639.06 3,580.83", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "total_income", + "value": 358083000.0, + "page": 70, + "line": "Total Income 3,639.06 3,580.83", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 48371000.0, + "page": 70, + "line": "Employee Benefit Expenses 21 483.71 222.76", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "employee_benefits", + "value": 22276000.0, + "page": 70, + "line": "Employee Benefit Expenses 21 483.71 222.76", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 6143000.0, + "page": 70, + "line": "Finance Costs 22 61.43 85.53", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "finance_costs", + "value": 8553000.0, + "page": 70, + "line": "Finance Costs 22 61.43 85.53", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 1953000.0, + "page": 70, + "line": "Depreciation /Amortisation 19.53 5.93", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "depreciation", + "value": 593000.0, + "page": 70, + "line": "Depreciation /Amortisation 19.53 5.93", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 54889000.0, + "page": 70, + "line": "Other Expenses 24 548.89 235.61 Foreign Exchange gain / loss (23.27) -", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "other_expenses", + "value": 23561000.0, + "page": 70, + "line": "Other Expenses 24 548.89 235.61 Foreign Exchange gain / loss (23.27) -", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 111356000.0, + "page": 70, + "line": "Total expenses 1,113.56 549.83 Finance Cost 61.43 85.53", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "total_expenses", + "value": 54983000.00000001, + "page": 70, + "line": "Total expenses 1,113.56 549.83 Finance Cost 61.43 85.53", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 252548999.99999997, + "page": 70, + "line": "Profit/(Loss) before Tax 2,525.49 2,944.52", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "pbt", + "value": 294452000.0, + "page": 70, + "line": "Profit/(Loss) before Tax 2,525.49 2,944.52", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 54936000.0, + "page": 70, + "line": "- Current Tax 549.36 564.29", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "tax_current", + "value": 56429000.0, + "page": 70, + "line": "- Current Tax 549.36 564.29", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": -177000.0, + "page": 70, + "line": "- Deferred Tax (1.77) (1.79) (Decrease)/Increase in trade payables 0.74 2.13", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "tax_deferred", + "value": -179000.0, + "page": 70, + "line": "- Deferred Tax (1.77) (1.79) (Decrease)/Increase in trade payables 0.74 2.13", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "pat": { + "current": { + "field": "pat", + "value": 197791000.0, + "page": 70, + "line": "Profit/(Loss) after Tax 1,977.91 2,382.02 (Decrease)/Increase in Provisions 15.67 526.24", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "pat", + "value": 238202000.0, + "page": 70, + "line": "Profit/(Loss) after Tax 1,977.91 2,382.02 (Decrease)/Increase in Provisions 15.67 526.24", + "scale": 100000.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 9.9, + "page": 70, + "line": "-Basic (In \u20b9) 26 9.90 13.06", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "eps_basic", + "value": 13.06, + "page": 70, + "line": "-Basic (In \u20b9) 26 9.90 13.06", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 9.9, + "page": 70, + "line": "-Diluted (In \u20b9) 26 9.90 12.76", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + }, + "previous": { + "field": "eps_diluted", + "value": 12.76, + "page": 70, + "line": "-Diluted (In \u20b9) 26 9.90 12.76", + "scale": 1.0, + "section": "audited_pl", + "basis": "standalone" + } + } + }, + "directors_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 307112000.0, + "page": 50, + "line": "Revenue from operations 3071.12 2794.43 6561.93 4302.84 as prescribed under the Companies Act, 2013 read with", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 279443000.0, + "page": 50, + "line": "Revenue from operations 3071.12 2794.43 6561.93 4302.84 as prescribed under the Companies Act, 2013 read with", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 56794000.00000001, + "page": 50, + "line": "Other income 567.94 786.40 168.10 0.75 Equity shares.", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 78640000.0, + "page": 50, + "line": "Other income 567.94 786.40 168.10 0.75 Equity shares.", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 363906000.0, + "page": 50, + "line": "Total revenue 3639.06 3580.83 6730.03 4303.59", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 358083000.0, + "page": 50, + "line": "Total revenue 3639.06 3580.83 6730.03 4303.59", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 252550000.0, + "page": 50, + "line": "Profit/(Loss) Before Tax 2525.50 2944.52 4140.74 3438.27 During the year under review, the Company\u2019s total income", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 294452000.0, + "page": 50, + "line": "Profit/(Loss) Before Tax 2525.50 2944.52 4140.74 3438.27 During the year under review, the Company\u2019s total income", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 54936000.0, + "page": 50, + "line": "- Current Tax 549.36 564.29 905.61 1034.23 of the Company at the Extra-Ordinary General Meeting", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 56429000.0, + "page": 50, + "line": "- Current Tax 549.36 564.29 905.61 1034.23 of the Company at the Extra-Ordinary General Meeting", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": -177000.0, + "page": 50, + "line": "- Deferred Tax (1.77) (1.79) (23.92) (1.32) against a net profit of \u20b92382.02/- lakhs in the previous", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": -179000.0, + "page": 50, + "line": "- Deferred Tax (1.77) (1.79) (23.92) (1.32) against a net profit of \u20b92382.02/- lakhs in the previous", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "Registered Office:", + "amount": 502.0, + "page": 27, + "line": "Registered Office: 502-A, Floor 5, A-Wing, Poonam Chambers, Dr. Annie Besant Road, Worli, Mumbai, Maharashtra 4. To Approve the Material Related Party Transactions Directors of the" + }, + { + "label": "LIMITED (\u2018NIFCO\u2019) will be held on Monday,", + "amount": 25.0, + "page": 27, + "line": "LIMITED (\u2018NIFCO\u2019) will be held on Monday, 25th August, Remuneration Policy and HR Policies of Nisus Finance Requirements) Regulations, 2015 (\u201cSEBI LODR against the respective relat" + }, + { + "label": "Chairman and Managing Director, from \u20b9", + "amount": 12000000.0, + "page": 27, + "line": "Chairman and Managing Director, from \u20b91,20,00,000/-" + }, + { + "label": "", + "amount": 1.0, + "page": 27, + "line": "1 Nisus Finance Subsidiary Loans / Investments / Corporate guarantee / 150" + }, + { + "label": "to", + "amount": 31.0, + "page": 27, + "line": "to 31st March, 2028, as minimum remuneration, in" + }, + { + "label": "", + "amount": 6624732.0, + "page": 27, + "line": "06624732), Director of the Company, who retires by profits during such period." + }, + { + "label": "rotation, and being eligible, has offered himself for re", + "amount": -2.0, + "page": 27, + "line": "rotation, and being eligible, has offered himself for re- 2 Nisus Fincorp Subsidiary Loans / Investments / Corporate guarantee / 100" + }, + { + "label": "", + "amount": 3.0, + "page": 27, + "line": "3 Nisus BCD Subsidiary Loans / Investments / Corporate guarantee / 100" + }, + { + "label": "", + "amount": 3.0, + "page": 27, + "line": "3. To approve remuneration of Mr. Amit Goenka (DIN: any financial year, the said remuneration comprising" + }, + { + "label": "", + "amount": 2778565.0, + "page": 27, + "line": "02778565), Chairman and Managing Director of the salary, perquisites and other benefits as approved by" + }, + { + "label": "Company. the Members shall be paid as minimum remuneration", + "amount": 4.0, + "page": 27, + "line": "Company. the Members shall be paid as minimum remuneration 4 Nisus Finance Sub-Subsidiary Loans / Investments / Corporate guarantee / 150" + }, + { + "label": "", + "amount": 5.0, + "page": 27, + "line": "5 Microspace Subsidiary Loans / Investments / Corporate guarantee / 50" + }, + { + "label": "in Sections", + "amount": 117178196197198.0, + "page": 27, + "line": "in Sections 117, 178, 196, 197, 198 and 203, Schedule authorised to vary and/or revise the remuneration" + }, + { + "label": "", + "amount": 250.0, + "page": 28, + "line": "6 Nisus Finance Subsidiary Loans / Investments / Corporate guarantee / 250 1 Nisus Finance & Investment Loans / Investments / Corporate guarantee / Security / 150" + }, + { + "label": "", + "amount": 150.0, + "page": 28, + "line": "7. Nisus Finance Sub-Subsidiary Loans / Investments / Corporate guarantee / 150 2 Nisus BCD Advisors LLP Loans / Investments / Corporate guarantee / Security / 100" + }, + { + "label": "", + "amount": 50.0, + "page": 28, + "line": "8. NIFCO Sub -Subsidiary Loans / Investments / Corporate guarantee / 50 3 Nisus Finance Projects LLP Loans / Investments / Corporate guarantee / Security / 150" + }, + { + "label": "", + "amount": 4.0, + "page": 28, + "line": "4 Microsafe Projects LLP Loans / Investments / Corporate guarantee / Security / 50" + }, + { + "label": "", + "amount": 9.0, + "page": 28, + "line": "9. Microsafe Projects Associates Loans / Investments / Corporate guarantee / 50 sale & purchase / availing or rendering of any services" + }, + { + "label": "", + "amount": 5.0, + "page": 28, + "line": "5 Dalmia Nisus Finance Loans / Investments / Corporate guarantee / Security / 50" + }, + { + "label": "", + "amount": 10.0, + "page": 28, + "line": "10. Dalmia Nisus Associates Loans / Investments / Corporate guarantee / 50 Investment Managers LLP sale & purchase / availing or rendering of any services" + } + ], + "auditors": [ + "Chartered Accountants (formerly known as Nisus Finance Services Co Private Limited)", + "Chartered Accountants - Due to Others 21.63 21.20", + "Chartered Accountants Chartered Accountants", + "Chartered Accountants year ended on that date. the auditor\u2019s judgment, including the assessment of the" + ], + "page_index": { + "pl": [ + 70, + 71, + 72, + 74, + 86, + 87, + 88, + 90, + 91, + 92, + 93 + ], + "directors_report": [ + 3, + 36, + 50, + 64 + ], + "balance_sheet": [ + 64, + 86 + ], + "shareholding": [], + "related_party": [ + 27, + 28, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 54, + 58, + 67, + 81, + 82, + 83, + 101, + 102, + 103 + ] + }, + "warnings": [ + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "directors_pl_identities": [ + "total_income = revenue + other_income" + ], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 70, + "directors_report": 50 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544310.json b/app/backend/primarydraft/data/companies/544310.json new file mode 100644 index 0000000000000000000000000000000000000000..8f550b42e0afba50ca9517e8a492ba1c3e232ecb --- /dev/null +++ b/app/backend/primarydraft/data/companies/544310.json @@ -0,0 +1,400 @@ +{ + "scrip_code": "544310", + "bse": { + "scrip_name": "Yash Highvoltage Ltd", + "issuer_name": "Yash Highvoltage Limited", + "group": "M", + "segment": "Equity", + "isin": "INE00GK01023", + "face_value": "5.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Capital Goods", + "market_cap": "2737.84", + "eps_reported": "13.19", + "pe_reported": "72.55", + "security_id": "YASHHV" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/66fa2296-17f4-4ca1-82c0-d1452e097c7e.pdf", + "authorised_at": "2025-08-18T10:23:03.763", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544310_2025.pdf", + "available_years": [ + "2025" + ] + }, + "extraction": { + "scrip_code": "544310", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544310_2025.pdf", + "pages": 54, + "cin": "L40109GJ2002PLC040833", + "isin": null, + "company_name": "Bse Limited", + "emails": [ + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "investors@yashhv.com", + "ivote@bigshareonline.com", + "sales@yashhv.com" + ], + "dins": [ + "01064190", + "02658070", + "03575362", + "09804792", + "10659968", + "10697584" + ], + "audited_pl": { + "total_income": { + "current": { + "field": "total_income", + "value": 152154600000.0, + "page": 32, + "line": "\u0099 Total Income: 15,215.46 manufacturers offering customized retrofit solutions for", + "scale": 10000000.0, + "section": "audited_pl", + "basis": null + } + }, + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 150141300000.0, + "page": 32, + "line": "Within the targeted voltage range, RIP bushings will serve as a sweet spot for the company as global market is rapidly transitioning \u0099 Revenue from Operations: 15,014.13 transformer bushings, adding niche capabilities.", + "scale": 10000000.0, + "section": "audited_pl", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 2713200000.0, + "page": 32, + "line": "\u0099 Depreciation: 271.32", + "scale": 10000000.0, + "section": "audited_pl", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 3152600000.0, + "page": 32, + "line": "\u0099 Finance Cost: 315.26 presence through a dedicated overseas marketing team", + "scale": 10000000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 2013300000.0000002, + "page": 32, + "line": "\u0099 Other Income: 201.33 and a vast network of agents and representatives.", + "scale": 10000000.0, + "section": "audited_pl", + "basis": null + } + } + }, + "directors_pl": { + "total_income": { + "current": { + "field": "total_income", + "value": 15215.46, + "page": 19, + "line": "Total Revenue 15215.46 10912.25", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 10912.25, + "page": 19, + "line": "Total Revenue 15215.46 10912.25", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 12400.76, + "page": 19, + "line": "Login type Helpdesk details Total Expenditure 12400.76 9138.80", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 9138.8, + "page": 19, + "line": "Login type Helpdesk details Total Expenditure 12400.76 9138.80", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 2814.7, + "page": 19, + "line": "Shareholder\u2018s other than individual In case shareholders/ investor have any queries regarding E-voting, you Profit Before Exceptional & Extraordinary items & tax 2814.70 1773.44", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 1773.44, + "page": 19, + "line": "Shareholder\u2018s other than individual In case shareholders/ investor have any queries regarding E-voting, you Profit Before Exceptional & Extraordinary items & tax 2814.70 1773.44", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 735.44, + "page": 19, + "line": "Less : Current Tax 735.44 540.00", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 540.0, + "page": 19, + "line": "Less : Current Tax 735.44 540.00", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": -10.85, + "page": 19, + "line": "For shareholder other than individual shareholders holding shares in Demat mode is given below: Less : Deferred Tax Expenses (Income) (10.85) 0.92", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": 0.92, + "page": 19, + "line": "For shareholder other than individual shareholders holding shares in Demat mode is given below: Less : Deferred Tax Expenses (Income) (10.85) 0.92", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 2140.76, + "page": 19, + "line": "\u2022 The Members may attend the AGM through VC/ OAVM at https://ivote.bigshareonline.com under Investor login by Profit/(Loss) After Taxes 2140.76 1232.87", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pat", + "value": 1232.87, + "page": 19, + "line": "\u2022 The Members may attend the AGM through VC/ OAVM at https://ivote.bigshareonline.com under Investor login by Profit/(Loss) After Taxes 2140.76 1232.87", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "Your directors placed on record the sense of appreciation value, if any or ransactions section", + "amount": 188.0, + "page": 24, + "line": "Your directors placed on record the sense of appreciation value, if any or ransactions section 188" + }, + { + "label": "", + "amount": 2016.0, + "page": 24, + "line": "2016 during the FY along with the current status:" + }, + { + "label": "", + "amount": 2013.0, + "page": 24, + "line": "2013 read with Rule 5(1) of the Companies (Appointment relationship arrangement/ by the advances," + }, + { + "label": "and Remuneration of Managerial Personnel) Rules,", + "amount": 2014.0, + "page": 24, + "line": "and Remuneration of Managerial Personnel) Rules, 2014 37. The details of difference between amount of PAN No. transactions (C IN LACS) Board if any" + }, + { + "label": "Keyur Shah \u2013 Director", + "amount": 1.0, + "page": 24, + "line": "Keyur Shah \u2013 Director 01/04/2024 to" + }, + { + "label": "settlement and the valuation done while taking Rent", + "amount": 26.72, + "page": 24, + "line": "settlement and the valuation done while taking Rent 26.72 -- -" + }, + { + "label": "Keyur Shah \u2013 Director Directors Remuneration", + "amount": 1.0, + "page": 24, + "line": "Keyur Shah \u2013 Director Directors Remuneration 01/04/2024 to" + }, + { + "label": "and Remuneration of Managerial Personnel) Rules,", + "amount": 2014.0, + "page": 24, + "line": "and Remuneration of Managerial Personnel) Rules, 2014," + }, + { + "label": "Keyur Shah \u2013 Director expenses of IPO (Refer", + "amount": 1.0, + "page": 24, + "line": "Keyur Shah \u2013 Director expenses of IPO (Refer 01/04/2024 to" + }, + { + "label": "particulars of the employees in terms of the remuneration", + "amount": 3.0, + "page": 24, + "line": "particulars of the employees in terms of the remuneration 38. Life at Yash Highvoltage Limited: AFOPS7301H Note no. 39 of the Notes 31/03/2025 169.67" + }, + { + "label": "", + "amount": 4.0, + "page": 24, + "line": "31. Related Parties Transactions: our employees by providing regular training sessions and Keyur Shah \u2013 Director Personal Guarantee 01/04/2024 to 66.21 -- -" + }, + { + "label": "Twinkle Shah-Director Professional Fees", + "amount": -1.0, + "page": 24, + "line": "Twinkle Shah-Director Professional Fees- 01/04/2024 to" + }, + { + "label": "The Chairman & Board of Directors of the Company ABBCA", + "amount": 8511.0, + "page": 24, + "line": "The Chairman & Board of Directors of the Company ABBCA8511H" + }, + { + "label": "bankers of the Company. The Board also acknowledges AKUPP", + "amount": 4.0, + "page": 24, + "line": "bankers of the Company. The Board also acknowledges AKUPP7106N Salary & Perquisites of 01/04/2024 to 31.11" + }, + { + "label": "On behalf of the Board Ltd.- relative of Director Expense/Sales", + "amount": 1.0, + "page": 24, + "line": "On behalf of the Board Ltd.- relative of Director Expense/Sales 01/04/2024 to" + }, + { + "label": "Expense/Sales", + "amount": 1.0, + "page": 24, + "line": "Expense/Sales 01/04/2024 to" + }, + { + "label": "Date :", + "amount": 11.0, + "page": 24, + "line": "Date : 11th August, 2025 Chairman Director is interested 8.57" + }, + { + "label": "Ltd.- relative of Director", + "amount": 1.0, + "page": 25, + "line": "Ltd.- relative of Director 01/04/2024 to" + }, + { + "label": "Ltd.- relative of Director", + "amount": 1.0, + "page": 25, + "line": "Ltd.- relative of Director 01/04/2024 to interests of all stakeholders." + }, + { + "label": "AG- holding", + "amount": 1.0, + "page": 25, + "line": "AG- holding 25.70% Purchase including 01/04/2023 to" + } + ], + "auditors": [ + "A chartered accountant by profession, Mr. Mehta has over a decade\u2019s experience, is", + "Chartered Accountants", + "Chartered Accountants YASH HIGHVOLTAGE LIMITED", + "Chartered Accountants," + ], + "page_index": { + "pl": [ + 32, + 33, + 34, + 38, + 41, + 46, + 47, + 48, + 50 + ], + "directors_report": [ + 19, + 32 + ], + "balance_sheet": [], + "shareholding": [], + "related_party": [ + 24, + 25, + 47, + 49, + 50 + ] + }, + "warnings": [ + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income" + ], + "directors_pl_identities": [ + "pbt = total_income - total_expenses" + ], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 32, + "directors_report": 19 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544332.json b/app/backend/primarydraft/data/companies/544332.json new file mode 100644 index 0000000000000000000000000000000000000000..ebe1873791781365624f71440173c3409f8503df --- /dev/null +++ b/app/backend/primarydraft/data/companies/544332.json @@ -0,0 +1,359 @@ +{ + "scrip_code": "544332", + "bse": { + "scrip_name": "Fabtech Technologies Cleanrooms Ltd", + "issuer_name": "FABTECH TECHNOLOGIES CLEANROOMS LIMITED", + "group": "MT", + "segment": "Equity", + "isin": "INE0HSD01011", + "face_value": "10.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Capital Goods", + "market_cap": "474.30", + "eps_reported": "7.35", + "pe_reported": "52.38", + "security_id": "FABCLEAN" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/cfa57826-70e9-4909-b420-a6c8d676a837.pdf", + "authorised_at": "2025-09-02T17:27:51.063", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544332_2025.pdf", + "available_years": [ + "2025" + ] + }, + "extraction": { + "scrip_code": "544332", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544332_2025.pdf", + "pages": 130, + "cin": "L74999MH2015PLC265137", + "isin": null, + "company_name": "Fabtech Technologies Cleanrooms Limited", + "emails": [ + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "quote@fabtechnologies.com", + "rhs@csdakamat.com", + "secretarial@fabtechnologies.com" + ], + "dins": [ + "00156111", + "02718019", + "05216025", + "08532321" + ], + "audited_pl": {}, + "directors_pl": { + "total_income": { + "current": { + "field": "total_income", + "value": 1400489000.0, + "page": 33, + "line": "Total Revenue 14,004.89 8,313.42 15,089.96 9,799.26", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 831342000.0, + "page": 33, + "line": "Total Revenue 14,004.89 8,313.42 15,089.96 9,799.26", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 1242704000.0, + "page": 33, + "line": "Total Expenditure 12,427.04 7,585.22 13,501.31 9,053.68", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 758522000.0, + "page": 33, + "line": "Total Expenditure 12,427.04 7,585.22 13,501.31 9,053.68", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 157785000.0, + "page": 33, + "line": "Profit/(Loss) before Tax 1,577.85 728.20 1,588.65 745.58", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 72820000.0, + "page": 33, + "line": "Profit/(Loss) before Tax 1,577.85 728.20 1,588.65 745.58", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 40000000.0, + "page": 33, + "line": "Current Tax 400.00 180.00 400.00 180.00", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 18000000.0, + "page": 33, + "line": "Current Tax 400.00 180.00 400.00 180.00", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": -1325000.0, + "page": 33, + "line": "Deferred Tax (13.25) (21.41) (13.25) (21.41)", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": -2141000.0, + "page": 33, + "line": "Deferred Tax (13.25) (21.41) (13.25) (21.41)", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 120418000.0, + "page": 33, + "line": "Profit/(Loss) after Tax 1,204.18 526.14 1329.56 556.61", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pat", + "value": 52614000.0, + "page": 33, + "line": "Profit/(Loss) after Tax 1,204.18 526.14 1329.56 556.61", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 12.35, + "page": 33, + "line": "Basic 12.35 6.30 13.64 6.66", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "eps_basic", + "value": 6.3, + "page": 33, + "line": "Basic 12.35 6.30 13.64 6.66", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 12.35, + "page": 33, + "line": "Diluted 12.35 6.30 13.64 6.66", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "eps_diluted", + "value": 6.3, + "page": 33, + "line": "Diluted 12.35 6.30 13.64 6.66", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "", + "amount": 2.0, + "page": 17, + "line": "2. To Consider and approve appointment of Mr. Chirag Himatlal Doshi (DIN: 08532321) as a Director of the Company, who retires by" + }, + { + "label": "", + "amount": 4.0, + "page": 17, + "line": "4. To ratify the Remuneration of Cost Auditors for Financial Year 2025-26" + }, + { + "label": "", + "amount": 103886.0, + "page": 17, + "line": "103886), appointed by the Board of Directors of the Company, to conduct the audit of cost records of the Company for the financial" + }, + { + "label": "", + "amount": 1.0, + "page": 17, + "line": "1 Fabtech Technologies Limited Sale / Purchase of Goods & Services Rs. 25.00" + }, + { + "label": "", + "amount": 1.0, + "page": 18, + "line": "1 Sale / Purchase of Goods & Services Rs. 50.00" + }, + { + "label": "", + "amount": 15.0, + "page": 26, + "line": "15th AGM of the Company to be held in the year 2030, at a remuneration as may be mutually agreed between the Board and the Statutory" + }, + { + "label": "services across multiple sectors. At the meeting of the Audit Committee and the Board of Directors held on Aug", + "amount": 29.0, + "page": 26, + "line": "services across multiple sectors. At the meeting of the Audit Committee and the Board of Directors held on August 29, 2024, the firm was" + }, + { + "label": "To ratify the Remuneration of Cost Auditors for Financial Year", + "amount": 2025.0, + "page": 26, + "line": "To ratify the Remuneration of Cost Auditors for Financial Year 2025-26" + }, + { + "label": "Upon recommendation of the Audit Committee, the Board of Directors of the Company in its meeting held on May", + "amount": 8.0, + "page": 26, + "line": "Upon recommendation of the Audit Committee, the Board of Directors of the Company in its meeting held on May 8, 2025, has, based" + }, + { + "label": "of Directors of the Company have approved a remuneration of Rs.", + "amount": 154000.0, + "page": 26, + "line": "of Directors of the Company have approved a remuneration of Rs. 1,54,000/-(Rupees One Lakh Fifty Four thousand) plus Taxes at the" + }, + { + "label": "Act read with the Companies (Audit and Auditors) Rules,", + "amount": 2014.0, + "page": 26, + "line": "Act read with the Companies (Audit and Auditors) Rules, 2014, the remuneration payable to the Cost Auditors is required to be ratified by" + }, + { + "label": "", + "amount": 4.0, + "page": 26, + "line": "4 of the Notice for ratification of the remuneration payable to the Cost Auditors for the financial year ending March 31, 2026." + } + ], + "auditors": [ + "Chartered Accountants", + "Financial Reporting issued by the Institute of Chartered Accountants of India.", + "He is a Bachelor of Commerce and a Fellow Chartered Accountant (FCA) from the", + "He was the President Bombay Chartered Accountants Society (2023 -24)." + ], + "page_index": { + "pl": [ + 62, + 63, + 72, + 75, + 76, + 78, + 89, + 93, + 96, + 98, + 104, + 107, + 108, + 109, + 111, + 122, + 126 + ], + "directors_report": [ + 33, + 62, + 98 + ], + "balance_sheet": [ + 62, + 96 + ], + "shareholding": [], + "related_party": [ + 17, + 18, + 26, + 27, + 28, + 29, + 42, + 43, + 50, + 90, + 91, + 92, + 93, + 123, + 124, + 125, + 126 + ] + }, + "warnings": [ + "Statement of Profit and Loss: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "audited P&L not machine-readable in this filing", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [], + "directors_pl_identities": [ + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 78, + "directors_report": 33 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544335.json b/app/backend/primarydraft/data/companies/544335.json new file mode 100644 index 0000000000000000000000000000000000000000..e949366ed819695ae623c8a349ab43fda1ef85d9 --- /dev/null +++ b/app/backend/primarydraft/data/companies/544335.json @@ -0,0 +1,454 @@ +{ + "scrip_code": "544335", + "bse": { + "scrip_name": "B.R.Goyal Infrastructure Ltd", + "issuer_name": "B.R.GOYAL INFRASTRUCTURE LIMITED", + "group": "MT", + "segment": "Equity", + "isin": "INE00ST01011", + "face_value": "10.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Construction", + "market_cap": "425.87", + "eps_reported": "18.77", + "pe_reported": "9.52", + "security_id": "BRGIL" + }, + "annual_report": { + "year": "2026", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/1e504d16-d491-403f-8dba-5b2fd9e027c2.pdf", + "authorised_at": "2026-08-04T17:06:24.527", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544335_2026.pdf", + "available_years": [ + "2026", + "2025" + ] + }, + "extraction": { + "scrip_code": "544335", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544335_2026.pdf", + "pages": 170, + "cin": "L04520MP2005PLC017479", + "isin": "INE00ST01011", + "company_name": "B.R.Goyal Infrastructure Limited", + "emails": [ + "abmsofficial1@gmail.com", + "caamanjindal.co@gmail.com", + "cs@brginfra.in", + "csankitjoshi0811@gmail.com", + "dvjasso@dvjasso.com", + "enotices@in.mpms.mufg.com" + ], + "dins": [ + "00012164", + "00012185", + "08216033", + "08984343" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 8114980000.0, + "page": 80, + "line": "Revenue from operations 21 81,149.80 50,155.46", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 5015546000.0, + "page": 80, + "line": "Revenue from operations 21 81,149.80 50,155.46", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 41488000.0, + "page": 80, + "line": "Other income 22 414.88 527.09", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 52709000.0, + "page": 80, + "line": "Other income 22 414.88 527.09", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 8156467999.999999, + "page": 80, + "line": "Total Income (a) 81,564.68 50,682.55", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 5068255000.0, + "page": 80, + "line": "Total Income (a) 81,564.68 50,682.55", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 967786000.0, + "page": 80, + "line": "Cost of raw materials and components consumed 23 9,677.86 10,025.05", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "cost_of_materials", + "value": 1002504999.9999999, + "page": 80, + "line": "Cost of raw materials and components consumed 23 9,677.86 10,025.05", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 308720000.0, + "page": 80, + "line": "Employee benefit expenses 25 3,087.20 2,083.76", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "employee_benefits", + "value": 208376000.00000003, + "page": 80, + "line": "Employee benefit expenses 25 3,087.20 2,083.76", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 77358000.0, + "page": 80, + "line": "Depreciation and amortization expenses 26 773.58 538.98", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 53898000.0, + "page": 80, + "line": "Depreciation and amortization expenses 26 773.58 538.98", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 87079000.0, + "page": 80, + "line": "Finance costs 27 870.79 716.69", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 71669000.0, + "page": 80, + "line": "Finance costs 27 870.79 716.69", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 6567812000.0, + "page": 80, + "line": "Operating and other expenses 28 65,678.12 37,765.22", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_expenses", + "value": 3776522000.0, + "page": 80, + "line": "Operating and other expenses 28 65,678.12 37,765.22", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 7532150000.0, + "page": 80, + "line": "Total expenses (b) 75,321.50 47,317.42", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 4731742000.0, + "page": 80, + "line": "Total expenses (b) 75,321.50 47,317.42", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 157551000.0, + "page": 80, + "line": "Current tax 1,575.51 832.92", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 83292000.0, + "page": 80, + "line": "Current tax 1,575.51 832.92", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 19665000.0, + "page": 80, + "line": "Deferred tax 196.65 25.11", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": 2511000.0, + "page": 80, + "line": "Deferred tax 196.65 25.11", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_total": { + "current": { + "field": "tax_total", + "value": 177216000.0, + "page": 80, + "line": "Total tax expenses 1,772.16 858.04", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_total", + "value": 85804000.0, + "page": 80, + "line": "Total tax expenses 1,772.16 858.04", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 447103000.0, + "page": 80, + "line": "Profit after tax for the year 4,471.03 2,507.10", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pat", + "value": 250710000.0, + "page": 80, + "line": "Profit after tax for the year 4,471.03 2,507.10", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 23.81, + "page": 80, + "line": "Basic (in Rs.) 30 23.81 13.35", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "eps_basic", + "value": 13.35, + "page": 80, + "line": "Basic (in Rs.) 30 23.81 13.35", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 23.81, + "page": 80, + "line": "Diluted (in Rs.) 23.81 13.35", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "eps_diluted", + "value": 13.35, + "page": 80, + "line": "Diluted (in Rs.) 23.81 13.35", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + } + }, + "directors_pl": {}, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "", + "amount": 9.0, + "page": 17, + "line": "9. PUBLIC DEPOSITS: The details of transactions of Loans and" + }, + { + "label": "", + "amount": 2025.0, + "page": 17, + "line": "2025-26. from its Directors and their Relatives that" + }, + { + "label": "", + "amount": 5.0, + "page": 23, + "line": "5. Reviewing, with the management, 9. Scrutiny of inter-corporate loans and" + }, + { + "label": "", + "amount": 21.0, + "page": 24, + "line": "21. To review the functioning of the of remuneration of the chief internal" + } + ], + "auditors": [ + "A B M S & Associates, Chartered Accountants", + "Aman Jindal & Co., Chartered Accountants", + "Associates, Chartered Accountants,", + "Chartered Accountants" + ], + "page_index": { + "pl": [ + 4, + 80, + 83, + 84, + 86, + 87, + 98, + 120, + 124, + 125, + 127, + 128, + 140 + ], + "directors_report": [ + 4, + 6, + 14, + 15, + 30, + 36, + 51, + 111 + ], + "balance_sheet": [ + 66, + 110 + ], + "shareholding": [], + "related_party": [ + 17, + 23, + 24, + 31, + 32, + 43, + 44, + 100, + 102, + 103, + 104, + 105, + 106, + 141, + 143, + 144, + 145, + 146, + 147 + ] + }, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 80, + "directors_report": 15 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544369.json b/app/backend/primarydraft/data/companies/544369.json new file mode 100644 index 0000000000000000000000000000000000000000..a5ca54295fa4d8dab338039d49e2776feedfafc5 --- /dev/null +++ b/app/backend/primarydraft/data/companies/544369.json @@ -0,0 +1,224 @@ +{ + "scrip_code": "544369", + "bse": { + "scrip_name": "Beezaasan Explotech Ltd", + "issuer_name": "Beezaasan Explotech Limited", + "group": "MT", + "segment": "Equity", + "isin": "INE13VU01016", + "face_value": "10.00", + "industry": "", + "sector": "Commodities", + "industry_new": "Chemicals", + "market_cap": "616.68", + "eps_reported": "7.79", + "pe_reported": "52.25", + "security_id": "BEEZAASAN" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/c6be74a8-bd2b-4666-9537-ad526b0622da.pdf", + "authorised_at": "2025-09-04T14:49:42.063", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544369_2025.pdf", + "available_years": [ + "2025" + ] + }, + "extraction": { + "scrip_code": "544369", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544369_2025.pdf", + "pages": 55, + "cin": "L24111GJ2013PLC076499", + "isin": null, + "company_name": "At Beezaasan Explotech Limited", + "emails": [ + "evoting@nsdl.co.in", + "helpdesk.evoting@cdslindia.com", + "investors@beezaasan.in" + ], + "dins": [ + "01766897", + "01782793", + "09652308", + "10440137", + "10442935", + "10519814", + "10788856" + ], + "audited_pl": {}, + "directors_pl": {}, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "", + "amount": 14.0, + "page": 21, + "line": "14. REMUNERATION TO KEY MANAGERIAL 18. POLICY REVIEW: FORM NO. AOC -2" + }, + { + "label": "Fixed Remuneration Annual Allowances or modification or replacement or reenactment of to in sub section", + "amount": -1.0, + "page": 21, + "line": "Fixed Remuneration Annual Allowances or modification or replacement or reenactment of to in sub section (1) of section 188 of the Companies Act, 2013 including certain arm\u2019s length" + }, + { + "label": "The Board of Directors shall comprise of Directors All contracts/arrangements entered into by the Company with", + "amount": -1.0, + "page": 21, + "line": "The Board of Directors shall comprise of Directors All contracts/arrangements entered into by the Company with related parties referred to in sub-section (1) of" + }, + { + "label": "having expertise in different areas / fields like Section", + "amount": 188.0, + "page": 21, + "line": "having expertise in different areas / fields like Section 188 of the Companies Act, 2013 are at arms\u2019 length basis." + }, + { + "label": "financial management expertise and at least one \u2022 Director should possess the highest personal", + "amount": -18.0, + "page": 21, + "line": "financial management expertise and at least one \u2022 Director should possess the highest personal -18) transactions including the" + }, + { + "label": "Rajan Enterprise Firm in which Purchase of", + "amount": 1.0, + "page": 21, + "line": "Rajan Enterprise Firm in which Purchase of 1st April, 2024 to 2,58,17.215 N.A. NIL" + }, + { + "label": "\u2022 Director must be willing to devote sufficient Directors are Goods", + "amount": 31.0, + "page": 21, + "line": "\u2022 Director must be willing to devote sufficient Directors are Goods 31st March, 2025" + }, + { + "label": "", + "amount": 1.0, + "page": 21, + "line": "16. EVALUATION: time and energy in carrying out their Duties partners Sale of Goods 1st April, 2024 to 23,08,71.176 N.A. NIL" + }, + { + "label": "performance of every Director. The Committee Payment of", + "amount": 1.0, + "page": 21, + "line": "performance of every Director. The Committee Payment of 1st April, 2024 to 1,17,29.051 N.A. NIL" + }, + { + "label": "INDEPENDENT DIRECTOR: Contracts /", + "amount": 31.0, + "page": 21, + "line": "INDEPENDENT DIRECTOR: Contracts / 31st March, 2025" + }, + { + "label": "Board and the Committee time to time. Asawara Subsidiary Purchase of", + "amount": 1.0, + "page": 21, + "line": "Board and the Committee time to time. Asawara Subsidiary Purchase of 1st April, 2024 to 12,31,77.167 N.A. NIL" + }, + { + "label": "", + "amount": 1.0, + "page": 21, + "line": "17. REMOVAL & RETIREMENT: Term/Tenure of the Independent Directors, Key (Formerly known Receipt of 1st April, 2024 to 1.770 N.A. NIL" + }, + { + "label": "", + "amount": 1.0, + "page": 39, + "line": "1. Sh. Sunil Kumar Somani- Wholetime Director" + }, + { + "label": "", + "amount": 2.0, + "page": 39, + "line": "2. Sh. Navneet Kumar Somani- Managing Director" + }, + { + "label": "", + "amount": 3.0, + "page": 39, + "line": "3. Shri Rajan Somani- Director" + }, + { + "label": "", + "amount": 1.0, + "page": 39, + "line": "1. Smt. Pushpa Ben Maheshwari- Director Mother" + }, + { + "label": "", + "amount": 2.0, + "page": 39, + "line": "2. Komal Ben S. Somani- Director Wife" + }, + { + "label": "", + "amount": 3.0, + "page": 39, + "line": "3. Manisha Ben N. Somani-Director Wife" + }, + { + "label": "Unsecured Loan Taken", + "amount": 33200.0, + "page": 39, + "line": "Unsecured Loan Taken 0.00 33200.000 0.00 0.00 0.00 33200.000 Cr 20420.052 Cr 0.00 (vi) The Company has not advanced or loaned or invested funds to any other person(s) or entity (ie" + }, + { + "label": "Unsecured Loan Paid", + "amount": 0.0, + "page": 39, + "line": "Unsecured Loan Paid 0.00 0.00 28890.000 0.00 0.00 0.00 0.00 0.00 foreign entities (Intermediaries) with the understanding that the Intermediary shall:" + } + ], + "auditors": [ + "CHARTERED ACCOUNTANTS (Formerly known as Beezaasan Explotech Pvt Ltd.)", + "Chartered Accountants", + "INVENTORIES [13] 255864.822 199505.544 CHARTERED ACCOUNTANTS (Formerly known as Beezaasan Explotech Pvt Ltd.)", + "M/s. PSV Jain & Associates, Chartered Accountants employees of the Company." + ], + "page_index": { + "pl": [ + 10, + 25, + 36, + 40, + 41, + 42, + 51, + 53 + ], + "directors_report": [ + 6, + 14, + 19, + 25, + 41 + ], + "balance_sheet": [ + 25, + 41 + ], + "shareholding": [], + "related_party": [ + 21, + 39, + 53 + ] + }, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "audited P&L not machine-readable in this filing", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [], + "directors_pl_identities": [], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 0, + "directors_report": 14 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544406.json b/app/backend/primarydraft/data/companies/544406.json new file mode 100644 index 0000000000000000000000000000000000000000..b61b1e1f38250b647a7e1b811613a4a747550998 --- /dev/null +++ b/app/backend/primarydraft/data/companies/544406.json @@ -0,0 +1,579 @@ +{ + "scrip_code": "544406", + "bse": { + "scrip_name": "Unified Data Tech Solutions Ltd", + "issuer_name": "UNIFIED DATA TECH SOLUTIONS LIMITED", + "group": "M", + "segment": "Equity", + "isin": "INE1ABX01018", + "face_value": "10.00", + "industry": "", + "sector": "Information Technology", + "industry_new": "Information Technology", + "market_cap": "792.76", + "eps_reported": "20.28", + "pe_reported": "19.46", + "security_id": "UNIFIED" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/f517193b-3e8a-4ed9-96ae-dac4f67e7eda.pdf", + "authorised_at": "2025-09-06T11:21:45.997", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544406_2025.pdf", + "available_years": [ + "2025" + ] + }, + "extraction": { + "scrip_code": "544406", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544406_2025.pdf", + "pages": 46, + "cin": "L51900MH2010PLC202878", + "isin": null, + "company_name": "Formerly Known As Unified Data-Tech Solutions Private Limited", + "emails": [ + "cs@udtechs.com", + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "info@udtechs.com" + ], + "dins": [ + "02972140", + "06849561", + "07897279", + "08760434", + "10484767", + "10810194" + ], + "audited_pl": {}, + "directors_pl": { + "total_income": { + "current": { + "field": "total_income", + "value": 229514400000.0, + "page": 14, + "line": "earned a total income of \u20b9 22,951.44 lakhs, compared future business operations, the Board of Directors", + "scale": 10000000.0, + "section": "directors_report", + "basis": null + } + }, + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 220260000000.0, + "page": 14, + "line": "Revenue from operations 22,026.00 26,037.87 to enhance the Company\u2019s visibility, strengthen its Company has not called for Buy back of Shares during", + "scale": 10000000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 260378700000.0, + "page": 14, + "line": "Revenue from operations 22,026.00 26,037.87 to enhance the Company\u2019s visibility, strengthen its Company has not called for Buy back of Shares during", + "scale": 10000000.0, + "section": "directors_report", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 9254400000.0, + "page": 14, + "line": "Other Income 925.44 642.46 governance structure, and improve access to capital the current financial year.", + "scale": 10000000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 6424600000.0, + "page": 14, + "line": "Other Income 925.44 642.46 governance structure, and improve access to capital the current financial year.", + "scale": 10000000.0, + "section": "directors_report", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 503200000.0, + "page": 14, + "line": "Less: Depreciation 50.32 63.46 Except for the above, there have been no other", + "scale": 10000000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 634600000.0, + "page": 14, + "line": "Less: Depreciation 50.32 63.46 Except for the above, there have been no other", + "scale": 10000000.0, + "section": "directors_report", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": -337200000.0, + "page": 14, + "line": "Less: Provision for Deferred Tax (33.72) 5.71 to develop cloud-native applications, data analytics,", + "scale": 10000000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": 57100000.0, + "page": 14, + "line": "Less: Provision for Deferred Tax (33.72) 5.71 to develop cloud-native applications, data analytics,", + "scale": 10000000.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": { + "share_capital": { + "current": { + "field": "share_capital", + "value": 200901000.0, + "page": 32, + "line": "(a) Share Capital 2 2,009.01 5.01 Total Income 22,951.44 26,680.33", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "share_capital", + "value": 501000.0, + "page": 32, + "line": "(a) Share Capital 2 2,009.01 5.01 Total Income 22,951.44 26,680.33", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "reserves_surplus": { + "current": { + "field": "reserves_surplus", + "value": 778027000.0, + "page": 32, + "line": "(b) Reserves and Surplus 3 7,780.27 6,376.70 Expenses:", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "reserves_surplus", + "value": 637670000.0, + "page": 32, + "line": "(b) Reserves and Surplus 3 7,780.27 6,376.70 Expenses:", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "deferred_tax_liability": { + "current": { + "field": "deferred_tax_liability", + "value": 94473000.0, + "page": 32, + "line": "(b) Deferred tax liabilities (Net) - - Employee Benefit Expense 19 944.73 1,602.76", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "deferred_tax_liability", + "value": 160276000.0, + "page": 32, + "line": "(b) Deferred tax liabilities (Net) - - Employee Benefit Expense 19 944.73 1,602.76", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "borrowings_current": { + "current": { + "field": "borrowings_current", + "value": 40899000.0, + "page": 32, + "line": "(a) Short-term borrowings - - Other Expenses 22 408.99 309.93", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "borrowings_current", + "value": 30993000.0, + "page": 32, + "line": "(a) Short-term borrowings - - Other Expenses 22 408.99 309.93", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "trade_payables": { + "current": { + "field": "trade_payables", + "value": 1847674000.0000002, + "page": 32, + "line": "(b) Trade payables 4 Total Expenses 18476.74 23313.61", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "trade_payables", + "value": 2331361000.0, + "page": 32, + "line": "(b) Trade payables 4 Total Expenses 18476.74 23313.61", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "other_current_liabilities": { + "current": { + "field": "other_current_liabilities", + "value": 24429000.0, + "page": 32, + "line": "(c) Other current liabilities 5 244.29 223.69 Tax Expense:", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "other_current_liabilities", + "value": 22369000.0, + "page": 32, + "line": "(c) Other current liabilities 5 244.29 223.69 Tax Expense:", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "short_term_provisions": { + "current": { + "field": "short_term_provisions", + "value": 56000.00000000001, + "page": 32, + "line": "(d) Short Term Provisions 6 0.56 8.48 Current tax 1,092.26 858.52", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "short_term_provisions", + "value": 848000.0, + "page": 32, + "line": "(d) Short Term Provisions 6 0.56 8.48 Current tax 1,092.26 858.52", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "total_equity_liabilities": { + "current": { + "field": "total_equity_liabilities", + "value": 1463210000.0, + "page": 32, + "line": "Total 14,632.10 7,815.81 Deferred tax for current year 3.38 5.71", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "total_equity_liabilities", + "value": 781581000.0, + "page": 32, + "line": "Total 14,632.10 7,815.81 Deferred tax for current year 3.38 5.71", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "ppe": { + "current": { + "field": "ppe", + "value": -1000.0, + "page": 32, + "line": "(a) Fixed assets Prior Period Adjustments - 0.01", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "non_current_investments": { + "current": { + "field": "non_current_investments", + "value": 345659000.0, + "page": 32, + "line": "(b) Non-Current Investments 8 3,456.59 2,204.54", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "non_current_investments", + "value": 220454000.0, + "page": 32, + "line": "(b) Non-Current Investments 8 3,456.59 2,204.54", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "current_investments": { + "current": { + "field": "current_investments", + "value": 854448000.0, + "page": 32, + "line": "(a) Current Investments 11 8,544.48 3,965.24 Basic 16.96 0.00", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "current_investments", + "value": 396524000.0, + "page": 32, + "line": "(a) Current Investments 11 8,544.48 3,965.24 Basic 16.96 0.00", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "inventories": { + "current": { + "field": "inventories", + "value": 1696000.0, + "page": 32, + "line": "(b) Inventories 12 - - Diluted 16.96 0.00", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "inventories", + "value": 0.0, + "page": 32, + "line": "(b) Inventories 12 - - Diluted 16.96 0.00", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "trade_receivables": { + "current": { + "field": "trade_receivables", + "value": 207133000.0, + "page": 32, + "line": "(c) Trade receivables 13 2,071.33 806.22", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "trade_receivables", + "value": 80622000.0, + "page": 32, + "line": "(c) Trade receivables 13 2,071.33 806.22", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "cash_and_equivalents": { + "current": { + "field": "cash_and_equivalents", + "value": 12290000.0, + "page": 32, + "line": "(d) Cash and cash equivalents 14 122.90 349.29", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "cash_and_equivalents", + "value": 34929000.0, + "page": 32, + "line": "(d) Cash and cash equivalents 14 122.90 349.29", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "total_assets": { + "current": { + "field": "total_assets", + "value": 1463210000.0, + "page": 32, + "line": "Total 14,632.10 7,815.81", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "total_assets", + "value": 781581000.0, + "page": 32, + "line": "Total 14,632.10 7,815.81", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + } + }, + "shareholding": [ + { + "label": "Note", + "numbers": [ + 2.4, + 4.2 + ], + "percent": 4.2, + "page": 36, + "line": "Note 2.4 : Details of Shareholding of Promoters and % Change during the year Note 4.2 - There are no reported cases of dues to Micro, Small and Medium Enterprises for more than" + }, + { + "label": "Shares held by the Promoter at the end of the year % change", + "numbers": [ + 45.0 + ], + "percent": 45.0, + "page": 36, + "line": "Shares held by the Promoter at the end of the year % change 45 days and hence no provision of interest has been made in the current year. The same is based on the" + } + ], + "related_party": [ + { + "label": "its promoters/directors/ subsidiaries either by SEBI or by FCS:", + "amount": 4372.0, + "page": 21, + "line": "its promoters/directors/ subsidiaries either by SEBI or by FCS: 4372/ CP: 7197" + }, + { + "label": "Mr. Rajendra Mehta Director as on Date", + "amount": 2025.0, + "page": 43, + "line": "Mr. Rajendra Mehta Director as on Date 31.03.2025 31.03.2024" + }, + { + "label": "Mr. Hiren Mehta Directors Remuneration", + "amount": 280.6, + "page": 43, + "line": "Mr. Hiren Mehta Directors Remuneration 280.60 421.76" + }, + { + "label": "Mr. Rajendra Mehta Directors Remuneration", + "amount": 139.57, + "page": 43, + "line": "Mr. Rajendra Mehta Directors Remuneration 139.57 374.43 Medical and Health \u2013 Rs" + }, + { + "label": "Mrs. Harsha Mehta Directors Remuneration", + "amount": 126.48, + "page": 43, + "line": "Mrs. Harsha Mehta Directors Remuneration 126.48 359.22" + }, + { + "label": "Mrs. Annapurna Devendra Dubey Director Sitting Fees", + "amount": 0.75, + "page": 43, + "line": "Mrs. Annapurna Devendra Dubey Director Sitting Fees 0.75 - Any movements in provision made ? NA NA" + }, + { + "label": "Mr. Mayank Modi Director Sitting Fees", + "amount": 0.75, + "page": 43, + "line": "Mr. Mayank Modi Director Sitting Fees 0.75 -" + }, + { + "label": "Mr. Shrawan Shrikrishna Shukla Salary", + "amount": 4.09, + "page": 43, + "line": "Mr. Shrawan Shrikrishna Shukla Salary 4.09 -" + }, + { + "label": "Mrs Khadija Taher Raniwala Salary", + "amount": 1.53, + "page": 43, + "line": "Mrs Khadija Taher Raniwala Salary 1.53 -" + }, + { + "label": "Note", + "amount": 1.0, + "page": 43, + "line": "Note 1:- Mrs. Harsha Mehta Resigned as a Director wef 30th November 2024." + }, + { + "label": "Mr. Hiren Mehta Directors Remuneration", + "amount": -3.08, + "page": 43, + "line": "Mr. Hiren Mehta Directors Remuneration - 3.08" + } + ], + "auditors": [ + "& Co., Chartered Accountants, (Firm Registration No. lays down a framework in relation to remuneration", + "Chartered Accountants", + "Chartered Accountants Mr. Hiren Mehta Mr. Chetan Mundhada", + "Decrease/(Increase) in Short-term provisions (7.92) - Chartered Accountants" + ], + "page_index": { + "pl": [ + 8, + 27, + 32, + 34, + 41, + 42 + ], + "directors_report": [ + 14, + 25, + 27 + ], + "balance_sheet": [ + 27, + 32, + 35, + 36, + 37, + 38, + 39, + 40 + ], + "shareholding": [ + 36 + ], + "related_party": [ + 21, + 43 + ] + }, + "warnings": [ + "Statement of Profit and Loss: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "audited P&L not machine-readable in this filing" + ], + "audited_pl_identities": [], + "directors_pl_identities": [ + "total_income = revenue + other_income" + ], + "balance_sheet_identities": [ + "total assets = total equity and liabilities" + ], + "statement_pages": { + "audited_pl": 32, + "directors_report": 14 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544434.json b/app/backend/primarydraft/data/companies/544434.json new file mode 100644 index 0000000000000000000000000000000000000000..0d294afc3556aa270cdd78a62f42170988ccc35b --- /dev/null +++ b/app/backend/primarydraft/data/companies/544434.json @@ -0,0 +1,582 @@ +{ + "scrip_code": "544434", + "bse": { + "scrip_name": "Neetu Yoshi Ltd", + "issuer_name": "Neetu Yoshi Limited", + "group": "MT", + "segment": "Equity", + "isin": "INE0UZO01024", + "face_value": "5.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Capital Goods", + "market_cap": "634.97", + "eps_reported": "6.45", + "pe_reported": "25.36", + "security_id": "NEETUYOSHI" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/963c5b99-ef84-402e-9050-dace3d27e443.pdf", + "authorised_at": "2025-09-09T22:53:55.167", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544434_2025.pdf", + "available_years": [ + "2025" + ] + }, + "extraction": { + "scrip_code": "544434", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544434_2025.pdf", + "pages": 94, + "cin": "U35999UR2020PLC010670", + "isin": "INE0UZO01024", + "company_name": "For And On Behalf Of Neetu Yoshi Limited", + "emails": [ + "contact@csravi.in", + "contact@neetuyoshi.com", + "evoting@cdslindia.com", + "evoting@nsdl.co.in", + "grievances@skylinerta.com", + "helpdesk.evoting@cdslindia.com" + ], + "dins": [ + "08564450", + "08564451" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 705912000.0, + "page": 71, + "line": "Revenue from Operations 23 7,059.12 4,733.42 2024-25 2023-24", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "revenue_from_operations", + "value": 473342000.0, + "page": 71, + "line": "Revenue from Operations 23 7,059.12 4,733.42 2024-25 2023-24", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 2181000.0, + "page": 71, + "line": "Other Income 24 21.81 11.94", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "other_income", + "value": 1194000.0, + "page": 71, + "line": "Other Income 24 21.81 11.94", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 708093000.0, + "page": 71, + "line": "Total Income 7,080.93 4,745.36", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "total_income", + "value": 474535999.99999994, + "page": 71, + "line": "Total Income 7,080.93 4,745.36", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 201788000.0, + "page": 71, + "line": "EXPENSES Net profit before tax 2,017.88 1,518.51", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "pbt", + "value": 151851000.0, + "page": 71, + "line": "EXPENSES Net profit before tax 2,017.88 1,518.51", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 379005000.0, + "page": 71, + "line": "Cost of Materials Consumed 25 3,790.05 2,672.80", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "cost_of_materials", + "value": 267280000.00000003, + "page": 71, + "line": "Cost of Materials Consumed 25 3,790.05 2,672.80", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 37570000.0, + "page": 71, + "line": "Employee Benefits Expense 28 375.70 167.67", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "employee_benefits", + "value": 16766999.999999998, + "page": 71, + "line": "Employee Benefits Expense 28 375.70 167.67", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 17348000.0, + "page": 71, + "line": "Finance Costs 29 173.48 120.23 Profit on Sale of property, Plant and Equipment - -", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "finance_costs", + "value": 12023000.0, + "page": 71, + "line": "Finance Costs 29 173.48 120.23 Profit on Sale of property, Plant and Equipment - -", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 15206000.0, + "page": 71, + "line": "Depreciation and Amortisation Expense 2 152.06 79.81 Loss on account of Fire - -", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "depreciation", + "value": 7981000.0, + "page": 71, + "line": "Depreciation and Amortisation Expense 2 152.06 79.81 Loss on account of Fire - -", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 98095000.0, + "page": 71, + "line": "Other Expenses 30 980.95 431.99", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "other_expenses", + "value": 43199000.0, + "page": 71, + "line": "Other Expenses 30 980.95 431.99", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 506305000.0, + "page": 71, + "line": "Total Expenses 5,063.05 3,226.85 Dividend Income - -", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "total_expenses", + "value": 322685000.0, + "page": 71, + "line": "Total Expenses 5,063.05 3,226.85 Dividend Income - -", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "pat": { + "current": { + "field": "pat", + "value": 164532000.0, + "page": 71, + "line": "Profit for the year 1,645.32 1,257.70 Liabilities no longer required written back - -", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "pat", + "value": 125770000.0, + "page": 71, + "line": "Profit for the year 1,645.32 1,257.70 Liabilities no longer required written back - -", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 5.84, + "page": 71, + "line": "Basic (in Rs) 5.84 7.39 Cash generated from operations 1301.17 988.33", + "scale": 1.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "eps_basic", + "value": 7.39, + "page": 71, + "line": "Basic (in Rs) 5.84 7.39 Cash generated from operations 1301.17 988.33", + "scale": 1.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 5.84, + "page": 71, + "line": "Diluted (in Rs) 5.84 7.39 Direct taxes paid (net) (73.31) (221.07)", + "scale": 1.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "eps_diluted", + "value": 7.39, + "page": 71, + "line": "Diluted (in Rs) 5.84 7.39 Direct taxes paid (net) (73.31) (221.07)", + "scale": 1.0, + "section": "audited_pl", + "basis": "consolidated" + } + } + }, + "directors_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 7019.89, + "page": 18, + "line": "Revenue from Operations 7019.89 4722.83 7059.12 4733.42", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 4722.83, + "page": 18, + "line": "Revenue from Operations 7019.89 4722.83 7059.12 4733.42", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 22.03, + "page": 18, + "line": "Website: www.neetuyoshi.com Other Income 22.03 11.94 21.81 11.94", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 11.94, + "page": 18, + "line": "Website: www.neetuyoshi.com Other Income 22.03 11.94 21.81 11.94", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 7041.92, + "page": 18, + "line": "Total Revenue 7041.92 4734.77 7080.93 4745.36", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 4734.77, + "page": 18, + "line": "Total Revenue 7041.92 4734.77 7080.93 4745.36", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 5037.43, + "page": 18, + "line": "Total Expenses 5037.43 3220.26 5063.05 3226.85", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 3220.26, + "page": 18, + "line": "Total Expenses 5037.43 3220.26 5063.05 3226.85", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 2004.49, + "page": 18, + "line": "Profit/(Loss) before tax from continued 2004.49 1514.51 2017.88 1518.51", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 1514.51, + "page": 18, + "line": "Profit/(Loss) before tax from continued 2004.49 1514.51 2017.88 1518.51", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 1635.42, + "page": 18, + "line": "Profit/(Loss) for the year 1635.42 1254.81 1645.32 1257.70", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pat", + "value": 1254.81, + "page": 18, + "line": "Profit/(Loss) for the year 1635.42 1254.81 1645.32 1257.70", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": {}, + "shareholding": [ + { + "label": "Indian Public and Corporate", + "numbers": [ + 0.01, + 1363800.0, + 4.78, + 4.77 + ], + "percent": 4.77, + "page": 30, + "line": "Indian Public and Corporate 400 0.01 1363800 4.78 4.77" + } + ], + "related_party": [ + { + "label": "", + "amount": 2014.0, + "page": 21, + "line": "2014 are given in Annexure-II to this Directors\u2019 Report." + }, + { + "label": "Operating Procedures (SOP). (fourteen) meetings of the Board of Directors were sub-regulation", + "amount": -2.0, + "page": 21, + "line": "Operating Procedures (SOP). (fourteen) meetings of the Board of Directors were sub-regulation (2) of regulation 46 and para C, D and E of Schedule V of SEBI (LODR) Regulations, 201" + }, + { + "label": "the Company. The main objectives of this policy are: Table: Number of meetings attended by each director", + "amount": 28.0, + "page": 21, + "line": "the Company. The main objectives of this policy are: Table: Number of meetings attended by each director 28. Particulars of Loans Given, Investment Made, Guarantees Given and Secur" + }, + { + "label": "", + "amount": -7.0, + "page": 21, + "line": "31, 2025 in Form MGT - 7 in accordance with Section 92(3) engaged in the manufacturing of customized products in different grades of ferrous metallurgical products. Further, the" + }, + { + "label": "Related Parties (Appointment and Remuneration of Managerial Personnel) Rules,", + "amount": 2014.0, + "page": 21, + "line": "Related Parties (Appointment and Remuneration of Managerial Personnel) Rules, 2014" + }, + { + "label": "The disclosure of particulars of contracts or Disclosures relating to remuneration and other details as requir", + "amount": -12.0, + "page": 21, + "line": "The disclosure of particulars of contracts or Disclosures relating to remuneration and other details as required under Section 197(12) of the Actread with Rule 5(1)" + }, + { + "label": "arrangements with Related Parties referred to in of the Companies (Appointment and Remuneration of Managerial ", + "amount": 2014.0, + "page": 21, + "line": "arrangements with Related Parties referred to in of the Companies (Appointment and Remuneration of Managerial Personnel) Rules, 2014 forms part of this Report.In" + }, + { + "label": "to in sub-section", + "amount": 188.0, + "page": 25, + "line": "to in sub-section (1) of section 188 of the Companies Act, 2013 including certain arm\u2019s length transactions under third Rule No. 9 of the Companies (Appointment and Remuneration" + }, + { + "label": "Add:", + "amount": 2.0, + "page": 25, + "line": "Add: 2/155, Jakhan, Rajpur road, Dehradun, Uttarakhand, India, 248001 stock exchange during the Audit Period) The Board of Directors of the Company is duly constituted" + }, + { + "label": "", + "amount": 4.0, + "page": 25, + "line": "4. The Depositories Act, 1996 and the Regulations and Bye- with proper balance of Executive Directors, Non-Executive" + } + ], + "auditors": [ + "(In times) Ratio (In times) Chartered Accountants", + "Chartered Accountants", + "Chartered Accountants EQUITY AND LIABILITIES", + "Chartered Accountants Neetu Yoshi Limited (Previously known as Neetu Yoshi" + ], + "page_index": { + "pl": [ + 31, + 32, + 37, + 40, + 41, + 44, + 45, + 46, + 54, + 55, + 61, + 67, + 68, + 71, + 74, + 81, + 82, + 88 + ], + "directors_report": [ + 3, + 10, + 18, + 31, + 67, + 68 + ], + "balance_sheet": [ + 31, + 67 + ], + "shareholding": [ + 30 + ], + "related_party": [ + 21, + 25, + 30, + 54, + 56, + 57, + 61, + 76, + 81, + 83, + 84, + 88 + ] + }, + "warnings": [ + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "directors_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 71, + "directors_report": 18 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544458.json b/app/backend/primarydraft/data/companies/544458.json new file mode 100644 index 0000000000000000000000000000000000000000..e8b9f63c6e1a6bd5b038f2d41a71f86895a951cd --- /dev/null +++ b/app/backend/primarydraft/data/companies/544458.json @@ -0,0 +1,476 @@ +{ + "scrip_code": "544458", + "bse": { + "scrip_name": "Shree Refrigerations Ltd", + "issuer_name": "SHREE REFRIGERATIONS LIMITED", + "group": "M", + "segment": "Equity", + "isin": "INE0FMZ01045", + "face_value": "2.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Capital Goods", + "market_cap": "1169.11", + "eps_reported": "6.01", + "pe_reported": "54.34", + "security_id": "SHREEREF" + }, + "annual_report": { + "year": "2026", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachLive/9ab8bbe0-03ce-4a22-affb-8491e8149456.pdf", + "authorised_at": "2026-08-08T12:37:21.833", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544458_2026.pdf", + "available_years": [ + "2026", + "2025" + ] + }, + "extraction": { + "scrip_code": "544458", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544458_2026.pdf", + "pages": 84, + "cin": "L29191PN2006PLC128377", + "isin": "INE0FMZ01045", + "company_name": "Bse Limited", + "emails": [ + "cs@shreeref.com", + "enotices@in.mpms", + "enotices@in.mpms.mufg", + "evoting@nsdl.co.in", + "insta.vote@linkintime.co.in", + "investor@shreeref.com" + ], + "dins": [ + "02028006", + "02028020", + "03339312", + "10581764", + "11546908" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 1535497000.0, + "page": 57, + "line": "I Revenue from operations 18 15,354.97 9,872.70", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "revenue_from_operations", + "value": 987270000.0000001, + "page": 57, + "line": "I Revenue from operations 18 15,354.97 9,872.70", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 15061000.000000002, + "page": 57, + "line": "II Other Income 19 150.61 36.43", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "other_income", + "value": 3643000.0, + "page": 57, + "line": "II Other Income 19 150.61 36.43", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 249938000.0, + "page": 57, + "line": "Net Profit before taxation 2,499.38 1,852.44", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "pbt", + "value": 185244000.0, + "page": 57, + "line": "Net Profit before taxation 2,499.38 1,852.44", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 1550558000.0, + "page": 57, + "line": "III Total Revenue (I +II) 15,505.58 9,909.13", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "total_income", + "value": 990912999.9999999, + "page": 57, + "line": "III Total Revenue (I +II) 15,505.58 9,909.13", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 852109000.0, + "page": 57, + "line": "Cost of materials consumed 20 8,521.09 6,140.04 Profit on Sale of Fixed Assets 0.36 -1.10", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "cost_of_materials", + "value": 614004000.0, + "page": 57, + "line": "Cost of materials consumed 20 8,521.09 6,140.04 Profit on Sale of Fixed Assets 0.36 -1.10", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 217373000.0, + "page": 57, + "line": "Employee benefit expense 22 2,173.73 1,379.17 Interest Paid 354.28 454.60", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "employee_benefits", + "value": 137917000.0, + "page": 57, + "line": "Employee benefit expense 22 2,173.73 1,379.17 Interest Paid 354.28 454.60", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 35428000.0, + "page": 57, + "line": "Finance costs 23 354.28 454.60 Dividend Received -1.68 -2.52", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "finance_costs", + "value": 45460000.0, + "page": 57, + "line": "Finance costs 23 354.28 454.60 Dividend Received -1.68 -2.52", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 57829000.0, + "page": 57, + "line": "Depreciation and amortization expense 24 578.29 424.18", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "depreciation", + "value": 42418000.0, + "page": 57, + "line": "Depreciation and amortization expense 24 578.29 424.18", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 123695000.0, + "page": 57, + "line": "Other expenses 25 1,236.95 765.48", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "other_expenses", + "value": 76548000.0, + "page": 57, + "line": "Other expenses 25 1,236.95 765.48", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 1300620000.0, + "page": 57, + "line": "Total Expenses 13,006.20 8,056.69", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "total_expenses", + "value": 805669000.0, + "page": 57, + "line": "Total Expenses 13,006.20 8,056.69", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 40316000.0, + "page": 57, + "line": "Current tax 403.16 553.91 (Increase)/ Decrease in Trade Receivables -1,026.66 -3,163.55", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "tax_current", + "value": 55391000.0, + "page": 57, + "line": "Current tax 403.16 553.91 (Increase)/ Decrease in Trade Receivables -1,026.66 -3,163.55", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": -9864000.0, + "page": 57, + "line": "Deferred tax -98.64 -55.71 -463.03 -438.38", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "tax_deferred", + "value": -5571000.0, + "page": 57, + "line": "Deferred tax -98.64 -55.71 -463.03 -438.38", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + }, + "tax_total": { + "current": { + "field": "tax_total", + "value": 34612000.0, + "page": 57, + "line": "Total Tax Expenses 346.12 591.06", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + }, + "previous": { + "field": "tax_total", + "value": 59105999.99999999, + "page": 57, + "line": "Total Tax Expenses 346.12 591.06", + "scale": 100000.0, + "section": "audited_pl", + "basis": "consolidated" + } + } + }, + "directors_pl": {}, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "during the last three years reckoned from the been given by the Board of Directors of the Company policies.", + "amount": 41.0, + "page": 28, + "line": "during the last three years reckoned from the been given by the Board of Directors of the Company policies. 41. Details of difference between amount of the valuation" + }, + { + "label": "(\u201cInternal Auditors Firm\u201d) as the Internal Auditors of the Prohibition and Redressal) Act,", + "amount": 2013.0, + "page": 28, + "line": "(\u201cInternal Auditors Firm\u201d) as the Internal Auditors of the Prohibition and Redressal) Act, 2013, during the year Policies/ Codes, business activities and current affairs" + }, + { + "label": "an arm\u2019s length basis. December", + "amount": 2025.0, + "page": 28, + "line": "an arm\u2019s length basis. December 2025, the Internal Auditors Firm has During the period under review, the following is is different from that prescribed in the applicable" + }, + { + "label": "of the Companies (Appointment and Remuneration", + "amount": 38.0, + "page": 28, + "line": "of the Companies (Appointment and Remuneration 38. Compliance with Maternity Benefit Act, 1961 prohibits the purchase or sale of Company shares" + }, + { + "label": "of Managerial Personnel) Rules,", + "amount": 2014.0, + "page": 28, + "line": "of Managerial Personnel) Rules, 2014 are attached as Pursuant to the provisions of the Section 148 read with by the Directors and the designated employees" + }, + { + "label": "employees in terms of remuneration drawn and their specified under Section", + "amount": 148.0, + "page": 28, + "line": "employees in terms of remuneration drawn and their specified under Section 148 of the Act is not applicable the regulators or courts or tribunal" + }, + { + "label": "f. The Company has not granted any loans or b. According to the information and explanations", + "amount": 9.0, + "page": 36, + "line": "f. The Company has not granted any loans or b. According to the information and explanations 9. In our opinion and according to the information and respect to applicable transactio" + }, + { + "label": "under clause", + "amount": 3.0, + "page": 36, + "line": "under clause 3(iii)(f) is not applicable. which have not been deposited as on 31st March, loans or other borrowings or in the payment of standards." + }, + { + "label": "", + "amount": 5.0, + "page": 36, + "line": "5. The Company has not accepted any deposit or amounts CGST and SGST July 17 Company Rs.8,49,592 for the purpose for which the loans were obtained the nature, timing and extent of " + }, + { + "label": "", + "amount": 18.0, + "page": 36, + "line": "20.02.2025 for 18/04/2025 utilised for long term purposes transactions with its Directors or persons connected" + }, + { + "label": "", + "amount": 6.0, + "page": 36, + "line": "6. The maintenance of cost records has not been ineligible ITC on with pre with its directors. and hence provisions of section 192" + }, + { + "label": "specified by the Central Government under sub- Rent-a-cab service deposit", + "amount": 10.0, + "page": 36, + "line": "specified by the Central Government under sub- Rent-a-cab service deposit 10% e. The company has not taken any funds from any of the Companies Act, 2013 are not applicable to the" + }, + { + "label": "f. The company has not raised loans during the year of India Act,", + "amount": 1934.0, + "page": 36, + "line": "f. The company has not raised loans during the year of India Act, 1934. Hence, reporting under clause" + }, + { + "label": "Employees\u2019 State Insurance, Income Tax, Sales Tax, explanations given to us and on the basis of our accordingl", + "amount": 3.0, + "page": 36, + "line": "Employees\u2019 State Insurance, Income Tax, Sales Tax, explanations given to us and on the basis of our accordingly reporting under clause 3(xvi)(d) of the" + }, + { + "label": "Insurance, Income Tax, Sales Tax, Service Tax, duty loans were applied for purpose for which those are", + "amount": 18.0, + "page": 36, + "line": "Insurance, Income Tax, Sales Tax, Service Tax, duty loans were applied for purpose for which those are 18. There has been no resignation of the statutory auditors" + }, + { + "label": "at", + "amount": 31.0, + "page": 36, + "line": "at 31st March, 2026 for a period of more than six b. The company has not made any preferential" + }, + { + "label": "Subject matter Period Present status Total demand in compliance with the requirement of section", + "amount": 42.0, + "page": 36, + "line": "Subject matter Period Present status Total demand in compliance with the requirement of section 42 knowledge of the Board of Directors and Management" + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants SHREE REFRIGERATIONS LIMITED", + "Chartered Accountants SHREE REFRIGERATIONS LIMITED Ms. Rucha Ravalnath Shende (DIN: 11546908), who", + "Chartered Accountants a. Long-term Borrowings 6 391.04 883.64" + ], + "page_index": { + "pl": [ + 34, + 41, + 43, + 50, + 53, + 57, + 59, + 60, + 61, + 69 + ], + "directors_report": [ + 24, + 34, + 54, + 76, + 78, + 79 + ], + "balance_sheet": [ + 34, + 53 + ], + "shareholding": [], + "related_party": [ + 28, + 34, + 36, + 53, + 54 + ] + }, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 57, + "directors_report": 24 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544498.json b/app/backend/primarydraft/data/companies/544498.json new file mode 100644 index 0000000000000000000000000000000000000000..03cb4473c37a081021819eef16a831f84862c287 --- /dev/null +++ b/app/backend/primarydraft/data/companies/544498.json @@ -0,0 +1,640 @@ +{ + "scrip_code": "544498", + "bse": { + "scrip_name": "Oval Projects Engineering Ltd", + "issuer_name": "OVAL PROJECTS ENGINEERING LIMITED", + "group": "M", + "segment": "Equity", + "isin": "INE0RTI01017", + "face_value": "10.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Construction", + "market_cap": "114.23", + "eps_reported": "7.33", + "pe_reported": "7.50", + "security_id": "OVAL" + }, + "annual_report": { + "year": "2025", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/bfc3b49e-80b9-42d6-b55e-ed6a731aad5c.pdf", + "authorised_at": "2025-12-08T18:08:56.413", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544498_2025.pdf", + "available_years": [ + "2025" + ] + }, + "extraction": { + "scrip_code": "544498", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544498_2025.pdf", + "pages": 152, + "cin": "L74900TR2013PLC008465", + "isin": null, + "company_name": "For Oval Projects Engineering Limited", + "emails": [ + "cs@ovalprojects.com", + "evoting@nsdl.co.in", + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com", + "investors@southwestpinnacle.com", + "kksandassociates@gmail.com" + ], + "dins": [ + "02155949", + "06923261", + "08502912", + "08968107", + "10697841" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 1022899000.0, + "page": 125, + "line": "Revenue from operations 17 10228.99 7796.54", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 779654000.0, + "page": 125, + "line": "Revenue from operations 17 10228.99 7796.54", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 11470000.0, + "page": 125, + "line": "Other income 18 114.70 102.07", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 10207000.0, + "page": 125, + "line": "Other income 18 114.70 102.07", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 1034368000.0, + "page": 125, + "line": "Total Revenue 10343.68 7898.61", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 789861000.0, + "page": 125, + "line": "Total Revenue 10343.68 7898.61", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 50789000.0, + "page": 125, + "line": "Employee benefits expense 21 507.89 422.50", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "employee_benefits", + "value": 42250000.0, + "page": 125, + "line": "Employee benefits expense 21 507.89 422.50", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 56565000.0, + "page": 125, + "line": "Finance costs 22 565.65 330.77", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 33077000.0, + "page": 125, + "line": "Finance costs 22 565.65 330.77", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 5575000.0, + "page": 125, + "line": "Depreciation and amortization expense 10 55.75 66.36", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 6636000.0, + "page": 125, + "line": "Depreciation and amortization expense 10 55.75 66.36", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 156087000.0, + "page": 125, + "line": "Other expenses 24 1560.87 1116.10", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_expenses", + "value": 111609999.99999999, + "page": 125, + "line": "Other expenses 24 1560.87 1116.10", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 904240000.0, + "page": 125, + "line": "Total Expenses 9042.40 7209.37", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 720937000.0, + "page": 125, + "line": "Total Expenses 9042.40 7209.37", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 130128000.0, + "page": 125, + "line": "Profit before exceptional and extraordinary items and tax 1301.28 689.24", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 68924000.0, + "page": 125, + "line": "Profit before exceptional and extraordinary items and tax 1301.28 689.24", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 38415000.0, + "page": 125, + "line": "Current tax 384.15 258.65", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 25864999.999999996, + "page": 125, + "line": "Current tax 384.15 258.65", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 13000.0, + "page": 125, + "line": "Deferred tax 0.13 -2.52", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": -252000.0, + "page": 125, + "line": "Deferred tax 0.13 -2.52", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 93325000.0, + "page": 125, + "line": "Profit (Loss) for the period from continuing operations 933.25 436.65", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pat", + "value": 43665000.0, + "page": 125, + "line": "Profit (Loss) for the period from continuing operations 933.25 436.65", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 6.65, + "page": 125, + "line": "Basic 6.65 6.32", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "eps_basic", + "value": 6.32, + "page": 125, + "line": "Basic 6.65 6.32", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 6.65, + "page": 125, + "line": "Diluted 6.65 6.32", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "eps_diluted", + "value": 6.32, + "page": 125, + "line": "Diluted 6.65 6.32", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + } + }, + "directors_pl": {}, + "balance_sheet": { + "share_capital": { + "current": { + "field": "share_capital", + "value": 152701000.0, + "page": 124, + "line": "Share capital 3 1527.01 1366.22", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "share_capital", + "value": 136622000.0, + "page": 124, + "line": "Share capital 3 1527.01 1366.22", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "reserves_surplus": { + "current": { + "field": "reserves_surplus", + "value": 407014000.0, + "page": 124, + "line": "Reserves and Surplus 4 4070.14 2009.81", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "reserves_surplus", + "value": 200981000.0, + "page": 124, + "line": "Reserves and Surplus 4 4070.14 2009.81", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "borrowings_non_current": { + "current": { + "field": "borrowings_non_current", + "value": 52565000.0, + "page": 124, + "line": "Long-term borrowings 5 525.65 338.77", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "borrowings_non_current", + "value": 33877000.0, + "page": 124, + "line": "Long-term borrowings 5 525.65 338.77", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "borrowings_current": { + "current": { + "field": "borrowings_current", + "value": 484437000.0, + "page": 124, + "line": "Short-term borrowings 6 4844.37 2902.71", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "borrowings_current", + "value": 290271000.0, + "page": 124, + "line": "Short-term borrowings 6 4844.37 2902.71", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "other_current_liabilities": { + "current": { + "field": "other_current_liabilities", + "value": 36179000.0, + "page": 124, + "line": "Other current liabilities 8 361.79 282.83", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "other_current_liabilities", + "value": 28283000.0, + "page": 124, + "line": "Other current liabilities 8 361.79 282.83", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "short_term_provisions": { + "current": { + "field": "short_term_provisions", + "value": 38415000.0, + "page": 124, + "line": "Short term Provisions 9 384.15 258.65", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "short_term_provisions", + "value": 25864999.999999996, + "page": 124, + "line": "Short term Provisions 9 384.15 258.65", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "total_equity_liabilities": { + "current": { + "field": "total_equity_liabilities", + "value": 1561808000.0, + "page": 124, + "line": "Total 15618.08 10375.09", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "total_equity_liabilities", + "value": 1037509000.0, + "page": 124, + "line": "Total 15618.08 10375.09", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "ppe": { + "current": { + "field": "ppe", + "value": 49436000.0, + "page": 124, + "line": "(i) Property, Plant and Equipment 494.36 570.16", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "ppe", + "value": 57016000.0, + "page": 124, + "line": "(i) Property, Plant and Equipment 494.36 570.16", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "non_current_investments": { + "current": { + "field": "non_current_investments", + "value": 1917000.0000000002, + "page": 124, + "line": "Non Current Investments 12 19.17 19.17", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "non_current_investments", + "value": 1917000.0000000002, + "page": 124, + "line": "Non Current Investments 12 19.17 19.17", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "trade_receivables": { + "current": { + "field": "trade_receivables", + "value": 425643000.0, + "page": 124, + "line": "Trade receivables 16c 4256.43 1781.92", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "trade_receivables", + "value": 178192000.0, + "page": 124, + "line": "Trade receivables 16c 4256.43 1781.92", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + }, + "total_assets": { + "current": { + "field": "total_assets", + "value": 1561808000.0, + "page": 124, + "line": "Total 15618.08 10375.09", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + }, + "previous": { + "field": "total_assets", + "value": 1037509000.0, + "page": 124, + "line": "Total 15618.08 10375.09", + "scale": 100000.0, + "section": "balance_sheet", + "basis": null + } + } + }, + "shareholding": [], + "related_party": [ + { + "label": "with reference to proviso to Section", + "amount": 2.0, + "page": 28, + "line": "with reference to proviso to Section 2(viii) of Companies (Acceptance of Deposit) Rules, 2014. However, Company has received loan" + }, + { + "label": "and advance from related party as mentioned in Note No.", + "amount": 46.0, + "page": 28, + "line": "and advance from related party as mentioned in Note No. 46 of Standalone Balance Sheet as on 31st March 2025." + }, + { + "label": "Note", + "amount": 45.0, + "page": 106, + "line": "Note 45 : In the opinion of the board of directors the current assets, loan & advances are realisable in ordinary course of" + } + ], + "auditors": [ + "(Chartered Accountants)", + "As per accounting standard 18 on \u201cRelated party Disclosure\u201d issued by the Institute of Chartered Accountants", + "Chartered Accountants", + "Chartered Accountants Sneha Banik Goutam Debnath" + ], + "page_index": { + "pl": [ + 13, + 72, + 74, + 87, + 88, + 89, + 90, + 91, + 94, + 112, + 113, + 114, + 117, + 119, + 125, + 126, + 127, + 128, + 129 + ], + "directors_report": [ + 24, + 117 + ], + "balance_sheet": [ + 28, + 72, + 86, + 117, + 124 + ], + "shareholding": [], + "related_party": [ + 28, + 106, + 107, + 143 + ] + }, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld." + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [ + "total assets = total equity and liabilities" + ], + "statement_pages": { + "audited_pl": 125, + "directors_report": 24 + } + }, + "isin_corroborated": false +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544504.json b/app/backend/primarydraft/data/companies/544504.json new file mode 100644 index 0000000000000000000000000000000000000000..166cc49c23d45fe87619afcb7a0e2adc3e3753c2 --- /dev/null +++ b/app/backend/primarydraft/data/companies/544504.json @@ -0,0 +1,391 @@ +{ + "scrip_code": "544504", + "bse": { + "scrip_name": "Goel Construction Company Ltd", + "issuer_name": "GOEL CONSTRUCTION COMPANY LIMITED", + "group": "MT", + "segment": "Equity", + "isin": "INE0ZOM01013", + "face_value": "10.00", + "industry": "", + "sector": "Industrials", + "industry_new": "Construction", + "market_cap": "697.92", + "eps_reported": "32.01", + "pe_reported": "15.09", + "security_id": "GOELCONS" + }, + "annual_report": { + "year": "2026", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachLive/b97df3f0-bb5b-4fbb-934e-b08b531621a6.pdf", + "authorised_at": "2026-08-08T16:49:17.597", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544504_2026.pdf", + "available_years": [ + "2026" + ] + }, + "extraction": { + "scrip_code": "544504", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544504_2026.pdf", + "pages": 100, + "cin": "L45201RJ1997PLC013937", + "isin": "INE0ZOM01013", + "company_name": "For Goel Construction Company Limited", + "emails": [ + "contact@goelconstruction.co.in", + "enotices@in.mpms", + "enotices@in.mpms.mufg.com", + "evoting@nsdl.co", + "gauravgoyalcs@gmail.com", + "helpdesk.evoting@cdslindia.com" + ], + "dins": [ + "00044890", + "00062259", + "00272592", + "01134075", + "10811317", + "10811352", + "10894599" + ], + "audited_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 6572964999.999999, + "page": 49, + "line": "Revenue from operations 18 65,729.65 58,998.45", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 5899845000.0, + "page": 49, + "line": "Revenue from operations 18 65,729.65 58,998.45", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 79818000.0, + "page": 49, + "line": "Other income 19 798.18 435.90", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 43590000.0, + "page": 49, + "line": "Other income 19 798.18 435.90", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 6652783000.0, + "page": 49, + "line": "Total Income 66,527.83 59,434.35", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 5943435000.0, + "page": 49, + "line": "Total Income 66,527.83 59,434.35", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 1752641000.0, + "page": 49, + "line": "Cost of material Consumed 20 17,526.41 18,336.61", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "cost_of_materials", + "value": 1833661000.0, + "page": 49, + "line": "Cost of material Consumed 20 17,526.41 18,336.61", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 680989000.0, + "page": 49, + "line": "Employee benefit expenses 22 6,809.89 5,908.73", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "employee_benefits", + "value": 590873000.0, + "page": 49, + "line": "Employee benefit expenses 22 6,809.89 5,908.73", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 101973000.0, + "page": 49, + "line": "Finance costs 23 1,019.73 323.11", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 32311000.0, + "page": 49, + "line": "Finance costs 23 1,019.73 323.11", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "depreciation": { + "current": { + "field": "depreciation", + "value": 89823000.0, + "page": 49, + "line": "Depreciation and amortization expenses 11 898.23 758.45", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "depreciation", + "value": 75845000.0, + "page": 49, + "line": "Depreciation and amortization expenses 11 898.23 758.45", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 6032038000.0, + "page": 49, + "line": "Total Expenses 60,320.38 54,289.51", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 5428951000.0, + "page": 49, + "line": "Total Expenses 60,320.38 54,289.51", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 620745000.0, + "page": 49, + "line": "Profit before tax 6,207.45 5,144.84", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 514484000.0, + "page": 49, + "line": "Profit before tax 6,207.45 5,144.84", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 153925000.0, + "page": 49, + "line": "Current tax 25 1,539.25 1,280.46", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 128046000.0, + "page": 49, + "line": "Current tax 25 1,539.25 1,280.46", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 4237000.0, + "page": 49, + "line": "Deferred tax 6 42.37 32.13", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": 3213000.0000000005, + "page": 49, + "line": "Deferred tax 6 42.37 32.13", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 462583000.0, + "page": 49, + "line": "Profit/(Loss) for the year 4,625.83 3,832.25", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pat", + "value": 383225000.0, + "page": 49, + "line": "Profit/(Loss) for the year 4,625.83 3,832.25", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 35.25, + "page": 49, + "line": "Basic and Diluted 26 35.25 33.72", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "eps_basic", + "value": 33.72, + "page": 49, + "line": "Basic and Diluted 26 35.25 33.72", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + } + }, + "directors_pl": {}, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "OF THE COMPANY WHICH HAVE OCCURRED", + "amount": 29.0, + "page": 22, + "line": "OF THE COMPANY WHICH HAVE OCCURRED 29. P ARTICULARS OF LOANS, GUARANTEES OR" + }, + { + "label": "Mr. Purushottam Dass Goel", + "amount": 27.3, + "page": 23, + "line": "Mr. Purushottam Dass Goel 27.30% 66.00 Remuneration" + }, + { + "label": "", + "amount": -0.84, + "page": 23, + "line": "(0.84) Interest on Loans-Repaid" + }, + { + "label": "", + "amount": -8.94, + "page": 23, + "line": "(8.94) Loans Repaid" + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants Goel Construction Company Limited", + "Chartered Accountants of India.", + "Financial Reporting issued by the Institute of Chartered Accountants" + ], + "page_index": { + "pl": [ + 41, + 43, + 49, + 52, + 54, + 58, + 77, + 78 + ], + "directors_report": [ + 3 + ], + "balance_sheet": [ + 41, + 77 + ], + "shareholding": [], + "related_party": [ + 22, + 23, + 46, + 72, + 80 + ] + }, + "warnings": [ + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "directors_pl_identities": [], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 49, + "directors_report": 0 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544657.json b/app/backend/primarydraft/data/companies/544657.json new file mode 100644 index 0000000000000000000000000000000000000000..adcc46c366695f7cc8f6db55e422abe6912090ab --- /dev/null +++ b/app/backend/primarydraft/data/companies/544657.json @@ -0,0 +1,356 @@ +{ + "scrip_code": "544657", + "bse": { + "scrip_name": "Pajson Agro India Ltd", + "issuer_name": "Pajson Agro India Limited", + "group": "M", + "segment": "Equity", + "isin": "INE14LM01012", + "face_value": "10.00", + "industry": "", + "sector": "Fast Moving Consumer Goods", + "industry_new": "Fast Moving Consumer Goods", + "market_cap": "457.14", + "eps_reported": "4.44", + "pe_reported": "43.24", + "security_id": "PAJSON" + }, + "annual_report": { + "year": "2026", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/3efaf437-60a4-495c-9c4b-8faaedbdb608.pdf", + "authorised_at": "2026-07-29T11:31:51.573", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544657_2026.pdf", + "available_years": [ + "2026" + ] + }, + "extraction": { + "scrip_code": "544657", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544657_2026.pdf", + "pages": 66, + "cin": "L01100DL2021PLC386740", + "isin": "INE14LM01012", + "company_name": "Pajson Agro India Limited", + "emails": [ + "advistalegal@gmail.com", + "cs@pajsonagro.com", + "evoting@nsdl.com", + "helpdesk.evoting@cdslindia.com" + ], + "dins": [ + "02754392", + "09323689", + "09323690" + ], + "audited_pl": {}, + "directors_pl": { + "other_income": { + "current": { + "field": "other_income", + "value": 119.56, + "page": 29, + "line": "Other Income 119.56 1.11 As the Initial Public Offer (IPO) of the Company comprised leadership, expertise, and independent judgment. Their", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 1.11, + "page": 29, + "line": "Other Income 119.56 1.11 As the Initial Public Offer (IPO) of the Company comprised leadership, expertise, and independent judgment. Their", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 25691.77, + "page": 29, + "line": "Total Revenue 25,691.77 18,727.95 a fresh issue of equity shares, the Company appointed varied knowledge and experience support the Company in", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 18727.95, + "page": 29, + "line": "Total Revenue 25,691.77 18,727.95 a fresh issue of equity shares, the Company appointed varied knowledge and experience support the Company in", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 22373.23, + "page": 29, + "line": "Total Expenses 22,373.23 15,995.65 Care Ratings Limited as the Monitoring Agency to monitor maintaining high standards of corporate governance and", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 15995.65, + "page": 29, + "line": "Total Expenses 22,373.23 15,995.65 Care Ratings Limited as the Monitoring Agency to monitor maintaining high standards of corporate governance and", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 3318.55, + "page": 29, + "line": "Profit /(Loss) Before Tax 3,318.55 2,732.30", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 2732.3, + "page": 29, + "line": "Profit /(Loss) Before Tax 3,318.55 2,732.30", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 808.94, + "page": 29, + "line": "- Current Tax 808.94 658.31 during the Financial Year 2025-26:", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 658.31, + "page": 29, + "line": "- Current Tax 808.94 658.31 during the Financial Year 2025-26:", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 31.22, + "page": 29, + "line": "- Deferred Tax 31.22", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 2478.38, + "page": 29, + "line": "Profit/(Loss) After Taxation 2,478.38 2,040.66 There was no change in the nature of business of the changes in the composition of the Board of Directors", + "scale": 1.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pat", + "value": 2040.66, + "page": 29, + "line": "Profit/(Loss) After Taxation 2,478.38 2,040.66 There was no change in the nature of business of the changes in the composition of the Board of Directors", + "scale": 1.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "and sales, and prudent working capital management.", + "amount": 31.0, + "page": 32, + "line": "and sales, and prudent working capital management. 31st March, 2026 and issued its Audit Report thereon. spirit and letter of the legislation. During the reporting" + }, + { + "label": "Another risk is Foreign exchange fluctuations, an inherent CODE,", + "amount": 2016.0, + "page": 32, + "line": "Another risk is Foreign exchange fluctuations, an inherent CODE, 2016 (31 OF 2016) DURING THE YEAR ALONG" + }, + { + "label": "through a structured and proactive risk management", + "amount": 21.0, + "page": 32, + "line": "through a structured and proactive risk management 21. PARTICULARS OF LOANS, GUARANTEES OR Female Employees: 424" + }, + { + "label": "Remuneration of Managerial Personnel) Rules,", + "amount": 2014.0, + "page": 32, + "line": "Remuneration of Managerial Personnel) Rules, 2014. Facilities Stable" + }, + { + "label": "Enterprises in PAJSON GLOBAL DMCC Purchase of Raw materials", + "amount": 553.45, + "page": 34, + "line": "Enterprises in PAJSON GLOBAL DMCC Purchase of Raw materials 553.45 11105.76" + }, + { + "label": "PAJSON GLOBAL DMCC Advance payment for", + "amount": 1407.75, + "page": 34, + "line": "PAJSON GLOBAL DMCC Advance payment for 1407.75 328.16" + }, + { + "label": "significant PP Softech Private Limited Interest on unsecured loan", + "amount": 54.0, + "page": 34, + "line": "significant PP Softech Private Limited Interest on unsecured loan 54.00 54.00" + }, + { + "label": "Particulars Details influence Pajson International FZCO Purchase of Raw materials", + "amount": 3139.24, + "page": 34, + "line": "Particulars Details influence Pajson International FZCO Purchase of Raw materials 3,139.24 -" + }, + { + "label": "Mr. Aayush Jain Chairman & Managing Director\u2019s remuneration", + "amount": 48.0, + "page": 34, + "line": "Mr. Aayush Jain Chairman & Managing Director\u2019s remuneration 48.00 48.00" + }, + { + "label": "c) Duration of the contracts/arrangements/transaction N.A Mrs. Anjali Jain Whole Time Director Director\u2019s remu", + "amount": 18.0, + "page": 34, + "line": "c) Duration of the contracts/arrangements/transaction N.A Mrs. Anjali Jain Whole Time Director Director\u2019s remuneration 18.00 12.00" + }, + { + "label": "d) Salient terms of the contracts or arrangements or transaction including the value, if any N.A Mr. Jayesh Bh", + "amount": 5.0, + "page": 34, + "line": "d) Salient terms of the contracts or arrangements or transaction including the value, if any N.A Mr. Jayesh Bhagia Director Director\u2019s remuneration 5.00 -" + }, + { + "label": "", + "amount": 2.0, + "page": 34, + "line": "2. Details of contracts or arrangements or transactions at Arm\u2019s length basis. Mr. Pulkit Jain Non-Executive Director Short term borrowings 530.00 -" + }, + { + "label": "Mr. Pulkit Jain Non-Executive Director Repayment of short-term", + "amount": 530.0, + "page": 34, + "line": "Mr. Pulkit Jain Non-Executive Director Repayment of short-term 530.00 -" + }, + { + "label": "Mr. Anjali Jain Whole Time Director Expenses incurred on", + "amount": 1.94, + "page": 34, + "line": "Mr. Anjali Jain Whole Time Director Expenses incurred on 1.94 18.49" + }, + { + "label": "", + "amount": 2.0, + "page": 34, + "line": "2. Pajson International FZCO Ajit Kumar Chief Financial Officer Salary 9.35 -" + }, + { + "label": "Roopal Saxena Company Secretary Salary", + "amount": 6.3, + "page": 34, + "line": "Roopal Saxena Company Secretary Salary 6.30 -" + }, + { + "label": "Mr Abhishek Jain Relative of Director Sales", + "amount": 9.19, + "page": 34, + "line": "Mr Abhishek Jain Relative of Director Sales 9.19 -" + }, + { + "label": "Sale of goods- H", + "amount": 9.19, + "page": 34, + "line": "Sale of goods- H 9.19 lakh For and on behalf of Board of Pajson Agro India Limited" + }, + { + "label": "Purchase of goods- H", + "amount": 3692.69, + "page": 34, + "line": "Purchase of goods- H 3692.69 lakh (Formerly Pajson Agro India Pvt Ltd)" + }, + { + "label": "g) Amount paid as advances, if any H", + "amount": 1407.75, + "page": 34, + "line": "g) Amount paid as advances, if any H 1407.75 lakh Chairman & Managing Director Whole Time Director" + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants Pajson Agro India Limited", + "Chartered Accountants Pajson Agro India Limited Place: New Delhi Chief Financial Officer Company Secretary", + "M/s AVKG & Associates, Chartered Accountant" + ], + "page_index": { + "pl": [ + 47, + 49, + 50, + 52, + 60 + ], + "directors_report": [ + 2, + 10, + 29, + 42 + ], + "balance_sheet": [ + 42, + 47 + ], + "shareholding": [], + "related_party": [ + 32, + 34, + 37, + 45, + 53, + 58, + 59 + ] + }, + "warnings": [ + "Statement of Profit and Loss: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "audited P&L not machine-readable in this filing", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [], + "directors_pl_identities": [ + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 47, + "directors_report": 29 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/companies/544694.json b/app/backend/primarydraft/data/companies/544694.json new file mode 100644 index 0000000000000000000000000000000000000000..bcbd6dd8272641b59bd595bbef9647c7b654b304 --- /dev/null +++ b/app/backend/primarydraft/data/companies/544694.json @@ -0,0 +1,523 @@ +{ + "scrip_code": "544694", + "bse": { + "scrip_name": "Accretion Nutraveda Ltd", + "issuer_name": "Accretion Nutraveda Limited", + "group": "MT", + "segment": "Equity", + "isin": "INE1KVQ01019", + "face_value": "10.00", + "industry": "", + "sector": "Healthcare", + "industry_new": "Healthcare", + "market_cap": "219.73", + "eps_reported": "3.71", + "pe_reported": "81.81", + "security_id": "ANL" + }, + "annual_report": { + "year": "2026", + "url": "https://www.bseindia.com/xml-data/corpfiling/AttachHis/549c9043-75fc-4135-b5f0-b4040d2bbe91.pdf", + "authorised_at": "2026-08-04T23:05:06.36", + "local_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544694_2026.pdf", + "available_years": [ + "2026" + ] + }, + "extraction": { + "scrip_code": "544694", + "pdf_path": "/Users/juni/hackathons-works/1/sebi-techsprint/app/backend/.cache/bse/ar_544694_2026.pdf", + "pages": 151, + "cin": "L24290GJ2021PLC121216", + "isin": "INE1KVQ01019", + "company_name": "Bse Limited", + "emails": [ + "cinward.ris@kfintech.com", + "compliance@accretionnutraveda.com", + "evoting@nsdl.co.in", + "helpdesk.evoting@cdslindia.com", + "info@accretionnutraveda.com" + ], + "dins": [ + "09108392", + "09108403", + "09108404", + "09130357", + "09130391", + "10685826", + "10706050", + "10952040" + ], + "audited_pl": { + "other_income": { + "current": { + "field": "other_income", + "value": 1124000.0, + "page": 86, + "line": "Other Income 21 11.24 0.62", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 62000.0, + "page": 86, + "line": "Other Income 21 11.24 0.62", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 337155000.0, + "page": 86, + "line": "Total Income 3,371.55 1,600.80", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 160080000.0, + "page": 86, + "line": "Total Income 3,371.55 1,600.80", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "cost_of_materials": { + "current": { + "field": "cost_of_materials", + "value": 250683000.0, + "page": 86, + "line": "Cost of Material Consumed 22 2,506.83 1,152.15", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "cost_of_materials", + "value": 115215000.00000001, + "page": 86, + "line": "Cost of Material Consumed 22 2,506.83 1,152.15", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "employee_benefits": { + "current": { + "field": "employee_benefits", + "value": 10680000.0, + "page": 86, + "line": "Employee Benefit Expenses 24 106.80 45.65", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "employee_benefits", + "value": 4565000.0, + "page": 86, + "line": "Employee Benefit Expenses 24 106.80 45.65", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "finance_costs": { + "current": { + "field": "finance_costs", + "value": 5342000.0, + "page": 86, + "line": "Finance Costs 25 53.42 35.49", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "finance_costs", + "value": 3549000.0, + "page": 86, + "line": "Finance Costs 25 53.42 35.49", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "other_expenses": { + "current": { + "field": "other_expenses", + "value": 15376000.0, + "page": 86, + "line": "Other Expenses 27 153.76 125.42", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "other_expenses", + "value": 12542000.0, + "page": 86, + "line": "Other Expenses 27 153.76 125.42", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 275042000.0, + "page": 86, + "line": "Total expenses 2,750.42 1,285.47", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 128547000.0, + "page": 86, + "line": "Total expenses 2,750.42 1,285.47", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 62113000.0, + "page": 86, + "line": "Profit/(Loss) before Tax 621.13 315.33", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 31533000.0, + "page": 86, + "line": "Profit/(Loss) before Tax 621.13 315.33", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_current": { + "current": { + "field": "tax_current", + "value": 11075000.0, + "page": 86, + "line": "- Current Tax 110.75 53.72", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_current", + "value": 5372000.0, + "page": 86, + "line": "- Current Tax 110.75 53.72", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "tax_deferred": { + "current": { + "field": "tax_deferred", + "value": 27000.0, + "page": 86, + "line": "- Deferred Tax 0.27 0.15", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "tax_deferred", + "value": 15000.0, + "page": 86, + "line": "- Deferred Tax 0.27 0.15", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 50683000.0, + "page": 86, + "line": "Profit/(Loss) for the Period from Con\u0000nuing Opera\u0000ons 506.83 250.09", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "pat", + "value": 25009000.0, + "page": 86, + "line": "Profit/(Loss) for the Period from Con\u0000nuing Opera\u0000ons 506.83 250.09", + "scale": 100000.0, + "section": "audited_pl", + "basis": null + } + }, + "eps_basic": { + "current": { + "field": "eps_basic", + "value": 9.35, + "page": 86, + "line": "-Basic (In Rs) 29 9.35 6.88", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "eps_basic", + "value": 6.88, + "page": 86, + "line": "-Basic (In Rs) 29 9.35 6.88", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + }, + "eps_diluted": { + "current": { + "field": "eps_diluted", + "value": 9.35, + "page": 86, + "line": "-Diluted (In Rs) 29 9.35 6.88", + "scale": 1.0, + "section": "audited_pl", + "basis": null + }, + "previous": { + "field": "eps_diluted", + "value": 6.88, + "page": 86, + "line": "-Diluted (In Rs) 29 9.35 6.88", + "scale": 1.0, + "section": "audited_pl", + "basis": null + } + } + }, + "directors_pl": { + "revenue_from_operations": { + "current": { + "field": "revenue_from_operations", + "value": 336030000.0, + "page": 48, + "line": "Revenue from operation 3360.3 1 1600.18", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "revenue_from_operations", + "value": 100000.0, + "page": 48, + "line": "Revenue from operation 3360.3 1 1600.18", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "other_income": { + "current": { + "field": "other_income", + "value": 1124000.0, + "page": 48, + "line": "Add: Other Income 11.24 0.62", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "other_income", + "value": 62000.0, + "page": 48, + "line": "Add: Other Income 11.24 0.62", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "total_income": { + "current": { + "field": "total_income", + "value": 337155000.0, + "page": 48, + "line": "Total Income 3371.55 1600.80", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_income", + "value": 160080000.0, + "page": 48, + "line": "Total Income 3371.55 1600.80", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "total_expenses": { + "current": { + "field": "total_expenses", + "value": 275042000.0, + "page": 48, + "line": "Less: Total Expenditure 2750.42 1285.47", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "total_expenses", + "value": 128547000.0, + "page": 48, + "line": "Less: Total Expenditure 2750.42 1285.47", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pbt": { + "current": { + "field": "pbt", + "value": 62113000.0, + "page": 48, + "line": "Profit/(Loss) before Tax 621.13 315.33", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pbt", + "value": 31533000.0, + "page": 48, + "line": "Profit/(Loss) before Tax 621.13 315.33", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + }, + "pat": { + "current": { + "field": "pat", + "value": 50683000.0, + "page": 48, + "line": "Profit/(Loss) for the year from continuing operations 506.83 250.09", + "scale": 100000.0, + "section": "directors_report", + "basis": null + }, + "previous": { + "field": "pat", + "value": 25009000.0, + "page": 48, + "line": "Profit/(Loss) for the year from continuing operations 506.83 250.09", + "scale": 100000.0, + "section": "directors_report", + "basis": null + } + } + }, + "balance_sheet": {}, + "shareholding": [], + "related_party": [ + { + "label": "PARTICULARS OF LOANS, GUARANTEES OR INVESTMENTS UNDER SECTION", + "amount": 186.0, + "page": 50, + "line": "PARTICULARS OF LOANS, GUARANTEES OR INVESTMENTS UNDER SECTION 186" + }, + { + "label": "Further, Separate meeting of Independent Directors was held on", + "amount": 2.0, + "page": 54, + "line": "Further, Separate meeting of Independent Directors was held on 02 February, 2026, without the presence of Non-" + }, + { + "label": "All the Independent Directors of the Company have given their declarations to the Company under Section", + "amount": 149.0, + "page": 54, + "line": "All the Independent Directors of the Company have given their declarations to the Company under Section 149(7)" + }, + { + "label": "The Audit Committee has been constituted by the Board of the Directors at its meeting held on", + "amount": 12.0, + "page": 54, + "line": "The Audit Committee has been constituted by the Board of the Directors at its meeting held on 12" + }, + { + "label": "Section", + "amount": 192.0, + "page": 83, + "line": "Section 192 of the Act, with directors or persons connected with them." + } + ], + "auditors": [ + "Chartered Accountants", + "Chartered Accountants ACCRETION NUTRAVEDA LIMITED", + "Financial Controls Over Financial Reporting issued by the Institute of Chartered Accountants of India. These", + "Institute of Chartered Accountants of India." + ], + "page_index": { + "pl": [ + 3, + 73, + 86, + 89, + 91, + 98 + ], + "directors_report": [ + 48, + 75, + 95, + 147 + ], + "balance_sheet": [ + 73, + 85 + ], + "shareholding": [], + "related_party": [ + 50, + 54, + 83, + 108, + 109, + 110 + ] + }, + "warnings": [ + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ], + "audited_pl_identities": [ + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "directors_pl_identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "balance_sheet_identities": [], + "statement_pages": { + "audited_pl": 86, + "directors_report": 48 + } + }, + "isin_corroborated": true +} \ No newline at end of file diff --git a/app/backend/primarydraft/data/index.json b/app/backend/primarydraft/data/index.json new file mode 100644 index 0000000000000000000000000000000000000000..fdfd3a12431ff4c440e745b8d2f1bab9ed6dc428 --- /dev/null +++ b/app/backend/primarydraft/data/index.json @@ -0,0 +1,896 @@ +{ + "companies": [ + { + "scrip_code": "540718", + "name": "Aayush Art And Bullion Ltd", + "cin": "L74110DL2009PLC196375", + "isin": "INE777X01017", + "industry": "", + "sector": "Consumer Discretionary", + "year": "2025", + "pages": 91, + "pl_fields": 15, + "bs_fields": 10, + "dr_fields": 0, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax", + "total assets = total equity and liabilities" + ], + "isin_corroborated": true, + "warnings": [] + }, + { + "scrip_code": "544694", + "name": "Accretion Nutraveda Ltd", + "cin": "L24290GJ2021PLC121216", + "isin": "INE1KVQ01019", + "industry": "", + "sector": "Healthcare", + "year": "2026", + "pages": 151, + "pl_fields": 13, + "bs_fields": 0, + "dr_fields": 6, + "identities": [ + "pbt = total_income - total_expenses", + "pat = pbt - tax", + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "isin_corroborated": true, + "warnings": [ + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "544224", + "name": "Afcom Holdings Ltd", + "cin": "L51201TN2013PLC089652", + "isin": "INE0OXY01013", + "industry": "", + "sector": "Services", + "year": "2025", + "pages": 68, + "pl_fields": 0, + "bs_fields": 0, + "dr_fields": 0, + "identities": [], + "isin_corroborated": true, + "warnings": [ + "Statement of Profit and Loss: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "audited P&L not machine-readable in this filing", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "544037", + "name": "Amic Forging Ltd", + "cin": "L27100WB2007PLC116674", + "isin": "INE0P9J01013", + "industry": "", + "sector": "Industrials", + "year": "2025", + "pages": 112, + "pl_fields": 0, + "bs_fields": 9, + "dr_fields": 8, + "identities": [ + "total assets = total equity and liabilities", + "pat = pbt - tax" + ], + "isin_corroborated": true, + "warnings": [ + "Statement of Profit and Loss: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "audited P&L not machine-readable in this filing" + ] + }, + { + "scrip_code": "543943", + "name": "Asarfi Hospital Ltd", + "cin": "L85110JH2005PLC011673", + "isin": "INE0DN001027", + "industry": "", + "sector": "Healthcare", + "year": "2025", + "pages": 217, + "pl_fields": 16, + "bs_fields": 0, + "dr_fields": 0, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "isin_corroborated": false, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "543543", + "name": "B-Right Realestate Ltd", + "cin": "L70100MH2007PLC282631", + "isin": "INE0IZQ01016", + "industry": "", + "sector": "Consumer Discretionary", + "year": "2026", + "pages": 179, + "pl_fields": 13, + "bs_fields": 0, + "dr_fields": 0, + "identities": [ + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "isin_corroborated": false, + "warnings": [ + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "544335", + "name": "B.R.Goyal Infrastructure Ltd", + "cin": "L04520MP2005PLC017479", + "isin": "INE00ST01011", + "industry": "", + "sector": "Industrials", + "year": "2026", + "pages": 170, + "pl_fields": 15, + "bs_fields": 0, + "dr_fields": 0, + "identities": [ + "total_income = revenue + other_income" + ], + "isin_corroborated": true, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "544369", + "name": "Beezaasan Explotech Ltd", + "cin": "L24111GJ2013PLC076499", + "isin": "INE13VU01016", + "industry": "", + "sector": "Commodities", + "year": "2025", + "pages": 55, + "pl_fields": 0, + "bs_fields": 0, + "dr_fields": 0, + "identities": [], + "isin_corroborated": false, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "audited P&L not machine-readable in this filing", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "543971", + "name": "Bondada Engineering Ltd", + "cin": "L28910TG2012PLC080018", + "isin": "INE0Q8P01029", + "industry": "", + "sector": "Telecommunication", + "year": "2026", + "pages": 249, + "pl_fields": 16, + "bs_fields": 0, + "dr_fields": 0, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "isin_corroborated": false, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "543831", + "name": "Bright Outdoor Media Ltd", + "cin": "L74300MH2005PLC156444", + "isin": "INE0OMI01019", + "industry": "", + "sector": "Consumer Discretionary", + "year": "2025", + "pages": 76, + "pl_fields": 0, + "bs_fields": 0, + "dr_fields": 11, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "isin_corroborated": true, + "warnings": [ + "audited P&L not machine-readable in this filing", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "543378", + "name": "CWD Ltd", + "cin": "U31900MH2016PLC281796", + "isin": "INE0H8H01019", + "industry": "", + "sector": "Consumer Discretionary", + "year": "2025", + "pages": 142, + "pl_fields": 10, + "bs_fields": 14, + "dr_fields": 6, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "total assets = total equity and liabilities", + "pat = pbt - tax" + ], + "isin_corroborated": false, + "warnings": [] + }, + { + "scrip_code": "540652", + "name": "Captain Technocast Ltd", + "cin": "L27300GJ2010PLC061678", + "isin": "INE931X01010", + "industry": "", + "sector": "Industrials", + "year": "2025", + "pages": 139, + "pl_fields": 0, + "bs_fields": 0, + "dr_fields": 8, + "identities": [ + "total_income = revenue + other_income" + ], + "isin_corroborated": true, + "warnings": [ + "audited P&L not machine-readable in this filing", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "543619", + "name": "Concord Control Systems Ltd", + "cin": "L31908UP2011PLC043229", + "isin": "INE0N0J01014", + "industry": "", + "sector": "Industrials", + "year": "2025", + "pages": 226, + "pl_fields": 9, + "bs_fields": 0, + "dr_fields": 0, + "identities": [ + "total_income = revenue + other_income" + ], + "isin_corroborated": true, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "543928", + "name": "Cosmic CRF Ltd", + "cin": "L27100WB2021PLC250447", + "isin": "INE0ORA01015", + "industry": "", + "sector": "Industrials", + "year": "2025", + "pages": 144, + "pl_fields": 13, + "bs_fields": 0, + "dr_fields": 9, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax", + "pat = pbt - tax" + ], + "isin_corroborated": false, + "warnings": [ + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "543172", + "name": "Cospower Engineering Ltd", + "cin": "L31908MH2010PLC208016", + "isin": "INE0CQB01010", + "industry": "", + "sector": "Industrials", + "year": "2025", + "pages": 92, + "pl_fields": 12, + "bs_fields": 13, + "dr_fields": 0, + "identities": [ + "pbt = total_income - total_expenses", + "total assets = total equity and liabilities" + ], + "isin_corroborated": false, + "warnings": [] + }, + { + "scrip_code": "544332", + "name": "Fabtech Technologies Cleanrooms Ltd", + "cin": "L74999MH2015PLC265137", + "isin": "INE0HSD01011", + "industry": "", + "sector": "Industrials", + "year": "2025", + "pages": 130, + "pl_fields": 0, + "bs_fields": 0, + "dr_fields": 8, + "identities": [ + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "isin_corroborated": false, + "warnings": [ + "Statement of Profit and Loss: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "audited P&L not machine-readable in this filing", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "544504", + "name": "Goel Construction Company Ltd", + "cin": "L45201RJ1997PLC013937", + "isin": "INE0ZOM01013", + "industry": "", + "sector": "Industrials", + "year": "2026", + "pages": 100, + "pl_fields": 13, + "bs_fields": 0, + "dr_fields": 0, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "isin_corroborated": true, + "warnings": [ + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "543916", + "name": "Hemant Surgical Industries Ltd", + "cin": "L33110MH1989PLC051133", + "isin": "INE0GYI01028", + "industry": "", + "sector": "Healthcare", + "year": "2025", + "pages": 158, + "pl_fields": 8, + "bs_fields": 13, + "dr_fields": 0, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "total assets = total equity and liabilities" + ], + "isin_corroborated": false, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld." + ] + }, + { + "scrip_code": "544150", + "name": "KP Green Engineering Ltd", + "cin": "L40100GJ2001PLC039763", + "isin": "INE0QVH01025", + "industry": "", + "sector": "Industrials", + "year": "2025", + "pages": 192, + "pl_fields": 0, + "bs_fields": 0, + "dr_fields": 7, + "identities": [ + "total_income = revenue + other_income" + ], + "isin_corroborated": false, + "warnings": [ + "Statement of Profit and Loss: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "audited P&L not machine-readable in this filing", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "544023", + "name": "Kalyani Cast-Tech Ltd", + "cin": "L26990DL2012PLC242760", + "isin": "INE0N6U01018", + "industry": "", + "sector": "Industrials", + "year": "2025", + "pages": 124, + "pl_fields": 11, + "bs_fields": 0, + "dr_fields": 14, + "identities": [ + "total_income = revenue + other_income", + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "isin_corroborated": true, + "warnings": [ + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "543542", + "name": "Kesar India Ltd", + "cin": "L51220MH2003PLC142989", + "isin": "INE0L1C01019", + "industry": "", + "sector": "Consumer Discretionary", + "year": "2025", + "pages": 114, + "pl_fields": 14, + "bs_fields": 14, + "dr_fields": 0, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax", + "total assets = total equity and liabilities" + ], + "isin_corroborated": true, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld." + ] + }, + { + "scrip_code": "543953", + "name": "Khazanchi Jewellers Ltd", + "cin": "L36911TN1996PLC034918", + "isin": "INE0OWC01011", + "industry": "", + "sector": "Consumer Discretionary", + "year": "2026", + "pages": 105, + "pl_fields": 12, + "bs_fields": 0, + "dr_fields": 0, + "identities": [ + "total_income = revenue + other_income", + "pat = pbt - tax" + ], + "isin_corroborated": true, + "warnings": [ + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "537669", + "name": "Laxmipati Engineering Works Ltd", + "cin": "L35111GJ2012PLC068922", + "isin": "INE920P01019", + "industry": "", + "sector": "Industrials", + "year": "2026", + "pages": 117, + "pl_fields": 14, + "bs_fields": 12, + "dr_fields": 8, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "total assets = total equity and liabilities", + "total_income = revenue + other_income" + ], + "isin_corroborated": true, + "warnings": [] + }, + { + "scrip_code": "543746", + "name": "Logica Infoway Ltd", + "cin": "L30007WB1995PLC073218", + "isin": "INE0BSU01018", + "industry": "", + "sector": "Consumer Discretionary", + "year": "2025", + "pages": 131, + "pl_fields": 13, + "bs_fields": 0, + "dr_fields": 0, + "identities": [ + "pat = pbt - tax" + ], + "isin_corroborated": true, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "544434", + "name": "Neetu Yoshi Ltd", + "cin": "U35999UR2020PLC010670", + "isin": "INE0UZO01024", + "industry": "", + "sector": "Industrials", + "year": "2025", + "pages": 94, + "pl_fields": 13, + "bs_fields": 0, + "dr_fields": 6, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "isin_corroborated": true, + "warnings": [ + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "544296", + "name": "Nisus Finance Services Co Ltd", + "cin": "L65923MH2013PLC247317", + "isin": "INE0DQN01013", + "industry": "", + "sector": "Financial Services", + "year": "2025", + "pages": 105, + "pl_fields": 14, + "bs_fields": 0, + "dr_fields": 6, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax", + "total_income = revenue + other_income" + ], + "isin_corroborated": true, + "warnings": [ + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "544498", + "name": "Oval Projects Engineering Ltd", + "cin": "L74900TR2013PLC008465", + "isin": "INE0RTI01017", + "industry": "", + "sector": "Industrials", + "year": "2025", + "pages": 152, + "pl_fields": 14, + "bs_fields": 11, + "dr_fields": 0, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax", + "total assets = total equity and liabilities" + ], + "isin_corroborated": false, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld." + ] + }, + { + "scrip_code": "544657", + "name": "Pajson Agro India Ltd", + "cin": "L01100DL2021PLC386740", + "isin": "INE14LM01012", + "industry": "", + "sector": "Fast Moving Consumer Goods", + "year": "2026", + "pages": 66, + "pl_fields": 0, + "bs_fields": 0, + "dr_fields": 7, + "identities": [ + "pbt = total_income - total_expenses", + "pat = pbt - tax" + ], + "isin_corroborated": true, + "warnings": [ + "Statement of Profit and Loss: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "audited P&L not machine-readable in this filing", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "543363", + "name": "Prevest Denpro Ltd", + "cin": "L85199JK1999PLC001969", + "isin": "INE0GAO01018", + "industry": "", + "sector": "Healthcare", + "year": "2025", + "pages": 177, + "pl_fields": 11, + "bs_fields": 12, + "dr_fields": 0, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "total assets = total equity and liabilities" + ], + "isin_corroborated": true, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld." + ] + }, + { + "scrip_code": "544141", + "name": "Pune E - Stock Broking Ltd", + "cin": "L67120PN2007PLC130374", + "isin": "INE510U01018", + "industry": "", + "sector": "Financial Services", + "year": "2025", + "pages": 141, + "pl_fields": 14, + "bs_fields": 0, + "dr_fields": 12, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax", + "total_income = revenue + other_income", + "pat = pbt - tax" + ], + "isin_corroborated": false, + "warnings": [ + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "544291", + "name": "Rajesh Power Services Ltd", + "cin": "L31300GJ2010PLC059536", + "isin": "INE0VN801010", + "industry": "", + "sector": "Utilities", + "year": "2025", + "pages": 76, + "pl_fields": 9, + "bs_fields": 0, + "dr_fields": 0, + "identities": [ + "pbt = total_income - total_expenses" + ], + "isin_corroborated": false, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "544189", + "name": "Sattrix Information Security Ltd", + "cin": "U72200GJ2013PLC076845", + "isin": "INE0QUV01010", + "industry": "", + "sector": "Information Technology", + "year": "2025", + "pages": 193, + "pl_fields": 10, + "bs_fields": 0, + "dr_fields": 6, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pbt = total_income - total_expenses" + ], + "isin_corroborated": false, + "warnings": [ + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "543782", + "name": "Sealmatic India Ltd", + "cin": "U26900MH2009PLC197524", + "isin": "INE0O4601016", + "industry": "", + "sector": "Industrials", + "year": "2026", + "pages": 167, + "pl_fields": 11, + "bs_fields": 0, + "dr_fields": 7, + "identities": [ + "pbt = total_income - total_expenses", + "pat = pbt - tax", + "pbt = total_income - total_expenses" + ], + "isin_corroborated": false, + "warnings": [ + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "544458", + "name": "Shree Refrigerations Ltd", + "cin": "L29191PN2006PLC128377", + "isin": "INE0FMZ01045", + "industry": "", + "sector": "Industrials", + "year": "2026", + "pages": 84, + "pl_fields": 13, + "bs_fields": 0, + "dr_fields": 0, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "isin_corroborated": true, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "544267", + "name": "Subam Papers Ltd", + "cin": "U21012TN2004PLC054403", + "isin": "INE0U6201010", + "industry": "", + "sector": "Industrials", + "year": "2025", + "pages": 162, + "pl_fields": 15, + "bs_fields": 0, + "dr_fields": 8, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax", + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "isin_corroborated": false, + "warnings": [ + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "544001", + "name": "Sunita Tools Ltd", + "cin": "U29220MH1988PLC045850", + "isin": "INE0Q1S01010", + "industry": "", + "sector": "Industrials", + "year": "2025", + "pages": 108, + "pl_fields": 11, + "bs_fields": 0, + "dr_fields": 0, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "isin_corroborated": false, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "Balance Sheet: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "543391", + "name": "Suyog Gurbaxani Funicular Ropeways Ltd", + "cin": "L45203MH2010PLC200005", + "isin": "INE07GA01011", + "industry": "", + "sector": "Industrials", + "year": "2025", + "pages": 83, + "pl_fields": 10, + "bs_fields": 0, + "dr_fields": 0, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "isin_corroborated": false, + "warnings": [ + "Directors' Report financial results: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "balance sheet not machine-readable in this filing" + ] + }, + { + "scrip_code": "544406", + "name": "Unified Data Tech Solutions Ltd", + "cin": "L51900MH2010PLC202878", + "isin": "INE1ABX01018", + "industry": "", + "sector": "Information Technology", + "year": "2025", + "pages": 46, + "pl_fields": 0, + "bs_fields": 15, + "dr_fields": 5, + "identities": [ + "total assets = total equity and liabilities", + "total_income = revenue + other_income" + ], + "isin_corroborated": false, + "warnings": [ + "Statement of Profit and Loss: a candidate page was found but its accounting identities did not close, so the figures were not trusted and have been withheld.", + "audited P&L not machine-readable in this filing" + ] + }, + { + "scrip_code": "543931", + "name": "Veefin Solutions Ltd", + "cin": "L72900MH2020PLC347893", + "isin": "INE0Q0M01015", + "industry": "", + "sector": "Information Technology", + "year": "2025", + "pages": 201, + "pl_fields": 15, + "bs_fields": 13, + "dr_fields": 7, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses", + "pat = pbt - tax", + "total assets = total equity and liabilities", + "pbt = total_income - total_expenses" + ], + "isin_corroborated": true, + "warnings": [] + }, + { + "scrip_code": "544310", + "name": "Yash Highvoltage Ltd", + "cin": "L40109GJ2002PLC040833", + "isin": "INE00GK01023", + "industry": "", + "sector": "Industrials", + "year": "2025", + "pages": 54, + "pl_fields": 5, + "bs_fields": 0, + "dr_fields": 6, + "identities": [ + "total_income = revenue + other_income", + "pbt = total_income - total_expenses" + ], + "isin_corroborated": false, + "warnings": [ + "balance sheet not machine-readable in this filing" + ] + } + ], + "count": 40 +} \ No newline at end of file diff --git a/app/backend/primarydraft/drafting/__init__.py b/app/backend/primarydraft/drafting/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app/backend/primarydraft/drafting/llm.py b/app/backend/primarydraft/drafting/llm.py new file mode 100644 index 0000000000000000000000000000000000000000..78192c6c3979343b3686daae024a8eaa1ef736c3 --- /dev/null +++ b/app/backend/primarydraft/drafting/llm.py @@ -0,0 +1,137 @@ +"""Optional Claude narrative layer. + +The model may improve the *prose* around figures. It may not touch the figures. +Every `` element is extracted before the call, replaced with an opaque +placeholder, and restored afterwards; if the model drops or alters a placeholder, +the rewrite is rejected and the deterministic template stands. + +With no API key configured the whole layer is inert and the product is unaffected: +the correctness engine never consults it. +""" + +from __future__ import annotations + +import logging +import os +import re +from typing import Any + +log = logging.getLogger(__name__) + +MODEL = os.environ.get("PRIMARYDRAFT_MODEL", "claude-sonnet-5") +CITE_RE = re.compile(r"]*>.*?", re.S | re.I) +PLACEHOLDER = "โŸฆF{}โŸง" +PLACEHOLDER_RE = re.compile(r"โŸฆF(\d+)โŸง") + +SYSTEM = """You are helping draft sections of an Indian SME IPO offer document \ +(a DRHP under SEBI ICDR Regulations, 2018, Schedule VI Part A). + +You will receive section HTML containing placeholders of the form โŸฆF0โŸง, โŸฆF1โŸง โ€ฆ +Each placeholder stands for a figure that has already been verified against the \ +issuer's filed records. + +Absolute rules: +1. Reproduce every placeholder exactly, once, in the same order. Never invent, \ +alter, merge, drop or reorder one. +2. Never introduce a number, date, name, percentage or amount of your own. If a \ +fact is not present, say it is not disclosed in the source records. +3. Do not add claims about the issuer that the input does not support. No \ +marketing language, no forecasts, no opinions on the merits of the issue. +4. Keep the regulatory register: precise, impersonal, in the style of an Indian \ +offer document. Keep the same

,

    ,
      ,
    • and structure. +5. Return only the rewritten HTML fragment. + +Your job is clarity and flow, nothing else. A single invented figure would be a \ +disclosure failure.""" + + +def llm_status() -> dict[str, Any]: + key = os.environ.get("ANTHROPIC_API_KEY") + try: + import anthropic # noqa: F401 + sdk = True + except ImportError: + sdk = False + return { + "enabled": bool(key) and sdk, + "reason": ("ready" if (key and sdk) + else "ANTHROPIC_API_KEY not set" if not key + else "anthropic SDK not installed (pip install '.[ai]')"), + "model": MODEL, + "affects_correctness": False, + "note": ("The narrative layer is optional. The consistency engine is deterministic " + "and runs identically whether or not this is enabled."), + } + + +def _protect(html: str) -> tuple[str, list[str]]: + cites: list[str] = [] + + def sub(m: re.Match[str]) -> str: + cites.append(m.group(0)) + return PLACEHOLDER.format(len(cites) - 1) + + return CITE_RE.sub(sub, html), cites + + +def _restore(html: str, cites: list[str]) -> str | None: + """Put the figures back: but only if the model preserved them exactly.""" + found = [int(m.group(1)) for m in PLACEHOLDER_RE.finditer(html)] + if sorted(found) != list(range(len(cites))): + return None # a placeholder was dropped, duplicated or invented + return PLACEHOLDER_RE.sub(lambda m: cites[int(m.group(1))], html) + + +def rewrite_section_html(html: str, title: str, client: Any) -> tuple[str, bool]: + protected, cites = _protect(html) + try: + msg = client.messages.create( + model=MODEL, + max_tokens=2000, + system=SYSTEM, + messages=[{ + "role": "user", + "content": (f"Section: {title}\n\nRewrite this fragment for clarity, " + f"obeying every rule.\n\n{protected}"), + }], + ) + out = "".join(b.text for b in msg.content if getattr(b, "type", "") == "text").strip() + except Exception as e: # noqa: BLE001 - never let the model break the draft + log.warning("LLM rewrite failed for %s: %s", title, e) + return html, False + + out = re.sub(r"^```(?:html)?|```$", "", out, flags=re.M).strip() + restored = _restore(out, cites) + if restored is None: + log.warning("LLM rewrite for %s dropped or altered a citation: rejected", title) + return html, False + return restored, True + + +def rewrite_sections(run: Any) -> int: + """Rewrite narrative in place. Returns how many sections the model improved.""" + status = llm_status() + if not status["enabled"]: + log.info("LLM narrative layer disabled: %s", status["reason"]) + return 0 + + import anthropic + + client = anthropic.Anthropic() + n = 0 + for sec in run.sections: + new_html, changed = rewrite_section_html(sec.html, sec.title, client) + if changed: + sec.html = new_html + sec.text = re.sub(r"\s+", " ", re.sub(r"<[^>]+>", " ", new_html)).strip() + sec.word_count = len(sec.text.split()) + sec.narrative_source = "llm" + n += 1 + from ..models import Decision + run.decisions.append(Decision( + actor="system", action="generate", + detail=(f"Claude rewrote narrative in {n} of {len(run.sections)} sections. " + "Every figure was held fixed and verified after generation; " + "rewrites that altered a citation were rejected."), + )) + return n diff --git a/app/backend/primarydraft/drafting/templates.py b/app/backend/primarydraft/drafting/templates.py new file mode 100644 index 0000000000000000000000000000000000000000..a27085a2ef13a32b406fc7928b2d0b3eedf70af6 --- /dev/null +++ b/app/backend/primarydraft/drafting/templates.py @@ -0,0 +1,612 @@ +"""Draft the offer document from the ledger: and only from the ledger. + +Templates never contain a figure. They contain tokens: + + {{fact:fin.current.revenue_from_operations}} + +which the renderer resolves against the Disclosure Ledger into a cited span. A +number that is not a token cannot reach the page, which is what lets rule PRV-001 +mechanically prove that no unsourced figure was published. If a token names a +fact the ledger does not hold, the renderer emits a visible abstention rather +than inventing a value. +""" + +from __future__ import annotations + +import html +import re +from typing import Any + +from ..issue import IssueTerms +from ..models import DraftSection, Fact, FactStatus, Unit + +TOKEN_RE = re.compile(r"\{\{fact:([a-zA-Z0-9_.\-]+)\}\}") +ISSUE_RE = re.compile(r"\{\{issue:([a-zA-Z0-9_.\-]+)\}\}") +#: Any bare digit run in rendered prose is a bug: PRV-001 hunts for these. +BARE_NUMBER_RE = re.compile(r"(?#;])\d[\d,]*(?:\.\d+)?(?![\w<])") + + +def fmt_value(f: Fact) -> str: + v = f.value + if isinstance(v, (int, float)): + if f.unit == Unit.INR: + a = abs(v) + if a >= 1_00_00_000: + return f"โ‚น{v / 1_00_00_000:,.2f} crore" + if a >= 1_00_000: + return f"โ‚น{v / 1_00_000:,.2f} lakh" + return f"โ‚น{v:,.2f}" + if f.unit == Unit.PCT: + return f"{v:,.2f}%" + if f.unit == Unit.SHARES: + return f"{v:,.0f}" + if f.unit == Unit.RATIO: + return f"{v:,.2f}" + return f"{v:,.2f}" + return str(v) + + +def fmt_inr(v: float) -> str: + a = abs(v) + if a >= 1_00_00_000: + return f"โ‚น{v / 1_00_00_000:,.2f} crore" + if a >= 1_00_000: + return f"โ‚น{v / 1_00_000:,.2f} lakh" + return f"โ‚น{v:,.2f}" + + +STATUS_CLASS = { + FactStatus.VERIFIED: "cite-verified", + FactStatus.DERIVED: "cite-derived", + FactStatus.UNVERIFIED: "cite-unverified", + FactStatus.CONFLICTED: "cite-conflicted", + FactStatus.ATTESTED: "cite-attested", + FactStatus.RESOLVED: "cite-resolved", +} + + +class Renderer: + """Resolves tokens against the ledger, recording exactly what it used.""" + + def __init__(self, facts: dict[str, Fact], issue: IssueTerms | None = None) -> None: + self.facts = facts + self.issue = issue + self.used: set[str] = set() + self.missing: set[str] = set() + + def _issue_value(self, key: str) -> str | None: + if not self.issue: + return None + mapping: dict[str, Any] = { + "price": fmt_inr(self.issue.price_per_share), + "face_value": fmt_inr(self.issue.face_value), + "fresh_shares": f"{self.issue.fresh_issue_shares:,.0f}", + "ofs_shares": f"{self.issue.ofs_shares:,.0f}", + "total_shares": f"{self.issue.total_issue_shares:,.0f}", + "fresh_value": fmt_inr(self.issue.fresh_issue_value), + "ofs_value": fmt_inr(self.issue.ofs_value), + "total_value": fmt_inr(self.issue.total_issue_value), + "expenses": fmt_inr(self.issue.issue_expenses), + "net_proceeds": fmt_inr(self.issue.net_proceeds), + "platform": self.issue.listing_platform, + } + v = mapping.get(key) + return str(v) if v is not None else None + + def render(self, template: str) -> str: + def fact_sub(m: re.Match[str]) -> str: + fid = m.group(1) + f = self.facts.get(fid) + if f is None: + self.missing.add(fid) + # Abstain visibly rather than invent. + return ('[not disclosed in the ' + 'source records]') + self.used.add(fid) + p = f.provenance[0] if f.provenance else None + cls = STATUS_CLASS.get(f.status, "cite-unverified") + return ( + f'' + f"{html.escape(fmt_value(f))}" + ) + + def issue_sub(m: re.Match[str]) -> str: + key = m.group(1) + v = self._issue_value(key) + if v is None: + return ('[issue term not supplied]') + return (f'{html.escape(v)}') + + out = TOKEN_RE.sub(fact_sub, template) + return ISSUE_RE.sub(issue_sub, out) + + def unbound_numbers(self, rendered_html: str) -> list[str]: + """Bare digits left in prose after rendering: each one is a PRV-001 breach. + + A cited figure is bound by definition, so `` elements are removed + WITH their contents before scanning. Statutory references ("Regulation + 229(6)", "Companies Act, 2013") and page citations ("p.39") are legal + text, not disclosure figures, and are removed too. Whatever survives is a + number that reached the page without a source: which must never happen. + """ + s = re.sub(r"]*>.*?", " ", rendered_html, flags=re.S | re.I) + s = re.sub(r"]*class=\"(?:cite-absent|prov)\"[^>]*>.*?", " ", s, + flags=re.S | re.I) + s = re.sub(r"<[^>]+>", " ", s) + for pat in ( + # statutory references + # "Regulation 23", "Regulations 236 to 239", "Reg 229(6)" + r"(?:Regulations?|Regs?\.?|Sections?|Schedules?|Clauses?|Parts?|Chapters?)\s+" + r"[\dIVXLC]+(?:\s*\([\da-z ]+\))*" + r"(?:\s*(?:to|and|,|-|โ€“)\s*[\dIVXLC]+(?:\s*\([\da-z ]+\))*)*", + r"Act,?\s*\d{4}", + r"\b(?:19|20)\d{2}\b", # years + r"\bp\.\s*\d+\b", # page citations + r"\bFY\s*\d{2,4}\b", + ): + s = re.sub(pat, " ", s, flags=re.I) + return [m.group() for m in BARE_NUMBER_RE.finditer(s)] + + +# ------------------------------------------------------------------- templates + +def _proposed(text: str, locator: str) -> str: + """Wrap a proposed-issue figure so it is cited as user input, not as a fact.""" + return (f'{html.escape(text)}') + + +def _schedule_cells(o: Any) -> str: + return "; ".join(f"{html.escape(k)}: {_proposed(fmt_inr(v), 'deployment schedule')}" + for k, v in o.schedule.items()) + + +def _objects_table(issue: IssueTerms | None) -> str: + if not issue or not issue.objects: + return "

      No objects of the issue have been supplied.

      " + rows = "".join( + f"
      " + f'" + f'' + for o in issue.objects + ) + total = sum(o.amount for o in issue.objects) + return ( + '
      {html.escape(o.label)}' + f"{fmt_inr(o.amount)}{_schedule_cells(o) or "-"}
      ' + '' + f'{rows}' + f'' + f'' + f'
      Object of the issueAmountDeployment schedule
      Total{_proposed(fmt_inr(total), "sum of objects")}
      Net proceeds available{_proposed(fmt_inr(issue.net_proceeds), "gross fresh issue less issue expenses")}
      ' + ) + + +SECTIONS: list[dict[str, str]] = [ + { + "id": "general_information", + "number": "I", + "title": "General Information", + "icdr_clause": "ICDR Sch VI Pt A (I) / (IV)", + "body": """ +

      The Issuer is {{fact:co.name}}, a company incorporated in India and bearing +Corporate Identity Number {{fact:co.cin}}. The equity shares of the Issuer bear ISIN +{{fact:co.isin}} and are admitted to trading on the {{fact:co.bse_group}} group of the +BSE SME platform.

      + +

      The Issuer operates in the {{fact:co.industry}} industry within the +{{fact:co.sector}} sector. The equity shares have a face value of +{{fact:co.face_value}} each.

      + +

      The statutory auditors, the registrar to the issue, the bankers to the issue and the +lead manager are to be named by the merchant banker. PrimaryDraft does not assert these +particulars: they are not present in the source records ingested for this draft.

      +""", + }, + { + "id": "capital_structure", + "number": "II", + "title": "Capital Structure", + "icdr_clause": "ICDR Sch VI Pt A (V)", + "body": """ +

      As at the date of the latest audited balance sheet, the issued, subscribed and paid-up +equity share capital of the Issuer was {{fact:fin.current.share_capital}}, comprising +{{fact:cap.shares_outstanding}} equity shares of face value {{fact:co.face_value}} each. +This figure is derived by dividing the paid-up capital as stated in the audited balance +sheet by the face value per share recorded on the exchange master.

      + +

      The Issuer proposes a fresh issue of {{issue:fresh_shares}} equity shares at +{{issue:price}} per share, aggregating to {{issue:fresh_value}}, together with an offer +for sale of {{issue:ofs_shares}} equity shares aggregating to {{issue:ofs_value}}. The +total issue therefore comprises {{issue:total_shares}} equity shares aggregating to +{{issue:total_value}}, proposed to be listed on {{issue:platform}}.

      + +

      Estimated issue expenses of {{issue:expenses}} are to be met out of the gross proceeds +of the fresh issue, leaving net proceeds of {{issue:net_proceeds}} available to the +Issuer. The offer for sale accrues to the selling shareholders and no part of it is +received by the Issuer.

      + +

      The minimum promoter contribution, the lock-in of promoter shareholding under +Regulations 236 to 239, the history of the equity share capital and the shareholding +pattern before and after the issue must be completed by the merchant banker from the +Issuer's share register, which is not part of the records ingested for this draft.

      +""", + }, + { + "id": "objects_of_issue", + "number": "III", + "title": "Objects of the Issue", + "icdr_clause": "ICDR Sch VI Pt A (VI)", + "body": """ +

      The Issuer proposes to deploy the net proceeds of the fresh issue, being +{{issue:net_proceeds}} after meeting estimated issue expenses of {{issue:expenses}} out of +gross proceeds of {{issue:fresh_value}}, towards the objects set out below.

      + +__OBJECTS_TABLE__ + +

      The objects of the issue and the year-wise deployment schedule are proposed terms +entered by the merchant banker. PrimaryDraft reconciles the stated objects against the +net proceeds available and against the limits applicable to an SME issue, and reports any +difference. It does not itself determine the objects.

      + +

      The utilisation of the net proceeds is to be monitored in accordance with the +applicable provisions, and any deployment prior to the issue is to be certified by the +statutory auditors.

      +""", + }, + { + "id": "basis_for_issue_price", + "number": "IV", + "title": "Basis for the Issue Price", + "icdr_clause": "ICDR Sch VI Pt A (VII)", + "body": """ +

      The issue price of {{issue:price}} per equity share of face value +{{fact:co.face_value}} has been determined by the Issuer in consultation with the lead +manager. The quantitative factors set out below are drawn from the restated financial +information in this draft.

      + +

      Basic earnings per share for the latest financial year, as stated in the audited +Statement of Profit and Loss, is {{fact:fin.current.eps_basic}}. Independently computing +profit after tax of {{fact:fin.current.pat}} over {{fact:cap.shares_outstanding}} equity +shares gives {{fact:fin.current.eps_computed}} per share. The consistency engine +reconciles these two figures and reports any difference, because earnings per share is +the principal driver of the issue price.

      + +

      Net worth as at the latest balance sheet date is {{fact:fin.current.net_worth}}, giving +a net asset value of {{fact:fin.current.nav_per_share}} per equity share on a pre-issue +basis. Return on net worth for the year was {{fact:fin.current.ronw}}.

      + +

      Revenue from operations grew by {{fact:fin.revenue_growth}} over the preceding +financial year. A comparison with listed industry peers, and the qualitative factors +supporting the issue price, must be supplied by the merchant banker: peer data is market +information and is not present in the Issuer's own records.

      +""", + }, + { + "id": "financial_information", + "number": "V", + "title": "Financial Information", + "icdr_clause": "ICDR Sch VI Pt A (IX)", + "body": """ +

      The financial information set out below has been extracted from the audited financial +statements of the Issuer for the latest financial year, together with the comparative +figures for the preceding year. Every figure carries a citation to the page of the filing +from which it was read.

      + +

      Revenue from operations for the latest financial year was +{{fact:fin.current.revenue_from_operations}}, against +{{fact:fin.previous.revenue_from_operations}} in the preceding year. Other income was +{{fact:fin.current.other_income}}, giving total income of +{{fact:fin.current.total_income}}.

      + +

      Total expenses for the year were {{fact:fin.current.total_expenses}}, of which finance +costs were {{fact:fin.current.finance_costs}} and depreciation and amortisation were +{{fact:fin.current.depreciation}}. Profit before tax was {{fact:fin.current.pbt}} and +profit after tax was {{fact:fin.current.pat}}, against +{{fact:fin.previous.pat}} in the preceding year.

      + +

      As at the balance sheet date, equity share capital was +{{fact:fin.current.share_capital}} and reserves and surplus were +{{fact:fin.current.reserves_surplus}}, giving net worth of +{{fact:fin.current.net_worth}}. Total assets were {{fact:fin.current.total_assets}}, +equal to total equity and liabilities of +{{fact:fin.current.total_equity_liabilities}}.

      + +

      Earnings before interest, tax, depreciation and amortisation, derived from the +foregoing, was {{fact:fin.current.ebitda}} for the latest financial year. This figure +determines eligibility to issue on the SME platform under Regulation 229(6).

      + +

      The restated financial statements required by Schedule VI, the capitalisation +statement and the statement of financial indebtedness must be prepared by the Issuer's +auditors. This draft reproduces the audited figures as filed and does not restate +them.

      +""", + }, + { + "id": "mdna", + "number": "VI", + "title": "Management Discussion and Analysis", + "icdr_clause": "ICDR Sch VI Pt A (IX)(5)", + "body": """ +

      Revenue from operations for the latest financial year was +{{fact:fin.current.revenue_from_operations}}, compared with +{{fact:fin.previous.revenue_from_operations}} in the preceding financial year, a movement +of {{fact:fin.revenue_growth}}.

      + +

      Profit after tax was {{fact:fin.current.pat}}, compared with +{{fact:fin.previous.pat}} in the preceding year. Finance costs of +{{fact:fin.current.finance_costs}} and depreciation and amortisation of +{{fact:fin.current.depreciation}} were charged during the year.

      + +

      The figures in this section are the same ledger facts that appear in the Financial +Information section. Where a figure is stated in more than one section of the Issuer's +own filing, the consistency engine compares every occurrence and reports any difference, +since a discrepancy between the financial statements and the management discussion is a +recurring cause of exchange observations.

      + +

      A narrative discussion of the factors affecting the results of operations, of +significant developments after the balance sheet date, and of known trends and +uncertainties, must be supplied by the Issuer's management.

      +""", + }, + { + "id": "related_party", + "number": "VII", + "title": "Related Party Transactions", + "icdr_clause": "ICDR Sch VI Pt A (IX)(3)", + "body": """ +

      The related party transactions set out below were read from the related party +disclosures in the audited financial statements. Each is tagged to the page on which it +appears.

      + +__RPT_TABLE__ + +

      Each of these items remains unverified in the disclosure ledger until the counterparty +relationship and the amount are confirmed against the audited note. PrimaryDraft +deliberately does not classify a counterparty as a promoter, a director or a group +company on the strength of a line item alone.

      +""", + }, + { + "id": "risk_factors", + "number": "VIII", + "title": "Risk Factors", + "icdr_clause": "ICDR Sch VI Pt A (II)", + "body": """ +

      The risk factors below are generated only where a specific, sourced figure in the +disclosure ledger supports them. Schedule VI requires risk factors to be specific, +quantified where possible, and ordered by materiality. A generic risk factor that is not +grounded in the Issuer's own records is not drafted here.

      + +__RISK_LIST__ + +

      The complete set of internal and external risk factors, ordered by materiality, must +be settled by the Issuer and the merchant banker. The consistency engine reports which +mandated risk-factor heads are not yet covered by this draft.

      +""", + }, + { + "id": "litigation", + "number": "IX", + "title": "Outstanding Litigation and Material Developments", + "icdr_clause": "ICDR Sch VI Pt A (X)", + "body": """ +

      Schedule VI requires disclosure of outstanding litigation against the Issuer, its +promoters, its directors and its group companies, together with outstanding dues to +creditors and any material developments since the last balance sheet date.

      + +

      The records ingested for this draft: the Issuer's filed annual report and the +exchange master: do not contain a machine-readable schedule of outstanding litigation. +PrimaryDraft therefore makes no assertion in this section. It records the gap rather than +filling it, and the ICDR coverage map reports this clause as not covered.

      + +

      The merchant banker must obtain the litigation certificate from the Issuer's legal +counsel and reconcile the count and aggregate amount of matters against the contingent +liabilities note in the audited financial statements.

      +""", + }, + { + "id": "our_business", + "number": "X", + "title": "Our Business", + "icdr_clause": "ICDR Sch VI Pt A (VIII)", + "body": """ +

      The Issuer operates in the {{fact:co.industry}} industry within the +{{fact:co.sector}} sector, as classified on the exchange master.

      + +

      Revenue from operations for the latest financial year was +{{fact:fin.current.revenue_from_operations}}. Property, plant and equipment carried in +the audited balance sheet was {{fact:fin.current.ppe}} and inventories were +{{fact:fin.current.inventories}}.

      + +

      A description of the Issuer's operations, its products and services, its properties, +its customers and suppliers, its employees and its competitive strengths must be prepared +by the Issuer. These are narrative disclosures that cannot be derived from financial +records, and PrimaryDraft does not generate them.

      +""", + }, + { + "id": "our_management", + "number": "XI", + "title": "Our Management", + "icdr_clause": "ICDR Sch VI Pt A (VIII)(5)", + "body": """ +

      The Director Identification Numbers appearing in the Issuer's filed annual report are +listed in the disclosure ledger and are reproduced in the management section of this +draft.

      + +__DIN_LIST__ + +

      The names, ages, addresses, qualifications, terms of office and remuneration of the +directors and key managerial personnel, and the details of borrowing powers and corporate +governance, must be completed by the merchant banker from the Issuer's statutory +registers. A Director Identification Number alone does not establish the identity or role +of a director, and PrimaryDraft does not infer one.

      +""", + }, + { + "id": "declaration", + "number": "XII", + "title": "Declaration", + "icdr_clause": "ICDR Sch VI Pt A (XII)(2)", + "body": """ +

      All relevant provisions of the Companies Act, 2013 and the rules made thereunder, and +the guidelines, directions and regulations issued by the Securities and Exchange Board of +India applicable to this issue, are to be complied with, and no statement made in the +offer document is to contravene those provisions.

      + +

      This draft was assembled by PrimaryDraft from the Issuer's own filed records. It is +decision-support and is not an offer document. It has not been certified by a merchant +banker, it has not been filed with any exchange or with the Securities and Exchange Board +of India, and it must not be circulated as an offer document.

      + +

      The due diligence certificate required of the merchant banker under Regulation 23, and +the declaration by the directors of the Issuer, remain the responsibility of the persons +required to give them. PrimaryDraft moves the work; it does not move the signature.

      +""", + }, +] + + +def _rpt_table(facts: dict[str, Fact]) -> str: + rows = [] + for fid, f in sorted(facts.items()): + if not fid.startswith("rpt."): + continue + p = f.provenance[0] if f.provenance else None + label = f.label.replace("Related party transaction: ", "") + rows.append( + f"{html.escape(label)}" + f'' + f"{html.escape(fmt_value(f))}" + f'{html.escape(p.locator if p else "")}' + ) + if not rows: + return ("

      No related party transactions were machine-readable in the source " + "records. This is a coverage gap and is reported as such.

      ") + return ('' + '' + + "".join(rows) + "
      TransactionAmountSource
      ") + + +def _din_list(facts: dict[str, Fact]) -> str: + dins = [f for fid, f in sorted(facts.items()) if fid.startswith("mgmt.din.")] + if not dins: + return ("

      No Director Identification Numbers were machine-readable in the source " + "records.

      ") + items = "".join( + f'
    • ' + f"DIN {html.escape(str(f.value))}
    • " + for f in dins + ) + return f"
        {items}
      " + + +def _risk_list(facts: dict[str, Fact], issue: IssueTerms | None) -> str: + """Risk factors only where a sourced figure actually supports one.""" + risks: list[str] = [] + + def val(fid: str) -> float | None: + f = facts.get(fid) + return float(f.value) if f and isinstance(f.value, (int, float)) else None + + pat = val("fin.current.pat") + if pat is not None and pat < 0: + risks.append( + "The Issuer incurred a loss of {{fact:fin.current.pat}} in the latest financial " + "year. Continued losses would erode net worth and may affect the Issuer's ability " + "to fund the objects of the issue from internal accruals.") + + ebitda = val("fin.current.ebitda") + if ebitda is not None and ebitda < 1_00_00_000: + risks.append( + "Operating profit for the latest financial year, derived as " + "{{fact:fin.current.ebitda}}, is below the threshold prescribed by Regulation " + "229(6) for eligibility to issue on the SME platform. Eligibility depends on the " + "position across three financial years and must be established by the merchant " + "banker.") + + growth = val("fin.revenue_growth") + if growth is not None and growth < 0: + risks.append( + "Revenue from operations declined by {{fact:fin.revenue_growth}} compared with the " + "preceding financial year. A sustained decline in revenue would adversely affect " + "the Issuer's results of operations and financial condition.") + + fc, pbt = val("fin.current.finance_costs"), val("fin.current.pbt") + if fc and pbt and pbt > 0 and fc > pbt * 0.5: + risks.append( + "Finance costs of {{fact:fin.current.finance_costs}} are substantial in relation " + "to profit before tax of {{fact:fin.current.pbt}}. The Issuer's results are " + "sensitive to movements in interest rates and to its level of indebtedness.") + + tr = val("fin.current.trade_receivables") + rev = val("fin.current.revenue_from_operations") + if tr and rev and tr > rev * 0.35: + risks.append( + "Trade receivables of {{fact:fin.current.trade_receivables}} are high in relation " + "to revenue from operations of {{fact:fin.current.revenue_from_operations}}. Delay " + "or default in collection would adversely affect working capital.") + + unverified = sum(1 for f in facts.values() + if f.status == FactStatus.UNVERIFIED and f.is_load_bearing) + if unverified: + risks.append( + "A number of figures in this draft were read from a single location in the " + "Issuer's records with no corroborating source. They are marked unverified in the " + "disclosure ledger and must be confirmed by the merchant banker before filing.") + + if issue and issue.objects: + risks.append( + "The objects of the issue, aggregating to {{issue:net_proceeds}} of net proceeds, " + "have not been appraised by any bank or financial institution and are based on " + "management estimates. Deployment is subject to change.") + + if not risks: + return ("

      No risk factor in this draft is supported by a specific sourced figure. " + "The full set must be settled by the Issuer and the merchant banker.

      ") + return "
        " + "".join(f"
      1. {r}
      2. " for r in risks) + "
      " + + +def build_sections(facts: dict[str, Fact], issue: IssueTerms | None = None + ) -> tuple[list[DraftSection], Renderer]: + """Render every section from the ledger, recording which facts were used.""" + r = Renderer(facts, issue) + out: list[DraftSection] = [] + + for spec in SECTIONS: + body = spec["body"] + body = body.replace("__OBJECTS_TABLE__", _objects_table(issue)) + body = body.replace("__RPT_TABLE__", _rpt_table(facts)) + body = body.replace("__DIN_LIST__", _din_list(facts)) + body = body.replace("__RISK_LIST__", _risk_list(facts, issue)) + + before = set(r.used) + rendered = r.render(body) + used_here = sorted(r.used - before) + + text = re.sub(r"<[^>]+>", "", rendered) + text = re.sub(r"\n{2,}", "\n\n", re.sub(r"[ \t]+", " ", text)).strip() + + out.append(DraftSection( + id=spec["id"], number=spec["number"], title=spec["title"], + icdr_clause=spec["icdr_clause"], html=rendered.strip(), text=text, + fact_ids=used_here, word_count=len(text.split()), + )) + return out, r diff --git a/app/backend/primarydraft/engine/__init__.py b/app/backend/primarydraft/engine/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app/backend/primarydraft/engine/icdr.py b/app/backend/primarydraft/engine/icdr.py new file mode 100644 index 0000000000000000000000000000000000000000..d125bd9c3aae0042b27738cb66c75001a17509af --- /dev/null +++ b/app/backend/primarydraft/engine/icdr.py @@ -0,0 +1,161 @@ +"""SEBI (ICDR) Regulations, 2018: Schedule VI Part A, as a machine-readable map. + +Schedule VI applies to SME issues through Regulation 246. This module encodes the +disclosure structure so coverage can be *measured* rather than asserted, and so a +gap is reported as a gap instead of being quietly omitted. + +Also encodes the numeric thresholds the engine tests against, including the +8 March 2025 SME amendments (OFS cap, general-corporate-purposes cap). +""" + +from __future__ import annotations + +from dataclasses import dataclass + + +@dataclass(frozen=True) +class Clause: + id: str + clause: str # citation as it appears in the regulation + title: str + part: str + section_id: str | None # draft section that discharges it, if we draft it + mandatory: bool = True + + +# --------------------------------------------------------------------- clause map + +CLAUSES: list[Clause] = [ + # (I) Cover pages + Clause("cover.front", "Sch VI Pt A (I)(A)", "Front cover page", "Introductory", "general_information"), + Clause("cover.issuer", "Sch VI Pt A (I)(A)(1)", "Name, CIN, registered office and contact details", "Introductory", "general_information"), + Clause("cover.promoters", "Sch VI Pt A (I)(A)(3)", "Names of the promoters", "Introductory", "promoters"), + Clause("cover.issue", "Sch VI Pt A (I)(A)(5)", "Nature, size and price of the issue", "Introductory", "capital_structure"), + Clause("cover.lm", "Sch VI Pt A (I)(A)(9)", "Lead manager and registrar details", "Introductory", None), + Clause("cover.listing", "Sch VI Pt A (I)(A)(11)", "Proposed listing platform", "Introductory", "general_information"), + + # (II) Risk factors + Clause("risk.internal", "Sch VI Pt A (II)(1)", "Internal risk factors", "Risk Factors", "risk_factors"), + Clause("risk.external", "Sch VI Pt A (II)(2)", "External risk factors", "Risk Factors", "risk_factors"), + Clause("risk.materiality", "Sch VI Pt A (II)(3)", "Risk factors ordered by materiality with quantification", "Risk Factors", "risk_factors"), + Clause("risk.litigation", "Sch VI Pt A (II)(4)", "Risk factors for outstanding litigation", "Risk Factors", "risk_factors"), + + # (III) Introduction + Clause("intro.summary", "Sch VI Pt A (III)(1)", "Summary of the offer document", "Introduction", "general_information"), + Clause("intro.definitions", "Sch VI Pt A (III)(2)", "Definitions and abbreviations", "Introduction", None), + Clause("intro.presentation", "Sch VI Pt A (III)(3)", "Presentation of financial and market data", "Introduction", "financial_information"), + Clause("intro.forward", "Sch VI Pt A (III)(4)", "Forward-looking statements", "Introduction", None), + + # General information + Clause("gen.registered", "Sch VI Pt A (IV)(1)", "Registered and corporate office", "General Information", "general_information"), + Clause("gen.board", "Sch VI Pt A (IV)(2)", "Board of directors", "General Information", "our_management"), + Clause("gen.cs", "Sch VI Pt A (IV)(3)", "Company secretary and compliance officer", "General Information", "our_management"), + Clause("gen.auditors", "Sch VI Pt A (IV)(5)", "Statutory auditors", "General Information", "general_information"), + Clause("gen.bankers", "Sch VI Pt A (IV)(6)", "Bankers to the issue and to the company", "General Information", None), + + # Capital structure + Clause("cap.share_capital", "Sch VI Pt A (V)(1)", "Share capital: authorised, issued, subscribed and paid-up", "Capital Structure", "capital_structure"), + Clause("cap.history", "Sch VI Pt A (V)(2)", "History of the equity share capital", "Capital Structure", "capital_structure"), + Clause("cap.shareholding", "Sch VI Pt A (V)(3)", "Shareholding pattern: pre-issue and post-issue", "Capital Structure", "capital_structure"), + Clause("cap.promoter_holding", "Sch VI Pt A (V)(4)", "Promoter and promoter group shareholding", "Capital Structure", "promoters"), + Clause("cap.mpc", "Sch VI Pt A (V)(5)", "Minimum promoter contribution and lock-in", "Capital Structure", "capital_structure"), + Clause("cap.waca", "Sch VI Pt A (V)(6)", "Weighted average cost of acquisition of promoter shares", "Capital Structure", None), + Clause("cap.top10", "Sch VI Pt A (V)(8)", "Top ten shareholders", "Capital Structure", None), + + # Objects of the issue + Clause("obj.objects", "Sch VI Pt A (VI)(1)", "Objects of the issue", "Objects", "objects_of_issue"), + Clause("obj.proceeds", "Sch VI Pt A (VI)(2)", "Gross proceeds, issue expenses and net proceeds", "Objects", "objects_of_issue"), + Clause("obj.schedule", "Sch VI Pt A (VI)(3)", "Means of finance and year-wise deployment schedule", "Objects", "objects_of_issue"), + Clause("obj.gcp", "Sch VI Pt A (VI)(4)", "General corporate purposes: limit and disclosure", "Objects", "objects_of_issue"), + Clause("obj.monitoring", "Sch VI Pt A (VI)(5)", "Monitoring of utilisation of proceeds", "Objects", "objects_of_issue"), + Clause("obj.interest", "Sch VI Pt A (VI)(6)", "Interest of promoters and directors in the objects", "Objects", None), + + # Basis for issue price + Clause("price.qualitative", "Sch VI Pt A (VII)(1)", "Qualitative factors for the issue price", "Basis for Issue Price", "basis_for_issue_price"), + Clause("price.quantitative", "Sch VI Pt A (VII)(2)", "Quantitative factors: EPS, P/E, RoNW, NAV", "Basis for Issue Price", "basis_for_issue_price"), + Clause("price.peer", "Sch VI Pt A (VII)(3)", "Comparison with listed industry peers", "Basis for Issue Price", "basis_for_issue_price"), + Clause("price.justification", "Sch VI Pt A (VII)(4)", "Justification of the issue price", "Basis for Issue Price", "basis_for_issue_price"), + + # About the issuer + Clause("biz.industry", "Sch VI Pt A (VIII)(1)", "Industry overview", "About the Issuer", "our_business"), + Clause("biz.business", "Sch VI Pt A (VIII)(2)", "Business of the issuer", "About the Issuer", "our_business"), + Clause("biz.regulations", "Sch VI Pt A (VIII)(3)", "Key industry regulations", "About the Issuer", None), + Clause("biz.history", "Sch VI Pt A (VIII)(4)", "History and corporate structure", "About the Issuer", "our_business"), + Clause("biz.management", "Sch VI Pt A (VIII)(5)", "Our management", "About the Issuer", "our_management"), + Clause("biz.promoters", "Sch VI Pt A (VIII)(6)", "Our promoters and promoter group", "About the Issuer", "promoters"), + Clause("biz.group", "Sch VI Pt A (VIII)(7)", "Group companies", "About the Issuer", None), + Clause("biz.dividend", "Sch VI Pt A (VIII)(8)", "Dividend policy", "About the Issuer", "financial_information"), + + # Financial information + Clause("fin.restated", "Sch VI Pt A (IX)(1)", "Restated financial statements", "Financial Information", "financial_information"), + Clause("fin.accounting", "Sch VI Pt A (IX)(2)", "Significant accounting policies and notes", "Financial Information", "financial_information"), + Clause("fin.rpt", "Sch VI Pt A (IX)(3)", "Related party transactions", "Financial Information", "related_party"), + Clause("fin.capitalisation", "Sch VI Pt A (IX)(4)", "Capitalisation statement", "Financial Information", "financial_information"), + Clause("fin.mdna", "Sch VI Pt A (IX)(5)", "Management discussion and analysis", "Financial Information", "mdna"), + Clause("fin.indebtedness", "Sch VI Pt A (IX)(6)", "Statement of financial indebtedness", "Financial Information", "financial_information"), + + # Legal and other information + Clause("legal.litigation", "Sch VI Pt A (X)(1)", "Outstanding litigation and material developments", "Legal", "litigation"), + Clause("legal.dues", "Sch VI Pt A (X)(2)", "Outstanding dues to creditors", "Legal", "litigation"), + Clause("legal.approvals", "Sch VI Pt A (X)(3)", "Government and other statutory approvals", "Legal", None), + Clause("legal.other", "Sch VI Pt A (X)(4)", "Other regulatory and statutory disclosures", "Legal", None), + + # Offering and other information + Clause("offer.terms", "Sch VI Pt A (XI)(1)", "Terms of the issue", "Offering Information", "capital_structure"), + Clause("offer.structure", "Sch VI Pt A (XI)(2)", "Issue structure", "Offering Information", "capital_structure"), + Clause("offer.procedure", "Sch VI Pt A (XI)(3)", "Issue procedure", "Offering Information", None), + Clause("other.contracts", "Sch VI Pt A (XII)(1)", "Material contracts and documents for inspection", "Other Information", None), + Clause("other.declaration", "Sch VI Pt A (XII)(2)", "Declaration", "Other Information", "declaration"), +] + +CLAUSE_BY_ID = {c.id: c for c in CLAUSES} + + +# ------------------------------------------------------------------- thresholds + +class Thresholds: + """Numeric limits the deterministic engine tests against.""" + + #: Reg 229(6): SME issuer operating-profit (EBITDA) eligibility. + SME_MIN_EBITDA_INR = 1_00_00_000 # โ‚น1 crore + SME_MIN_EBITDA_YEARS = 2 # in 2 of the last 3 financial years + SME_EBITDA_LOOKBACK = 3 + + #: ICDR amendment effective 8 March 2025: offer for sale cap for SME IPOs. + SME_MAX_OFS_PCT_OF_ISSUE = 20.0 + + #: ICDR amendment effective 8 March 2025: general corporate purposes cap. + SME_MAX_GCP_PCT_OF_PROCEEDS = 15.0 + SME_MAX_GCP_ABSOLUTE_INR = 10_00_00_000 # โ‚น10 crore + + #: Reg 236: minimum promoter contribution, and Reg 238/239 lock-in. + MIN_PROMOTER_CONTRIBUTION_PCT = 20.0 + MPC_LOCK_IN_YEARS = 3 + PROMOTER_EXCESS_LOCK_IN_YEARS = 1 + + #: Reg 229(1): SME platform post-issue paid-up capital ceiling. + SME_MAX_POST_ISSUE_CAPITAL_INR = 25_00_00_000 # โ‚น25 crore + + #: Tolerance for comparing two printings of the same figure (rounding). + REL_TOL = 0.005 + #: Tolerance for derived arithmetic (EPS, NAV) against a printed figure. + DERIVED_TOL = 0.02 + + +def coverage_for(drafted_section_ids: set[str]) -> list[dict[str, object]]: + """Measure Schedule VI coverage against the sections we actually drafted.""" + out: list[dict[str, object]] = [] + for c in CLAUSES: + covered = bool(c.section_id and c.section_id in drafted_section_ids) + out.append({ + "clause_id": c.id, + "clause": c.clause, + "title": c.title, + "part": c.part, + "covered": covered, + "section_id": c.section_id, + "reason": ("" if covered else + "Not drafted by this prototype: deliberately out of the 7 deep " + "sections; the merchant banker supplies it."), + }) + return out diff --git a/app/backend/primarydraft/engine/rules.py b/app/backend/primarydraft/engine/rules.py new file mode 100644 index 0000000000000000000000000000000000000000..97253ae1d964f1645aaa7b81f131c3559c14d863 --- /dev/null +++ b/app/backend/primarydraft/engine/rules.py @@ -0,0 +1,1106 @@ +"""The deterministic consistency engine. + +There is no LLM in this module and there never will be: `tests/test_no_llm.py` +asserts it at the import level. Every verdict here is plain, auditable Python that +a regulator can read. + +Rules operate on two inputs: + * the Disclosure Ledger, built from the company's REAL filed annual report + * the proposed issue terms, which the merchant banker enters (real user input) + +Nothing is seeded. If a rule fires, it fires because the real numbers disagree. +""" + +from __future__ import annotations + +from typing import Any, Callable + +from ..models import ( + Evidence, + Fact, + FactStatus, + Finding, + Resolution, + RuleResult, + Severity, + Unit, +) +from .icdr import Thresholds as T + +Ctx = dict[str, Any] +RuleFn = Callable[[dict[str, Fact], Ctx], RuleResult] + +REGISTRY: list[tuple[str, str, str, RuleFn]] = [] + + +def rule(rule_id: str, title: str, icdr_ref: str = "") -> Callable[[RuleFn], RuleFn]: + def deco(fn: RuleFn) -> RuleFn: + REGISTRY.append((rule_id, title, icdr_ref, fn)) + return fn + return deco + + +# ------------------------------------------------------------------- utilities + +def fmt_inr(v: float | None) -> str: + """Format rupees the way an Indian offer document does.""" + if v is None: + return "n/a" + a = abs(v) + if a >= 1_00_00_000: + return f"โ‚น{v / 1_00_00_000:,.2f} crore" + if a >= 1_00_000: + return f"โ‚น{v / 1_00_000:,.2f} lakh" + return f"โ‚น{v:,.2f}" + + +def fmt(f: Fact | None) -> str: + if f is None: + return "-" + if f.unit == Unit.INR: + return fmt_inr(_num(f)) + if f.unit == Unit.PCT: + return f"{_num(f):.2f}%" if _num(f) is not None else "-" + if f.unit in (Unit.RATIO,): + return f"{_num(f):,.2f}" if _num(f) is not None else "-" + if f.unit == Unit.SHARES: + n = _num(f) + return f"{n:,.0f} shares" if n is not None else "-" + return str(f.value) + + +def _num(f: Fact | None) -> float | None: + if f is None or not isinstance(f.value, (int, float)): + return None + return float(f.value) + + +def g(facts: dict[str, Fact], fid: str) -> Fact | None: + return facts.get(fid) + + +def gv(facts: dict[str, Fact], fid: str) -> float | None: + return _num(facts.get(fid)) + + +def close(a: float, b: float, tol: float = T.REL_TOL) -> bool: + return abs(a - b) <= tol * max(abs(a), abs(b), 1.0) + + +def ev(facts: dict[str, Fact], fid: str, label: str | None = None) -> Evidence | None: + f = facts.get(fid) + if f is None: + return None + p = f.provenance[0] if f.provenance else None + return Evidence( + label=label or f.label, + value=f.value, + display=fmt(f), + fact_id=fid, + section=(p.section if p else ""), + locator=(p.locator if p else ""), + raw_line=(p.raw_line if p else ""), + ) + + +TRUSTED = (FactStatus.VERIFIED, FactStatus.DERIVED, FactStatus.ATTESTED, + FactStatus.RESOLVED) + + +def trusted(facts: dict[str, Fact], ids: list[str]) -> bool: + """Whether every input to a check is a figure the ledger actually trusts.""" + return all((f := facts.get(i)) is not None and f.status in TRUSTED for i in ids) + + +def temper(facts: dict[str, Fact], ids: list[str], severity: Severity, + explanation: str) -> tuple[Severity, str]: + """Soften a verdict whose own inputs are not trusted. + + A contradiction is only a contradiction between figures we are confident we + read correctly. Where an input is itself unverified, the honest finding is + "these do not reconcile and at least one of them is unconfirmed", not + "the issuer has contradicted itself". Asserting the latter on a shaky read + would be exactly the overreach this tool exists to avoid. + """ + if trusted(facts, ids): + return severity, explanation + weak = [facts[i].label for i in ids + if i in facts and facts[i].status not in TRUSTED] + softened = Severity.MEDIUM if severity == Severity.BLOCKER else severity + return softened, ( + explanation + " This figure could not be independently corroborated in the " + "filing (" + "; ".join(weak[:3]) + "), so the difference may be a limitation of " + "what was machine-readable rather than an error by the issuer. It is reported " + "for confirmation, not asserted as a contradiction." + ) + + +def ok(rid: str, title: str, ref: str, detail: str) -> RuleResult: + return RuleResult(rule_id=rid, title=title, icdr_ref=ref, status="pass", detail=detail) + + +def na(rid: str, title: str, ref: str, detail: str) -> RuleResult: + return RuleResult(rule_id=rid, title=title, icdr_ref=ref, status="not_applicable", + detail=detail) + + +def fail(rid: str, title: str, ref: str, detail: str, findings: list[Finding]) -> RuleResult: + return RuleResult(rule_id=rid, title=title, icdr_ref=ref, status="fail", detail=detail, + findings=findings) + + +# =============================================================== FIN: financials + +@rule("FIN-001", "Revenue is stated identically in every section that reports it", + "ICDR Sch VI Pt A (IX)(1) / (IX)(5)") +def fin_001(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid, title, ref = "FIN-001", fin_001.__doc__ or "", "" + return _cross_section_agreement( + facts, "fin.current.revenue_from_operations", "FIN-001", + "Revenue is stated identically in every section that reports it", + "ICDR Sch VI Pt A (IX)(1) / (IX)(5)", + "Revenue from operations", + ) + + +@rule("FIN-002", "Profit after tax ties across the audited statement and the Directors' Report", + "ICDR Sch VI Pt A (IX)(1)") +def fin_002(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + return _cross_section_agreement( + facts, "fin.current.pat", "FIN-002", + "Profit after tax ties across the audited statement and the Directors' Report", + "ICDR Sch VI Pt A (IX)(1)", "Profit after tax", + ) + + +def _cross_section_agreement(facts: dict[str, Fact], fid: str, rid: str, title: str, + ref: str, what: str) -> RuleResult: + """A figure printed in two independent sections must agree in both.""" + f = facts.get(fid) + if f is None: + return na(rid, title, ref, f"{what} was not machine-readable in this filing.") + + sections = {p.section: p for p in f.provenance} + if f.status == FactStatus.CONFLICTED: + evs = [ + Evidence(label=f"{what}: {p.section.replace('_', ' ')}", value=f.value, + display=p.raw_line.strip()[:160] or fmt(f), fact_id=fid, + section=p.section, locator=p.locator, raw_line=p.raw_line) + for p in f.provenance + ] + return fail(rid, title, ref, f"{what} is not consistent across sections.", [ + Finding( + rule_id=rid, severity=Severity.BLOCKER, + title=f"{what} differs between two sections of the same filing", + explanation=(f.note or f"{what} is reported differently in two places."), + icdr_ref=ref, evidence=evs, fact_ids=[fid], + resolutions=[ + Resolution(id="adopt_audited", label="Adopt the audited financial statements", + description=("Treat the audited Statement of Profit and Loss as " + "authoritative and restate the other section."), + recommended=True, kind="adopt_value", target_fact_id=fid, + justification="Audited statements carry the auditor's opinion."), + Resolution(id="flag", label="Refer to the merchant banker", + description="Record the discrepancy for the banker to reconcile.", + kind="flag_to_banker"), + ], + ) + ]) + + if len(sections) > 1: + where = " and ".join(sorted(s.replace("_", " ") for s in sections)) + return ok(rid, title, ref, + f"{what} = {fmt(f)}, identical in {where}.") + return ok(rid, title, ref, + f"{what} = {fmt(f)}; found in one section only, no contradiction present.") + + +@rule("FIN-003", "Balance sheet balances: total assets equal total equity and liabilities", + "ICDR Sch VI Pt A (IX)(1)") +def fin_003(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid, title = "FIN-003", "Balance sheet balances: total assets equal total equity and liabilities" + ref = "ICDR Sch VI Pt A (IX)(1)" + ta, tel = gv(facts, "fin.current.total_assets"), gv(facts, "fin.current.total_equity_liabilities") + if ta is None or tel is None: + return na(rid, title, ref, "Balance sheet totals were not machine-readable.") + if close(ta, tel): + return ok(rid, title, ref, f"Both sides total {fmt_inr(ta)}.") + return fail(rid, title, ref, "The balance sheet does not balance.", [ + Finding( + rule_id=rid, + severity=temper(facts, ["fin.current.total_assets", + "fin.current.total_equity_liabilities"], + Severity.BLOCKER, "")[0], + title="Balance sheet does not balance", + explanation=temper( + facts, ["fin.current.total_assets", "fin.current.total_equity_liabilities"], + Severity.BLOCKER, + "Total assets and total equity and liabilities must be equal. " + f"They differ by {fmt_inr(abs(ta - tel))}.")[1], + icdr_ref=ref, delta=fmt_inr(abs(ta - tel)), + evidence=[e for e in (ev(facts, "fin.current.total_assets"), + ev(facts, "fin.current.total_equity_liabilities")) if e], + fact_ids=["fin.current.total_assets", "fin.current.total_equity_liabilities"], + resolutions=[Resolution(id="flag", label="Refer to the merchant banker", + description="A balance-sheet imbalance must be resolved " + "against the audited statements.", + recommended=True, kind="flag_to_banker")], + ) + ]) + + +@rule("FIN-004", "Basic EPS equals profit after tax divided by shares outstanding", + "ICDR Sch VI Pt A (IX)(1) / (VII)(2)") +def fin_004(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid = "FIN-004" + title = "Basic EPS equals profit after tax divided by shares outstanding" + ref = "ICDR Sch VI Pt A (IX)(1) / (VII)(2)" + printed, computed = gv(facts, "fin.current.eps_basic"), gv(facts, "fin.current.eps_computed") + if printed is None or computed is None: + return na(rid, title, ref, "EPS or the share count was not machine-readable.") + if close(printed, computed, T.DERIVED_TOL): + return ok(rid, title, ref, + f"EPS as printed ({printed:,.2f}) reconciles to profit after tax " + f"divided by shares outstanding ({computed:,.2f}).") + # A near-exact power of ten between the two is the signature of a scale error: + # a figure printed under a "โ‚น in thousands" heading that does not apply to it. + hint = "" + if printed and computed and (computed / printed) > 0: + import math + + lg = math.log10(computed / printed) + exp = round(lg) + if exp != 0 and abs(lg - exp) < 0.05: + hint = (f" The two differ by almost exactly a factor of {10 ** abs(exp):,}, " + "which usually means one of them was printed under a scale heading " + "that does not apply to it (a share count under a 'โ‚น in thousands' " + "banner is the common case).") + return fail(rid, title, ref, "EPS does not reconcile to profit after tax and share count.", [ + Finding( + rule_id=rid, + severity=temper(facts, ["fin.current.eps_basic", "fin.current.pat", + "cap.shares_outstanding"], Severity.HIGH, "")[0], + title="Earnings per share does not reconcile to the underlying figures", + explanation=( + f"The filing prints basic EPS of {printed:,.2f}. Profit after tax divided by " + f"closing shares outstanding gives {computed:,.2f}." + hint + + " A modest difference is expected where shares were issued during the year, " + "because basic EPS is struck on the weighted average number of shares while " + "this computation uses the closing count. In an offer document EPS drives the " + "Basis for Issue Price, so the weighted average share count must be disclosed " + "and the two reconciled." + ), + icdr_ref=ref, delta=f"{abs(printed - computed):,.2f} per share", + evidence=[e for e in (ev(facts, "fin.current.eps_basic", "Basic EPS as printed"), + ev(facts, "fin.current.eps_computed", "EPS computed from PAT รท shares"), + ev(facts, "fin.current.pat"), + ev(facts, "cap.shares_outstanding")) if e], + fact_ids=["fin.current.eps_basic", "fin.current.eps_computed"], + resolutions=[ + Resolution(id="adopt_computed", label="Adopt the computed EPS", + description=("Use profit after tax divided by shares outstanding, " + "both of which are themselves sourced facts."), + recommended=True, kind="adopt_value", + target_fact_id="fin.current.eps_basic", new_value=round(computed, 2), + justification="Derived from two independently sourced ledger facts."), + Resolution(id="flag", label="Refer to the merchant banker", + description="Reconcile the share count and EPS against the audited " + "statements before filing.", kind="flag_to_banker"), + ], + ) + ]) + + +@rule("FIN-005", "Net worth equals equity share capital plus reserves and surplus", + "ICDR Sch VI Pt A (IX)(1)") +def fin_005(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid = "FIN-005" + title = "Net worth equals equity share capital plus reserves and surplus" + ref = "ICDR Sch VI Pt A (IX)(1)" + sc, rs = gv(facts, "fin.current.share_capital"), gv(facts, "fin.current.reserves_surplus") + nw = gv(facts, "fin.current.net_worth") + if None in (sc, rs, nw): + return na(rid, title, ref, "Share capital or reserves were not machine-readable.") + if close(sc + rs, nw): # type: ignore[operator] + return ok(rid, title, ref, f"Net worth {fmt_inr(nw)} = share capital {fmt_inr(sc)} " + f"+ reserves {fmt_inr(rs)}.") + return fail(rid, title, ref, "Net worth does not reconcile.", [ + Finding(rule_id=rid, severity=Severity.HIGH, title="Net worth does not reconcile", + explanation="Net worth must equal equity share capital plus reserves and surplus.", + icdr_ref=ref, + evidence=[e for e in (ev(facts, "fin.current.share_capital"), + ev(facts, "fin.current.reserves_surplus"), + ev(facts, "fin.current.net_worth")) if e], + fact_ids=["fin.current.net_worth"]) + ]) + + +@rule("FIN-006", "Total income equals revenue from operations plus other income", + "ICDR Sch VI Pt A (IX)(1)") +def fin_006(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid, title = "FIN-006", "Total income equals revenue from operations plus other income" + ref = "ICDR Sch VI Pt A (IX)(1)" + rev, oi = gv(facts, "fin.current.revenue_from_operations"), gv(facts, "fin.current.other_income") + ti = gv(facts, "fin.current.total_income") + if None in (rev, oi, ti): + return na(rid, title, ref, "Income lines were not machine-readable.") + if close(rev + oi, ti): # type: ignore[operator] + return ok(rid, title, ref, f"{fmt_inr(rev)} + {fmt_inr(oi)} = {fmt_inr(ti)}.") + ids = ["fin.current.revenue_from_operations", "fin.current.other_income", + "fin.current.total_income"] + sev, expl = temper(facts, ids, Severity.BLOCKER, + "Revenue from operations plus other income must equal total income; " + f"they differ by {fmt_inr(abs(rev + oi - ti))}.") # type: ignore[operator] + return fail(rid, title, ref, "Total income does not foot.", [ + Finding(rule_id=rid, severity=sev, title="Total income does not foot", + explanation=expl, + icdr_ref=ref, delta=fmt_inr(abs(rev + oi - ti)), # type: ignore[operator] + evidence=[e for e in (ev(facts, "fin.current.revenue_from_operations"), + ev(facts, "fin.current.other_income"), + ev(facts, "fin.current.total_income")) if e], + fact_ids=["fin.current.total_income"]) + ]) + + +@rule("FIN-007", "Profit before tax equals total income less total expenses", + "ICDR Sch VI Pt A (IX)(1)") +def fin_007(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid, title = "FIN-007", "Profit before tax equals total income less total expenses" + ref = "ICDR Sch VI Pt A (IX)(1)" + ti, te = gv(facts, "fin.current.total_income"), gv(facts, "fin.current.total_expenses") + pbt = gv(facts, "fin.current.pbt") + if None in (ti, te, pbt): + return na(rid, title, ref, "Income or expense totals were not machine-readable.") + if close(ti - abs(te), pbt): # type: ignore[operator] + return ok(rid, title, ref, f"{fmt_inr(ti)} โˆ’ {fmt_inr(abs(te))} = {fmt_inr(pbt)}.") + ids7 = ["fin.current.total_income", "fin.current.total_expenses", "fin.current.pbt"] + sev7, expl7 = temper(facts, ids7, Severity.BLOCKER, + "Total income less total expenses must equal profit before tax.") + return fail(rid, title, ref, "Profit before tax does not foot.", [ + Finding(rule_id=rid, severity=sev7, + title="Profit before tax does not foot", + explanation=expl7, + icdr_ref=ref, delta=fmt_inr(abs(ti - abs(te) - pbt)), # type: ignore[operator] + evidence=[e for e in (ev(facts, "fin.current.total_income"), + ev(facts, "fin.current.total_expenses"), + ev(facts, "fin.current.pbt")) if e], + fact_ids=["fin.current.pbt"]) + ]) + + +@rule("FIN-008", "EPS in the filing agrees with the EPS published on the exchange", + "cross-source corroboration") +def fin_008(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid = "FIN-008" + title = "EPS in the filing agrees with the EPS published on the exchange" + ref = "cross-source corroboration" + filed, bse = gv(facts, "fin.current.eps_basic"), gv(facts, "co.eps_bse") + if filed is None or bse is None or bse == 0: + return na(rid, title, ref, "One of the two EPS figures is unavailable.") + if close(filed, bse, 0.10): + return ok(rid, title, ref, f"Filing EPS {filed:,.2f} agrees with BSE-published " + f"EPS {bse:,.2f}.") + return fail(rid, title, ref, "Filing EPS differs from the exchange-published EPS.", [ + Finding(rule_id=rid, severity=Severity.MEDIUM, + title="EPS in the annual report differs from the EPS published by BSE", + explanation=(f"The annual report prints {filed:,.2f}; BSE publishes {bse:,.2f}. " + "These are two independent sources for the same measure. The " + "difference is often a period or consolidation mismatch, but it " + "must be explained in the Basis for Issue Price."), + icdr_ref="ICDR Sch VI Pt A (VII)(2)", + delta=f"{abs(filed - bse):,.2f} per share", + evidence=[e for e in (ev(facts, "fin.current.eps_basic", "EPS: annual report"), + ev(facts, "co.eps_bse", "EPS: BSE published")) if e], + fact_ids=["fin.current.eps_basic", "co.eps_bse"], + resolutions=[Resolution(id="attest", label="Attest the difference is periodic", + description="Record that the difference arises from " + "differing reporting periods.", + kind="attest", target_fact_id="co.eps_bse")]) + ]) + + +# ======================================================= CAP: capital structure + +@rule("CAP-001", "Paid-up capital equals shares outstanding times face value", + "ICDR Sch VI Pt A (V)(1)") +def cap_001(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid, title = "CAP-001", "Paid-up capital equals shares outstanding times face value" + ref = "ICDR Sch VI Pt A (V)(1)" + sc, fv = gv(facts, "fin.current.share_capital"), gv(facts, "co.face_value") + sh = gv(facts, "cap.shares_outstanding") + if None in (sc, fv, sh) or not fv: + return na(rid, title, ref, "Share capital or face value unavailable.") + if close(sh * fv, sc): # type: ignore[operator] + return ok(rid, title, ref, + f"{sh:,.0f} shares ร— {fmt_inr(fv)} = {fmt_inr(sc)}.") # type: ignore[str-format] + return fail(rid, title, ref, "Paid-up capital does not reconcile.", [ + Finding(rule_id=rid, severity=Severity.HIGH, title="Paid-up capital does not reconcile", + explanation="Shares outstanding multiplied by face value must equal paid-up capital.", + icdr_ref=ref, fact_ids=["cap.shares_outstanding"], + evidence=[e for e in (ev(facts, "fin.current.share_capital"), + ev(facts, "co.face_value"), + ev(facts, "cap.shares_outstanding")) if e]) + ]) + + +@rule("CAP-002", "Post-issue paid-up capital reconciles to the proposed fresh issue", + "ICDR Sch VI Pt A (V)(1)") +def cap_002(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid = "CAP-002" + title = "Post-issue paid-up capital reconciles to the proposed fresh issue" + ref = "ICDR Sch VI Pt A (V)(1)" + issue = ctx.get("issue") + sc, fv = gv(facts, "fin.current.share_capital"), gv(facts, "co.face_value") + if not issue or None in (sc, fv): + return na(rid, title, ref, "No proposed issue terms supplied.") + post = sc + issue.fresh_issue_shares * fv # type: ignore[operator] + return ok(rid, title, ref, + f"Pre-issue {fmt_inr(sc)} + {issue.fresh_issue_shares:,.0f} fresh shares ร— " + f"{fmt_inr(fv)} = post-issue {fmt_inr(post)}.") + + +# ================================================== ELG: SME issuer eligibility + +@rule("ELG-001", "Operating profit meets the SME issuer eligibility threshold", + "ICDR Reg 229(6)") +def elg_001(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid = "ELG-001" + title = "Operating profit meets the SME issuer eligibility threshold" + ref = "ICDR Reg 229(6)" + ebitda = gv(facts, "fin.current.ebitda") + if ebitda is None: + return na(rid, title, ref, + "EBITDA could not be derived from the machine-readable statements.") + if ebitda >= T.SME_MIN_EBITDA_INR: + return ok(rid, title, ref, + f"Operating profit (EBITDA) of {fmt_inr(ebitda)} for the latest year " + f"exceeds the {fmt_inr(T.SME_MIN_EBITDA_INR)} threshold. Regulation 229(6) " + f"requires this in {T.SME_MIN_EBITDA_YEARS} of the last " + f"{T.SME_EBITDA_LOOKBACK} financial years; only the latest year is " + "machine-readable from this filing.") + return fail(rid, title, ref, "Operating profit is below the SME eligibility threshold.", [ + Finding(rule_id=rid, severity=Severity.BLOCKER, + title="Operating profit is below the Regulation 229(6) eligibility threshold", + explanation=( + f"Regulation 229(6) requires operating profit (EBITDA) of at least " + f"{fmt_inr(T.SME_MIN_EBITDA_INR)} in {T.SME_MIN_EBITDA_YEARS} of the last " + f"{T.SME_EBITDA_LOOKBACK} financial years. The latest year derives to " + f"{fmt_inr(ebitda)}. On this evidence the issuer does not appear eligible " + "for the SME platform without relying on earlier years."), + icdr_ref=ref, delta=fmt_inr(T.SME_MIN_EBITDA_INR - ebitda), + evidence=[e for e in (ev(facts, "fin.current.ebitda"), + ev(facts, "fin.current.pbt"), + ev(facts, "fin.current.finance_costs"), + ev(facts, "fin.current.depreciation")) if e], + fact_ids=["fin.current.ebitda"], + resolutions=[Resolution(id="flag", label="Refer to the merchant banker", + description="Eligibility must be established across " + "three years of restated financials.", + recommended=True, kind="flag_to_banker")]) + ]) + + +@rule("ELG-002", "Offer for sale is within the SME cap of 20% of the issue", + "ICDR amendment effective 8 March 2025") +def elg_002(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid, title = "ELG-002", "Offer for sale is within the SME cap of 20% of the issue" + ref = "ICDR amendment effective 8 March 2025" + issue = ctx.get("issue") + if not issue or not issue.total_issue_value: + return na(rid, title, ref, "No proposed issue terms supplied.") + pct = 100.0 * issue.ofs_value / issue.total_issue_value + if pct <= T.SME_MAX_OFS_PCT_OF_ISSUE: + return ok(rid, title, ref, + f"Offer for sale is {fmt_inr(issue.ofs_value)}, {pct:.2f}% of the " + f"{fmt_inr(issue.total_issue_value)} issue: within the " + f"{T.SME_MAX_OFS_PCT_OF_ISSUE:.0f}% cap.") + return fail(rid, title, ref, "Offer for sale exceeds the 20% cap.", [ + Finding(rule_id=rid, severity=Severity.BLOCKER, + title="Offer for sale exceeds 20% of the total issue size", + explanation=( + f"The March 2025 amendment caps the offer-for-sale component of an SME IPO " + f"at {T.SME_MAX_OFS_PCT_OF_ISSUE:.0f}% of the total issue size. The proposed " + f"offer for sale of {fmt_inr(issue.ofs_value)} is {pct:.2f}% of the " + f"{fmt_inr(issue.total_issue_value)} issue."), + icdr_ref=ref, + delta=f"{pct - T.SME_MAX_OFS_PCT_OF_ISSUE:.2f} percentage points over", + evidence=[ + Evidence(label="Proposed offer for sale", value=issue.ofs_value, + display=fmt_inr(issue.ofs_value), section="issue_terms", + locator="proposed issue terms"), + Evidence(label="Total issue size", value=issue.total_issue_value, + display=fmt_inr(issue.total_issue_value), section="issue_terms", + locator="proposed issue terms"), + Evidence(label="Regulatory cap", value=T.SME_MAX_OFS_PCT_OF_ISSUE, + display=f"{T.SME_MAX_OFS_PCT_OF_ISSUE:.0f}% of issue size", + section="ICDR", locator="amendment effective 8 March 2025"), + ], + resolutions=[ + Resolution( + id="cap_ofs", label="Reduce the offer for sale to the 20% cap", + description=( + "Resize the offer-for-sale component to " + f"{fmt_inr(issue.total_issue_value * T.SME_MAX_OFS_PCT_OF_ISSUE / 100)}, " + "the maximum permitted."), + recommended=True, kind="adopt_value", + justification="ICDR amendment effective 8 March 2025."), + Resolution(id="flag", label="Refer to the merchant banker", + description="Restructure the issue.", kind="flag_to_banker"), + ]) + ]) + + +@rule("ELG-003", "Post-issue paid-up capital is within the SME platform ceiling", + "ICDR Reg 229(1)") +def elg_003(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid, title = "ELG-003", "Post-issue paid-up capital is within the SME platform ceiling" + ref = "ICDR Reg 229(1)" + issue = ctx.get("issue") + sc, fv = gv(facts, "fin.current.share_capital"), gv(facts, "co.face_value") + if not issue or None in (sc, fv): + return na(rid, title, ref, "No proposed issue terms supplied.") + post = sc + issue.fresh_issue_shares * fv # type: ignore[operator] + if post <= T.SME_MAX_POST_ISSUE_CAPITAL_INR: + return ok(rid, title, ref, f"Post-issue paid-up capital {fmt_inr(post)} is within the " + f"{fmt_inr(T.SME_MAX_POST_ISSUE_CAPITAL_INR)} ceiling.") + return fail(rid, title, ref, "Post-issue capital exceeds the SME ceiling.", [ + Finding(rule_id=rid, severity=Severity.HIGH, + title="Post-issue paid-up capital exceeds the SME platform ceiling", + explanation=(f"Post-issue paid-up capital of {fmt_inr(post)} exceeds the " + f"{fmt_inr(T.SME_MAX_POST_ISSUE_CAPITAL_INR)} ceiling for the SME " + "platform; the issue would need to migrate to the main board."), + icdr_ref=ref, fact_ids=["fin.current.share_capital"], + delta=fmt_inr(post - T.SME_MAX_POST_ISSUE_CAPITAL_INR)) + ]) + + +# ==================================================== OBJ: objects of the issue + +@rule("OBJ-001", "Objects of the issue sum to the net proceeds available", + "ICDR Sch VI Pt A (VI)(2)") +def obj_001(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid, title = "OBJ-001", "Objects of the issue sum to the net proceeds available" + ref = "ICDR Sch VI Pt A (VI)(2)" + issue = ctx.get("issue") + if not issue or not issue.objects: + return na(rid, title, ref, "No objects of the issue supplied.") + total = sum(o.amount for o in issue.objects) + net = issue.net_proceeds + if close(total, net, 0.001): + return ok(rid, title, ref, + f"The {len(issue.objects)} stated objects total {fmt_inr(total)}, equal to " + f"net proceeds of {fmt_inr(net)}.") + over = total - net + evs = [Evidence(label=o.label, value=o.amount, display=fmt_inr(o.amount), + section="objects_of_issue", locator="proposed issue terms") + for o in issue.objects] + evs += [ + Evidence(label="Total of stated objects", value=total, display=fmt_inr(total), + section="objects_of_issue", locator="sum of the objects above"), + Evidence(label="Net proceeds available", value=net, display=fmt_inr(net), + section="objects_of_issue", + locator=(f"gross fresh issue {fmt_inr(issue.fresh_issue_value)} less issue " + f"expenses {fmt_inr(issue.issue_expenses)}")), + ] + verb = "exceed" if over > 0 else "fall short of" + return fail(rid, title, ref, f"Objects {verb} net proceeds by {fmt_inr(abs(over))}.", [ + Finding( + rule_id=rid, severity=Severity.BLOCKER, + title=f"Objects of the issue {verb} the net proceeds by {fmt_inr(abs(over))}", + explanation=( + f"The objects total {fmt_inr(total)} but only {fmt_inr(net)} is available " + f"(gross fresh issue {fmt_inr(issue.fresh_issue_value)} less issue expenses " + f"{fmt_inr(issue.issue_expenses)}). An offer document must deploy exactly the " + "net proceeds: this is one of the most common reasons an exchange returns a " + "draft with observations."), + icdr_ref=ref, delta=fmt_inr(abs(over)), evidence=evs, + resolutions=[ + Resolution(id="scale_gcp", + label="Adjust general corporate purposes to absorb the difference", + description=("Reduce the general-corporate-purposes allocation so the " + "objects total exactly the net proceeds."), + recommended=True, kind="adopt_value", + justification="GCP is the residual object and is capped separately."), + Resolution(id="resize_issue", label="Resize the fresh issue", + description="Increase the fresh issue so net proceeds meet the objects.", + kind="adopt_value"), + Resolution(id="flag", label="Refer to the merchant banker", + description="Rework the objects table.", kind="flag_to_banker"), + ]) + ]) + + +@rule("OBJ-002", "General corporate purposes is within the SME cap", + "ICDR amendment effective 8 March 2025") +def obj_002(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid, title = "OBJ-002", "General corporate purposes is within the SME cap" + ref = "ICDR amendment effective 8 March 2025" + issue = ctx.get("issue") + if not issue or not issue.objects: + return na(rid, title, ref, "No objects of the issue supplied.") + gcp = sum(o.amount for o in issue.objects if o.is_general_corporate) + if gcp <= 0: + return ok(rid, title, ref, "No general-corporate-purposes allocation is proposed.") + cap = min(issue.fresh_issue_value * T.SME_MAX_GCP_PCT_OF_PROCEEDS / 100.0, + float(T.SME_MAX_GCP_ABSOLUTE_INR)) + pct = 100.0 * gcp / issue.fresh_issue_value if issue.fresh_issue_value else 0.0 + if gcp <= cap: + return ok(rid, title, ref, + f"General corporate purposes of {fmt_inr(gcp)} is {pct:.2f}% of gross " + f"proceeds, within the cap of {fmt_inr(cap)}.") + return fail(rid, title, ref, "General corporate purposes exceeds the cap.", [ + Finding(rule_id=rid, severity=Severity.BLOCKER, + title="General corporate purposes exceeds the permitted cap", + explanation=( + f"For an SME issue, general corporate purposes may not exceed " + f"{T.SME_MAX_GCP_PCT_OF_PROCEEDS:.0f}% of gross proceeds or " + f"{fmt_inr(T.SME_MAX_GCP_ABSOLUTE_INR)}, whichever is lower: here " + f"{fmt_inr(cap)}. The proposed allocation is {fmt_inr(gcp)} ({pct:.2f}%)."), + icdr_ref=ref, delta=fmt_inr(gcp - cap), + evidence=[ + Evidence(label="Proposed general corporate purposes", value=gcp, + display=fmt_inr(gcp), section="objects_of_issue", + locator="proposed issue terms"), + Evidence(label="Permitted cap", value=cap, display=fmt_inr(cap), + section="ICDR", + locator=(f"lower of {T.SME_MAX_GCP_PCT_OF_PROCEEDS:.0f}% of gross " + f"proceeds and {fmt_inr(T.SME_MAX_GCP_ABSOLUTE_INR)}")), + ], + resolutions=[Resolution(id="cap_gcp", label="Reduce to the permitted cap", + description=f"Reduce the allocation to {fmt_inr(cap)}.", + recommended=True, kind="adopt_value", + justification="ICDR amendment effective 8 March 2025.")]) + ]) + + +@rule("OBJ-003", "Every object carries a year-wise deployment schedule that sums to its amount", + "ICDR Sch VI Pt A (VI)(3)") +def obj_003(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid = "OBJ-003" + title = "Every object carries a year-wise deployment schedule that sums to its amount" + ref = "ICDR Sch VI Pt A (VI)(3)" + issue = ctx.get("issue") + if not issue or not issue.objects: + return na(rid, title, ref, "No objects of the issue supplied.") + bad = [] + for o in issue.objects: + if not o.schedule: + bad.append((o, None)) + continue + s = sum(o.schedule.values()) + if not close(s, o.amount, 0.001): + bad.append((o, s)) + if not bad: + return ok(rid, title, ref, + f"All {len(issue.objects)} objects carry a deployment schedule that sums " + "to the stated amount.") + findings = [] + for o, s in bad: + findings.append(Finding( + rule_id=rid, severity=Severity.MEDIUM if s is None else Severity.HIGH, + title=(f"'{o.label}' has no deployment schedule" if s is None + else f"Deployment schedule for '{o.label}' does not sum to the object amount"), + explanation=( + "Schedule VI requires a year-wise deployment schedule for each object. " + + ("None is stated." if s is None + else f"The schedule totals {fmt_inr(s)} against an object of " + f"{fmt_inr(o.amount)}.")), + icdr_ref=ref, delta=None if s is None else fmt_inr(abs(s - o.amount)), + evidence=[Evidence(label=o.label, value=o.amount, display=fmt_inr(o.amount), + section="objects_of_issue", locator="proposed issue terms")], + resolutions=[Resolution(id="flag", label="Refer to the merchant banker", + description="Supply the year-wise deployment schedule.", + recommended=True, kind="flag_to_banker")])) + return fail(rid, title, ref, f"{len(bad)} object(s) have an incomplete schedule.", findings) + + +# ============================================================ DIL: issue pricing + +@rule("DIL-001", "The stated price/earnings ratio equals issue price divided by EPS", + "ICDR Sch VI Pt A (VII)(2)") +def dil_001(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid, title = "DIL-001", "The stated price/earnings ratio equals issue price divided by EPS" + ref = "ICDR Sch VI Pt A (VII)(2)" + issue = ctx.get("issue") + eps = gv(facts, "fin.current.eps_basic") + if not issue or eps is None or eps == 0: + return na(rid, title, ref, "Issue price or EPS unavailable.") + pe = issue.price_per_share / eps + if pe < 0: + return fail(rid, title, ref, "The issuer is loss-making at the latest year.", [ + Finding(rule_id=rid, severity=Severity.HIGH, + title="Price/earnings ratio cannot be stated: the issuer is loss-making", + explanation=("Basic EPS for the latest financial year is negative, so a " + "price/earnings ratio cannot be presented. Schedule VI requires " + "the Basis for Issue Price to explain the pricing on other " + "quantitative factors and to carry a specific risk factor."), + icdr_ref=ref, + evidence=[e for e in (ev(facts, "fin.current.eps_basic"),) if e], + fact_ids=["fin.current.eps_basic"], + resolutions=[Resolution(id="flag", label="Refer to the merchant banker", + description="Justify pricing without a P/E multiple.", + recommended=True, kind="flag_to_banker")]) + ]) + return ok(rid, title, ref, + f"At an issue price of {fmt_inr(issue.price_per_share)} and basic EPS of " + f"{eps:,.2f}, the price/earnings ratio is {pe:,.2f}.") + + +@rule("DIL-002", "Post-issue net asset value per share reconciles to net worth and proceeds", + "ICDR Sch VI Pt A (VII)(2)") +def dil_002(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid = "DIL-002" + title = "Post-issue net asset value per share reconciles to net worth and proceeds" + ref = "ICDR Sch VI Pt A (VII)(2)" + issue = ctx.get("issue") + nw, sh = gv(facts, "fin.current.net_worth"), gv(facts, "cap.shares_outstanding") + if not issue or None in (nw, sh): + return na(rid, title, ref, "Net worth or share count unavailable.") + post_shares = sh + issue.fresh_issue_shares # type: ignore[operator] + post_nav = (nw + issue.net_proceeds) / post_shares # type: ignore[operator] + return ok(rid, title, ref, + f"Post-issue net asset value is {post_nav:,.2f} per share " + f"(net worth {fmt_inr(nw)} plus net proceeds {fmt_inr(issue.net_proceeds)}, " + f"over {post_shares:,.0f} shares).") + + +# ===================================================== RPT: related party checks + +@rule("RPT-001", "Related party transactions are disclosed and quantified", + "ICDR Sch VI Pt A (IX)(3)") +def rpt_001(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid, title = "RPT-001", "Related party transactions are disclosed and quantified" + ref = "ICDR Sch VI Pt A (IX)(3)" + rpts = [f for fid, f in facts.items() if fid.startswith("rpt.")] + if not rpts: + return fail(rid, title, ref, "No related party transactions were found.", [ + Finding(rule_id=rid, severity=Severity.MEDIUM, + title="No related party transactions could be read from the filing", + explanation=("Schedule VI requires related party transactions to be disclosed " + "and quantified. None were machine-readable here. This is a " + "coverage gap, not evidence that none exist: it must be " + "confirmed against the audited notes."), + icdr_ref=ref, + resolutions=[Resolution(id="flag", label="Refer to the merchant banker", + description="Confirm the related party note.", + recommended=True, kind="flag_to_banker")]) + ]) + total = sum(_num(f) or 0.0 for f in rpts) + return ok(rid, title, ref, + f"{len(rpts)} related party transactions read from the audited notes, " + f"totalling {fmt_inr(total)}. Each is tagged to its page and remains " + "unverified until the counterparty relationship is confirmed.") + + +# ================================== PRV: provenance / responsible-AI invariants + +@rule("PRV-001", "Every figure in the draft is bound to a sourced ledger fact", + "responsible-AI invariant") +def prv_001(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid, title = "PRV-001", "Every figure in the draft is bound to a sourced ledger fact" + ref = "responsible-AI invariant" + unbound = ctx.get("unbound_numbers") or [] + sections = ctx.get("drafted_sections") or [] + if not sections: + return na(rid, title, ref, "The draft has not been generated yet.") + if not unbound: + return ok(rid, title, ref, + f"Every numeric assertion across {len(sections)} drafted sections resolves to " + "a ledger fact with a page-level citation. No unsourced figure reached the " + "document.") + return fail(rid, title, ref, f"{len(unbound)} unsourced figures found in the draft.", [ + Finding(rule_id=rid, severity=Severity.BLOCKER, + title="An unsourced figure reached the draft", + explanation=("Every number in the offer document must resolve to a ledger fact " + "carrying provenance. These did not: " + ", ".join(unbound[:8])), + icdr_ref=ref, + resolutions=[Resolution(id="flag", label="Refer to the merchant banker", + description="Remove or source the figure.", + recommended=True, kind="flag_to_banker")]) + ]) + + +@rule("PRV-002", "No unverified fact carries a load-bearing disclosure without attestation", + "responsible-AI invariant") +def prv_002(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid = "PRV-002" + title = "No unverified fact carries a load-bearing disclosure without attestation" + ref = "responsible-AI invariant" + used = set(ctx.get("used_fact_ids") or []) + risky = [f for fid, f in facts.items() + if f.status == FactStatus.UNVERIFIED and f.is_load_bearing and fid in used] + if not risky: + return ok(rid, title, ref, + "No unverified figure is carrying a load-bearing disclosure in the draft.") + evs = [Evidence(label=f.label, value=f.value, display=fmt(f), fact_id=f.id, + section=(f.provenance[0].section if f.provenance else ""), + locator=(f.provenance[0].locator if f.provenance else ""), + raw_line=(f.provenance[0].raw_line if f.provenance else "")) + for f in risky[:12]] + return fail(rid, title, ref, f"{len(risky)} unverified figures are in use.", [ + Finding( + rule_id=rid, severity=Severity.MEDIUM, + title=f"{len(risky)} unverified figure(s) are used in the draft", + explanation=( + "These figures were read from a single location with no corroborating section " + "and no accounting identity supporting them. The system has deliberately " + "abstained from treating them as verified. Each must be confirmed and attested " + "by the merchant banker before filing."), + icdr_ref=ref, evidence=evs, fact_ids=[f.id for f in risky], + resolutions=[ + Resolution(id="attest_all", label="Attest these figures", + description=("Record that the merchant banker has confirmed each " + "figure against the audited statements. The attestation " + "is written to the audit manifest with name and time."), + recommended=True, kind="attest"), + Resolution(id="flag", label="Refer to the merchant banker", + description="Leave open for review.", kind="flag_to_banker"), + ]) + ]) + + +@rule("PRV-003", "Conflicting sources have been reconciled", "responsible-AI invariant") +def prv_003(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid, title = "PRV-003", "Conflicting sources have been reconciled" + ref = "responsible-AI invariant" + conflicted = [f for f in facts.values() if f.status == FactStatus.CONFLICTED] + if not conflicted: + return ok(rid, title, ref, + "No figure in the ledger has two sources that disagree.") + return fail(rid, title, ref, f"{len(conflicted)} figures have conflicting sources.", [ + Finding(rule_id=rid, severity=Severity.HIGH, + title=f"{len(conflicted)} figure(s) are sourced from sections that disagree", + explanation=("Where two sections of the filing state different values for the " + "same figure, the ledger records the conflict rather than picking " + "a winner. Each must be reconciled."), + icdr_ref=ref, + evidence=[Evidence(label=f.label, value=f.value, display=fmt(f), fact_id=f.id, + locator=(f.provenance[0].locator if f.provenance else "")) + for f in conflicted[:10]], + fact_ids=[f.id for f in conflicted]) + ]) + + +# ============================================================ DOC: completeness + +@rule("DOC-001", "The issuer's identity is established from more than one source", + "ICDR Sch VI Pt A (I)(A)(1)") +def doc_001(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid, title = "DOC-001", "The issuer's identity is established from more than one source" + ref = "ICDR Sch VI Pt A (I)(A)(1)" + cin, isin = g(facts, "co.cin"), g(facts, "co.isin") + if cin is None: + return fail(rid, title, ref, "No CIN could be read from the filing.", [ + Finding(rule_id=rid, severity=Severity.BLOCKER, + title="Corporate Identity Number could not be established", + explanation="The offer document cover page must carry the issuer's CIN.", + icdr_ref=ref) + ]) + corroborated = isin is not None and isin.status == FactStatus.VERIFIED + if corroborated: + return ok(rid, title, ref, + f"CIN {cin.value} read from the filing; ISIN {isin.value} matches " + "independently between the annual report and the BSE master.") + return ok(rid, title, ref, + f"CIN {cin.value} read from the filing. ISIN could not be independently " + "corroborated between the annual report and the exchange master.") + + +@rule("DOC-002", "The filing's reporting scale is unambiguous", + "ICDR Sch VI Pt A (III)(3)") +def doc_002(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid, title = "DOC-002", "The filing's reporting scale is unambiguous" + ref = "ICDR Sch VI Pt A (III)(3)" + scales = ctx.get("scales") or {} + distinct = {v for v in scales.values() if v} + if len(distinct) <= 1: + return ok(rid, title, ref, + "All statements are presented on a single reporting scale.") + human = {1.0: "units", 1000.0: "thousands", 100000.0: "lakhs", + 1000000.0: "millions", 10000000.0: "crores"} + detail = ", ".join(f"{k.replace('_', ' ')} in {human.get(v, str(v))}" + for k, v in scales.items() if v) + return fail(rid, title, ref, "Statements use different reporting scales.", [ + Finding(rule_id=rid, severity=Severity.MEDIUM, + title="Different sections of the filing report on different scales", + explanation=( + f"The filing presents figures on more than one scale ({detail}). Every " + "figure has been normalised to rupees before checking, but the offer " + "document must state a single presentation basis, and mixed scales are a " + "frequent source of transcription error."), + icdr_ref=ref, + resolutions=[Resolution(id="attest", label="Confirm the presentation basis", + description="State a single presentation basis in the " + "offer document.", + recommended=True, kind="attest")]) + ]) + + +# ==================================================================== entry point + +def run_all(facts: dict[str, Fact], ctx: Ctx | None = None) -> list[RuleResult]: + """Run every registered rule. Deterministic, ordered, and free of side effects.""" + ctx = ctx or {} + out: list[RuleResult] = [] + for rid, title, ref, fn in REGISTRY: + try: + res = fn(facts, ctx) + except Exception as e: # noqa: BLE001 - a rule must never take down the engine + res = RuleResult(rule_id=rid, title=title, icdr_ref=ref, status="not_applicable", + detail=f"rule error: {type(e).__name__}: {e}") + for f in res.findings: + f.rule_id = res.rule_id + out.append(res) + return out + + +def rule_count() -> int: + return len(REGISTRY) + + +# ============================================ CIN: what the identifier settles + +@rule("ELG-004", "The issuer is a public company, as an issue requires", + "Companies Act 2013 s.23 / ICDR Reg 228") +def elg_004(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid = "ELG-004" + title = "The issuer is a public company, as an issue requires" + ref = "Companies Act 2013 s.23 / ICDR Reg 228" + parsed = ctx.get("cin") + if not parsed or not parsed.get("valid"): + return na(rid, title, ref, "No valid Corporate Identity Number was supplied.") + + own, name = parsed["ownership_code"], parsed["ownership"] + if parsed.get("is_public_company"): + return ok(rid, title, ref, + f"The Corporate Identity Number carries ownership class {own}, a " + f"{name.lower()}. A public company may make a public issue.") + if parsed.get("is_public_company") is None: + return na(rid, title, ref, f"Ownership class {own} is not recognised.") + + return fail(rid, title, ref, f"The issuer is a {name.lower()}.", [ + Finding( + rule_id=rid, severity=Severity.BLOCKER, + title="The issuer is a private company and cannot make a public issue", + explanation=( + f"The Corporate Identity Number carries ownership class {own}, which is a " + f"{name.lower()}. Only a public company may offer securities to the public. " + "Before an offer document can be filed the issuer must convert to a public " + "limited company under the Companies Act, which changes its name, its articles " + "and this very identifier. Every disclosure in the draft that names the issuer " + "will change with it."), + icdr_ref=ref, + evidence=[ + Evidence(label="Corporate Identity Number", value=parsed["raw"], + display=parsed["raw"], section="cin", + locator="ownership class, characters 13 to 15"), + Evidence(label="Ownership class", value=own, display=f"{own} ยท {name}", + section="cin", locator="Ministry of Corporate Affairs classification"), + ], + resolutions=[Resolution( + id="flag", label="Refer to the merchant banker", + description=("Conversion to a public limited company is a prerequisite step, " + "not a drafting fix."), + recommended=True, kind="flag_to_banker", + justification="Companies Act 2013, section 23.")], + ) + ]) + + +@rule("ELG-005", "The issuer has enough closed financial years for the track record test", + "ICDR Reg 229(6)") +def elg_005(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + rid = "ELG-005" + title = "The issuer has enough closed financial years for the track record test" + ref = "ICDR Reg 229(6)" + parsed = ctx.get("cin") + if not parsed or not parsed.get("valid") or not parsed.get("year"): + return na(rid, title, ref, "No valid Corporate Identity Number was supplied.") + + from ..cin import completed_financial_years + + year = int(parsed["year"]) + closed = completed_financial_years(year) + need = T.SME_MIN_EBITDA_YEARS + + if closed >= need: + return ok(rid, title, ref, + f"Incorporated in {year}, so at most {closed} financial years have closed. " + f"Regulation 229(6) tests operating profit in {need} of the last " + f"{T.SME_EBITDA_LOOKBACK}, which is reachable.") + + return fail(rid, title, ref, + f"Only {closed} financial year(s) can have closed since incorporation.", [ + Finding( + rule_id=rid, severity=Severity.BLOCKER, + title="The issuer is too recently incorporated to meet the track record test", + explanation=( + f"The Corporate Identity Number records incorporation in {year}. Counting " + f"Indian financial years ending 31 March, at most {closed} can have closed. " + f"Regulation 229(6) requires operating profit of at least " + f"{fmt_inr(T.SME_MIN_EBITDA_INR)} in {need} of the last " + f"{T.SME_EBITDA_LOOKBACK} financial years, so the issuer cannot satisfy it yet " + "however profitable those years were. This is a question of elapsed time, not " + "of performance."), + icdr_ref=ref, + delta=f"{need - closed} more closed financial year(s) required", + evidence=[ + Evidence(label="Year of incorporation", value=year, display=str(year), + section="cin", locator="characters 9 to 12 of the CIN"), + Evidence(label="Financial years closed at most", value=closed, + display=str(closed), section="derived", + locator="Indian financial years ending 31 March"), + Evidence(label="Required by Regulation 229(6)", value=need, + display=f"{need} of the last {T.SME_EBITDA_LOOKBACK}", + section="ICDR", locator="Reg 229(6)"), + ], + resolutions=[Resolution( + id="flag", label="Refer to the merchant banker", + description="Eligibility depends on elapsed financial years and cannot be " + "drafted around.", + recommended=True, kind="flag_to_banker")], + ) + ]) + + +@rule("CAP-004", "Paid-up capital agrees between the register and the audited balance sheet", + "ICDR Sch VI Pt A (V)(1)") +def cap_004(facts: dict[str, Fact], ctx: Ctx) -> RuleResult: + """Two independent authorities for one figure: the register and the auditor.""" + rid = "CAP-004" + title = "Paid-up capital agrees between the register and the audited balance sheet" + ref = "ICDR Sch VI Pt A (V)(1)" + reg = gv(facts, "cap.paidup_capital_registry") + aud = gv(facts, "fin.current.share_capital") + if reg is None or aud is None: + return na(rid, title, ref, + "Paid-up capital is available from only one of the register and the " + "audited balance sheet, so there is nothing to reconcile.") + if close(reg, aud, 0.01): + return ok(rid, title, ref, + f"Paid-up capital of {fmt_inr(aud)} agrees between the Ministry of " + "Corporate Affairs register and the audited balance sheet.") + return fail(rid, title, ref, "Paid-up capital differs between the two sources.", [ + Finding( + rule_id=rid, severity=Severity.HIGH, + title="Paid-up capital differs between the register and the audited accounts", + explanation=( + f"The Ministry of Corporate Affairs register records paid-up capital of " + f"{fmt_inr(reg)}; the audited balance sheet states {fmt_inr(aud)}. These are " + "two independent authorities for the same figure and an offer document must " + "reconcile them. A difference commonly means an allotment made after the " + "registry snapshot, which itself has to be disclosed in the capital " + "structure."), + icdr_ref=ref, delta=fmt_inr(abs(reg - aud)), + evidence=[e for e in (ev(facts, "cap.paidup_capital_registry"), + ev(facts, "fin.current.share_capital")) if e], + fact_ids=["cap.paidup_capital_registry", "fin.current.share_capital"], + resolutions=[Resolution( + id="adopt_audited", label="Adopt the audited balance sheet", + description=("Treat the audited accounts as authoritative and disclose any " + "allotment made since the registry snapshot."), + recommended=True, kind="adopt_value", + target_fact_id="cap.paidup_capital_registry", new_value=aud, + justification="Audited accounts carry the auditor's opinion.")], + ) + ]) diff --git a/app/backend/primarydraft/export/__init__.py b/app/backend/primarydraft/export/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app/backend/primarydraft/export/docx_export.py b/app/backend/primarydraft/export/docx_export.py new file mode 100644 index 0000000000000000000000000000000000000000..ddbe289d6aa55685200856ae12f6ec5726fbfd77 --- /dev/null +++ b/app/backend/primarydraft/export/docx_export.py @@ -0,0 +1,248 @@ +"""Export the draft as a Word document the merchant banker can actually edit. + +Citations survive the export: every figure carries a footnote-style source marker +and the document ends with a provenance schedule, so the reviewer can check any +number against the filed page it came from without opening the tool. +""" + +from __future__ import annotations + +import re +from pathlib import Path + +from docx import Document +from docx.enum.text import WD_ALIGN_PARAGRAPH +from docx.shared import Pt, RGBColor + +from ..models import FactStatus, Run, Severity + +NAVY = RGBColor(0x0B, 0x1B, 0x2B) +TEAL = RGBColor(0x0E, 0x9F, 0x9A) +SLATE = RGBColor(0x5B, 0x6B, 0x7E) +RED = RGBColor(0xD7, 0x44, 0x3E) +AMBER = RGBColor(0xB0, 0x76, 0x0B) + +CITE_RE = re.compile(r']*data-fact-id="([^"]*)"[^>]*>(.*?)', re.S) +ANY_CITE_RE = re.compile(r"]*>(.*?)", re.S) +TAG_RE = re.compile(r"<[^>]+>") + + +def _unescape(s: str) -> str: + import html as _h + return _h.unescape(s) + + +def _blocks(html: str) -> list[tuple[str, str]]: + """Split rendered section HTML into ('p'|'li'|'table', inner html) blocks.""" + out: list[tuple[str, str]] = [] + for m in re.finditer(r"<(p|li|table)\b[^>]*>(.*?)", html, re.S | re.I): + out.append((m.group(1).lower(), m.group(2))) + return out + + +def build_docx(run: Run, path: Path) -> Path: + doc = Document() + + style = doc.styles["Normal"] + style.font.name = "Calibri" + style.font.size = Pt(10.5) + + # ------------------------------------------------------------------ cover + t = doc.add_paragraph() + t.alignment = WD_ALIGN_PARAGRAPH.CENTER + r = t.add_run("DRAFT RED HERRING PROSPECTUS: WORKING DRAFT") + r.bold = True + r.font.size = Pt(16) + r.font.color.rgb = NAVY + + s = doc.add_paragraph() + s.alignment = WD_ALIGN_PARAGRAPH.CENTER + sr = s.add_run("Not for circulation ยท Not certified ยท Not filed") + sr.italic = True + sr.font.color.rgb = RED + + doc.add_paragraph() + h = doc.add_paragraph() + h.alignment = WD_ALIGN_PARAGRAPH.CENTER + hr = h.add_run(run.company_name) + hr.bold = True + hr.font.size = Pt(20) + hr.font.color.rgb = NAVY + + meta = doc.add_paragraph() + meta.alignment = WD_ALIGN_PARAGRAPH.CENTER + mr = meta.add_run( + f"CIN {run.cin or '-'} ยท BSE scrip {run.scrip_code} ยท " + f"{run.meta.get('industry') or ''}" + ) + mr.font.color.rgb = SLATE + + doc.add_paragraph() + box = doc.add_paragraph() + br = box.add_run( + "This working draft was assembled by PrimaryDraft from the issuer's own filed " + f"annual report ({run.meta.get('annual_report_year')}) and the BSE scrip master. " + "Every figure below resolves to a source in the accompanying audit manifest. " + "Proposed issue terms were supplied by the user and are not facts about the issuer. " + "The merchant banker reviews, edits, certifies and files; PrimaryDraft does none of " + "those things." + ) + br.italic = True + br.font.size = Pt(9.5) + br.font.color.rgb = SLATE + + # ------------------------------------------------------- verdict summary + doc.add_page_break() + hh = doc.add_heading("Consistency check summary", level=1) + hh.runs[0].font.color.rgb = NAVY + + passed = sum(1 for r_ in run.rule_results if r_.status == "pass") + failed = sum(1 for r_ in run.rule_results if r_.status == "fail") + na = sum(1 for r_ in run.rule_results if r_.status == "not_applicable") + p = doc.add_paragraph() + p.add_run( + f"{len(run.rule_results)} deterministic checks were run: {passed} passed, " + f"{failed} failed, {na} not applicable. ICDR Schedule VI clause coverage is " + f"{run.coverage_pct()}%. No language model participated in any check." + ) + + if run.open_findings: + tb = doc.add_table(rows=1, cols=4) + tb.style = "Light Grid Accent 1" + for i, txt in enumerate(("Severity", "Rule", "Finding", "Difference")): + cell = tb.rows[0].cells[i] + cell.text = txt + for para in cell.paragraphs: + for rr in para.runs: + rr.bold = True + for f in sorted(run.open_findings, + key=lambda x: list(Severity).index(x.severity)): + row = tb.add_row().cells + row[0].text = f.severity.value.upper() + row[1].text = f.rule_id + row[2].text = f.title + row[3].text = f.delta or "-" + else: + doc.add_paragraph("No open findings. Every deterministic check that applied passed.") + + # ------------------------------------------------------------- sections + cited: dict[str, str] = {} + + for sec in run.sections: + doc.add_page_break() + hd = doc.add_heading(f"{sec.number}. {sec.title}", level=1) + hd.runs[0].font.color.rgb = NAVY + cl = doc.add_paragraph() + clr = cl.add_run(sec.icdr_clause) + clr.italic = True + clr.font.size = Pt(9) + clr.font.color.rgb = TEAL + + for kind, inner in _blocks(sec.html): + if kind == "table": + _add_table(doc, inner) + continue + para = doc.add_paragraph(style="List Bullet" if kind == "li" else None) + _add_rich(para, inner, run, cited) + + # -------------------------------------------------- provenance schedule + doc.add_page_break() + ph = doc.add_heading("Schedule of sources", level=1) + ph.runs[0].font.color.rgb = NAVY + doc.add_paragraph( + "Every figure cited in this draft, with the source it was read from. " + "Figures marked unverified were found in a single location with no " + "corroborating source and must be confirmed before filing." + ) + + tb = doc.add_table(rows=1, cols=4) + tb.style = "Light Grid Accent 1" + for i, txt in enumerate(("Figure", "Value", "Status", "Source")): + cell = tb.rows[0].cells[i] + cell.text = txt + for para in cell.paragraphs: + for rr in para.runs: + rr.bold = True + + used = run.meta.get("used_fact_ids") or list(run.facts) + for fid in sorted(set(used)): + f = run.facts.get(fid) + if f is None: + continue + prov = f.provenance[0] if f.provenance else None + row = tb.add_row().cells + row[0].text = f.label + row[1].text = cited.get(fid, str(f.value)) + row[2].text = f.status.value + row[3].text = (f"{prov.source_title}: {prov.locator}" if prov else "-") + + # ------------------------------------------------------------ sign-off + doc.add_page_break() + sh = doc.add_heading("Status of this document", level=1) + sh.runs[0].font.color.rgb = NAVY + for line in ( + "This is a working draft produced by an automated pre-filing consistency tool.", + "It has not been certified by a merchant banker.", + "It has not been filed with any stock exchange or with the Securities and Exchange " + "Board of India.", + "It is not an offer document and must not be circulated as one.", + "The due diligence certificate under Regulation 23 remains the responsibility of the " + "merchant banker.", + ): + b = doc.add_paragraph(style="List Bullet") + b.add_run(line) + + path.parent.mkdir(parents=True, exist_ok=True) + doc.save(str(path)) + return path + + +def _add_rich(para, inner: str, run: Run, cited: dict[str, str]) -> None: + """Write a paragraph, colouring cited figures by the status they earned.""" + pos = 0 + for m in ANY_CITE_RE.finditer(inner): + pre = TAG_RE.sub("", inner[pos:m.start()]) + if pre.strip(): + para.add_run(_unescape(re.sub(r"\s+", " ", pre))) + text = _unescape(TAG_RE.sub("", m.group(1))).strip() + fid_m = re.search(r'data-fact-id="([^"]*)"', m.group(0)) + status_m = re.search(r'data-status="([^"]*)"', m.group(0)) + status = status_m.group(1) if status_m else "" + run_ = para.add_run(text) + run_.bold = True + if status == FactStatus.UNVERIFIED.value: + run_.font.color.rgb = AMBER + elif status == FactStatus.CONFLICTED.value: + run_.font.color.rgb = RED + elif status == "proposed": + run_.font.color.rgb = SLATE + else: + run_.font.color.rgb = NAVY + if fid_m: + cited[fid_m.group(1)] = text + pos = m.end() + tail = TAG_RE.sub("", inner[pos:]) + if tail.strip(): + para.add_run(_unescape(re.sub(r"\s+", " ", tail))) + + +def _add_table(doc, inner: str) -> None: + rows = re.findall(r"]*>(.*?)", inner, re.S | re.I) + if not rows: + return + parsed: list[list[str]] = [] + for r in rows: + cells = re.findall(r"<(?:td|th)\b[^>]*>(.*?)", r, re.S | re.I) + parsed.append([_unescape(re.sub(r"\s+", " ", TAG_RE.sub("", c))).strip() + for c in cells]) + width = max(len(r) for r in parsed) + tb = doc.add_table(rows=0, cols=width) + tb.style = "Light Grid Accent 1" + for i, r in enumerate(parsed): + cells = tb.add_row().cells + for j, text in enumerate(r[:width]): + cells[j].text = text + if i == 0: + for para in cells[j].paragraphs: + for rr in para.runs: + rr.bold = True diff --git a/app/backend/primarydraft/export/manifest.py b/app/backend/primarydraft/export/manifest.py new file mode 100644 index 0000000000000000000000000000000000000000..64764e0cd36da918a4b2b7cab4fe73aab25c8336 --- /dev/null +++ b/app/backend/primarydraft/export/manifest.py @@ -0,0 +1,143 @@ +"""The audit manifest. + +This is the artefact that makes the tool defensible to a regulator: for every +figure in the draft it records where the value came from, what status it earned, +what supported it, and which human decided what. A reviewer can reconstruct the +entire draft from this file plus the source filings. +""" + +from __future__ import annotations + +import datetime as _dt +from typing import Any + +from ..engine import rules as rules_mod +from ..models import FactStatus, Run + + +def build_manifest(run: Run) -> dict[str, Any]: + facts_by_status: dict[str, list[dict[str, Any]]] = {s.value: [] for s in FactStatus} + for f in sorted(run.facts.values(), key=lambda x: x.id): + facts_by_status[f.status.value].append({ + "id": f.id, + "label": f.label, + "value": f.value, + "unit": f.unit.value, + "confidence": f.confidence, + "note": f.note, + "identities_supporting": f.identities, + "derived_from": f.derived_from, + "corroborating_sources": f.corroboration(), + "used_in_sections": f.section_refs, + "provenance": [ + { + "source": p.source_title, + "type": p.source_type, + "locator": p.locator, + "page": p.page, + "section": p.section, + "raw_line": p.raw_line, + "url": p.url, + "extractor": p.extractor, + "retrieved_at": p.retrieved_at, + } + for p in f.provenance + ], + "history": f.history, + }) + + used = set(run.meta.get("used_fact_ids") or []) + + return { + "manifest_version": "1.0", + "generated_at": _dt.datetime.now(_dt.timezone.utc).isoformat(timespec="seconds"), + "tool": { + "name": "PrimaryDraft", + "purpose": ("Pre-filing consistency gate for SME IPO offer documents. " + "Decision-support only."), + "deterministic_rule_count": rules_mod.rule_count(), + "llm_in_correctness_loop": False, + "statement": ( + "The correctness verdict in this manifest was produced entirely by " + "deterministic Python rules. No language model participated in any check. " + "Narrative phrasing may be model-assisted, but every figure in the draft " + "resolves to a ledger fact carrying the provenance recorded here." + ), + }, + "issuer": { + "name": run.company_name, + "cin": run.cin, + "bse_scrip_code": run.scrip_code, + "industry": run.meta.get("industry"), + "sector": run.meta.get("sector"), + "bse_group": run.meta.get("bse_group"), + }, + "sources": run.source_documents, + "source_integrity": { + "isin_corroborated_across_sources": run.meta.get("isin_corroborated"), + "accounting_identities_closed": run.meta.get("identities_closed", []), + "statement_pages": run.meta.get("statement_pages", {}), + "reporting_scales": run.meta.get("scales", {}), + "extraction_warnings": run.meta.get("extraction_warnings", []), + }, + "proposed_issue_terms": { + **(run.meta.get("issue") or {}), + "_note": ("Proposed terms supplied by the user. These are not facts about the " + "issuer and are recorded separately from the disclosure ledger."), + }, + "ledger": { + "total_facts": len(run.facts), + "status_counts": run.status_counts(), + "facts_used_in_draft": len(used), + "facts_by_status": facts_by_status, + }, + "draft": { + "sections": [ + {"id": s.id, "number": s.number, "title": s.title, + "icdr_clause": s.icdr_clause, "word_count": s.word_count, + "facts_cited": s.fact_ids, "narrative_source": s.narrative_source} + for s in run.sections + ], + "tokens_abstained": run.meta.get("missing_fact_ids", []), + "unsourced_figures": run.meta.get("unbound_numbers", []), + }, + "icdr_coverage": { + "percent": run.coverage_pct(), + "covered": sum(1 for c in run.coverage if c.covered), + "total": len(run.coverage), + "uncovered_clauses": [ + {"clause": c.clause, "title": c.title, "reason": c.reason} + for c in run.coverage if not c.covered + ], + }, + "checks": [ + { + "rule_id": r.rule_id, + "title": r.title, + "icdr_ref": r.icdr_ref, + "status": r.status, + "detail": r.detail, + "findings": [ + { + "severity": f.severity.value, + "title": f.title, + "explanation": f.explanation, + "delta": f.delta, + "resolved": f.resolved, + "resolved_by": f.resolved_by, + "resolved_at": f.resolved_at, + "evidence": [e.model_dump() for e in f.evidence], + } + for f in r.findings + ], + } + for r in run.rule_results + ], + "decision_log": [d.model_dump() for d in run.decisions], + "sign_off": { + "certified": False, + "statement": ("PrimaryDraft does not certify and does not file. The merchant " + "banker reviews this draft, exercises independent judgement, and " + "gives the due diligence certificate required under Regulation 23."), + }, + } diff --git a/app/backend/primarydraft/issue.py b/app/backend/primarydraft/issue.py new file mode 100644 index 0000000000000000000000000000000000000000..59b54cd06da5e45023eb9f21dd9dbe10d942b983 --- /dev/null +++ b/app/backend/primarydraft/issue.py @@ -0,0 +1,151 @@ +"""Proposed issue terms: the merchant banker's own input. + +The company's financials are real, read from its filed annual report. The issue +being contemplated is a *proposal*, supplied by the user exactly as a merchant +banker would supply it. Keeping the two apart matters: nothing here is presented +as a fact about the company, and the ledger never absorbs it as one. + +Defaults are computed from the issuer's real net worth so the form opens with a +plausible structure, and every field is editable. +""" + +from __future__ import annotations + +from typing import Any + +from pydantic import BaseModel, Field + + +class IssueObject(BaseModel): + """One stated object of the issue.""" + + id: str + label: str + amount: float + is_general_corporate: bool = False + #: FY label -> amount, e.g. {"FY2027": 1_00_00_000} + schedule: dict[str, float] = Field(default_factory=dict) + + +class IssueTerms(BaseModel): + """A proposed SME IPO structure. User input, clearly separated from filed facts.""" + + face_value: float = 10.0 + price_per_share: float = 100.0 + fresh_issue_shares: float = 0.0 + ofs_shares: float = 0.0 + issue_expenses: float = 0.0 + objects: list[IssueObject] = Field(default_factory=list) + lead_manager: str = "" + listing_platform: str = "BSE SME" + + # --------------------------------------------------------------- derivations + + @property + def fresh_issue_value(self) -> float: + return self.fresh_issue_shares * self.price_per_share + + @property + def ofs_value(self) -> float: + return self.ofs_shares * self.price_per_share + + @property + def total_issue_value(self) -> float: + return self.fresh_issue_value + self.ofs_value + + @property + def total_issue_shares(self) -> float: + return self.fresh_issue_shares + self.ofs_shares + + @property + def net_proceeds(self) -> float: + """Only the fresh issue reaches the company; an OFS goes to selling shareholders.""" + return self.fresh_issue_value - self.issue_expenses + + def to_public(self) -> dict[str, Any]: + return { + **self.model_dump(), + "fresh_issue_value": self.fresh_issue_value, + "ofs_value": self.ofs_value, + "total_issue_value": self.total_issue_value, + "total_issue_shares": self.total_issue_shares, + "net_proceeds": self.net_proceeds, + } + + +def _round_to(v: float, step: float) -> float: + return max(step, round(v / step) * step) + + +def default_terms(facts: dict[str, Any]) -> IssueTerms: + """Open the form with a structure scaled to the issuer's real balance sheet. + + These are suggestions for the banker to edit, not claims about the company. + They are deliberately built to be *plausible but not pre-reconciled*: the + engine's job is to check the proposal, so it must be checked honestly. + """ + + def val(fid: str) -> float | None: + f = facts.get(fid) + v = getattr(f, "value", None) + return float(v) if isinstance(v, (int, float)) else None + + face_value = val("co.face_value") or 10.0 + net_worth = val("fin.current.net_worth") or 0.0 + eps = val("fin.current.eps_basic") or val("fin.current.eps_computed") or 0.0 + shares = val("cap.shares_outstanding") or 0.0 + + # Price on a modest multiple of real earnings, floored at face value. + price = _round_to(max(eps * 15.0, face_value * 1.5, face_value + 1.0), 1.0) + + # Raise roughly 40% of net worth, floored so the structure is meaningful. + target_raise = max(net_worth * 0.40, 5_00_00_000.0) + fresh_shares = _round_to(target_raise / price, 10_000.0) + + # Keep the opening proposal inside the SME platform's post-issue capital + # ceiling (Reg 229(1)); the banker can still push it past, and the engine + # will say so. + sme_capital_ceiling = 25_00_00_000.0 + share_capital = shares * face_value + if face_value: + headroom = max(0.0, (sme_capital_ceiling - share_capital) / face_value) + if headroom: + fresh_shares = min(fresh_shares, _round_to(headroom * 0.9, 10_000.0)) + + # A modest OFS, sized at 15% of the total issue: inside the 20% SME cap. + ofs_shares = _round_to(fresh_shares * 0.1765, 10_000.0) + if shares: + ofs_shares = min(ofs_shares, _round_to(shares * 0.10, 10_000.0)) + + gross = fresh_shares * price + expenses = _round_to(gross * 0.06, 1_00_000.0) + net = gross - expenses + + capex = _round_to(net * 0.45, 1_00_000.0) + wc = _round_to(net * 0.30, 1_00_000.0) + debt = _round_to(net * 0.12, 1_00_000.0) + gcp = net - capex - wc - debt + + objects = [ + IssueObject(id="capex", label="Funding capital expenditure towards plant and machinery", + amount=capex, + schedule={"FY2027": round(capex * 0.6, 2), "FY2028": round(capex * 0.4, 2)}), + IssueObject(id="working_capital", + label="Funding incremental working capital requirements", amount=wc, + schedule={"FY2027": round(wc * 0.5, 2), "FY2028": round(wc * 0.5, 2)}), + IssueObject(id="debt_repayment", + label="Repayment or prepayment of certain borrowings", amount=debt, + schedule={"FY2027": debt}), + IssueObject(id="gcp", label="General corporate purposes", amount=round(gcp, 2), + is_general_corporate=True, schedule={"FY2027": round(gcp, 2)}), + ] + + return IssueTerms( + face_value=face_value, + price_per_share=price, + fresh_issue_shares=fresh_shares, + ofs_shares=ofs_shares, + issue_expenses=expenses, + objects=objects, + listing_platform="BSE SME", + ) diff --git a/app/backend/primarydraft/ledger.py b/app/backend/primarydraft/ledger.py new file mode 100644 index 0000000000000000000000000000000000000000..b4fea86b5519b5d6c689f0bbd15f00bd19acbce5 --- /dev/null +++ b/app/backend/primarydraft/ledger.py @@ -0,0 +1,423 @@ +"""Build the Disclosure Ledger from real extracted filings. + +Status is *earned*, never assumed: + + two independent sections agree -> VERIFIED (corroborated) + one section, but an identity closes -> VERIFIED (identity-supported) + two sections disagree -> CONFLICTED (engine raises a finding) + one section, nothing supports it -> UNVERIFIED (abstain; says what to confirm) + +Nothing is invented. A value we could not read is simply absent from the ledger, +and the ICDR coverage map reports that absence honestly. +""" + +from __future__ import annotations + +from typing import Any + +from .models import Fact, FactStatus, Provenance, Unit + +# Human labels for the canonical fields we extract. +LABELS: dict[str, str] = { + "revenue_from_operations": "Revenue from operations", + "other_income": "Other income", + "total_income": "Total income", + "cost_of_materials": "Cost of materials consumed", + "purchases_stock_in_trade": "Purchases of stock-in-trade", + "employee_benefits": "Employee benefits expense", + "finance_costs": "Finance costs", + "depreciation": "Depreciation and amortisation", + "other_expenses": "Other expenses", + "total_expenses": "Total expenses", + "pbt": "Profit before tax", + "tax_current": "Current tax", + "tax_deferred": "Deferred tax", + "pat": "Profit after tax (restated)", + "eps_basic": "Basic earnings per share", + "eps_diluted": "Diluted earnings per share", + "share_capital": "Equity share capital", + "reserves_surplus": "Reserves and surplus", + "borrowings_non_current": "Long-term borrowings", + "borrowings_current": "Short-term borrowings", + "deferred_tax_liability": "Deferred tax liabilities (net)", + "other_current_liabilities": "Other current liabilities", + "short_term_provisions": "Short-term provisions", + "trade_payables": "Trade payables", + "total_equity_liabilities": "Total equity and liabilities", + "ppe": "Property, plant and equipment", + "non_current_investments": "Non-current investments", + "long_term_loans_advances": "Long-term loans and advances", + "current_investments": "Current investments", + "inventories": "Inventories", + "trade_receivables": "Trade receivables", + "cash_and_equivalents": "Cash and cash equivalents", + "total_assets": "Total assets", +} + +# Which ICDR offer-document sections consume each field. +SECTION_REFS: dict[str, list[str]] = { + "revenue_from_operations": ["financial_information", "mdna", "basis_for_issue_price"], + "other_income": ["financial_information", "mdna"], + "total_income": ["financial_information", "mdna"], + "total_expenses": ["financial_information", "mdna"], + "pbt": ["financial_information", "mdna"], + "pat": ["financial_information", "mdna", "basis_for_issue_price"], + "eps_basic": ["basis_for_issue_price", "financial_information"], + "eps_diluted": ["basis_for_issue_price", "financial_information"], + "share_capital": ["capital_structure", "financial_information"], + "reserves_surplus": ["financial_information", "basis_for_issue_price"], + "total_assets": ["financial_information"], + "total_equity_liabilities": ["financial_information"], +} + +UNITS: dict[str, Unit] = { + "eps_basic": Unit.RATIO, + "eps_diluted": Unit.RATIO, +} + +SECTION_TITLES = { + "audited_pl": "Statement of Profit and Loss (audited)", + "directors_report": "Directors' Report: Financial Results", + "balance_sheet": "Balance Sheet (audited)", +} + +# Fields the two P&L presentations should agree on. Tax lines are excluded: the +# Directors' Report presents them as negatives inside a derivation, so a raw +# comparison would flag a presentational difference as a contradiction. +CROSS_CHECK_FIELDS = ( + "revenue_from_operations", "other_income", "total_income", + "pat", "eps_basic", "eps_diluted", +) + +REL_TOL = 0.005 # 0.5%: absorbs rounding between two printings of one figure + + +def _close(a: float, b: float, tol: float = REL_TOL) -> bool: + scale = max(abs(a), abs(b), 1.0) + return abs(a - b) <= tol * scale + + +def _prov(src: dict[str, Any], ex: dict[str, Any], section: str, cell: dict[str, Any], + extractor: str = "deterministic") -> Provenance: + return Provenance( + source_id=f"ar_{src['scrip_code']}_{src['annual_report']['year']}", + source_title=(f"Annual Report {src['annual_report']['year']}: " + f"{src['bse']['scrip_name']}"), + source_type="annual_report", + page=cell.get("page"), + locator=f"p.{cell.get('page')} ยท {SECTION_TITLES.get(section, section)}", + raw_line=cell.get("line", ""), + section=section, + url=src["annual_report"].get("url"), + extractor=extractor, # type: ignore[arg-type] + ) + + +def _identity_supports(field: str, identities: list[str]) -> list[str]: + """Which closed identities vouch for this particular field.""" + out = [] + for ident in identities: + toks = ident.replace("=", " ").replace("+", " ").replace("-", " ").split() + norm = {t.strip().lower() for t in toks} + if field in norm: + out.append(ident) + elif field == "revenue_from_operations" and "revenue" in norm: + out.append(ident) + elif field == "other_income" and "other_income" in ident: + out.append(ident) + elif field in ("total_assets", "total_equity_liabilities") and "total" in ident: + out.append(ident) + return out + + +def build_ledger(record: dict[str, Any]) -> dict[str, Fact]: + """Turn one real company record into provenance-bound facts.""" + ex = record["extraction"] + facts: dict[str, Fact] = {} + + year = str(record["annual_report"].get("year") or "") + periods = {"current": f"FY{year}", "previous": "FY-prior"} + + statements = { + "audited_pl": (ex.get("audited_pl") or {}, ex.get("audited_pl_identities") or []), + "directors_report": (ex.get("directors_pl") or {}, ex.get("directors_pl_identities") or []), + "balance_sheet": (ex.get("balance_sheet") or {}, ex.get("balance_sheet_identities") or []), + } + + # ---- 1. gather every reading of every (field, period) across all statements + readings: dict[tuple[str, str], list[tuple[str, dict[str, Any], list[str]]]] = {} + for section, (stmt, idents) in statements.items(): + for field, cols in stmt.items(): + for period, cell in cols.items(): + readings.setdefault((field, period), []).append((section, cell, idents)) + + # ---- 2. reconcile each into exactly one fact + for (field, period), obs in readings.items(): + label = LABELS.get(field, field.replace("_", " ").capitalize()) + unit = UNITS.get(field, Unit.INR) + fid = f"fin.{period}.{field}" + + provs = [_prov(record, ex, sec, cell) for sec, cell, _ in obs] + values = [cell["value"] for _, cell, _ in obs] + supporting: list[str] = [] + for sec, _cell, idents in obs: + supporting += _identity_supports(field, idents) + + distinct_sections = {sec for sec, _, _ in obs} + + # Two readings are only comparable when they are on the SAME reporting + # basis. A standalone figure and a consolidated figure are different + # measures, and a Directors' Report that prints both side by side is + # ambiguous. Comparing across bases would manufacture a contradiction + # from two correctly-stated numbers, so we decline to compare at all. + bases = {cell.get("basis") for _, cell, _ in obs} + comparable = len(bases) == 1 and None not in bases + cross_checkable = field in CROSS_CHECK_FIELDS and comparable + + # If the two sections print the SAME digits but we scaled them differently, + # the disagreement is ours, not the issuer's: one of the two scale headings + # was misread. That is a presentation ambiguity (DOC-002), never a + # contradiction to put in front of a regulator. + raw_values = [cell["value"] / (cell.get("scale") or 1.0) for _, cell, _ in obs] + same_digits = len(obs) > 1 and all(_close(raw_values[0], r) for r in raw_values[1:]) + scale_mismatch = same_digits and not all(_close(values[0], v) for v in values[1:]) + + if scale_mismatch: + status = FactStatus.UNVERIFIED + conf = 0.55 + note = ( + "Both sections print the same figure, but they declare different " + "reporting scales, so the amounts do not agree once normalised. This is " + "an ambiguity in how the filing states its units, not a difference in " + "the underlying number. Confirm the presentation basis." + ) + elif len(obs) > 1 and cross_checkable and not all( + _close(values[0], v) for v in values[1:] + ): + # Two independent sections of the company's own filing disagree. + status = FactStatus.CONFLICTED + conf = 0.35 + note = ( + "Two sections of the filing state different values for this figure: " + + "; ".join( + f"{SECTION_TITLES.get(sec, sec)} = {cell['value']:,.2f}" + for sec, cell, _ in obs + ) + ) + elif len(distinct_sections) > 1 and cross_checkable: + status = FactStatus.VERIFIED + conf = 0.99 + note = None + elif supporting: + status = FactStatus.VERIFIED + conf = 0.9 + note = None + elif len(obs) > 1 and not comparable: + status = FactStatus.UNVERIFIED + conf = 0.6 + seen = ", ".join(sorted(str(b or "basis not stated") for b in bases)) + note = ( + "This figure appears in more than one section, but on different " + f"reporting bases ({seen}), so the readings are not comparable and " + "have not been treated as corroborating each other. Confirm which " + "basis the offer document should present." + ) + else: + status = FactStatus.UNVERIFIED + conf = 0.5 + note = ( + "Read from a single location with no corroborating section and no " + "accounting identity supporting it. Confirm against the audited " + "financial statements before filing." + ) + + facts[fid] = Fact( + id=fid, + label=f"{label} ({periods.get(period, period)})", + value=values[0], + unit=unit, + status=status, + confidence=conf, + provenance=provs, + section_refs=SECTION_REFS.get(field, ["financial_information"]), + note=note, + period=period, + identities=sorted(set(supporting)), + ) + + # ---- 3. company identity facts (BSE master + the filing itself) + bse = record["bse"] + api_prov = Provenance( + source_id=f"bse_{record['scrip_code']}", + source_title="BSE India: scrip master & company header (live API)", + source_type="bse_api", + locator="api.bseindia.com ยท ListofScripData / ComHeadernew", + section="bse_master", + url="https://api.bseindia.com/BseIndiaAPI/api/ListofScripData/w", + extractor="deterministic", + ) + filing_prov = Provenance( + source_id=f"ar_{record['scrip_code']}_{record['annual_report']['year']}", + source_title=f"Annual Report {record['annual_report']['year']}", + source_type="annual_report", + locator="cover / corporate information", + section="corporate_information", + url=record["annual_report"].get("url"), + extractor="deterministic", + ) + + def add(fid: str, label: str, value: Any, unit: Unit, provs: list[Provenance], + status: FactStatus, refs: list[str], note: str | None = None) -> None: + if value in (None, "", []): + return + facts[fid] = Fact(id=fid, label=label, value=value, unit=unit, status=status, + confidence=0.99 if status == FactStatus.VERIFIED else 0.6, + provenance=provs, section_refs=refs, note=note) + + add("co.name", "Name of the Issuer", bse["scrip_name"], Unit.TEXT, + [api_prov, filing_prov], FactStatus.VERIFIED, ["general_information"]) + add("co.cin", "Corporate Identity Number", ex.get("cin"), Unit.TEXT, + [filing_prov], FactStatus.VERIFIED, ["general_information"]) + + # ISIN appears in BOTH the BSE master and the company's own annual report. + isin_status = (FactStatus.VERIFIED if record.get("isin_corroborated") + else FactStatus.UNVERIFIED) + add("co.isin", "ISIN", bse.get("isin"), Unit.TEXT, + [api_prov, filing_prov] if record.get("isin_corroborated") else [api_prov], + isin_status, ["general_information"], + None if record.get("isin_corroborated") + else "ISIN in the BSE master could not be matched to the annual report text.") + + add("co.face_value", "Face value per equity share", _f(bse.get("face_value")), Unit.INR, + [api_prov], FactStatus.VERIFIED, ["capital_structure"]) + add("co.industry", "Industry", bse.get("industry"), Unit.TEXT, [api_prov], + FactStatus.VERIFIED, ["our_business"]) + add("co.sector", "Sector", bse.get("sector"), Unit.TEXT, [api_prov], + FactStatus.VERIFIED, ["our_business"]) + add("co.bse_group", "BSE trading group (SME platform)", bse.get("group"), Unit.TEXT, + [api_prov], FactStatus.VERIFIED, ["general_information"]) + add("co.market_cap", "Market capitalisation (BSE)", _f(bse.get("market_cap")), Unit.INR, + [api_prov], FactStatus.VERIFIED, ["basis_for_issue_price"]) + add("co.eps_bse", "Earnings per share as published by BSE", _f(bse.get("eps_reported")), + Unit.RATIO, [api_prov], FactStatus.VERIFIED, ["basis_for_issue_price"]) + add("co.pe_bse", "Price/earnings ratio as published by BSE", _f(bse.get("pe_reported")), + Unit.RATIO, [api_prov], FactStatus.VERIFIED, ["basis_for_issue_price"]) + + for i, aud in enumerate(ex.get("auditors") or []): + if "chartered accountant" not in aud.lower() or len(aud) > 80: + continue + add(f"co.auditor.{i}", "Statutory auditor (as named in the filing)", aud, Unit.TEXT, + [filing_prov], FactStatus.UNVERIFIED, ["general_information"], + "Auditor name read from the filing text; confirm the firm registration number.") + + for i, din in enumerate((ex.get("dins") or [])[:10]): + add(f"mgmt.din.{i}", "Director Identification Number disclosed in the filing", din, + Unit.TEXT, [filing_prov], FactStatus.VERIFIED, ["our_management"]) + + for i, rp in enumerate((ex.get("related_party") or [])[:14]): + p = Provenance( + source_id=f"ar_{record['scrip_code']}_{record['annual_report']['year']}", + source_title="Annual Report: Related Party Disclosures", + source_type="annual_report", page=rp.get("page"), + locator=f"p.{rp.get('page')} ยท Related Party Disclosures", + raw_line=rp.get("line", ""), section="related_party", + url=record["annual_report"].get("url"), + ) + facts[f"rpt.{i}"] = Fact( + id=f"rpt.{i}", label=f"Related party transaction: {rp['label']}", + value=rp["amount"], unit=Unit.INR, status=FactStatus.UNVERIFIED, + confidence=0.55, provenance=[p], section_refs=["related_party", "financial_information"], + note=("Read from the related-party note. Confirm the counterparty relationship " + "and that the amount ties to the RPT summary."), + ) + + # ---- 4. derived facts, with explicit lineage + _add_derived(facts, record) + return facts + + +def _f(v: Any) -> float | None: + try: + return float(str(v).replace(",", "").strip()) + except (TypeError, ValueError): + return None + + +def _add_derived(facts: dict[str, Fact], record: dict[str, Any]) -> None: + """Facts computed from other facts. Lineage is recorded; nothing is guessed.""" + year = str(record["annual_report"].get("year") or "") + + def val(fid: str) -> float | None: + f = facts.get(fid) + return float(f.value) if f and isinstance(f.value, (int, float)) else None + + dp = Provenance( + source_id="derived", source_title="Computed by PrimaryDraft from ledger facts", + source_type="derived", locator="deterministic computation", section="derived", + extractor="derived", + ) + + def derive(fid: str, label: str, value: float | None, parents: list[str], + unit: Unit, refs: list[str], note: str | None = None) -> None: + if value is None or not all(p in facts for p in parents): + return + facts[fid] = Fact( + id=fid, label=label, value=round(value, 4), unit=unit, + status=FactStatus.DERIVED, confidence=0.95, provenance=[dp], + section_refs=refs, derived_from=parents, note=note, + ) + + pbt, pat = val("fin.current.pbt"), val("fin.current.pat") + if pbt is not None and pat is not None: + derive("fin.current.tax_total", f"Total tax expense (FY{year}, derived)", pbt - pat, + ["fin.current.pbt", "fin.current.pat"], Unit.INR, ["financial_information"], + "Derived as profit before tax less profit after tax.") + + pbt_, fc, dep, oi = (val("fin.current.pbt"), val("fin.current.finance_costs"), + val("fin.current.depreciation"), val("fin.current.other_income")) + if None not in (pbt_, fc, dep, oi): + derive("fin.current.ebitda", f"EBITDA (FY{year}, derived)", + pbt_ + fc + dep - oi, # type: ignore[operator] + ["fin.current.pbt", "fin.current.finance_costs", + "fin.current.depreciation", "fin.current.other_income"], + Unit.INR, ["basis_for_issue_price", "financial_information"], + "Profit before tax plus finance costs and depreciation, less other income. " + "Drives the Reg 229(6) SME eligibility test.") + + sc, rs = val("fin.current.share_capital"), val("fin.current.reserves_surplus") + if sc is not None and rs is not None: + derive("fin.current.net_worth", f"Net worth (FY{year}, derived)", sc + rs, + ["fin.current.share_capital", "fin.current.reserves_surplus"], + Unit.INR, ["financial_information", "basis_for_issue_price"]) + + fv = val("co.face_value") + if sc is not None and fv: + derive("cap.shares_outstanding", "Equity shares outstanding (derived)", sc / fv, + ["fin.current.share_capital", "co.face_value"], Unit.SHARES, + ["capital_structure", "basis_for_issue_price"], + "Equity share capital divided by face value per share.") + + shares, pat_ = val("cap.shares_outstanding"), val("fin.current.pat") + if shares and pat_ is not None: + derive("fin.current.eps_computed", f"Basic EPS (FY{year}, computed)", pat_ / shares, + ["fin.current.pat", "cap.shares_outstanding"], Unit.RATIO, + ["basis_for_issue_price"], + "Profit after tax divided by shares outstanding: reconciled against the " + "EPS as printed in the filing.") + + nw = val("fin.current.net_worth") + if nw is not None and shares: + derive("fin.current.nav_per_share", "Net asset value per equity share (derived)", + nw / shares, ["fin.current.net_worth", "cap.shares_outstanding"], + Unit.RATIO, ["basis_for_issue_price"]) + if nw and pat_ is not None: + derive("fin.current.ronw", "Return on net worth (derived, %)", 100.0 * pat_ / nw, + ["fin.current.pat", "fin.current.net_worth"], Unit.PCT, + ["basis_for_issue_price"]) + + rev_c, rev_p = val("fin.current.revenue_from_operations"), val("fin.previous.revenue_from_operations") + if rev_c is not None and rev_p: + derive("fin.revenue_growth", "Revenue growth over the previous year (derived, %)", + 100.0 * (rev_c - rev_p) / abs(rev_p), + ["fin.current.revenue_from_operations", "fin.previous.revenue_from_operations"], + Unit.PCT, ["mdna", "basis_for_issue_price"]) diff --git a/app/backend/primarydraft/live.py b/app/backend/primarydraft/live.py new file mode 100644 index 0000000000000000000000000000000000000000..b967f64e964fe7b3039ac9eeb727192a449e4bba --- /dev/null +++ b/app/backend/primarydraft/live.py @@ -0,0 +1,269 @@ +"""Live search over the BSE universe, and on-demand ingestion of any issuer. + +Search runs against the real BSE scrip master (4,949 active equity scrips, of which +~513 sit on the SME platform). Choosing an issuer we have not seen before downloads +its actual annual report and parses it, which takes real time and can genuinely +fail. Progress is reported honestly, and so is failure: a filing that is a scanned +image with no text layer yields nothing citable, and we say exactly that rather +than inventing a ledger. +""" + +from __future__ import annotations + +import json +import logging +import threading +import time +import uuid +from concurrent.futures import ThreadPoolExecutor +from typing import Any + +from .sources.bse import SME_GROUPS, BSEClient +from .sources.corpus import DATA, INDEX, Unusable, build_one + +log = logging.getLogger(__name__) + +_MASTER_LOCK = threading.Lock() +_master: list[dict[str, Any]] | None = None +_master_at: float = 0.0 +MASTER_TTL = 60 * 60 * 6 # the scrip master changes rarely; re-read every 6 hours + + +def scrip_master(offline: bool = False) -> list[dict[str, Any]]: + """The live BSE scrip master, memoised in process and cached on disk.""" + global _master, _master_at + with _MASTER_LOCK: + if _master is not None and (time.time() - _master_at) < MASTER_TTL: + return _master + with BSEClient(offline=offline) as c: + _master = c.scrip_master() + _master_at = time.time() + return _master + + +def prepared_codes() -> set[str]: + return {p.stem for p in DATA.glob("*.json")} + + +def search(q: str, scope: str = "sme", limit: int = 40) -> list[dict[str, Any]]: + """Search every active BSE company by name, scrip code or ISIN.""" + rows = scrip_master() + have = prepared_codes() + ql = q.strip().lower() + + def is_sme(r: dict[str, Any]) -> bool: + return (r.get("GROUP") or "").strip() in SME_GROUPS + + pool = [r for r in rows if is_sme(r)] if scope == "sme" else rows + + if ql: + def hit(r: dict[str, Any]) -> bool: + return (ql in (r.get("Scrip_Name") or "").lower() + or ql in (r.get("Issuer_Name") or "").lower() + or ql in str(r.get("SCRIP_CD") or "") + or ql in (r.get("ISIN_NUMBER") or "").lower() + or ql in (r.get("INDUSTRY") or "").lower()) + pool = [r for r in pool if hit(r)] + + def rank(r: dict[str, Any]) -> tuple: + name = (r.get("Scrip_Name") or "").lower() + try: + mcap = float(str(r.get("Mktcap") or 0).replace(",", "")) + except ValueError: + mcap = 0.0 + # Prepared issuers first, then exact prefix matches, then by size. + return ( + str(r.get("SCRIP_CD")) not in have, + not name.startswith(ql) if ql else True, + -mcap, + ) + + out = [] + for r in sorted(pool, key=rank)[:limit]: + code = str(r.get("SCRIP_CD")) + out.append({ + "scrip_code": code, + "name": (r.get("Scrip_Name") or "").strip(), + "issuer_name": (r.get("Issuer_Name") or "").strip(), + "isin": (r.get("ISIN_NUMBER") or "").strip() or None, + "industry": (r.get("INDUSTRY") or "").strip(), + "group": (r.get("GROUP") or "").strip(), + "face_value": r.get("FACE_VALUE"), + "market_cap": r.get("Mktcap"), + "is_sme": is_sme(r), + "prepared": code in have, + }) + return out + + +def enrich_filings(results: list[dict[str, Any]], limit: int = 14) -> None: + """Mark which issuers actually have an annual report on BSE, in place. + + Many recently listed SME issuers have not filed one yet, and a scanned filing + has nothing citable in it. Checking up front means the user is not sent down a + dead end. The index call is cheap JSON and is cached, so this is fast after the + first look. + """ + todo = [r for r in results[:limit] if not r["prepared"]] + if not todo: + for r in results: + r.setdefault("has_filing", r["prepared"] or None) + return + + def check(row: dict[str, Any]) -> None: + try: + with BSEClient() as c: + reports = c.annual_reports(row["scrip_code"]) + row["has_filing"] = bool(reports) + row["filing_year"] = reports[0].get("Year") if reports else None + except Exception: # noqa: BLE001 - unknown is a valid answer here + row["has_filing"] = None + + with ThreadPoolExecutor(max_workers=8) as ex: + list(ex.map(check, todo)) + + for r in results: + if r["prepared"]: + r["has_filing"] = True + else: + r.setdefault("has_filing", None) + + +def universe_counts() -> dict[str, int]: + rows = scrip_master() + return { + "total": len(rows), + "sme": sum(1 for r in rows if (r.get("GROUP") or "").strip() in SME_GROUPS), + "prepared": len(prepared_codes()), + } + + +# ------------------------------------------------------------------- ingestion + +class Job: + """One live ingestion, observable while it runs.""" + + def __init__(self, scrip_code: str, name: str) -> None: + self.id = uuid.uuid4().hex[:12] + self.scrip_code = scrip_code + self.name = name + self.status = "running" # running | done | failed + self.stage = "queued" + self.detail = "Waiting for a worker" + self.pct = 0 + self.error: str | None = None + self.result: dict[str, Any] | None = None + self.started = time.time() + self.events: list[dict[str, Any]] = [] + + def push(self, stage: str, detail: str, pct: int) -> None: + self.stage, self.detail, self.pct = stage, detail, pct + self.events.append({"stage": stage, "detail": detail, "pct": pct, + "at": round(time.time() - self.started, 1)}) + + def to_dict(self) -> dict[str, Any]: + return { + "id": self.id, "scrip_code": self.scrip_code, "name": self.name, + "status": self.status, "stage": self.stage, "detail": self.detail, + "pct": self.pct, "error": self.error, + "elapsed": round(time.time() - self.started, 1), + "events": self.events, + "summary": self.result, + } + + +_JOBS: dict[str, Job] = {} +_POOL = ThreadPoolExecutor(max_workers=2, thread_name_prefix="ingest") +_BY_CODE: dict[str, str] = {} + + +def _run(job: Job) -> None: + try: + rows = scrip_master() + row = next((r for r in rows if str(r.get("SCRIP_CD")) == job.scrip_code), None) + if row is None: + raise Unusable("That scrip code is not in the active BSE equity master.") + + with BSEClient() as client: + rec = build_one(client, row, progress=job.push) + + if rec is None: + raise Unusable("The issuer's records could not be read.") + + DATA.mkdir(parents=True, exist_ok=True) + (DATA / f"{rec['scrip_code']}.json").write_text(json.dumps(rec, indent=1)) + _refresh_index() + + ex = rec["extraction"] + job.result = { + "scrip_code": rec["scrip_code"], + "name": rec["bse"]["scrip_name"], + "cin": ex["cin"], + "pages": ex["pages"], + "year": rec["annual_report"]["year"], + "pl_fields": len(ex["audited_pl"]), + "bs_fields": len(ex["balance_sheet"]), + "identities": (ex["audited_pl_identities"] + ex["balance_sheet_identities"] + + ex["directors_pl_identities"]), + "isin_corroborated": rec["isin_corroborated"], + "warnings": ex.get("warnings", []), + } + job.push("done", f"Read {ex['pages']} pages and built a record for {ex['cin']}", 100) + job.status = "done" + + except Unusable as e: + job.error = str(e) + job.status = "failed" + job.push("failed", str(e), 100) + except Exception as e: # noqa: BLE001 + log.exception("ingest failed for %s", job.scrip_code) + job.error = f"{type(e).__name__}: {e}" + job.status = "failed" + job.push("failed", job.error, 100) + + +def start_ingest(scrip_code: str, name: str = "") -> Job: + """Begin (or re-join) a live ingestion for one issuer.""" + existing = _BY_CODE.get(scrip_code) + if existing and existing in _JOBS and _JOBS[existing].status == "running": + return _JOBS[existing] + + job = Job(scrip_code, name) + _JOBS[job.id] = job + _BY_CODE[scrip_code] = job.id + _POOL.submit(_run, job) + return job + + +def get_job(job_id: str) -> Job | None: + return _JOBS.get(job_id) + + +def _refresh_index() -> None: + """Rebuild the corpus index from whatever is on disk.""" + idx: list[dict[str, Any]] = [] + for p in sorted(DATA.glob("*.json")): + try: + r = json.loads(p.read_text()) + e = r["extraction"] + except Exception: # noqa: BLE001 + continue + idx.append({ + "scrip_code": r["scrip_code"], + "name": r["bse"]["scrip_name"], + "cin": e["cin"], + "isin": r["bse"]["isin"], + "industry": r["bse"]["industry"], + "sector": r["bse"]["sector"], + "year": r["annual_report"]["year"], + "pages": e["pages"], + "pl_fields": len(e["audited_pl"]), + "bs_fields": len(e["balance_sheet"]), + "dr_fields": len(e.get("directors_pl") or {}), + "identities": (e["audited_pl_identities"] + e["balance_sheet_identities"] + + e.get("directors_pl_identities", [])), + "isin_corroborated": r.get("isin_corroborated", False), + "warnings": e.get("warnings", []), + }) + idx.sort(key=lambda c: c["name"]) + INDEX.write_text(json.dumps({"companies": idx, "count": len(idx)}, indent=1)) diff --git a/app/backend/primarydraft/main.py b/app/backend/primarydraft/main.py new file mode 100644 index 0000000000000000000000000000000000000000..120ac08d81baa28b150c9335843474b631825c19 --- /dev/null +++ b/app/backend/primarydraft/main.py @@ -0,0 +1,395 @@ +"""PrimaryDraft HTTP service. + +REST plus one SSE endpoint that streams the disclosure ledger as it is built. +The service holds no correctness logic: verdicts come from `engine.rules`, which +has no LLM in it. +""" + +from __future__ import annotations + +import asyncio +import json +import logging +from pathlib import Path +from typing import Any + +from fastapi import Body, FastAPI, HTTPException, Query +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import FileResponse, JSONResponse, StreamingResponse +from fastapi.staticfiles import StaticFiles + +from . import live +from . import pipeline as P +from .drafting.llm import llm_status, rewrite_sections +from .engine import rules as rules_mod +from .export.docx_export import build_docx +from .export.manifest import build_manifest +from .issue import IssueTerms +from .models import Run +from .store import STORE + +log = logging.getLogger("primarydraft") + +app = FastAPI(title="PrimaryDraft", version="1.0.0", + description="The IPO offer document that checks itself.") + +app.add_middleware( + CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"], +) + +EXPORT_DIR = Path(__file__).resolve().parents[1] / ".exports" +FRONTEND = Path(__file__).resolve().parents[2] / "frontend" / "dist" + + +# ------------------------------------------------------------------ serialisers + +def run_summary(run: Run) -> dict[str, Any]: + return { + "id": run.id, + "scrip_code": run.scrip_code, + "company_name": run.company_name, + "cin": run.cin, + "status": run.status, + "created_at": run.created_at, + "fact_count": len(run.facts), + "fact_status": run.status_counts(), + "severity": run.severity_counts(), + "section_count": len(run.sections), + "coverage_pct": run.coverage_pct(), + "rule_count": rules_mod.rule_count(), + "rules_passed": sum(1 for r in run.rule_results if r.status == "pass"), + "rules_failed": sum(1 for r in run.rule_results if r.status == "fail"), + "rules_na": sum(1 for r in run.rule_results if r.status == "not_applicable"), + "open_findings": len(run.open_findings), + "resolved_findings": sum(1 for f in run.findings if f.resolved), + "meta": run.meta, + "source_documents": run.source_documents, + } + + +def run_full(run: Run) -> dict[str, Any]: + return { + **run_summary(run), + "facts": {k: v.model_dump() for k, v in run.facts.items()}, + "sections": [s.model_dump() for s in run.sections], + "rule_results": [r.model_dump() for r in run.rule_results], + "coverage": [c.model_dump() for c in run.coverage], + "decisions": [d.model_dump() for d in run.decisions], + } + + +def _get(run_id: str) -> Run: + run = STORE.get(run_id) + if run is None: + raise HTTPException(404, f"no run {run_id}") + return run + + +# ------------------------------------------------------------------- endpoints + +@app.get("/api/health") +def health() -> dict[str, Any]: + return { + "ok": True, + "rule_count": rules_mod.rule_count(), + "companies": len(P.load_index()), + "llm": llm_status(), + "engine_is_deterministic": True, + } + + +@app.get("/api/companies") +def companies(q: str = Query("", description="filter by name, CIN or industry")) -> dict[str, Any]: + idx = P.load_index() + if q: + ql = q.lower() + idx = [c for c in idx + if ql in (c.get("name") or "").lower() + or ql in (c.get("cin") or "").lower() + or ql in (c.get("industry") or "").lower() + or ql in str(c.get("scrip_code"))] + return {"companies": idx, "count": len(idx)} + + +@app.get("/api/search") +def search_companies(q: str = Query("", description="name, scrip code, ISIN or industry"), + scope: str = Query("sme", pattern="^(sme|all)$"), + limit: int = Query(40, ge=1, le=100)) -> dict[str, Any]: + """Search every active company on BSE, live.""" + try: + results = live.search(q, scope, limit) + live.enrich_filings(results) + counts = live.universe_counts() + except Exception as e: # noqa: BLE001 - offline is a normal condition, not a crash + raise HTTPException( + 503, + "The BSE scrip master could not be reached and is not cached locally, so " + f"live search is unavailable ({type(e).__name__}). The issuers already " + "prepared are still available.", + ) from e + return {"results": results, "count": len(results), "universe": counts, "scope": scope} + + +@app.post("/api/ingest") +def start_ingest(payload: dict[str, Any] = Body(...)) -> dict[str, Any]: + """Ingest an issuer we have not seen: download its filing and parse it.""" + scrip = str(payload.get("scrip_code") or "").strip() + if not scrip: + raise HTTPException(400, "scrip_code is required") + job = live.start_ingest(scrip, str(payload.get("name") or "")) + return job.to_dict() + + +@app.get("/api/ingest/{job_id}") +def ingest_status(job_id: str) -> dict[str, Any]: + job = live.get_job(job_id) + if job is None: + raise HTTPException(404, f"no ingestion job {job_id}") + return job.to_dict() + + +@app.get("/api/ingest/{job_id}/stream") +async def ingest_stream(job_id: str) -> StreamingResponse: + """Stream ingestion progress, so a slow real download is visible.""" + job = live.get_job(job_id) + if job is None: + raise HTTPException(404, f"no ingestion job {job_id}") + + async def gen(): + sent = 0 + while True: + while sent < len(job.events): + e = job.events[sent] + sent += 1 + yield f"event: progress\ndata: {json.dumps(e)}\n\n" + if job.status != "running": + yield f"event: {job.status}\ndata: {json.dumps(job.to_dict())}\n\n" + return + await asyncio.sleep(0.35) + + return StreamingResponse(gen(), media_type="text/event-stream", + headers={"Cache-Control": "no-cache", + "X-Accel-Buffering": "no"}) + + +@app.post("/api/runs") +def create_run(payload: dict[str, Any] = Body(...)) -> dict[str, Any]: + scrip = str(payload.get("scrip_code") or "").strip() + if not scrip: + raise HTTPException(400, "scrip_code is required") + try: + run = P.create_run(scrip) + except FileNotFoundError as e: + raise HTTPException(404, str(e)) from e + STORE.put(run) + return run_summary(run) + + +@app.post("/api/runs/from-cin") +def create_run_from_cin(payload: dict[str, Any] = Body(...)) -> dict[str, Any]: + """Start a run for an unlisted, pre-IPO issuer from its CIN.""" + cin = str(payload.get("cin") or "").strip() + if not cin: + raise HTTPException(400, "cin is required") + try: + run = P.create_run_from_cin(cin, str(payload.get("name") or "")) + except ValueError as e: + raise HTTPException(400, str(e)) from e + STORE.put(run) + return run_summary(run) + + +@app.get("/api/cin/{cin}") +def inspect_cin(cin: str) -> dict[str, Any]: + """Decompose a Corporate Identity Number without starting a run.""" + from .cin import parse_cin + return parse_cin(cin).to_dict() + + +@app.get("/api/runs/{run_id}") +def get_run(run_id: str) -> dict[str, Any]: + return run_full(_get(run_id)) + + +@app.get("/api/runs/{run_id}/ledger") +def get_ledger(run_id: str, status: str = "", section: str = "") -> dict[str, Any]: + run = _get(run_id) + facts = list(run.facts.values()) + if status: + facts = [f for f in facts if f.status.value == status] + if section: + facts = [f for f in facts if section in f.section_refs] + return { + "facts": [f.model_dump() for f in facts], + "count": len(facts), + "status_counts": run.status_counts(), + } + + +@app.get("/api/runs/{run_id}/ledger/stream") +async def stream_ledger(run_id: str, delay_ms: int = 18) -> StreamingResponse: + """Stream the ledger fact by fact, so the reviewer watches it being built.""" + run = _get(run_id) + + async def gen(): + facts = list(run.facts.values()) + total = len(facts) + yield f"event: start\ndata: {json.dumps({'total': total})}\n\n" + # Group order keeps related facts adjacent as they land on screen. + for i, f in enumerate(sorted(facts, key=lambda x: (x.id.split('.')[0], x.id))): + payload = {"index": i, "total": total, "fact": f.model_dump()} + yield f"event: fact\ndata: {json.dumps(payload, default=str)}\n\n" + if delay_ms: + await asyncio.sleep(delay_ms / 1000.0) + yield (f"event: done\ndata: " + f"{json.dumps({'total': total, 'status_counts': run.status_counts()})}\n\n") + + return StreamingResponse(gen(), media_type="text/event-stream", + headers={"Cache-Control": "no-cache", + "X-Accel-Buffering": "no"}) + + +@app.get("/api/runs/{run_id}/issue") +def get_issue(run_id: str) -> dict[str, Any]: + return _get(run_id).meta.get("issue", {}) + + +@app.put("/api/runs/{run_id}/issue") +def put_issue(run_id: str, payload: dict[str, Any] = Body(...)) -> dict[str, Any]: + run = _get(run_id) + for k in ("fresh_issue_value", "ofs_value", "total_issue_value", + "total_issue_shares", "net_proceeds"): + payload.pop(k, None) + try: + terms = IssueTerms(**payload) + except Exception as e: # noqa: BLE001 + raise HTTPException(400, f"invalid issue terms: {e}") from e + P.update_issue(run, terms) + STORE.put(run) + return run.meta["issue"] + + +@app.post("/api/runs/{run_id}/draft") +def make_draft(run_id: str, use_llm: bool = False) -> dict[str, Any]: + run = _get(run_id) + P.generate_draft(run) + if use_llm: + rewrite_sections(run) + STORE.put(run) + return { + **run_summary(run), + "sections": [s.model_dump() for s in run.sections], + "coverage": [c.model_dump() for c in run.coverage], + } + + +@app.get("/api/runs/{run_id}/draft") +def get_draft(run_id: str) -> dict[str, Any]: + run = _get(run_id) + return {"sections": [s.model_dump() for s in run.sections], + "coverage_pct": run.coverage_pct()} + + +@app.post("/api/runs/{run_id}/check") +def check(run_id: str) -> dict[str, Any]: + run = _get(run_id) + if not run.sections: + P.generate_draft(run) + P.run_checks(run) + STORE.put(run) + return { + **run_summary(run), + "rule_results": [r.model_dump() for r in run.rule_results], + } + + +@app.post("/api/runs/{run_id}/resolve") +def resolve(run_id: str, payload: dict[str, Any] = Body(...)) -> dict[str, Any]: + run = _get(run_id) + rule_id = payload.get("rule_id") + resolution_id = payload.get("resolution_id") + actor = payload.get("actor") or "Merchant banker" + if not rule_id or not resolution_id: + raise HTTPException(400, "rule_id and resolution_id are required") + try: + P.apply_resolution(run, rule_id, resolution_id, actor) + except ValueError as e: + raise HTTPException(400, str(e)) from e + # Re-draft so the document reflects the decision, then re-judge. + P.generate_draft(run) + P.run_checks(run) + STORE.put(run) + return {**run_summary(run), + "rule_results": [r.model_dump() for r in run.rule_results]} + + +@app.post("/api/runs/{run_id}/attest") +def attest(run_id: str, payload: dict[str, Any] = Body(...)) -> dict[str, Any]: + run = _get(run_id) + fact_ids = payload.get("fact_ids") or [] + actor = payload.get("actor") or "Merchant banker" + n = P.attest_facts(run, fact_ids, actor) + P.generate_draft(run) + P.run_checks(run) + STORE.put(run) + return {**run_summary(run), "attested": n, + "rule_results": [r.model_dump() for r in run.rule_results]} + + +@app.get("/api/runs/{run_id}/coverage") +def coverage(run_id: str) -> dict[str, Any]: + run = _get(run_id) + return {"coverage": [c.model_dump() for c in run.coverage], + "coverage_pct": run.coverage_pct(), + "covered": sum(1 for c in run.coverage if c.covered), + "total": len(run.coverage)} + + +@app.get("/api/runs/{run_id}/manifest") +def manifest(run_id: str) -> JSONResponse: + return JSONResponse(build_manifest(_get(run_id))) + + +@app.get("/api/runs/{run_id}/export/manifest") +def export_manifest(run_id: str) -> FileResponse: + run = _get(run_id) + EXPORT_DIR.mkdir(parents=True, exist_ok=True) + p = EXPORT_DIR / f"PrimaryDraft-Audit-Manifest-{run.scrip_code}-{run.id}.json" + p.write_text(json.dumps(build_manifest(run), indent=2)) + run.decisions.append(_export_decision("audit manifest")) + STORE.put(run) + return FileResponse(p, filename=p.name, media_type="application/json") + + +@app.get("/api/runs/{run_id}/export/docx") +def export_docx(run_id: str) -> FileResponse: + run = _get(run_id) + EXPORT_DIR.mkdir(parents=True, exist_ok=True) + p = EXPORT_DIR / f"PrimaryDraft-{run.scrip_code}-{run.id}.docx" + build_docx(run, p) + run.decisions.append(_export_decision("offer document DOCX")) + STORE.put(run) + return FileResponse( + p, filename=p.name, + media_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document", + ) + + +def _export_decision(what: str): + from .models import Decision + return Decision(actor="Merchant banker", action="export", detail=f"Exported {what}.") + + +@app.get("/api/rules") +def list_rules() -> dict[str, Any]: + return { + "count": rules_mod.rule_count(), + "rules": [{"rule_id": rid, "title": title, "icdr_ref": ref} + for rid, title, ref, _ in rules_mod.REGISTRY], + } + + +# ------------------------------------------------------- static frontend (built) + +if FRONTEND.exists(): + app.mount("/", StaticFiles(directory=str(FRONTEND), html=True), name="frontend") diff --git a/app/backend/primarydraft/models.py b/app/backend/primarydraft/models.py new file mode 100644 index 0000000000000000000000000000000000000000..f3f71e949576c33899e871d9c352c4c201fb08ac --- /dev/null +++ b/app/backend/primarydraft/models.py @@ -0,0 +1,238 @@ +"""Core domain model for PrimaryDraft. + +The central object is the Fact: an atomic disclosure value bound to the real page +of the real filing it came from. A Fact with no provenance cannot exist: the +constructor requires at least one source. That constraint is what makes the +"the LLM never asserts an unsourced fact" claim structural rather than aspirational. +""" + +from __future__ import annotations + +import datetime as _dt +from enum import Enum +from typing import Any, Literal + +from pydantic import BaseModel, Field, field_validator + + +def _now() -> str: + return _dt.datetime.now(_dt.timezone.utc).isoformat(timespec="seconds") + + +class FactStatus(str, Enum): + """How much weight a fact can bear. + + VERIFIED corroborated by two independent sections, or supported by an + accounting identity that closes. + UNVERIFIED found once and unsupported: the abstain path. Carries a note + saying exactly what a human must confirm. Never silently promoted. + CONFLICTED two sources disagree. The engine raises a finding. + RESOLVED a human chose between conflicting sources. + ATTESTED a human signed off an unverified fact. Recorded in the manifest. + DERIVED computed from other facts; lineage in `derived_from`. + """ + + VERIFIED = "verified" + UNVERIFIED = "unverified" + CONFLICTED = "conflicted" + RESOLVED = "resolved" + ATTESTED = "attested" + DERIVED = "derived" + + +class Unit(str, Enum): + INR = "INR" + PCT = "PCT" + SHARES = "SHARES" + RATIO = "RATIO" + TEXT = "TEXT" + DATE = "DATE" + COUNT = "COUNT" + + +class Severity(str, Enum): + BLOCKER = "blocker" + HIGH = "high" + MEDIUM = "medium" + INFO = "info" + + +class Provenance(BaseModel): + """Where a value physically came from. Every field here is checkable.""" + + source_id: str + source_title: str + source_type: Literal["annual_report", "bse_api", "mca", "derived", "human"] + locator: str = "" # "p.72 ยท Statement of Profit and Loss" + page: int | None = None + raw_line: str = "" # the literal text line as printed in the filing + section: str = "" # "audited_pl" | "directors_report" | "balance_sheet" + url: str | None = None + extractor: Literal["deterministic", "identity", "llm", "derived", "human"] = "deterministic" + retrieved_at: str = Field(default_factory=_now) + + +class Fact(BaseModel): + """One atomic, sourced disclosure value.""" + + id: str + label: str + value: Any + unit: Unit = Unit.INR + status: FactStatus = FactStatus.UNVERIFIED + confidence: float = 0.5 + provenance: list[Provenance] = Field(default_factory=list) + section_refs: list[str] = Field(default_factory=list) + derived_from: list[str] = Field(default_factory=list) + note: str | None = None + period: str | None = None # "current" | "previous" + identities: list[str] = Field(default_factory=list) # identities supporting it + history: list[dict[str, Any]] = Field(default_factory=list) + + @field_validator("provenance") + @classmethod + def _require_source(cls, v: list[Provenance]) -> list[Provenance]: + if not v: + raise ValueError("a Fact must carry at least one Provenance") + return v + + @property + def is_load_bearing(self) -> bool: + return self.unit in (Unit.INR, Unit.SHARES, Unit.PCT, Unit.RATIO) + + def corroboration(self) -> int: + return len({(p.source_id, p.section) for p in self.provenance}) + + +class Evidence(BaseModel): + """One side of a contradiction, shown to the reviewer verbatim.""" + + label: str + value: Any + display: str = "" + fact_id: str | None = None + section: str = "" + locator: str = "" + raw_line: str = "" + + +class Resolution(BaseModel): + """A concrete, sourced way to fix a finding.""" + + id: str + label: str + description: str + recommended: bool = False + kind: Literal["adopt_value", "attest", "flag_to_banker"] = "adopt_value" + target_fact_id: str | None = None + new_value: Any = None + justification: str = "" + + +class Finding(BaseModel): + """One deterministic check result.""" + + rule_id: str + severity: Severity + title: str + explanation: str + icdr_ref: str = "" + evidence: list[Evidence] = Field(default_factory=list) + delta: str | None = None + resolutions: list[Resolution] = Field(default_factory=list) + caused_by: str | None = None + fact_ids: list[str] = Field(default_factory=list) + resolved: bool = False + resolved_by: str | None = None + resolved_at: str | None = None + + +class RuleResult(BaseModel): + """Outcome of one rule: including the passes, which are the reassurance.""" + + rule_id: str + title: str + icdr_ref: str = "" + status: Literal["pass", "fail", "not_applicable"] = "pass" + detail: str = "" + findings: list[Finding] = Field(default_factory=list) + + +class Decision(BaseModel): + """A human action. The audit manifest is a list of these.""" + + at: str = Field(default_factory=_now) + actor: str + action: Literal["resolve", "attest", "override", "generate", "check", "export"] + rule_id: str | None = None + resolution_id: str | None = None + fact_ids: list[str] = Field(default_factory=list) + detail: str = "" + + +class DraftSection(BaseModel): + """One rendered offer-document section.""" + + id: str + number: str + title: str + icdr_clause: str = "" + html: str = "" + text: str = "" + fact_ids: list[str] = Field(default_factory=list) + word_count: int = 0 + narrative_source: Literal["template", "llm"] = "template" + + +class ClauseCoverage(BaseModel): + clause_id: str + clause: str + title: str + covered: bool + section_id: str | None = None + reason: str = "" + + +class Run(BaseModel): + """One end-to-end pass over one real company.""" + + id: str + scrip_code: str + company_name: str + cin: str | None = None + created_at: str = Field(default_factory=_now) + status: Literal["ingesting", "ledger_ready", "drafted", "checked", "complete"] = "ingesting" + facts: dict[str, Fact] = Field(default_factory=dict) + sections: list[DraftSection] = Field(default_factory=list) + rule_results: list[RuleResult] = Field(default_factory=list) + decisions: list[Decision] = Field(default_factory=list) + coverage: list[ClauseCoverage] = Field(default_factory=list) + source_documents: list[dict[str, Any]] = Field(default_factory=list) + meta: dict[str, Any] = Field(default_factory=dict) + + # ------------------------------------------------------------------ helpers + + @property + def findings(self) -> list[Finding]: + return [f for r in self.rule_results for f in r.findings] + + @property + def open_findings(self) -> list[Finding]: + return [f for f in self.findings if not f.resolved] + + def severity_counts(self) -> dict[str, int]: + out = {s.value: 0 for s in Severity} + for f in self.open_findings: + out[f.severity.value] += 1 + return out + + def status_counts(self) -> dict[str, int]: + out = {s.value: 0 for s in FactStatus} + for f in self.facts.values(): + out[f.status.value] += 1 + return out + + def coverage_pct(self) -> float: + if not self.coverage: + return 0.0 + return round(100.0 * sum(1 for c in self.coverage if c.covered) / len(self.coverage), 1) diff --git a/app/backend/primarydraft/pipeline.py b/app/backend/primarydraft/pipeline.py new file mode 100644 index 0000000000000000000000000000000000000000..289ca3dd72a8a598ec351687486677a8b95a6fa3 --- /dev/null +++ b/app/backend/primarydraft/pipeline.py @@ -0,0 +1,499 @@ +"""Orchestration: real record -> ledger -> draft -> deterministic verdict. + +This module sequences the pipeline and applies human decisions. It holds no +correctness logic of its own: the verdict always comes from `engine.rules`. +""" + +from __future__ import annotations + +import json +import uuid +from pathlib import Path +from typing import Any + +from .cin import parse_cin +from .sources.mca import lookup as mca_lookup, to_float as _mca_float +from .drafting.templates import build_sections +from .engine import rules as rules_mod +from .engine.icdr import coverage_for +from .issue import IssueTerms, default_terms +from .ledger import build_ledger +from .models import ( + ClauseCoverage, + Decision, + Fact, + FactStatus, + Finding, + Provenance, + Run, +) + +DATA = Path(__file__).resolve().parent / "data" +COMPANIES = DATA / "companies" +INDEX = DATA / "index.json" + + +# ------------------------------------------------------------------- corpus IO + +def load_index() -> list[dict[str, Any]]: + if not INDEX.exists(): + return [] + return json.loads(INDEX.read_text()).get("companies", []) + + +def load_record(scrip_code: str) -> dict[str, Any]: + p = COMPANIES / f"{scrip_code}.json" + if not p.exists(): + raise FileNotFoundError(f"no real record for scrip {scrip_code}") + return json.loads(p.read_text()) + + +def source_documents(record: dict[str, Any]) -> list[dict[str, Any]]: + """The real documents this run is grounded in: shown on the intake screen.""" + ex = record["extraction"] + ar = record["annual_report"] + return [ + { + "id": f"ar_{record['scrip_code']}_{ar['year']}", + "title": f"Annual Report {ar['year']}", + "type": "annual_report", + "pages": ex.get("pages", 0), + "url": ar.get("url"), + "detail": (f"Filed with BSE ยท {ex.get('pages', 0)} pages ยท statements located on " + f"pages {ex.get('statement_pages', {})}"), + "real": True, + }, + { + "id": f"bse_{record['scrip_code']}", + "title": "BSE scrip master and company header", + "type": "bse_api", + "pages": 0, + "url": "https://api.bseindia.com/BseIndiaAPI/api/ListofScripData/w", + "detail": (f"Live BSE API ยท scrip {record['scrip_code']} ยท " + f"group {record['bse'].get('group')} (SME platform)"), + "real": True, + }, + ] + + +# --------------------------------------------------------------------- pipeline + +def create_run(scrip_code: str, issue: IssueTerms | None = None) -> Run: + record = load_record(scrip_code) + facts = build_ledger(record) + ex = record["extraction"] + + run = Run( + id=uuid.uuid4().hex[:12], + scrip_code=scrip_code, + company_name=record["bse"]["scrip_name"], + cin=ex.get("cin"), + status="ledger_ready", + facts=facts, + source_documents=source_documents(record), + meta={ + "annual_report_year": record["annual_report"].get("year"), + "annual_report_url": record["annual_report"].get("url"), + "pages": ex.get("pages"), + "isin_corroborated": record.get("isin_corroborated", False), + "identities_closed": (ex.get("audited_pl_identities", []) + + ex.get("balance_sheet_identities", [])), + "extraction_warnings": ex.get("warnings", []), + "statement_pages": ex.get("statement_pages", {}), + "scales": _scales(ex), + "industry": record["bse"].get("industry"), + "sector": record["bse"].get("sector"), + "bse_group": record["bse"].get("group"), + }, + ) + if ex.get("cin"): + # Mutate run.facts, not the local dict: the model copies on construction. + reg = add_registry_facts(run.facts, ex["cin"]) + run.meta["mca"] = {k: v for k, v in reg.items() if k != "record"} + run.meta["issue"] = (issue or default_terms(facts)).to_public() + return run + + +def _scales(ex: dict[str, Any]) -> dict[str, float]: + out: dict[str, float] = {} + for key, stmt in (("audited_pl", ex.get("audited_pl")), + ("directors_report", ex.get("directors_pl")), + ("balance_sheet", ex.get("balance_sheet"))): + if not stmt: + continue + for cols in stmt.values(): + cur = cols.get("current") + if cur and cur.get("scale"): + out[key] = float(cur["scale"]) + break + return out + + +def issue_from_run(run: Run) -> IssueTerms: + raw = dict(run.meta.get("issue") or {}) + for k in ("fresh_issue_value", "ofs_value", "total_issue_value", + "total_issue_shares", "net_proceeds"): + raw.pop(k, None) + return IssueTerms(**raw) + + +def generate_draft(run: Run) -> Run: + issue = issue_from_run(run) + sections, renderer = build_sections(run.facts, issue) + run.sections = sections + + drafted = {s.id for s in sections} + run.coverage = [ClauseCoverage(**c) for c in coverage_for(drafted)] # type: ignore[arg-type] + + run.meta["used_fact_ids"] = sorted(renderer.used) + run.meta["missing_fact_ids"] = sorted(renderer.missing) + run.meta["unbound_numbers"] = sorted( + {n for s in sections for n in renderer.unbound_numbers(s.html)} + ) + run.status = "drafted" + run.decisions.append(Decision( + actor="system", action="generate", + detail=(f"Drafted {len(sections)} sections from {len(renderer.used)} ledger facts; " + f"{len(renderer.missing)} tokens abstained for want of a source."), + )) + return run + + +def run_checks(run: Run) -> Run: + issue = issue_from_run(run) + ctx = { + "issue": issue, + # The CIN settles several eligibility questions on its own, before any + # financial statement is opened. + "cin": parse_cin(run.cin).to_dict() if run.cin else None, + "drafted_sections": [s.id for s in run.sections], + "used_fact_ids": run.meta.get("used_fact_ids", []), + "unbound_numbers": run.meta.get("unbound_numbers", []), + "scales": run.meta.get("scales", {}), + "meta": run.meta, + } + previously_resolved = { + (f.rule_id, f.title) for f in run.findings if f.resolved + } + run.rule_results = rules_mod.run_all(run.facts, ctx) + # Findings already dealt with stay dealt with across re-runs. + for f in run.findings: + if (f.rule_id, f.title) in previously_resolved: + f.resolved = True + run.status = "checked" + run.decisions.append(Decision( + actor="system", action="check", + detail=(f"Ran {rules_mod.rule_count()} deterministic checks: " + f"{sum(1 for r in run.rule_results if r.status == 'pass')} passed, " + f"{sum(1 for r in run.rule_results if r.status == 'fail')} failed, " + f"{sum(1 for r in run.rule_results if r.status == 'not_applicable')} " + "not applicable."), + )) + return run + + +# ------------------------------------------------------------ human decisions + +def _human_prov(actor: str, detail: str) -> Provenance: + return Provenance( + source_id="human", source_title=f"Decision recorded by {actor}", + source_type="human", locator=detail, section="decision", extractor="human", + ) + + +def apply_resolution(run: Run, rule_id: str, resolution_id: str, actor: str) -> Finding: + finding = next((f for f in run.findings + if f.rule_id == rule_id and not f.resolved), None) + if finding is None: + raise ValueError(f"no open finding for rule {rule_id}") + res = next((r for r in finding.resolutions if r.id == resolution_id), None) + if res is None: + raise ValueError(f"no resolution {resolution_id} on {rule_id}") + + detail = f"{res.label}: {res.description}" + + if res.kind == "adopt_value" and res.target_fact_id and res.new_value is not None: + fact = run.facts.get(res.target_fact_id) + if fact: + fact.history.append({"previous_value": fact.value, "by": actor, + "reason": res.label}) + fact.value = res.new_value + fact.status = FactStatus.RESOLVED + fact.confidence = 0.95 + fact.note = f"Adopted by {actor}: {res.justification or res.label}" + fact.provenance.append(_human_prov(actor, detail)) + + elif res.kind == "attest": + targets = ([res.target_fact_id] if res.target_fact_id else finding.fact_ids) + for fid in targets: + fact = run.facts.get(fid) + if fact and fact.status in (FactStatus.UNVERIFIED, FactStatus.CONFLICTED): + fact.history.append({"previous_status": fact.status.value, "by": actor}) + fact.status = FactStatus.ATTESTED + fact.confidence = 0.9 + fact.note = f"Attested by {actor} as confirmed against the audited records." + fact.provenance.append(_human_prov(actor, detail)) + + elif res.kind == "adopt_value" and res.id in ("scale_gcp", "cap_gcp", "cap_ofs", + "resize_issue"): + _apply_issue_patch(run, res.id) + + finding.resolved = True + finding.resolved_by = actor + from .models import Decision as _D + stamp = _D(actor=actor, action="resolve", rule_id=rule_id, resolution_id=resolution_id, + fact_ids=finding.fact_ids, detail=detail) + finding.resolved_at = stamp.at + run.decisions.append(stamp) + return finding + + +def _apply_issue_patch(run: Run, kind: str) -> None: + """Apply a structural fix to the proposed issue, then let the engine re-judge.""" + from .engine.icdr import Thresholds as T + + issue = issue_from_run(run) + if kind in ("scale_gcp",): + target = issue.net_proceeds + total = sum(o.amount for o in issue.objects) + delta = total - target + gcp = next((o for o in issue.objects if o.is_general_corporate), None) + if gcp is not None: + gcp.amount = round(gcp.amount - delta, 2) + gcp.schedule = {k: round(gcp.amount, 2) for k in list(gcp.schedule)[:1]} or {} + elif kind == "cap_gcp": + cap = min(issue.fresh_issue_value * T.SME_MAX_GCP_PCT_OF_PROCEEDS / 100.0, + float(T.SME_MAX_GCP_ABSOLUTE_INR)) + gcp = next((o for o in issue.objects if o.is_general_corporate), None) + if gcp is not None: + gcp.amount = round(cap, 2) + elif kind == "cap_ofs": + max_ofs_value = (issue.fresh_issue_value * T.SME_MAX_OFS_PCT_OF_ISSUE + / (100.0 - T.SME_MAX_OFS_PCT_OF_ISSUE)) + issue.ofs_shares = round(max_ofs_value / issue.price_per_share, 0) + elif kind == "resize_issue": + need = sum(o.amount for o in issue.objects) + issue.issue_expenses + issue.fresh_issue_shares = round(need / issue.price_per_share, 0) + + run.meta["issue"] = issue.to_public() + + +def attest_facts(run: Run, fact_ids: list[str], actor: str) -> int: + n = 0 + for fid in fact_ids: + f = run.facts.get(fid) + if f and f.status in (FactStatus.UNVERIFIED, FactStatus.CONFLICTED): + f.history.append({"previous_status": f.status.value, "by": actor}) + f.status = FactStatus.ATTESTED + f.confidence = 0.9 + f.note = f"Attested by {actor} as confirmed against the audited records." + f.provenance.append(_human_prov(actor, "attestation")) + n += 1 + if n: + run.decisions.append(Decision(actor=actor, action="attest", fact_ids=fact_ids, + detail=f"Attested {n} figure(s) as confirmed.")) + return n + + +def update_issue(run: Run, issue: IssueTerms) -> Run: + run.meta["issue"] = issue.to_public() + return run + + +# ------------------------------------------------- pre-IPO issuer, by CIN alone + +def add_registry_facts(facts: dict[str, Any], cin: str) -> dict[str, Any]: + """Add MCA register facts for a CIN, if the published snapshot reaches it. + + Used by both intake paths. For a listed issuer this is what gives paid-up + capital a second, independent authority to be reconciled against the audited + balance sheet. + """ + from .models import Fact, FactStatus, Provenance, Unit + + reg = mca_lookup(cin) + rec = reg.get("record") + if not reg.get("found") or not rec: + return reg + + rprov = Provenance( + source_id=f"mca_{cin}", + source_title=f"MCA Company Master Data ({reg['dataset']['title']})", + source_type="mca", + locator="data.gov.in ยท Ministry of Corporate Affairs", + section="mca_master", + url="https://api.data.gov.in/resource/" + reg["dataset"]["resource_id"], + extractor="deterministic", + ) + + def rf(fid, label, value, unit, refs, status=FactStatus.VERIFIED, note=None): + if value in (None, "", "NA"): + return + facts[fid] = Fact(id=fid, label=label, value=value, unit=unit, status=status, + confidence=0.95, provenance=[rprov], section_refs=refs, note=note) + + rf("co.name_registry", "Name of the Issuer (registry)", rec.get("company_name"), + Unit.TEXT, ["general_information"]) + rf("co.status", "Company status on the register", rec.get("company_status"), + Unit.TEXT, ["general_information"]) + rf("co.class", "Company class on the register", rec.get("company_class"), + Unit.TEXT, ["general_information"]) + rf("co.registered_office", "Registered office", rec.get("registered_office_address"), + Unit.TEXT, ["general_information"]) + rf("co.roc", "Registrar of Companies", rec.get("registrar_of_companies"), + Unit.TEXT, ["general_information"]) + rf("co.date_of_registration", "Date of registration", + (rec.get("date_of_registration") or "")[:10], Unit.DATE, ["our_business"]) + rf("cap.authorised_capital", "Authorised share capital (registry)", + _mca_float(rec.get("authorized_cap")), Unit.INR, ["capital_structure"]) + rf("cap.paidup_capital_registry", "Paid-up share capital (registry)", + _mca_float(rec.get("paidup_capital")), Unit.INR, ["capital_structure"]) + rf("co.email", "Email address on the register", rec.get("email_addr"), Unit.TEXT, + ["general_information"], FactStatus.UNVERIFIED, + "Read from a periodic registry snapshot; confirm it is current.") + return reg + + +def create_run_from_cin(cin: str, name: str = "") -> Run: + """Start a run for an issuer that is not listed, from its CIN. + + This is the path a genuine pre-IPO issuer takes. A private limited company has + no exchange filing history, so the only records that exist are the ones it + supplies itself. What a CIN encodes is real and citable; everything else is + absent until documents are uploaded, and the ledger says so plainly rather + than filling the gaps. + """ + from .models import Fact, FactStatus, Provenance, Unit + + parsed = parse_cin(cin) + if not parsed.valid: + raise ValueError(parsed.error) + + prov = Provenance( + source_id=f"cin_{parsed.raw}", + source_title="Corporate Identity Number issued by the Ministry of Corporate Affairs", + source_type="mca", + locator=f"CIN {parsed.raw}", + section="cin", + extractor="deterministic", + ) + + def fact(fid: str, label: str, value: Any, unit: Unit, locator: str, + status: FactStatus = FactStatus.VERIFIED, + refs: list[str] | None = None) -> tuple[str, Fact]: + p = prov.model_copy(update={"locator": f"CIN {parsed.raw} ยท {locator}"}) + return fid, Fact( + id=fid, label=label, value=value, unit=unit, status=status, + confidence=0.99 if status == FactStatus.VERIFIED else 0.6, + provenance=[p], section_refs=refs or ["general_information"], + derived_from=["co.cin"] if fid != "co.cin" else [], + ) + + facts = dict([ + fact("co.cin", "Corporate Identity Number", parsed.raw, Unit.TEXT, + "the identifier itself"), + fact("co.company_type", "Class of company", parsed.ownership, Unit.TEXT, + f"ownership class {parsed.ownership_code}, characters 13 to 15"), + fact("co.state", "State of the Registrar of Companies", parsed.state, Unit.TEXT, + f"state code {parsed.state_code}, characters 7 and 8"), + fact("co.incorporation_year", "Year of incorporation", parsed.year, Unit.COUNT, + "characters 9 to 12", refs=["our_business"]), + fact("co.nic_code", "Industry classification (NIC)", parsed.industry_code, Unit.TEXT, + f"{parsed.nic_division_name}, characters 2 to 6", refs=["our_business"]), + fact("co.registration_number", "Registration number with the Registrar", + parsed.registration_number, Unit.TEXT, "characters 16 to 21"), + fact("co.listing_status", "Listing status recorded in the identifier", + "Listed" if parsed.is_listed else "Unlisted", Unit.TEXT, + f"listing letter {parsed.listing}, character 1"), + ]) + + # Independent registry record, where the MCA snapshot reaches this company. + reg = add_registry_facts(facts, parsed.raw) + if False: + rec = reg["record"] + rprov = Provenance( + source_id=f"mca_{parsed.raw}", + source_title=f"MCA Company Master Data ({reg['dataset']['title']})", + source_type="mca", + locator="data.gov.in ยท Ministry of Corporate Affairs", + section="mca_master", + url="https://api.data.gov.in/resource/" + reg["dataset"]["resource_id"], + extractor="deterministic", + ) + + def reg_fact(fid, label, value, unit, refs, status=FactStatus.VERIFIED, note=None): + if value in (None, "", "NA"): + return + facts[fid] = Fact(id=fid, label=label, value=value, unit=unit, status=status, + confidence=0.95, provenance=[rprov], section_refs=refs, + note=note) + + reg_fact("co.name_registry", "Name of the Issuer (registry)", + rec.get("company_name"), Unit.TEXT, ["general_information"]) + reg_fact("co.status", "Company status on the register", + rec.get("company_status"), Unit.TEXT, ["general_information"]) + reg_fact("co.class", "Company class on the register", + rec.get("company_class"), Unit.TEXT, ["general_information"]) + reg_fact("co.registered_office", "Registered office", + rec.get("registered_office_address"), Unit.TEXT, ["general_information"]) + reg_fact("co.roc", "Registrar of Companies", + rec.get("registrar_of_companies"), Unit.TEXT, ["general_information"]) + reg_fact("co.date_of_registration", "Date of registration", + (rec.get("date_of_registration") or "")[:10], Unit.DATE, ["our_business"]) + reg_fact("cap.authorised_capital", "Authorised share capital (registry)", + _mca_float(rec.get("authorized_cap")), Unit.INR, ["capital_structure"]) + reg_fact("cap.paidup_capital_registry", "Paid-up share capital (registry)", + _mca_float(rec.get("paidup_capital")), Unit.INR, ["capital_structure"]) + reg_fact("co.email", "Email address on the register", + rec.get("email_addr"), Unit.TEXT, ["general_information"], + FactStatus.UNVERIFIED, + "Read from a periodic registry snapshot; confirm it is current.") + + if name.strip(): + facts["co.name"] = Fact( + id="co.name", label="Name of the Issuer", value=name.strip(), unit=Unit.TEXT, + status=FactStatus.UNVERIFIED, confidence=0.5, + provenance=[Provenance( + source_id="user", source_title="Name supplied by the user", + source_type="human", locator="entered at intake", section="intake", + extractor="human")], + section_refs=["general_information"], + note=("Supplied by hand and not corroborated against any register. Confirm " + "against the certificate of incorporation before filing."), + ) + + run = Run( + id=uuid.uuid4().hex[:12], + scrip_code="", + company_name=name.strip() or parsed.raw, + cin=parsed.raw, + status="ledger_ready", + facts=facts, + source_documents=[{ + "id": f"cin_{parsed.raw}", + "title": "Corporate Identity Number", + "type": "mca", + "pages": 0, + "url": None, + "detail": (f"{parsed.ownership}, incorporated {parsed.year} in {parsed.state}. " + "A registry identifier, not a financial record."), + "real": True, + }], + meta={ + "intake": "cin", + "mca": {k: v for k, v in mca_lookup(parsed.raw).items() if k != "record"}, + "cin_parsed": parsed.to_dict(), + "identities_closed": [], + "extraction_warnings": [ + "No financial statements have been supplied for this issuer. Every " + "financial disclosure in the draft will abstain until documents are " + "provided." + ], + "scales": {}, + "industry": parsed.nic_division_name, + "sector": "", + "bse_group": "", + }, + ) + run.meta["issue"] = default_terms(facts).to_public() + return run diff --git a/app/backend/primarydraft/sources/__init__.py b/app/backend/primarydraft/sources/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app/backend/primarydraft/sources/bse.py b/app/backend/primarydraft/sources/bse.py new file mode 100644 index 0000000000000000000000000000000000000000..f1eb03c95383f96397c31845da22c76d89cda2b6 --- /dev/null +++ b/app/backend/primarydraft/sources/bse.py @@ -0,0 +1,155 @@ +"""Real BSE India public API client. + +Every endpoint here is a live, unauthenticated BSE endpoint. Nothing is synthesised. +Responses are cached to disk so a demo never depends on the network being up. + +Verified working (Aug 2026): + ListofScripData -> full active scrip master (4,949 rows; SME = groups M/MT/MS) + ComHeadernew -> per-scrip ISIN, face value, industry, sector, EPS/PE + AnnualReport_New -> per-scrip annual report PDF URLs, by year +""" + +from __future__ import annotations + +import json +import logging +import time +from pathlib import Path +from typing import Any + +import httpx + +log = logging.getLogger(__name__) + +API = "https://api.bseindia.com/BseIndiaAPI/api" +UA = ( + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 " + "(KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" +) +# BSE rejects requests without a browser Origin/Referer pair. +HEADERS = { + "User-Agent": UA, + "Origin": "https://www.bseindia.com", + "Referer": "https://www.bseindia.com/", + "Accept": "application/json, text/plain, */*", + "Accept-Language": "en-US,en;q=0.9", +} + +#: BSE trading groups that constitute the SME platform. +SME_GROUPS = {"M", "MT", "MS"} + +CACHE = Path(__file__).resolve().parents[2] / ".cache" / "bse" + + +def _cache_path(key: str, ext: str = "json") -> Path: + p = CACHE / f"{key}.{ext}" + p.parent.mkdir(parents=True, exist_ok=True) + return p + + +class BSEClient: + """Live BSE client with a read-through disk cache. + + ``offline=True`` serves only from cache: used on stage so the demo cannot be + broken by conference wifi. + """ + + def __init__(self, offline: bool = False, timeout: float = 45.0) -> None: + self.offline = offline + self._client = httpx.Client(headers=HEADERS, timeout=timeout, follow_redirects=True) + + def close(self) -> None: + self._client.close() + + def __enter__(self) -> "BSEClient": + return self + + def __exit__(self, *exc: Any) -> None: + self.close() + + # ---------------------------------------------------------------- internals + + def _get_json(self, key: str, path: str, params: dict[str, Any]) -> Any: + cp = _cache_path(key) + if cp.exists(): + try: + return json.loads(cp.read_text()) + except json.JSONDecodeError: + cp.unlink(missing_ok=True) + if self.offline: + raise FileNotFoundError(f"offline and no cache for {key}") + + last: Exception | None = None + for attempt in range(3): + try: + r = self._client.get(f"{API}/{path}", params=params) + r.raise_for_status() + data = r.json() + cp.write_text(json.dumps(data)) + return data + except Exception as e: # noqa: BLE001 - retry any transport/parse failure + last = e + time.sleep(1.5 * (attempt + 1)) + raise RuntimeError(f"BSE request failed for {key}: {last}") + + # ------------------------------------------------------------------- public + + def scrip_master(self) -> list[dict[str, Any]]: + """Full active equity scrip master. Real BSE data, ~4,949 rows.""" + return self._get_json( + "scrip_master", + "ListofScripData/w", + { + "Group": "", + "Scripcode": "", + "industry": "", + "segment": "Equity", + "status": "Active", + }, + ) + + def sme_universe(self) -> list[dict[str, Any]]: + """Active BSE SME-platform companies (groups M / MT / MS).""" + rows = [r for r in self.scrip_master() if (r.get("GROUP") or "").strip() in SME_GROUPS] + return sorted(rows, key=lambda r: (r.get("Scrip_Name") or "")) + + def company_header(self, scrip_code: str) -> dict[str, Any]: + """ISIN, face value, industry, sector, EPS/PE for one scrip.""" + return self._get_json( + f"header_{scrip_code}", + "ComHeadernew/w", + {"quotetype": "EQ", "scripcode": scrip_code, "seriesid": ""}, + ) + + def annual_reports(self, scrip_code: str) -> list[dict[str, Any]]: + """Annual report PDF URLs for one scrip, newest first.""" + data = self._get_json( + f"annrep_{scrip_code}", "AnnualReport_New/w", {"scripcode": scrip_code} + ) + rows = data.get("Table", []) if isinstance(data, dict) else [] + out = [r for r in rows if r.get("PDFDownload")] + out.sort(key=lambda r: str(r.get("Year") or ""), reverse=True) + return out + + def fetch_pdf(self, url: str, key: str) -> Path: + """Download an annual report PDF, cached on disk by key.""" + cp = _cache_path(key, "pdf") + if cp.exists() and cp.stat().st_size > 20_000: + return cp + if self.offline: + raise FileNotFoundError(f"offline and no cached PDF for {key}") + + with self._client.stream( + "GET", url, headers={**HEADERS, "Accept": "application/pdf,*/*"} + ) as r: + r.raise_for_status() + tmp = cp.with_suffix(".part") + with tmp.open("wb") as fh: + for chunk in r.iter_bytes(65536): + fh.write(chunk) + tmp.replace(cp) + + if cp.stat().st_size < 20_000: + cp.unlink(missing_ok=True) + raise RuntimeError(f"PDF too small / not a real report: {url}") + return cp diff --git a/app/backend/primarydraft/sources/corpus.py b/app/backend/primarydraft/sources/corpus.py new file mode 100644 index 0000000000000000000000000000000000000000..a87906ec65ef60b6bf86f00cce1e77af4b84c3e4 --- /dev/null +++ b/app/backend/primarydraft/sources/corpus.py @@ -0,0 +1,223 @@ +"""Build the real company corpus from live BSE data + real annual-report PDFs. + +Run: python -m primarydraft.sources.corpus --target 30 + +For each company we keep only what a real source actually yielded. A company whose +annual report is a scanned image (no text layer) is skipped rather than filled in +an empty record would be a fabrication. +""" + +from __future__ import annotations + +import argparse +import json +import logging +import sys +import traceback +from concurrent.futures import ThreadPoolExecutor, as_completed +from pathlib import Path +from typing import Any + +from .bse import BSEClient +from .pdf_extract import extract_annual_report + +log = logging.getLogger("corpus") + +DATA = Path(__file__).resolve().parents[1] / "data" / "companies" +INDEX = Path(__file__).resolve().parents[1] / "data" / "index.json" + +#: A record is only usable if we recovered a CIN and a P&L that self-validates. +MIN_PL_FIELDS = 6 + + +class Unusable(Exception): + """The issuer's own records could not yield a usable record. + + Raised with a reason the user can act on, because "we could not read it" is a + legitimate outcome that must be reported rather than papered over. + """ + + +def build_one(client: BSEClient, row: dict[str, Any], + progress: Any = None) -> dict[str, Any] | None: + """Fetch + extract one real company. + + Returns None (batch mode) or raises Unusable (live mode) when the sources are + unusable. `progress(stage, detail, pct)` is called as the work proceeds. + """ + scrip = str(row.get("SCRIP_CD") or "").strip() + name = (row.get("Scrip_Name") or "").strip() + + def step(stage: str, detail: str = "", pct: int = 0) -> None: + if progress: + progress(stage, detail, pct) + + def give_up(reason: str) -> None: + log.info("%s (%s) unusable: %s", scrip, name, reason) + if progress: + raise Unusable(reason) + + if not scrip: + return None + + step("header", "Reading the company header from the BSE master", 5) + try: + header = client.company_header(scrip) + except Exception as e: # noqa: BLE001 + log.warning("%s header failed: %s", scrip, e) + header = {} + + step("reports", "Listing the annual reports this issuer has filed", 12) + try: + reports = client.annual_reports(scrip) + except Exception as e: # noqa: BLE001 + log.warning("%s annual reports failed: %s", scrip, e) + give_up("The BSE annual-report index could not be reached for this issuer.") + return None + if not reports: + give_up("This issuer has no annual report filed on BSE, so there are no " + "records to read.") + return None + + latest = reports[0] + step("download", f"Downloading the {latest.get('Year')} annual report from BSE", 22) + try: + pdf = client.fetch_pdf(latest["PDFDownload"], f"ar_{scrip}_{latest.get('Year')}") + except Exception as e: # noqa: BLE001 + log.warning("%s pdf download failed: %s", scrip, e) + give_up("The annual report PDF could not be downloaded from BSE.") + return None + + mb = pdf.stat().st_size / 1_000_000 + step("extract", f"Reading the filing ({mb:.1f} MB). This is the slow part.", 45) + try: + ex = extract_annual_report(pdf, scrip) + except Exception as e: # noqa: BLE001 + log.warning("%s extraction failed: %s", scrip, e) + give_up(f"The annual report could not be parsed ({type(e).__name__}).") + return None + + step("verify", f"Checking what {ex.pages} pages actually yielded", 88) + if not ex.cin: + give_up("No Corporate Identity Number could be read from this filing. It is " + "almost certainly a scanned image with no text layer, so nothing in it " + "can be cited. PrimaryDraft will not guess at the contents.") + return None + if len(ex.audited_pl) < MIN_PL_FIELDS and len(ex.directors_pl) < MIN_PL_FIELDS: + give_up("No machine-readable financial statement was found in this filing. " + "Rather than publish figures it cannot cite, PrimaryDraft declines to " + "build a ledger for this issuer.") + return None + + api_isin = (header.get("ISIN") or "").strip() or None + return { + "scrip_code": scrip, + "bse": { + "scrip_name": name, + "issuer_name": (row.get("Issuer_Name") or "").strip(), + "group": (row.get("GROUP") or "").strip(), + "segment": (row.get("Segment") or "").strip(), + "isin": api_isin or (row.get("ISIN_NUMBER") or "").strip() or None, + "face_value": row.get("FACE_VALUE"), + "industry": (row.get("INDUSTRY") or "").strip(), + "sector": (header.get("Sector") or "").strip(), + "industry_new": (header.get("IndustryNew") or "").strip(), + "market_cap": row.get("Mktcap"), + "eps_reported": header.get("EPS"), + "pe_reported": header.get("PE"), + "security_id": header.get("SecurityId"), + }, + "annual_report": { + "year": latest.get("Year"), + "url": latest["PDFDownload"], + "authorised_at": latest.get("Fld_AuthoriseDate"), + "local_path": str(pdf), + "available_years": [r.get("Year") for r in reports[:8]], + }, + "extraction": ex.to_dict(), + # Independent corroboration: the ISIN printed in the company's own annual + # report versus the ISIN BSE holds on its master. Two sources, one fact. + "isin_corroborated": bool(api_isin and ex.isin and api_isin == ex.isin), + } + + +def build(target: int, candidates: int, workers: int, offline: bool) -> None: + DATA.mkdir(parents=True, exist_ok=True) + client = BSEClient(offline=offline) + universe = client.sme_universe() + log.info("BSE SME universe: %d active companies", len(universe)) + + # Prefer larger SMEs: they file richer, better-structured annual reports. + def mcap(r: dict[str, Any]) -> float: + try: + return float(str(r.get("Mktcap") or 0).replace(",", "")) + except ValueError: + return 0.0 + + pool = sorted(universe, key=mcap, reverse=True)[:candidates] + log.info("attempting %d candidates for %d slots", len(pool), target) + + built: list[dict[str, Any]] = [] + with ThreadPoolExecutor(max_workers=workers) as ex: + futs = {ex.submit(build_one, client, r): r for r in pool} + for fut in as_completed(futs): + row = futs[fut] + if len(built) >= target: + break + try: + rec = fut.result() + except Exception: # noqa: BLE001 + log.warning("worker crashed for %s\n%s", row.get("SCRIP_CD"), traceback.format_exc()) + continue + if not rec: + continue + built.append(rec) + path = DATA / f"{rec['scrip_code']}.json" + path.write_text(json.dumps(rec, indent=1)) + e = rec["extraction"] + log.info( + "[%2d/%d] %-42s CIN=%s pl=%d bs=%d ids=%d", + len(built), target, rec["bse"]["scrip_name"][:42], e["cin"], + len(e["audited_pl"]), len(e["balance_sheet"]), + len(e["audited_pl_identities"]) + len(e["balance_sheet_identities"]), + ) + + index = [ + { + "scrip_code": r["scrip_code"], + "name": r["bse"]["scrip_name"], + "cin": r["extraction"]["cin"], + "isin": r["bse"]["isin"], + "industry": r["bse"]["industry"], + "sector": r["bse"]["sector"], + "year": r["annual_report"]["year"], + "pages": r["extraction"]["pages"], + "pl_fields": len(r["extraction"]["audited_pl"]), + "bs_fields": len(r["extraction"]["balance_sheet"]), + "identities": (r["extraction"]["audited_pl_identities"] + + r["extraction"]["balance_sheet_identities"]), + "isin_corroborated": r["isin_corroborated"], + } + for r in sorted(built, key=lambda r: r["bse"]["scrip_name"]) + ] + INDEX.write_text(json.dumps({"companies": index, "count": len(index)}, indent=1)) + log.info("wrote %d real company records -> %s", len(index), DATA) + client.close() + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--target", type=int, default=30) + ap.add_argument("--candidates", type=int, default=90) + ap.add_argument("--workers", type=int, default=6) + ap.add_argument("--offline", action="store_true") + a = ap.parse_args() + logging.basicConfig( + level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s", stream=sys.stdout + ) + build(a.target, a.candidates, a.workers, a.offline) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/app/backend/primarydraft/sources/mca.py b/app/backend/primarydraft/sources/mca.py new file mode 100644 index 0000000000000000000000000000000000000000..aa617f6163721102e9e700b738a43f795798bb15 --- /dev/null +++ b/app/backend/primarydraft/sources/mca.py @@ -0,0 +1,191 @@ +"""MCA Company Master Data, via the open government data platform. + +The Ministry of Corporate Affairs publishes company master data as state-wise +datasets on data.gov.in. They are official, free, and queryable by CIN. One row +carries several disclosures an offer document needs on its cover page and in its +capital structure: + + corporate_identification_number, company_name, company_status, company_class, + company_category, date_of_registration, authorized_cap, paidup_capital, + registered_office_address, registrar_of_companies, email_addr, + latest_year_ar, latest_year_bs + +The paid-up capital here is the second, independent source for a figure the +audited balance sheet also states, which is exactly what lets the ledger mark it +verified instead of merely read. + +KNOWN LIMITS, stated plainly and measured rather than assumed: + * the snapshots run to 31 March 2021, so a company incorporated after that is absent + * they are PARTIAL extracts, not the complete register, so a miss proves nothing +A hit is therefore real evidence and a miss is silence. The module never treats a +miss as a fact about the company. +""" + +from __future__ import annotations + +import json +import logging +import re +from pathlib import Path +from typing import Any + +import httpx + +log = logging.getLogger(__name__) + +BASE = "https://api.data.gov.in" +#: The platform's published sample key, documented for open access. +API_KEY = "579b464db66ec23bdd000001cdd3946e44ce4aad7209ff7b23ac571b" + +CACHE = Path(__file__).resolve().parents[2] / ".cache" / "mca" +CATALOG = CACHE / "catalog.json" + +#: Two-letter code in a CIN -> the state name used in dataset titles. +CIN_STATE_TO_NAME: dict[str, str] = { + "AP": "Andhra Pradesh", "AR": "Arunachal Pradesh", "AS": "Assam", "BR": "Bihar", + "CH": "Chandigarh", "CT": "Chhattisgarh", "DL": "Delhi", "GA": "Goa", + "GJ": "Gujarat", "HR": "Haryana", "HP": "Himachal Pradesh", "JH": "Jharkhand", + "JK": "Jammu", "KA": "Karnataka", "KL": "Kerala", "MH": "Maharashtra", + "ML": "Meghalaya", "MN": "Manipur", "MP": "Madhya Pradesh", "MZ": "Mizoram", + "NL": "Nagaland", "OR": "Odisha", "PB": "Punjab", "PY": "Puducherry", + "RJ": "Rajasthan", "SK": "Sikkim", "TN": "Tamil Nadu", "TZ": "Tamil Nadu", "TG": "Telangana", + "TS": "Telangana", "TR": "Tripura", "UP": "Uttar Pradesh", "UR": "Uttarakhand", + "UT": "Uttarakhand", "WB": "West Bengal", +} + +_YEAR_RE = re.compile(r"(\d{4})\s*$") + + +# data.gov.in stalls on a default client but answers a browser-shaped request +# in well under a second. Same handling the BSE client needs. +HEADERS = { + "User-Agent": ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 " + "(KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"), + "Accept": "application/json, text/plain, */*", + "Accept-Language": "en-US,en;q=0.9", +} + + +def _client() -> httpx.Client: + return httpx.Client(timeout=20.0, follow_redirects=True, headers=HEADERS) + + +def _get(path: str, params: dict[str, Any], attempts: int = 2) -> dict[str, Any] | None: + """GET with retries. The platform is intermittently slow, and an unavailable + registry must degrade to 'we could not check' rather than break a run.""" + import time + + for i in range(attempts): + try: + with _client() as c: + r = c.get(f"{BASE}{path}", params=params) + if r.status_code == 200: + return r.json() + log.info("data.gov.in %s -> %s", path, r.status_code) + except Exception as e: # noqa: BLE001 + log.info("data.gov.in %s attempt %d failed: %s", path, i + 1, type(e).__name__) + time.sleep(1.0 * (i + 1)) + return None + + +def catalog(refresh: bool = False) -> dict[str, dict[str, Any]]: + """Map state name -> the most recent Company Master Data dataset for it.""" + CACHE.mkdir(parents=True, exist_ok=True) + if CATALOG.exists() and not refresh: + try: + return json.loads(CATALOG.read_text()) + except json.JSONDecodeError: + CATALOG.unlink(missing_ok=True) + + found: dict[str, dict[str, Any]] = {} + for offset in (0, 100, 200): + data = _get("/lists", { + "api-key": API_KEY, "format": "json", "limit": 100, + "offset": offset, "filters[title]": "company master data", + }) + if data is None: + break + if True: + for rec in data.get("records", []): + title = rec.get("title") or "" + if "company master data" not in title.lower(): + continue + for code, state in CIN_STATE_TO_NAME.items(): + if state.lower() in title.lower(): + m = _YEAR_RE.search(title.strip()) + year = int(m.group(1)) if m else 0 + prev = found.get(state) + if prev is None or year > prev["year"]: + found[state] = { + "resource_id": rec["index_name"], + "title": title, + "year": year, + } + break + + if found: + CATALOG.write_text(json.dumps(found, indent=1)) + return found + + +def dataset_for_cin(cin: str) -> dict[str, Any] | None: + code = cin[6:8].upper() if len(cin) >= 8 else "" + state = CIN_STATE_TO_NAME.get(code) + if not state: + return None + return catalog().get(state) + + +def lookup(cin: str) -> dict[str, Any]: + """Look one CIN up in the MCA master data. + + Returns `{"found": bool, "record": โ€ฆ, "dataset": โ€ฆ, "note": โ€ฆ}`. A miss is a + result, not an error: for a company incorporated after the snapshot, absence + is the correct and honest answer. + """ + cin = (cin or "").strip().upper() + ds = dataset_for_cin(cin) + if ds is None: + return {"found": False, "record": None, "dataset": None, + "note": ("No MCA master dataset is published for the state in this CIN, " + "so no independent registry record could be consulted.")} + + key = CACHE / f"{cin}.json" + if key.exists(): + try: + return json.loads(key.read_text()) + except json.JSONDecodeError: + key.unlink(missing_ok=True) + + data = _get(f"/resource/{ds['resource_id']}", { + "api-key": API_KEY, "format": "json", "limit": 5, + "filters[corporate_identification_number]": cin, + }) + if data is None: + # Unreachable is not the same as absent, and must not be cached as absent. + return {"found": False, "record": None, "dataset": ds, "unreachable": True, + "note": ("The MCA dataset could not be reached, so the registry could not " + "be consulted. This is not evidence that the company is absent " + "from it.")} + records = data.get("records", []) + + out = { + "found": bool(records), + "record": records[0] if records else None, + "dataset": ds, + "note": ("" if records else + f"This CIN is not in '{ds['title']}'. That snapshot runs to {ds['year']} " + "and is a partial extract rather than the complete register, so absence " + "from it is NOT evidence that the company is not registered. No registry " + "figures were used for this issuer."), + } + CACHE.mkdir(parents=True, exist_ok=True) + key.write_text(json.dumps(out, indent=1)) + return out + + +def to_float(v: Any) -> float | None: + try: + return float(str(v).replace(",", "").strip()) + except (TypeError, ValueError): + return None diff --git a/app/backend/primarydraft/sources/pdf_extract.py b/app/backend/primarydraft/sources/pdf_extract.py new file mode 100644 index 0000000000000000000000000000000000000000..8d7eec6068b7d4108b59ec1757992b5455bd3f2e --- /dev/null +++ b/app/backend/primarydraft/sources/pdf_extract.py @@ -0,0 +1,589 @@ +"""Extract structured disclosure data from real annual-report PDFs. + +Everything returned by this module is traced to a real page and a real source line +in a real filing. Nothing is synthesised: if a value cannot be found, it is absent, +and the ledger records that absence as an abstention rather than a guess. + +Design notes from real BSE SME filings: + * numbers carry Indian digit grouping AND stray internal spaces ("1 ,52,170") + * scale is declared per-statement, not per-document ("(Rs in '000)", "(โ‚น in Lakhs)") + * the SAME figures appear in two independent places: the audited Statement of + Profit and Loss, and the "Financial Results" table in the Directors' Report. + We extract BOTH and let the deterministic engine reconcile them. That pair is + the real cross-section check at the heart of the product. +""" + +from __future__ import annotations + +import re +from dataclasses import dataclass, field +from pathlib import Path +from typing import Any + +import pdfplumber + +# --------------------------------------------------------------------------- regex + +CIN_RE = re.compile(r"\b([LU]\d{5}[A-Z]{2}\d{4}[A-Z]{3}\d{6})\b") +ISIN_RE = re.compile(r"\b(INE[A-Z0-9]{9})\b") +PAN_RE = re.compile(r"\b([A-Z]{5}\d{4}[A-Z])\b") +DIN_RE = re.compile(r"\b(?:DIN|D\.I\.N\.?)[\s:\-]*(\d{8})\b", re.I) +EMAIL_RE = re.compile(r"\b[\w.\-]+@[\w\-]+\.[\w.\-]+\b") + +# A number token. PDF text extraction inserts stray spaces AROUND separators +# ("1 ,52,170") but a space between two bare digit groups is a COLUMN break +# ("19 85,728" = note 19, then value 85,728). So spaces are only tolerated +# adjacent to a comma or decimal point: never between plain digits. +# Indian grouping puts 2 or 3 digits after each comma, never 4, and the lookahead +# stops a date ("March 31, 2025") being swallowed as the number 312025. +NUM_RE = re.compile(r"\(?\s*-?\s*\d+(?:\s*,\s*\d{2,3}(?!\d))*(?:\s*\.\s*\d+)?\s*\)?") + +# Scale is declared in a statement header, in many dialects: "(Rs in '000)", +# "(โ‚น'000)", "(Amount in Lakhs)", "โ‚น in millions". The apostrophe form carries no +# "in" at all, so it needs its own pattern. +# Real headers seen in filed reports: "(Rs in '000)", "(โ‚น'000)", "(Rs in Lakhs)", +# "(All amounts are in Indian Rupees lakhs, except share data)". A bare word match +# is what survives that variety: scanned only over the header region of a page so +# a passing mention in a note cannot rescale a statement. +SCALE_PATTERNS: list[tuple[re.Pattern[str], float]] = [ + (re.compile(r"\bcrores?\b", re.I), 10_000_000.0), + (re.compile(r"\blakh?s?\b|\blacs?\b", re.I), 100_000.0), + (re.compile(r"\bmillions?\b|\bmn\b", re.I), 1_000_000.0), + (re.compile(r"['โ€˜โ€™\"]\s*000\b|\bthousands?\b|\bin\s*000\b", re.I), 1_000.0), +] +#: Lines from the top of a page within which a scale declaration is believed. +SCALE_HEADER_LINES = 16 + +LAKH = 100_000.0 + + +def parse_number(tok: str) -> float | None: + """Parse a PDF-extracted Indian-format number. Returns None if not numeric.""" + t = tok.strip() + neg = t.startswith("(") and t.endswith(")") + t = t.strip("()").replace(",", "").replace(" ", "").replace("\u00a0", "") + if t in {"", "-", "--", ".", "NIL", "nil"}: + return None + try: + v = float(t) + except ValueError: + return None + return -v if neg else v + + +def detect_scale(text: str) -> float: + """Detect the rupee scale declared in a statement header.""" + header = "\n".join(text.splitlines()[:SCALE_HEADER_LINES]) + for pat, mult in SCALE_PATTERNS: + if pat.search(header): + return mult + return 1.0 + + +def trailing_numbers(line: str, limit: int = 4) -> list[float]: + """Pull the trailing numeric columns off a financial-statement line.""" + out: list[float] = [] + for m in NUM_RE.finditer(line): + v = parse_number(m.group()) + if v is not None: + out.append(v) + return out[-limit:] if len(out) > limit else out + + +def value_columns(line: str) -> list[float]: + """The (current, previous) value columns of a statement line. + + Indian statements print `