Odoo + Power BI: Complete Analytics Integration Guide

Connect Odoo 19 to Power BI for enterprise analytics. Covers DirectQuery, Import mode, data modeling, DAX measures, live dashboards, and deployment architecture.

E
ECOSIRE Research and Development Team
|19 Mart 20269 dk okuma2.0k Kelime|

Data Analytics & BI serimizin bir parçası

Tam kılavuzu okuyun

Odoo + Power BI: Eksiksiz Analitik Entegrasyon Kılavuzu

Odoo 19 Enterprise sağlam yerleşik raporlama içerir ancak self servis analitiği, sistemler arası veri modellemesi ve kurumsal düzeyde görselleştirmeye ihtiyaç duyan kuruluşlar için Power BI doğal bir tamamlayıcıdır. Connecting Odoo's operational data to Power BI's analytical engine unlocks insights that Odoo's native reports can't provide.

Bu kılavuz, Odoo-Power BI entegrasyonunun her yönünü kapsar: bağlantı mimarisi, en iyi veri modelleme uygulamaları, temel iş kontrol panelleri oluşturma, DAX ölçümü oluşturma, artımlı yenileme yapılandırması ve kurumsal ölçek için Microsoft Fabric'te dağıtım.

Önemli Çıkarımlar

  • Üç bağlantı yöntemi: PostgreSQL direct, Odoo REST API ve Odoo'nun dışa aktarımı yoluyla ODBC
  • DirectQuery modu gerçek zamanlı veriler sağlar; İçe aktarma modu, büyük veri kümeleri için daha iyi performans sağlar
  • Odoo'nun PostgreSQL şeması, verimli Power BI veri modelleri için denormalizasyon gerektirir
  • Artımlı yenileme, büyük tablolar için yükleme süresini azaltır (account.move,stock.move)
  • Power BI'daki Satır Düzeyinde Güvenlik, Odoo'nun şirket düzeyindeki erişim kontrolünü yansıtır
  • Şirket içi Odoo için ağ geçidi dağıtımı gereklidir; bulut Odoo doğrudan bağlanır
  • Microsoft Fabric (Power BI Premium), kurumsal göl evinde Odoo verilerinin kullanılmasına olanak sağlar
  • Temel ölçümler: gelir, brüt kar marjı, stok devir hızı, alacakların yaşlandırılması, OEE

Entegrasyon Mimarisi Seçenekleri

Odoo dağıtım ve raporlama ihtiyaçlarınıza göre doğru bağlantı mimarisini seçin.

Seçenek 1: Doğrudan PostgreSQL Bağlantısı (Önerilen)

PostgreSQL bağlayıcısını kullanarak Power BI'ı doğrudan Odoo'nun PostgreSQL veritabanına bağlayın:

Artıları:

  • Tüm Odoo tablolarına ve ham verilere tam erişim
  • Karmaşık birleştirmeler için en iyi performans
  • Hem İçe Aktarma hem de DirectQuery modlarını destekler

Eksileri:

  • Power BI Ağ Geçidi'nden PostgreSQL'e ağ erişimi gerektirir
  • Odoo'nun veri modelindeki değişiklikler Power BI sorgularının güncellenmesini gerektirir
  • Doğrudan veritabanı erişimi, Odoo'nun erişim kontrolünü atlar

Seçenek 2: Odoo REST API

Odoo'nun REST API'sini kullanarak Power BI'ın Web bağlayıcısı aracılığıyla bağlanın:

Artıları:

  • PostgreSQL'e ağ erişimi olmadan çalışır
  • Odoo'nun kullanıcı başına erişim haklarına saygı duyar
  • Veritabanı kimlik bilgilerine gerek yok

Eksileri:

  • Doğrudan PostgreSQL'den daha yavaştır (tablo başına bir API çağrısı)
  • Hız sınırlaması büyük veri çekimlerini etkiler
  • Büyük veri kümeleri için verimli bir şekilde sayfalandırmanın zor olması

Seçenek 3: Veri Ambarına Aktarma

ETL Odoo verilerini özel bir veri ambarına (Azure Synapse, Snowflake, BigQuery):

Artıları:

  • Geniş ölçekte maksimum performans
  • BI'yı ERP'den ayırır
  • Birden fazla kaynak sistemini entegre edebilir

