fix: correct service API calls in arm_company.py
Some checks are pending
NordaBiz Tests / Unit & Integration Tests (push) Waiting to run
NordaBiz Tests / E2E Tests (Playwright) (push) Blocked by required conditions
NordaBiz Tests / Smoke Tests (Production) (push) Blocked by required conditions
NordaBiz Tests / Send Failure Notification (push) Blocked by required conditions

- KRS: search_by_nip() returns dict, not just KRS number
- SEO: SEOAuditor(database_url) + audit_company(company_dict)
- Social: SocialMediaAuditor() + audit_company(company_dict)
- GBP: GBPAuditService(db) + audit_company(company_id)
- Support multiple company IDs in one invocation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Maciej Pienczyn 2026-02-20 16:36:24 +01:00
parent 1967fe8695
commit 0e04a17785

View File

@ -5,6 +5,7 @@ Odpowiednik przycisku "Uzbrój firmę" w panelu admina.
Użycie: Użycie:
python3 scripts/arm_company.py <company_id> [--force] python3 scripts/arm_company.py <company_id> [--force]
python3 scripts/arm_company.py 120 121 122 --force # wiele firm naraz
Opcje: Opcje:
--force Wymusza ponowne wykonanie wszystkich kroków (jak "Zaktualizuj dane") --force Wymusza ponowne wykonanie wszystkich kroków (jak "Zaktualizuj dane")
@ -14,7 +15,12 @@ import os
import logging import logging
# Setup path # Setup path
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, BASE_DIR)
scripts_dir = os.path.join(BASE_DIR, 'scripts')
if scripts_dir not in sys.path:
sys.path.insert(0, scripts_dir)
from database import SessionLocal, Company, CompanyWebsiteAnalysis, CompanySocialMedia, CompanyPKD, CompanyPerson from database import SessionLocal, Company, CompanyWebsiteAnalysis, CompanySocialMedia, CompanyPKD, CompanyPerson
from database import GBPAudit from database import GBPAudit
@ -50,13 +56,13 @@ def arm_company(company_id, force=False):
krs_service = KRSApiService() krs_service = KRSApiService()
# Sprawdź KRS przez Białą Listę # Sprawdź KRS przez Białą Listę (search_by_nip zwraca dict lub None)
if not company.krs: if not company.krs:
krs_number = krs_service.get_krs_by_nip(company.nip) krs_data = krs_service.search_by_nip(company.nip)
if krs_number: if krs_data and krs_data.get('krs'):
company.krs = krs_number company.krs = krs_data['krs']
db.flush() db.flush()
logger.info("Znaleziono KRS %s dla NIP %s" % (krs_number, company.nip)) logger.info("Znaleziono KRS %s dla NIP %s" % (company.krs, company.nip))
if company.krs: if company.krs:
success = _enrich_company_from_krs(company, db) success = _enrich_company_from_krs(company, db)
@ -69,28 +75,57 @@ def arm_company(company_id, force=False):
print(" -> FAIL: Nie udało się pobrać z KRS") print(" -> FAIL: Nie udało się pobrać z KRS")
else: else:
# Próbuj CEIDG # Próbuj CEIDG
try: import requests as req
from blueprints.api.routes_company import _enrich_from_ceidg ceidg_key = os.getenv("CEIDG_API_KEY", "")
ceidg_ok = _enrich_from_ceidg(company, db) nip_clean = company.nip.replace('-', '').replace(' ', '')
if ceidg_ok: ceidg_url = "https://dane.biznes.gov.pl/api/ceidg/v3/firma?nip=%s" % nip_clean
headers = {"Authorization": "Bearer %s" % ceidg_key}
resp = req.get(ceidg_url, headers=headers, timeout=10)
if resp.status_code == 200:
data = resp.json()
firmy = data.get('firmy', [])
if firmy:
firma = firmy[0]
# Zapisz surowe dane
company.ceidg_raw_data = firma
from datetime import datetime
company.ceidg_fetched_at = datetime.utcnow()
# Mapuj podstawowe pola
if firma.get('wlasciciel'):
wl = firma['wlasciciel']
company.legal_form = 'JDG'
if not company.owner_name:
company.owner_name = '%s %s' % (wl.get('imie', ''), wl.get('nazwisko', ''))
if firma.get('adresDzialalnosci'):
addr = firma['adresDzialalnosci']
if not company.address_street:
ulica = addr.get('ulica', '')
nr = addr.get('budynek', '')
lokal = addr.get('lokal', '')
company.address_street = ('%s %s%s' % (ulica, nr, '/%s' % lokal if lokal else '')).strip()
if not company.address_city:
company.address_city = addr.get('miasto', '')
if not company.address_zip:
company.address_zip = addr.get('kodPocztowy', '')
if firma.get('email') and not company.email:
company.email = firma['email']
if firma.get('telefon') and not company.phone:
company.phone = firma['telefon']
if firma.get('adresStronyInternetowej') and not company.website:
company.website = firma['adresStronyInternetowej']
db.commit() db.commit()
results['registry'] = 'OK (CEIDG)' results['registry'] = 'OK (CEIDG)'
print(" -> OK: Dane z CEIDG pobrane") print(" -> OK: Dane z CEIDG pobrane")
else:
results['registry'] = 'FAIL (CEIDG)'
print(" -> FAIL: Nie znaleziono w CEIDG")
except ImportError:
# Fallback: bezpośrednie wywołanie CEIDG API
import requests as req
ceidg_url = "https://dane.biznes.gov.pl/api/ceidg/v3/firma?nip=%s" % company.nip
headers = {"Authorization": "Bearer %s" % os.getenv("CEIDG_API_KEY", "")}
resp = req.get(ceidg_url, headers=headers, timeout=10)
if resp.status_code == 200 and resp.json().get('firmy'):
results['registry'] = 'OK (CEIDG-raw)'
print(" -> OK: Dane z CEIDG (raw)")
else: else:
results['registry'] = 'NOT FOUND' results['registry'] = 'NOT FOUND'
print(" -> Nie znaleziono w żadnym rejestrze") print(" -> Nie znaleziono w CEIDG")
else:
results['registry'] = 'NOT FOUND'
print(" -> Nie znaleziono w żadnym rejestrze")
except Exception as e: except Exception as e:
results['registry'] = 'ERROR: %s' % str(e)[:80] results['registry'] = 'ERROR: %s' % str(e)[:80]
print(" -> ERROR: %s" % str(e)[:80]) print(" -> ERROR: %s" % str(e)[:80])
@ -110,18 +145,20 @@ def arm_company(company_id, force=False):
if company.website: if company.website:
print("\n[2/5] Audyt SEO...") print("\n[2/5] Audyt SEO...")
try: try:
scripts_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'scripts') from seo_audit import SEOAuditor
if scripts_dir not in sys.path: seo_service = SEOAuditor()
sys.path.insert(0, scripts_dir) company_dict = {
from seo_audit import SEOAuditService 'id': company.id,
seo_service = SEOAuditService() 'name': company.name,
result = seo_service.audit_company(company.id, db) 'slug': company.slug,
if result and result.get('success'): 'website': company.website,
results['seo'] = 'OK (score: %s)' % result.get('seo_score', '?') 'address_city': company.address_city or '',
print(" -> OK: SEO=%s, Perf=%s" % (result.get('seo_score', '?'), result.get('performance_score', '?'))) }
else: audit_result = seo_service.audit_company(company_dict)
results['seo'] = 'FAIL' seo_score = audit_result.get('scores', {}).get('pagespeed_seo', '?')
print(" -> FAIL: %s" % (result.get('error', 'unknown') if result else 'no result')) perf_score = audit_result.get('scores', {}).get('pagespeed_performance', '?')
results['seo'] = 'OK (SEO: %s, Perf: %s)' % (seo_score, perf_score)
print(" -> OK: SEO=%s, Perf=%s" % (seo_score, perf_score))
except Exception as e: except Exception as e:
results['seo'] = 'ERROR: %s' % str(e)[:80] results['seo'] = 'ERROR: %s' % str(e)[:80]
print(" -> ERROR: %s" % str(e)[:80]) print(" -> ERROR: %s" % str(e)[:80])
@ -137,13 +174,17 @@ def arm_company(company_id, force=False):
if force or not social_done: if force or not social_done:
print("\n[3/5] Audyt Social Media...") print("\n[3/5] Audyt Social Media...")
try: try:
scripts_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'scripts')
if scripts_dir not in sys.path:
sys.path.insert(0, scripts_dir)
from social_media_audit import SocialMediaAuditor from social_media_audit import SocialMediaAuditor
auditor = SocialMediaAuditor(db) auditor = SocialMediaAuditor() # uses DATABASE_URL from env
audit_result = auditor.audit_company(company.id) company_dict = {
profiles = audit_result.get('profiles_found', 0) if audit_result else 0 'id': company.id,
'name': company.name,
'slug': company.slug,
'website': company.website,
'address_city': company.address_city or '',
}
audit_result = auditor.audit_company(company_dict)
profiles = len(audit_result.get('social_media', {}).get('profiles', [])) if audit_result else 0
results['social'] = 'OK (%d profili)' % profiles results['social'] = 'OK (%d profili)' % profiles
print(" -> OK: %d profili znalezionych" % profiles) print(" -> OK: %d profili znalezionych" % profiles)
except Exception as e: except Exception as e:
@ -159,15 +200,15 @@ def arm_company(company_id, force=False):
print("\n[4/5] Audyt GBP...") print("\n[4/5] Audyt GBP...")
try: try:
from gbp_audit_service import GBPAuditService from gbp_audit_service import GBPAuditService
gbp_service = GBPAuditService() gbp_service = GBPAuditService(db)
gbp_result = gbp_service.audit_company(company.id, db) gbp_result = gbp_service.audit_company(company.id)
if gbp_result and gbp_result.get('success'): if gbp_result:
score = gbp_result.get('completeness_score', '?') score = gbp_result.get('completeness_score', gbp_result.get('score', '?'))
results['gbp'] = 'OK (score: %s)' % score results['gbp'] = 'OK (score: %s)' % score
print(" -> OK: Score=%s" % score) print(" -> OK: Score=%s" % score)
else: else:
results['gbp'] = 'FAIL' results['gbp'] = 'FAIL'
print(" -> FAIL: %s" % (gbp_result.get('error', 'unknown') if gbp_result else 'no result')) print(" -> FAIL: brak wyniku")
except Exception as e: except Exception as e:
results['gbp'] = 'ERROR: %s' % str(e)[:80] results['gbp'] = 'ERROR: %s' % str(e)[:80]
print(" -> ERROR: %s" % str(e)[:80]) print(" -> ERROR: %s" % str(e)[:80])
@ -235,11 +276,14 @@ def arm_company(company_id, force=False):
if __name__ == '__main__': if __name__ == '__main__':
if len(sys.argv) < 2: if len(sys.argv) < 2:
print("Użycie: python3 scripts/arm_company.py <company_id> [--force]") print("Użycie: python3 scripts/arm_company.py <company_id> [<id2> ...] [--force]")
print(" --force Wymusza ponowne wykonanie wszystkich kroków") print(" --force Wymusza ponowne wykonanie wszystkich kroków")
sys.exit(1) sys.exit(1)
cid = int(sys.argv[1])
force = '--force' in sys.argv force = '--force' in sys.argv
ids = [int(a) for a in sys.argv[1:] if a != '--force' and a.isdigit()]
arm_company(cid, force=force) for cid in ids:
arm_company(cid, force=force)
if len(ids) > 1:
print("\n")