File size: 4,429 Bytes
745ead6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import requests
import logging
from typing import Dict, Any, Optional

logger = logging.getLogger(__name__)


class KRSClient:
    """
    Klient do pobierania Odpisu Aktualnego z publicznego API KRS (Krajowy Rejestr S膮dowy).
    Zgodnie z dokumentacj膮: https://api-krs.ms.gov.pl/api/krs/OdpisAktualny/{krs}?rejestr={rejestr}&format=json
    """

    BASE_URL = "https://api-krs.ms.gov.pl/api/krs"

    @staticmethod
    def get_odpis_aktualny(krs: str, rejestr: str = "P") -> Optional[Dict[str, Any]]:
        """
        Pobiera aktualny JSON podmiotu z KRS.
        :param krs: 10-cyfrowy numer KRS
        :param rejestr: P - przedsi臋biorc贸w, S - stowarzysze艅
        """
        url = f"{KRSClient.BASE_URL}/OdpisAktualny/{krs}"
        params = {"rejestr": rejestr, "format": "json"}

        try:
            response = requests.get(url, params=params, timeout=10)
            if response.status_code == 200:
                return response.json()
            elif response.status_code == 404:
                logger.warning(f"Podmiot {krs} nie znaleziony w KRS.")
                return None
            else:
                logger.error(
                    f"B艂膮d us艂ugi KRS API ({response.status_code}): {response.text}"
                )
                return None
        except Exception as e:
            logger.error(f"Wyj膮tek podczas 艂膮czenia z KRS API: {e}")
            return None

    @staticmethod
    def extract_graph_relations(krs_data: Dict[str, Any]) -> Dict[str, Any]:
        """
        Ekstrahuje kluczowe dane do zbudowania relacji w Neo4j: Wsp贸lnik贸w i Zarz膮d.
        Zwraca wyselekcjonowane s艂owniki przydatne w analizach powi膮za艅 M艢P.
        """
        if not krs_data:
            return {}

        try:
            odpis = krs_data.get("odpis", {})
            dane = odpis.get("dane", {})

            # Podstawowe info (dzia艂 1)
            dzial1 = dane.get("dzial1", {})
            dane_podmiotu = dzial1.get("danePodmiotu", {})
            nazwa = dane_podmiotu.get("nazwa", "")
            nip = dane_podmiotu.get("identyfikatory", {}).get("nip", "")
            regon = dane_podmiotu.get("identyfikatory", {}).get("regon", "")
            krs_nr = odpis.get("naglowekA", {}).get("numerKRS", "")

            # Kapita艂 (dzia艂 1 - kapita艂)
            kapital = dzial1.get("kapital", {})
            kapital_zakladowy = kapital.get("wysokoscKapitaluZakladowego", {}).get(
                "wartosc", "0"
            )

            # Wsp贸lnicy (dzia艂 1 - wsp贸lnicy)
            wspolnicy = []
            wspolnicy_krs = dzial1.get("wspolnicySpZoo", [])
            for w in wspolnicy_krs:
                osoba = w.get("identyfikator", {})
                pesel = osoba.get("pesel", "")
                krs_wspolnika = osoba.get("krs", "")
                wspolnicy.append(
                    {
                        "id": pesel or krs_wspolnika or osoba.get("nazwisko", ""),
                        "nazwa": osoba.get("nazwisko", "") or osoba.get("nazwa", ""),
                        "imiona": osoba.get("imiona", ""),
                        "is_spolka": bool(krs_wspolnika),
                        "posiadaneDzialyUdzialy": w.get("posiadaneDzialyUdzialy", {}),
                    }
                )

            # Reprezentacja / Zarz膮d (dzia艂 2)
            dzial2 = dane.get("dzial2", {})
            zarzad_krs = dzial2.get("reprezentacja", {}).get("sklad", [])
            zarzad = []
            for z in zarzad_krs:
                osoba = z.get("identyfikator", {})
                funkcja = z.get("funkcjaWOrganie", "Cz艂onek Zarz膮du")
                pesel = osoba.get("pesel", "")
                zarzad.append(
                    {
                        "id": pesel or osoba.get("nazwisko", ""),
                        "nazwa": osoba.get("nazwisko", "") or osoba.get("nazwa", ""),
                        "imiona": osoba.get("imiona", ""),
                        "funkcja": funkcja,
                    }
                )

            return {
                "krs": krs_nr,
                "nip": nip,
                "regon": regon,
                "nazwa": nazwa,
                "kapitalZakladowy": kapital_zakladowy,
                "wspolnicy": wspolnicy,
                "zarzad": zarzad,
            }
        except Exception as e:
            logger.error(f"B艂膮d parsowania JSON z KRS: {e}")
            return {}