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:
parent
fc2d4e0175
commit
4e3d6aa9cc
@ -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()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user