Kurumsal ziyaret raporlarını, satış ve finans verilerini tek akışta işleyip birleşik içgörülere dönüştüren modüler analiz ve raporlama platformu.
NormVision; PDF ziyaret özetlerinden, satış Excel raporlarından ve finansal tablolardan gelen verileri:
- Yapılandırır (extract & normalize)
- Zenginleştirir (LLM destekli alan doldurma + yorumlama)
- KPI & performans analizlerine dönüştürür
- Kampanya – satış ilgisi kesişimini çıkarır
- Tek konsolide Final Rapor üretir (JSON + Markdown)
| Katman | Modüller | Sorumluluk |
|---|---|---|
| Extraction | extractor/ (pdf_reader, sections, normalize, llm_fill, campaigns, notlar_parser) |
PDF + içerik ayrıştırma, LLM ile alan tamamlama |
| Analysis | analyzer/ (sales_performance, financial_analysis) |
Satış kırılımı ve finansal metrik üretimi |
| KPI Builder | runners/runner_monthly.py |
Ziyaret bazlı KPI + kampanya JSON & MD üretimi |
| Bridge | bridge/sales_visit_bridge.py |
Ürün ilgisi – kampanya eşleşmesine hazırlık |
| Final Assembly | bridge/final_assembler.py |
Satış+Finans + KPI + Bridge analizini konsolide etme |
| Orkestrasyon | pipeline_workflow.py |
Uçtan uca aylık pipeline (4 adım) |
| Utilities | utils/company_name_utils.py |
Şirket adı kanonik normalizasyonu |
sales_performance.py→datasforfinalblock/LLM_Input_Satis_Analizi.json(temel satış + malzeme analizi)financial_analysis.py→ Aynı dosyayı açar ve finansal blokları ekler (üzerine yazmaz, zenginleştirir)runner_monthly.py→Reports/Monthly/{COMPANY}/{MM-Ay}/NormVision_KPI_*.json+.mdfinal_assembler.py→ Satış+Finans JSON + ilgili KPI JSON’u bulur, ürün ilgisi ↔ kampanya kesişimi (Bridge), final birleşik rapor JSON'u oluşturur.
datasforfinalblock/
LLM_Input_Satis_Analizi.json # Zenginleştirilmiş satış + finans
FAKE COMPANY/
Final_Report_YYYYMMDD_HHMMSS.json # Final rapor(lar)
*.xlsx # Kaynak veri Excel’leri
Reports/Monthly/
FAKE_COMPANY/
07-Temmuz/
NormVision_KPI_*.json
NormVision_Aylik_Rapor_*.md
ENV ile konumlar:
REPORTS_BASE=...\NormHoldingDynamicSummarizer\Reports\Monthly
DATAS_BASE=...\datasforfinalblock
utils/company_name_utils.py:
- Türkçe karakter → ASCII (Ş→S, Ö→O, Ğ→G, Ü→U, Ç→C, ı→i)
- NFKD + diakritik temizleme
- Klasör için: Nokta (.) ve tire (-) korunur, boşluk →
_ - Dosya için (isteğe bağlı varyant):
.ve-da_ - Fazla ayıraçlar daraltılır, uzunluk sınırı uygulanır
Örnekler:
| Orijinal | Klasör | Dosya-uyumlu |
|---|---|---|
FAKE_COMPANY |
FAKE_COMPANY |
FAKE_COMPANY |
| Adım | Script | Çıktı | Kritik Noktalar |
|---|---|---|---|
| 1 | runner_monthly.py |
KPI JSON + Markdown | PDF çözümleme, kampanya listesi |
| 2 | analyzer/sales_performance.py |
Satış+malzeme analizi JSON & Excel | Malzeme bazlı grupla |
| 3 | analyzer/financial_analysis.py |
JSON enrich | Ortalama tahsilat, risk, limit uyumu |
| 4 | bridge/final_assembler.py |
Final birleşik rapor | Şirket adı + ay bazlı eşleşme |
pipeline_workflow.py hepsini orkestre eder (subprocess, UTF-8 ortam, zaman ölçümü, sonuç tablosu).
- Windows
charmaphatalarına karşı tüm subprocess çağrılarındaPYTHONIOENCODING=utf-8 - Dosya yazımı:
encoding='utf-8' - JSON çıktıları:
ensure_ascii=False - Problemli emoji / non-BMP karakterler kaldırıldı
| Alan | Açıklama |
|---|---|
payment_compliance_rate |
Vade uyumu (%) |
avg_collection_period |
Tahsilat gün ortalaması |
credit_limit_compliance |
Limit aşımı durumu |
risk_assessment |
Basit segment yorumu |
recommendations |
Ödeme/limit önerileri |
Kaynaklar:
malzeme_analizi→ İlgilenilen / sipariş edilen ürün gruplarısunulan_urunler_ve_kampanyalar→ Kampanya ürünleri
Çıktı örneği:
"bridge_analizi": {
"ilgilenilen_urun_gruplari": [...],
"sunulan_urun_gruplari": [...],
"teklif_verilen_urun_gruplari": [...],
"analiz_tarihi": "YYYY-MM-DD HH:MM:SS",
"analiz_durumu": "Başarılı|Başarısız"
}
Repository’de tutulmayanlar:
Reports/datasforfinalblock/crmyapayzekamodlrnekdataset/- Final raporlar (
Final_Report_*.json) - Hassas dokümantasyon (
COMPANY_FILE_STRUCTURE.md,README_New_Architecture.md) - Batch log ve geçici pipeline dosyaları
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
copy .env.example .env
# .env içine API anahtarlarını ve base path'leri girMinimum .env:
GEMINI_API_KEY=YOUR_KEY
REPORTS_BASE=...\\NormHoldingDynamicSummarizer\\Reports\\Monthly
DATAS_BASE=...\\datasforfinalblock
python pipeline_workflow.py --month 7 --year 2025python runners/runner_monthly.py --month 7 --year 2025 --input-dir "crmyapayzekamodlrnekdataset/pdfs" --llm
python -m analyzer.sales_performance
python -m analyzer.financial_analysis
python -m bridge.final_assembler --month 7| Başlık | Durum | Not |
|---|---|---|
| Fuzzy KPI klasör eşleşmesi | Plan | Levenshtein / rapidfuzz |
| Çoklu müşteri batch pipeline | Plan | Company list ingestion |
| Markdown → HTML/Email | Plan | Jinja2 templating |
| Zamanlanmış otomasyon | Plan | Task Scheduler / cron |
| Web dashboard | Plan | FastAPI + Vue/React |
| Lokal LLM fallback | Plan | Embedding veya rule-based |
| Belirti | Çözüm |
|---|---|
| KPI klasörü bulunamadı | normalize_company_name() çıktısını logla, folder ile kıyasla |
Unicode charmap hatası |
Ortama PYTHONUTF8=1 ekleyin, UTF-8 print kullanın |
JSON’da \u0131 kaçışları |
ensure_ascii=False ile yeniden yazın |
| Bridge boş dönüyor | KPI kampanya listesi veya malzeme_analizi eksik |
{
"musteri_adi": "FAKE_COMPANY",
"malzeme_analizi": {"...": "..."},
"finansal_analiz": {
"odeme_uyum_orani": "94.67%",
"ortalama_tahsilat_suresi": "73.55 gün",
"kredi_limit_uyumu": "EVET"
},
"kpi_analizi": {"toplam_ziyaret": 6},
"bridge_analizi": {"analiz_durumu": "Başarılı"},
"final_report_metadata": {"rapor_versiyonu": "1.0"}
}Kurumsal / Proprietary – Norm Holding iç kullanım için.
İç geliştirme ekibi: Bilgi Teknolojileri / Veri & Analitik Birimi.
Bu doküman otomatik güncellenmeye uygundur; mimari değişikliklerinde lütfen senkron tutun.