diff --git a/blueprints/api/routes_company.py b/blueprints/api/routes_company.py index c9ea36d..f8d6ffc 100644 --- a/blueprints/api/routes_company.py +++ b/blueprints/api/routes_company.py @@ -415,172 +415,191 @@ def api_enrich_company_registry(company_id): 'error': f'Nie udało się pobrać danych z KRS dla numeru {company.krs}' }), 404 - # Strategy 2: No KRS but has NIP — try Biała Lista to find KRS + # Strategy 2: No KRS but has NIP — try CEIDG first (JDG), then Biała Lista/KRS elif effective_nip: - krs_service = krs_api_service.KRSApiService() - biala_lista_result = krs_service.search_by_nip(effective_nip) + # Try CEIDG first — if the NIP belongs to a JDG, this will find it + ceidg_data = fetch_ceidg_by_nip(effective_nip) + if ceidg_data: + source = 'CEIDG' + updated_fields = [] - if biala_lista_result and biala_lista_result.get('krs'): - # Found KRS via Biała Lista — save it and enrich - company.krs = biala_lista_result['krs'] - db.flush() + # --- CEIDG identifiers & metadata --- + if ceidg_data.get('ceidg_id'): + company.ceidg_id = ceidg_data['ceidg_id'] + updated_fields.append('CEIDG ID') + if ceidg_data.get('status'): + company.ceidg_status = ceidg_data['status'] + updated_fields.append('status CEIDG') + company.ceidg_raw_data = ceidg_data.get('raw') + company.ceidg_fetched_at = datetime.now() + company.data_source = 'CEIDG API' + company.last_verified_at = datetime.now() - from blueprints.admin.routes_membership import _enrich_company_from_krs - success = _enrich_company_from_krs(company, db) - if success: - source = 'KRS (via Biała Lista VAT)' - people_count = db.query(CompanyPerson).filter_by(company_id=company.id).count() - pkd_count = db.query(CompanyPKD).filter_by(company_id=company.id).count() - details = { - 'krs_found': company.krs, - 'people_imported': people_count, - 'pkd_codes': pkd_count, - 'legal_form': company.legal_form or '' - } - message_parts.append(f'znaleziono KRS: {company.krs}') - message_parts.append(f'zarząd ({people_count} osób)') - message_parts.append(f'kody PKD ({pkd_count})') - else: - source = 'Biała Lista VAT' - details = {'krs_found': company.krs} - message_parts.append(f'znaleziono KRS: {company.krs} (dane KRS niedostępne)') + # --- Owner --- + wlasciciel = ceidg_data.get('wlasciciel', {}) + if wlasciciel.get('imie'): + company.owner_first_name = wlasciciel['imie'] + updated_fields.append('właściciel') + if wlasciciel.get('nazwisko'): + company.owner_last_name = wlasciciel['nazwisko'] + if ceidg_data.get('obywatelstwa'): + company.owner_citizenships = ceidg_data['obywatelstwa'] + + # --- Legal name --- + if ceidg_data.get('firma') and (not company.legal_name or company.legal_name == company.name): + company.legal_name = ceidg_data['firma'] + updated_fields.append('nazwa pełna') + + # --- REGON --- + if not company.regon: + regon = ceidg_data.get('regon') or wlasciciel.get('regon') + if regon: + company.regon = regon + updated_fields.append('REGON') + + # --- Business start date --- + if ceidg_data.get('dataRozpoczecia'): + try: + d = ceidg_data['dataRozpoczecia'] + if isinstance(d, str): + company.business_start_date = date.fromisoformat(d) + updated_fields.append('data rozpoczęcia') + except (ValueError, TypeError): + pass + + # --- Legal form (set to JDG since found in CEIDG) --- + if company.legal_form != 'JEDNOOSOBOWA DZIAŁALNOŚĆ GOSPODARCZA': + company.legal_form = 'JEDNOOSOBOWA DZIAŁALNOŚĆ GOSPODARCZA' + updated_fields.append('forma prawna → JDG') + + # --- Clear KRS data (CEIDG = JDG, not a spółka) --- + if company.krs: + company.krs = None + company.krs_registration_date = None + company.krs_company_agreement_date = None + company.krs_representation_rules = None + company.krs_duration = None + company.krs_raw_data = None + company.krs_fetched_at = None + company.krs_representation = None + company.krs_activities = None + company.krs_last_audit_at = None + company.krs_pdf_path = None + company.capital_amount = None + company.capital_shares_count = None + company.capital_share_value = None + company.capital_currency = None + updated_fields.append('wyczyszczono dane KRS (firma jest JDG)') + + # --- PKD (main) --- + pkd_gl = ceidg_data.get('pkdGlowny', {}) + if pkd_gl and pkd_gl.get('kod'): + company.pkd_code = pkd_gl['kod'] + company.pkd_description = pkd_gl.get('nazwa') + updated_fields.append(f'PKD główny ({pkd_gl["kod"]})') + + # --- PKD (full list) --- + pkd_lista = ceidg_data.get('pkd', []) + if pkd_lista: + company.ceidg_pkd_list = pkd_lista + # Create CompanyPKD records (same pattern as KRS enrichment) + pkd_main_code = pkd_gl.get('kod', '') if pkd_gl else '' + for pkd_item in pkd_lista: + kod = pkd_item.get('kod', '') + if not kod: + continue + existing_pkd = db.query(CompanyPKD).filter( + CompanyPKD.company_id == company.id, + CompanyPKD.pkd_code == kod + ).first() + if not existing_pkd: + db.add(CompanyPKD( + company_id=company.id, + pkd_code=kod, + pkd_description=pkd_item.get('nazwa', ''), + is_primary=(kod == pkd_main_code) + )) + updated_fields.append(f'lista PKD ({len(pkd_lista)} kodów)') + + # --- Business address --- + adres = ceidg_data.get('adresDzialalnosci', {}) + ulica = adres.get('ulica', '') + budynek = adres.get('budynek', '') + lokal = adres.get('lokal', '') + if ulica or budynek: + street_parts = [ulica, budynek] + if lokal: + street_parts[-1] = (budynek + '/' + lokal) if budynek else lokal + company.address_street = ' '.join(p for p in street_parts if p) + updated_fields.append('adres') + if adres.get('kod') or adres.get('kodPocztowy'): + company.address_postal = adres.get('kod') or adres.get('kodPocztowy') + if adres.get('miasto') or adres.get('miejscowosc'): + company.address_city = adres.get('miasto') or adres.get('miejscowosc') + if company.address_street and company.address_postal and company.address_city: + company.address_full = f'{company.address_street}, {company.address_postal} {company.address_city}' + + # --- Correspondence address --- + koresp = ceidg_data.get('adresKorespondencyjny', {}) + if koresp and (koresp.get('ulica') or koresp.get('budynek')): + k_ulica = koresp.get('ulica', '') + k_budynek = koresp.get('budynek', '') + k_lokal = koresp.get('lokal', '') + k_parts = [k_ulica, k_budynek] + if k_lokal: + k_parts[-1] = (k_budynek + '/' + k_lokal) if k_budynek else k_lokal + company.correspondence_street = ' '.join(p for p in k_parts if p) + company.correspondence_postal = koresp.get('kod') + company.correspondence_city = koresp.get('miasto') + updated_fields.append('adres korespondencyjny') + + # --- Contact (only if empty) --- + if ceidg_data.get('email') and not company.email: + company.email = ceidg_data['email'] + updated_fields.append('email') + if ceidg_data.get('stronaWWW') and not company.website: + company.website = ceidg_data['stronaWWW'] + updated_fields.append('strona www') + if ceidg_data.get('telefon') and not company.phone: + company.phone = ceidg_data['telefon'] + updated_fields.append('telefon') + + details = {'updated_fields': updated_fields} + message_parts.append(f'zaktualizowano {len(updated_fields)} pól') + if updated_fields: + message_parts.append(', '.join(updated_fields)) else: - # No KRS found — try CEIDG (likely JDG) - ceidg_data = fetch_ceidg_by_nip(effective_nip) - if ceidg_data: - source = 'CEIDG' - updated_fields = [] + # Not found in CEIDG — try Biała Lista to find KRS (spółka) + krs_service = krs_api_service.KRSApiService() + biala_lista_result = krs_service.search_by_nip(effective_nip) - # --- CEIDG identifiers & metadata --- - if ceidg_data.get('ceidg_id'): - company.ceidg_id = ceidg_data['ceidg_id'] - updated_fields.append('CEIDG ID') - if ceidg_data.get('status'): - company.ceidg_status = ceidg_data['status'] - updated_fields.append('status CEIDG') - company.ceidg_raw_data = ceidg_data.get('raw') - company.ceidg_fetched_at = datetime.now() - company.data_source = 'CEIDG API' - company.last_verified_at = datetime.now() + if biala_lista_result and biala_lista_result.get('krs'): + company.krs = biala_lista_result['krs'] + db.flush() - # --- Owner --- - wlasciciel = ceidg_data.get('wlasciciel', {}) - if wlasciciel.get('imie'): - company.owner_first_name = wlasciciel['imie'] - updated_fields.append('właściciel') - if wlasciciel.get('nazwisko'): - company.owner_last_name = wlasciciel['nazwisko'] - if ceidg_data.get('obywatelstwa'): - company.owner_citizenships = ceidg_data['obywatelstwa'] - - # --- Legal name --- - if ceidg_data.get('firma') and (not company.legal_name or company.legal_name == company.name): - company.legal_name = ceidg_data['firma'] - updated_fields.append('nazwa pełna') - - # --- REGON --- - if not company.regon: - regon = ceidg_data.get('regon') or wlasciciel.get('regon') - if regon: - company.regon = regon - updated_fields.append('REGON') - - # --- Business start date --- - if ceidg_data.get('dataRozpoczecia'): - try: - d = ceidg_data['dataRozpoczecia'] - if isinstance(d, str): - company.business_start_date = date.fromisoformat(d) - updated_fields.append('data rozpoczęcia') - except (ValueError, TypeError): - pass - - # --- Legal form --- - if not company.legal_form: - company.legal_form = 'JEDNOOSOBOWA DZIAŁALNOŚĆ GOSPODARCZA' - updated_fields.append('forma prawna') - - # --- PKD (main) --- - pkd_gl = ceidg_data.get('pkdGlowny', {}) - if pkd_gl and pkd_gl.get('kod'): - company.pkd_code = pkd_gl['kod'] - company.pkd_description = pkd_gl.get('nazwa') - updated_fields.append(f'PKD główny ({pkd_gl["kod"]})') - - # --- PKD (full list) --- - pkd_lista = ceidg_data.get('pkd', []) - if pkd_lista: - company.ceidg_pkd_list = pkd_lista - # Create CompanyPKD records (same pattern as KRS enrichment) - pkd_main_code = pkd_gl.get('kod', '') if pkd_gl else '' - for pkd_item in pkd_lista: - kod = pkd_item.get('kod', '') - if not kod: - continue - existing_pkd = db.query(CompanyPKD).filter( - CompanyPKD.company_id == company.id, - CompanyPKD.pkd_code == kod - ).first() - if not existing_pkd: - db.add(CompanyPKD( - company_id=company.id, - pkd_code=kod, - pkd_description=pkd_item.get('nazwa', ''), - is_primary=(kod == pkd_main_code) - )) - updated_fields.append(f'lista PKD ({len(pkd_lista)} kodów)') - - # --- Business address --- - adres = ceidg_data.get('adresDzialalnosci', {}) - ulica = adres.get('ulica', '') - budynek = adres.get('budynek', '') - lokal = adres.get('lokal', '') - if ulica or budynek: - street_parts = [ulica, budynek] - if lokal: - street_parts[-1] = (budynek + '/' + lokal) if budynek else lokal - company.address_street = ' '.join(p for p in street_parts if p) - updated_fields.append('adres') - if adres.get('kod') or adres.get('kodPocztowy'): - company.address_postal = adres.get('kod') or adres.get('kodPocztowy') - if adres.get('miasto') or adres.get('miejscowosc'): - company.address_city = adres.get('miasto') or adres.get('miejscowosc') - if company.address_street and company.address_postal and company.address_city: - company.address_full = f'{company.address_street}, {company.address_postal} {company.address_city}' - - # --- Correspondence address --- - koresp = ceidg_data.get('adresKorespondencyjny', {}) - if koresp and (koresp.get('ulica') or koresp.get('budynek')): - k_ulica = koresp.get('ulica', '') - k_budynek = koresp.get('budynek', '') - k_lokal = koresp.get('lokal', '') - k_parts = [k_ulica, k_budynek] - if k_lokal: - k_parts[-1] = (k_budynek + '/' + k_lokal) if k_budynek else k_lokal - company.correspondence_street = ' '.join(p for p in k_parts if p) - company.correspondence_postal = koresp.get('kod') - company.correspondence_city = koresp.get('miasto') - updated_fields.append('adres korespondencyjny') - - # --- Contact (only if empty) --- - if ceidg_data.get('email') and not company.email: - company.email = ceidg_data['email'] - updated_fields.append('email') - if ceidg_data.get('stronaWWW') and not company.website: - company.website = ceidg_data['stronaWWW'] - updated_fields.append('strona www') - if ceidg_data.get('telefon') and not company.phone: - company.phone = ceidg_data['telefon'] - updated_fields.append('telefon') - - details = {'updated_fields': updated_fields} - message_parts.append(f'zaktualizowano {len(updated_fields)} pól') - if updated_fields: - message_parts.append(', '.join(updated_fields)) + from blueprints.admin.routes_membership import _enrich_company_from_krs + success = _enrich_company_from_krs(company, db) + if success: + source = 'KRS (via Biała Lista VAT)' + people_count = db.query(CompanyPerson).filter_by(company_id=company.id).count() + pkd_count = db.query(CompanyPKD).filter_by(company_id=company.id).count() + details = { + 'krs_found': company.krs, + 'people_imported': people_count, + 'pkd_codes': pkd_count, + 'legal_form': company.legal_form or '' + } + message_parts.append(f'znaleziono KRS: {company.krs}') + message_parts.append(f'zarząd ({people_count} osób)') + message_parts.append(f'kody PKD ({pkd_count})') + else: + source = 'Biała Lista VAT' + details = {'krs_found': company.krs} + message_parts.append(f'znaleziono KRS: {company.krs} (dane KRS niedostępne)') else: return jsonify({ 'success': False, - 'error': 'Nie znaleziono danych w rejestrach KRS ani CEIDG dla tego NIP' + 'error': 'Nie znaleziono danych w rejestrach CEIDG ani KRS dla tego NIP' }), 404 else: return jsonify({