Eksileri:

  • En yüksek altyapı maliyeti ve karmaşıklığı
  • Veri gecikmesi ETL planına bağlıdır (genellikle 1 saatten 24 saate kadar)
  • ETL boru hattı bakımı gerektirir

Çoğu kuruluş için önerilen mimari: Power BI Ağ Geçidi (şirket içi) veya doğrudan bağlantı (bulut Odoo) ile Doğrudan PostgreSQL, artımlı yenileme ile içe aktarma modu, 1-4 saatte bir planlanmış yenileme.


PostgreSQL Bağlantısını Kurma

1. Adım: Ağ erişimi

Şirket içi Odoo için:

  1. Şirket İçi Veri Ağ Geçidini PostgreSQL'e ağ erişimi olan bir sunucuya yükleyin
  2. Ağ geçidini Microsoft 365 kimlik bilgilerinizle yapılandırın
  3. Ağ geçidi sunucusundan Odoo DB sunucusuna PostgreSQL bağlantı noktasını (5432 veya 5433) açın

Bulut Odoo için (AWS, Azure, GCP):

  • Güvenlik grubunu/güvenlik duvarını Power BI'ın IP aralıklarından gelen girişlere izin verecek şekilde yapılandırın
  • Veya: aynı VPC'deki bir bulut sanal makinesinde şirket içi ağ geçidini kullanın

2. Adım: Salt okunur bir veritabanı kullanıcısı oluşturun

Power BI'ı asla ana Odoo veritabanı kullanıcınıza bağlamayın. Özel bir salt okunur kullanıcı oluşturun:

-- Create read-only user for Power BI
CREATE USER powerbi_reader WITH PASSWORD 'strong_password_here';

-- Grant connection to database
GRANT CONNECT ON DATABASE your_odoo_db TO powerbi_reader;

-- Grant schema usage
GRANT USAGE ON SCHEMA public TO powerbi_reader;

-- Grant SELECT on all current and future tables
GRANT SELECT ON ALL TABLES IN SCHEMA public TO powerbi_reader;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT SELECT ON TABLES TO powerbi_reader;

3. Adım: Power BI Desktop'ta yapılandırın

  1. Power BI Desktop'ı açın → Veri Al → PostgreSQL Veritabanı
  2. Girin:
  • Sunucu: PostgreSQL sunucunuz (ve 5432 değilse bağlantı noktası)
  • Veritabanı: Odoo veritabanı adınız
  • Kullanıcı adı: powerbi_reader
  • Şifre: salt okunur kullanıcı şifresi
  1. Bağlantı modunu seçin: İçe Aktar (önerilir) veya DirectQuery

Power BI için Önemli Odoo Tabloları

Odoo'nun PostgreSQL şemasını anlamak, doğru veri modelleri oluşturmak için çok önemlidir.

Finansal tablolar:

TabloAçıklamaAnahtar Alanlar
KOD0Faturalar, faturalar, yevmiye kayıtlarıtaşıma_türü, eyalet, fatura_tarihi, miktar_toplam, para_nodu
KOD0Günlük girişlerindeki satır öğelerimove_id, account_id, borç, kredi, miktar, fiyat_alttoplam
KOD0Hesap planıkod, ad, hesap_türü
KOD0Müşteri/satıcı ödemeleritutar, ödeme_tarihi, eyalet, partner_id

Satış tabloları:

TabloAçıklamaAnahtar Alanlar
KOD0Satış siparişleriad, eyalet, tarih_sipariş, miktar_toplam, iş ortağı_kimliği, kullanıcı_kimliği
KOD0Satış siparişi satırlarısipariş_kimliği, ürün_kimliği, ürün_uom_adet, fiyat_alttoplam
KOD0CRM fırsatlarıad, aşama_kimliği, beklenen_gelir, olasılık, kullanıcı_kimliği

Envanter tabloları:

TabloAçıklamaAnahtar Alanlar
KOD0Mevcut envanter seviyeleriürün_kimliği, konum_kimliği, miktar
KOD0Tüm stok hareketleriürün_kimliği, durum, tarih, miktar_done
KOD0Teslimat/makbuz belgeleritoplama_tipi_kimliği, durum, planlanan_tarih
KOD0Ürün ana verileriad, liste_fiyatı, kategori_kimliği, tür

İK ve Bordro:

