feat: Auto-fetch KRS data when approving membership application

- Add _enrich_company_from_krs() helper function
- Import board members (zarząd) to CompanyPerson table
- Import PKD codes to CompanyPKD table
- Set data_source='KRS API' for proper template rendering
- Show status message to admin about KRS data fetch

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Maciej Pienczyn 2026-02-01 20:02:49 +01:00
parent fc2d4e0175
commit 4e3d6aa9cc

View File

@ -16,8 +16,9 @@ from sqlalchemy.orm.attributes import flag_modified
from . import bp
from database import (
SessionLocal, MembershipApplication, CompanyDataRequest,
Company, Category, User, UserNotification
Company, Category, User, UserNotification, Person, CompanyPerson, CompanyPKD
)
from krs_api_service import get_company_from_krs
logger = logging.getLogger(__name__)
@ -48,6 +49,107 @@ def _generate_member_number(db):
return f"NB-{count + 1:04d}"
def _enrich_company_from_krs(company, db):
"""
Fetch and import KRS data for a company.
Updates company with krs_raw_data, imports people and PKD codes.
"""
if not company.krs:
return False
try:
krs_data = get_company_from_krs(company.krs)
if not krs_data:
logger.warning(f"KRS data not found for company {company.id} (KRS: {company.krs})")
return False
data_dict = krs_data.to_dict()
# Update company with KRS data
company.krs_raw_data = data_dict
company.krs_fetched_at = datetime.now()
company.data_source = 'KRS API'
company.last_verified_at = datetime.now()
# Additional fields from KRS
if data_dict.get('forma_prawna'):
company.legal_form = data_dict['forma_prawna']
if data_dict.get('nazwa_pełna'):
company.legal_name = data_dict['nazwa_pełna']
if data_dict.get('sposob_reprezentacji'):
company.krs_representation = data_dict['sposob_reprezentacji']
kapital = data_dict.get('kapital', {})
if kapital.get('zakladowy'):
company.capital_amount = kapital['zakladowy']
# Import board members (zarząd)
with db.no_autoflush:
for osoba in data_dict.get('zarzad', []):
nazwisko = osoba.get('nazwisko', '')
imiona = osoba.get('imiona', osoba.get('imie', ''))
funkcja = osoba.get('funkcja', 'CZŁONEK ZARZĄDU')
if not nazwisko:
continue
person = db.query(Person).filter(
Person.nazwisko == nazwisko,
Person.imiona == imiona
).first()
if not person:
person = Person(nazwisko=nazwisko, imiona=imiona)
db.add(person)
db.flush()
existing = db.query(CompanyPerson).filter(
CompanyPerson.company_id == company.id,
CompanyPerson.person_id == person.id
).first()
if not existing:
cp = CompanyPerson(
company_id=company.id,
person_id=person.id,
role=funkcja,
role_category='zarzad',
source='ekrs.ms.gov.pl',
fetched_at=datetime.now()
)
db.add(cp)
# Import PKD codes
for pkd in data_dict.get('przedmiot_dzialalnosci', []):
kod = pkd.get('kod', '')
nazwa = pkd.get('nazwa', '')
is_primary = pkd.get('glowny', False)
if not kod:
continue
existing = db.query(CompanyPKD).filter(
CompanyPKD.company_id == company.id,
CompanyPKD.pkd_code == kod
).first()
if not existing:
cpkd = CompanyPKD(
company_id=company.id,
pkd_code=kod,
pkd_description=nazwa,
is_primary=is_primary
)
db.add(cpkd)
logger.info(f"Enriched company {company.id} with KRS data")
return True
except Exception as e:
logger.error(f"Error enriching company {company.id} from KRS: {e}")
return False
# ============================================================
# MEMBERSHIP APPLICATIONS
# ============================================================
@ -265,12 +367,26 @@ def admin_membership_approve(app_id):
f"Company {company.id} created. Member number: {application.member_number}"
)
flash(f'Deklaracja zatwierdzona. Utworzono firmę: {company.name}', 'success')
# Enrich company with KRS data (if KRS number available)
krs_enriched = False
krs_message = ""
if company.krs:
logger.info(f"Fetching KRS data for company {company.id} (KRS: {company.krs})...")
krs_enriched = _enrich_company_from_krs(company, db)
if krs_enriched:
db.commit()
krs_message = " Pobrano dane z rejestru KRS."
logger.info(f"KRS data imported for company {company.id}")
else:
krs_message = " (Nie udało się pobrać danych z KRS)"
flash(f'Deklaracja zatwierdzona! Nr członkowski: {application.member_number}{krs_message}', 'success')
return jsonify({
'success': True,
'company_id': company.id,
'member_number': application.member_number
'member_number': application.member_number,
'krs_enriched': krs_enriched
})
except Exception as e:
db.rollback()