TabloAçıklamaAnahtar Alanlar
KOD0Çalışanlaradı, departman_kimliği, iş_kimliği, şirket_kimliği
KOD0Zaman ve katılımçalışan_kimliği, check_in, check_out
KOD0Maaş bordrolarıçalışan_kimliği, başlangıç ​​tarihi, bitiş tarihi, eyalet

Power BI Veri Modeli Tasarımı

Odoo verileri için yıldız şeması tasarımı:

Optimum Power BI performansı için Odoo'nun normalleştirilmiş şemasını yıldız şemasına dönüştürün:

[Date Table] (dimension)
     ↓
[Sales Fact Table]
     ↓
[Product Dimension] ← [Product Category Dimension]
     ↓
[Customer Dimension] ← [Country Dimension]
     ↓
[Salesperson Dimension]
     ↓
[Company Dimension]

Power Query M kodu — Satış Bilgi Tablosu:

let
    Source = PostgreSQL.Database("your-odoo-server:5433", "your_db"),
    SaleOrderLine = Source{[Schema="public", Item="sale_order_line"]}[Data],
    SaleOrder = Source{[Schema="public", Item="sale_order"]}[Data],
    ProductTemplate = Source{[Schema="public", Item="product_template"]}[Data],
    ProductProduct = Source{[Schema="public", Item="product_product"]}[Data],

    // Join order lines with orders
    JoinWithOrder = Table.NestedJoin(
        SaleOrderLine, {"order_id"},
        SaleOrder, {"id"},
        "Order", JoinKind.Inner
    ),

    // Expand order columns needed
    ExpandOrder = Table.ExpandTableColumn(
        JoinWithOrder, "Order",
        {"name", "state", "date_order", "partner_id", "user_id", "company_id"},
        {"order_name", "order_state", "date_order", "partner_id", "user_id", "company_id"}
    ),

    // Filter: confirmed and done orders only
    FilterState = Table.SelectRows(
        ExpandOrder,
        each [order_state] = "sale" or [order_state] = "done"
    ),

    // Select and rename final columns
    SelectColumns = Table.SelectColumns(FilterState, {
        "id", "order_id", "product_id", "date_order", "partner_id",
        "user_id", "company_id", "product_uom_qty", "price_unit",
        "price_subtotal", "price_tax", "price_total"
    }),

    // Change types
    ChangedTypes = Table.TransformColumnTypes(SelectColumns, {
        {"date_order", type datetime},
        {"price_subtotal", type number},
        {"product_uom_qty", type number}
    })
in
    ChangedTypes

Temel DAX Önlemleri

Gelir ve marj:

// Total Revenue (Net)
Revenue = SUMX(SalesFact, SalesFact[price_subtotal])

// Revenue MTD
Revenue MTD =
CALCULATE([Revenue], DATESMTD(DateTable[Date]))

// Revenue YTD
Revenue YTD =
CALCULATE([Revenue], DATESYTD(DateTable[Date]))

// Revenue vs Prior Period
Revenue vs PY =
VAR CurrentRevenue = [Revenue]
VAR PriorYearRevenue =
    CALCULATE([Revenue], SAMEPERIODLASTYEAR(DateTable[Date]))
RETURN
DIVIDE(CurrentRevenue - PriorYearRevenue, PriorYearRevenue, 0)

// Gross Margin
Gross Margin =
SUMX(SalesFact,
    SalesFact[price_subtotal] -
    (RELATED(ProductDim[standard_price]) * SalesFact[product_uom_qty])
)

// Gross Margin %
Gross Margin % =
DIVIDE([Gross Margin], [Revenue], 0)

Envanter önlemleri:

// Current Stock Value
Stock Value =
SUMX(
    StockQuant,
    StockQuant[quantity] * RELATED(ProductDim[standard_price])
)

// Inventory Turnover (annualized)
Inventory Turnover =
DIVIDE(
    [COGS Annualized],
    [Average Inventory Value],
    0
)

// Days of Inventory Outstanding
DIO =
DIVIDE(365, [Inventory Turnover], 0)

// Stockout % (products with zero stock)
Stockout Rate =
DIVIDE(
    COUNTROWS(FILTER(StockQuant, StockQuant[quantity] <= 0)),
    COUNTROWS(StockQuant),
    0
)

Alacakların yaşlandırması:

// Current (0-30 days)
AR Current =
CALCULATE(
    SUM(ARFact[amount_residual]),
    ARFact[days_overdue] <= 0
)

// 1-30 days overdue
AR 1-30 Days =
CALCULATE(
    SUM(ARFact[amount_residual]),
    ARFact[days_overdue] >= 1 && ARFact[days_overdue] <= 30
)

// Days Sales Outstanding
DSO =
DIVIDE(
    SUM(ARFact[amount_residual]),
    [Revenue] / 365,
    0
)

Anahtar Kontrol Paneli Sayfaları

1. Yönetici Kontrol Paneli

  • Gelir ve bütçe (gösterge grafiği)
  • Gelir eğilimi (çizgi grafik, 13 aylık hareketli)
  • Brüt kar marjı %'si (trendli KPI kartı)
  • Gelire göre ilk 10 müşteri (çubuk grafik)
  • Gelire göre ilk 10 ürün (yatay çubuk)
  • Bölgeye göre gelir (doldurulmuş harita)

2. Satış Hattı (CRM)

  • Aşamaya göre ardışık düzen (huni grafiği)
  • Ağırlıklı ardışık düzen değeri (KPI)
  • Kazanma/kaybetme oranı (halka grafiği)
  • Ortalama anlaşma büyüklüğü eğilimi
  • Satış temsilcisi performansı (matris tablosu)
  • Tahmin ve gerçek (çizgi + çubuk kombinasyonu)

3. Finansal Genel Bakış

  • Kâr ve Zarar özeti (YTD, YoY ile tablo)
  • Nakit pozisyonu (KPI)
  • Alacakların yaşlandırılması (yığılmış çubuk)
  • Borçların yaşlandırılması (yığılmış çubuk)
  • DSO trendi (çizgi grafik)

4. Envanter Kontrol Paneli

  • Kategoriye göre hisse senedi değeri (ağaç haritası)
  • Depoya göre stok devir hızı (çubuk)
  • Yavaş hareket eden envanter (tablo: stok > 90 gün)
  • Stok yokluğu riski kalemleri (tablo: gün kapsamı < 7)
  • Yeniden sıralama noktası uyarıları (kartlar)

5. İK Kontrol Paneli

  • Bölüme göre personel sayısı (çubuk)
  • Katılım ve planlanan saat (gösterge)
  • Bakiye kullanımını bırakın (matris)
  • Devir oranı eğilimi (çizgi)

Büyük Tablolar için Artımlı Yenileme

Odoo'nun account_move_line, stock_move ve mail_message tabloları milyonlarca satıra ulaşır. Artımlı yenileme, her yenilemede tam tablonun yeniden yüklenmesini önler.

Artımlı yenilemeyi yapılandırın:

  1. Power Query'de RangeStart ve RangeEnd parametrelerini ekleyin (DateTime türü)
  2. Tarih sütununuzu filtreleyin: Table.SelectRows(Source, each [write_date] >= RangeStart and [write_date] < RangeEnd)
  3. Alanlar bölmesinde tabloya sağ tıklayın → Artımlı Yenileme
  4. Ayarlayın: son 12 ayda saklayın, son 3 günde yenileyin

Artımlı yenilemeden en çok yararlanan Odoo tabloları:

  • account_move_line: date'ye göre filtrele
  • stock_move: date'ye göre filtrele
  • sale_order: date_order'e göre filtrele
  • mail_message: date'e göre filtrele

Satır Düzeyinde Güvenlik

Odoo'nun şirket düzeyindeki erişim kontrolünü yansıtmak için Power BI'da Satır Düzeyinde Güvenlik (RLS) uygulayın.

// RLS filter: user sees only their assigned companies
[company_id] IN
    CALCULATETABLE(
        VALUES(UserCompanyMapping[company_id]),
        UserCompanyMapping[user_email] = USERPRINCIPALNAME()
    )

E-posta adreslerini yetkili şirket kimlikleriyle eşleyen bir UserCompanyMapping tablosu oluşturun (Power BI'da tutulur veya Odoo'dan senkronize edilir).


Sıkça Sorulan Sorular

Gerçek zamanlı veriler için DirectQuery'yi Odoo'nun PostgreSQL veritabanıyla kullanabilir miyim?

Evet, ancak uyarılarla. Odoo'nun PostgreSQL'indeki DirectQuery, basit sorgulara sahip kontrol panelleri için uygundur. Her görsel, üretim veritabanınıza karşı yeni SQL sorgularını tetiklediğinden, birçok ölçüm içeren karmaşık kontrol panelleri yavaş olacaktır. Çoğu kullanım durumunda, 1 saatlik yenilemeli İçe Aktarma modu, tazelik ve performans arasında daha iyi bir denge sağlar.

Odoo'nun çoklu para birimi verilerini Power BI'da nasıl işleyebilirim?

Odoo, tutarları hem işlem para biriminde hem de şirket para biriminde saklar. Orijinal para birimi için KOD0 alanını ve şirketin para birimi eşdeğeri için KOD1/KOD2 (veya KOD3) alanını kullanın. Power BI'da grup düzeyinde birleştirme için Odoo'nun şirket para birimi tutarlarını kullanın ve tutarlı raporlama için ayrı bir para birimi dönüştürme boyutu tablosu uygulayın.

Power BI yenilendiğinde Odoo'nun PostgreSQL veritabanı üzerindeki performans etkisi nedir?

Tam Power BI veri kümesi yenilemesi, PostgreSQL'de aynı anda birden çok analitik sorguyu çalıştırır. Büyük Odoo veritabanları için (>50 GB), yenileme penceresi sırasında bu durum önemli miktarda G/Ç ve CPU tüketebilir. En iyi uygulamalar: yenilemeleri yoğun olmayan saatlerde (ör. 02:00-4:00) zamanlayın, Power BI sorguları için PostgreSQL'in okuma kopyasını kullanın ve sorgu kapsamını en aza indirmek için artımlı yenileme uygulayın.

Power BI'ı PostgreSQL aracılığıyla Odoo Topluluğu'na (ücretsiz sürüm) bağlayabilir miyim?

Evet. Power BI, hangi uygulamanın yönettiğine bakılmaksızın herhangi bir PostgreSQL veritabanına bağlanır. Odoo Topluluğu'nun PostgreSQL şeması Enterprise ile neredeyse aynıdır (bazı yalnızca Enterprise tabloları hariç). Bağlantı yöntemi aynıdır; salt okunur veritabanı kullanıcısının Topluluk veritabanına erişebildiğinden emin olun.

Odoo yeni bir sürüme yükseltildiğinde Power BI veri modelimi nasıl senkronize halde tutabilirim?

Odoo sürüm yükseltmeleri, özellikle önemli ölçüde yeniden düzenleme yapılan modüller için veritabanı tablolarını yeniden adlandırabilir veya yeniden yapılandırabilir. Herhangi bir Odoo yükseltmesinden sonra: eski ve yeni sürümler arasında tablo şemalarının karşılaştırmasını çalıştırın, Power Query sorgularını yeniden adlandırılan sütunlara başvuracak şekilde güncelleyin ve tüm DAX ölçümlerini yeni şemaya göre doğrulayın. Geçiş runbook'unuzda bir şema değişikliği kontrolü oluşturun.


Sonraki Adımlar

Üretim düzeyinde bir Odoo + Power BI entegrasyonu oluşturmak, veri modelleme uzmanlığı, PostgreSQL bilgisi ve Odoo şemasının derinlemesine anlaşılmasını gerektirir. Doğru yapıldığında, liderlik ekibinizin karar verme şeklini dönüştüren birleşik bir analiz platformu sunar.

ECOSIRE, veritabanı mimarisi ve veri modellemeden kontrol paneli tasarımı, DAX geliştirme ve dağıtımına kadar uçtan uca Odoo + Power BI analiz çözümleri sunar. Ekibimiz Odoo uzmanlığı ile Power BI uzmanlığı arasında köprü kuruyor.

Odoo Analytics Entegrasyonunuz Hakkında ECOSIRE ile Konuşun →

ECOSIRE'ın Power BI Hizmetlerini keşfedin →

Raporlama gereksinimlerinizi paylaşın, biz de liderlik ekibinize Odoo operasyonlarınızın her boyutunda gerçek zamanlı görünürlük sağlayan bir Power BI mimarisi tasarlayalım.

E

Yazan

ECOSIRE Research and Development Team

ECOSIRE'da kurumsal düzeyde dijital ürünler geliştiriyor. Odoo entegrasyonları, e-ticaret otomasyonu ve yapay zeka destekli iş çözümleri hakkında içgörüler paylaşıyor.

WhatsApp'ta Sohbet Et