Ana içeriğe geç

Regüle Tarifeler — Superadmin Operatör Kılavuzu

Mahsuplaşma tutar hesabında PTF (piyasa takas fiyatı) değil, EPDK (Enerji Piyasası Düzenleme Kurumu) tarafından her fatura dönemi için belirlenen faaliyet bazlı regüle tarife fiyatı kullanılır (Md.4-l). Bu tarifeler ulusal veridir — tüm firmalar (tenant) için aynıdır. Bu yüzden yalnızca süper yönetici girer ve düzenler; firmalar (ileride) bu veriyi yalnızca okur.

Bu sayfa iki kritik boşluğu kapatır: (1) fiyat satırının amacı (price_purpose) ne demek ve hesabın neresine girer, (2) fiyat rakamlarını EPDK'nın hangi resmî belgesinden alacaksınız. Alanların tam sözlüğü için ayrıca Alan Sözlüğü master referansına bakın.

Yönetim ekranı: /console/regulated-tariffs (Sistem Konsolu). API kök yolu: /api/v1/admin/regulated-tariffs/* (tümü require_superuser).

Bu sayfa kimin için?

Yalnızca platform süper yöneticileri içindir. Firma (tenant) kullanıcıları bu ekranı ve API'yi göremez. Regüle tarife bir izin tüketmez — konsol deseniyle superuser koruması altındadır.


Kavramlar

  • Fiyat paketi (price set) — bir tarife import paketidir (bir kaynak doküman + onay akışı). Bir fatura dönemine (billing_period) aittir.
  • Fiyat satırı (price) — pakete bağlı tekil bir fiyat kaydıdır: abone grubu × amaç × zaman dilimi × kademe boyutlarıyla anahtarlanır.

Aynı dönem için birden fazla versiyon meşrudur: bir approved + bir veya çok archived (revizyon geçmişi). Hesap motoru o dönem için en son approved paketi kullanır (billing_period eşleşen, approval_status='approved', en son approved_at).


Tarife amacı (price_purpose) — 9 kalem, hangisi hesaba girer

price_purpose, bir fiyat satırının hangi tarife kalemi olduğunu söyler. Mahsuplaşma hesap motoru bir tutar hesaplarken hangi fiyatı arayacağını bu alana göre seçer — yani bu alan yanlışsa, doğru rakamı girmiş olsanız bile motor onu bulamaz ve satır ya hiç yazılmaz ya da uyarıyla geçer. Bu yüzden her fiyatın amacını doğru işaretlemek kritiktir.

9 değer vardır (EPDK 04.04.2026 tarife matrisiyle birlikte güç ve reaktif kalemleri eklendi). Dördü hesaba fiilen girer, beşi şu an yalnız kayıt/gelecek kullanım içindir (whitelist'te tanımlıdır, sistemde saklanır ama mevcut hesap motoru tüketmez):

Teknik değerDüz-TürkçeHesaba girer mi?Hangi hesapta / ne zaman bunu seç
mahsuplasma_related_tariffMahsuplaşmayla ilişkili (ana) tarifeAna girdiMahsuplaşmanın çekirdek fiyatı (Md.11). Tedarikçiye ödenecek eşleşen (matched) tüketim tutarında, üreticinin bedelli ihtiyaç fazlasında (28/11 tüm-mesken ve 28/12 aynı kademeli grup dalları) ve mesken aylık tutarında kullanılır. Her dönem için bu kalemi mutlaka girin.
mahsuplasma_lowest_related_tariffEn düşük ilişkili tarife✅ EvetYalnızca karışık/diğer tüketici dalı (Yönetmelik 28/13) için: üreticinin bedelli ihtiyaç fazlası en düşük ilişkili tarifeden hesaplanır. Grup üyeleri farklı abone gruplarından oluşuyorsa (karışık) bu kalem gereklidir; yoksa 28/13 dalı fiyatı bulamaz ve uyarı üretir.
sktt_active_energySKTT aktif enerji✅ EvetSon Kaynak Tedarik Tarifesi (SKTT) kapsamındaki bir tüketim tesisinin eşleşen tüketim kısmı bu fiyattan hesaplanır (Md.12). Grupta SKTT statüsü işaretli tüketim tesisi varsa girin.
system_usageSistem kullanım bedeli (SKB)✅ EvetSistem kullanım bedeli tahmini için. SKB, "en düşük tarifeden satış" değildir; ayrı bir dağıtım/iletim kullanım kalemidir. SKB tutarının fiyat tabanı ÜRETİCİ lisanssız-üretici grubudur (lisanssiz_uretici_1/lisanssiz_uretici_2 — Md.4-l veriş yönlü dağıtım bedeli), tüketici abone grubu değil. Bu yüzden EPDK tablosundaki Lisanssız Üretici 1/2 — veriş yönlü dağıtım bedeli satırlarını system_usage + abone_grubu = lisanssiz_uretici_1/2 olarak mutlaka girin (bkz. Abone grupları). Portföyünüze uygun LÜ grubu için system_usage eksikse dönem taraması (mahsuplasma_tariff_missing sistem alarmı) eksik olarak raporlar — SKB satırı fiyatsız (yalnız miktar) kalır.
customer_bill_active_energyMüşteri fatura aktif enerjisi⚪ Hayır (bilgi/gelecek)Müşteri faturasındaki aktif enerji fiyatını referans olarak saklamak isterseniz. Mevcut hesap motoru tüketmez; ileride tasarruf/karşılaştırma KPI'ları için ayrılmıştır.
distributionDağıtım bedeli⚪ Hayır (bilgi/gelecek)Dağıtım bedeli kalemini ayrı saklamak isterseniz. Şu an hesaba girmez (SKB system_usage üzerinden yürür); dokümantasyon/şeffaflık için tutulur.
capacityGüç bedeli (kr/kW/ay)⚪ Hayır (kayıt/gelecek)EPDK tablosundaki Güç Bedeli kolonu (kuruş/kW/ay). Birimi mutlaka kurus_per_kw_month girin (bkz. amaç ↔ birim eşlemesi). Güç aşım bedelini ayrıca girmeyin — EPDK kuralı gereği aşım = 2 × güç bedelidir ve gerektiğinde sistemce türetilir; ayrı bir amaç/satır olarak saklanmaz. Mevcut hesap motoru henüz tüketmez; depoya kayıpsız girsin diye eklendi.
reactiveReaktif enerji bedeli (kr/kVArh)⚪ Hayır (kayıt/gelecek)EPDK tablosundaki Reaktif kolonu (kuruş/kVArh). Birimi mutlaka kurus_per_kvarh girin. Mevcut hesap motoru henüz tüketmez; depoya kayıpsız girsin diye eklendi.
otherDiğer⚪ Hayır (bilgi)Yukarıdakilerin dışında kalan, yalnız kayıt amaçlı bir kalem. Hesaba girmez.
Emin değilseniz

Bir EPDK kaleminin hangi price_purpose'a düştüğünden emin değilseniz: mahsuplaşma tutarını doğrudan etkileyen dört kalem mahsuplasma_related_tariff, mahsuplasma_lowest_related_tariff, sktt_active_energy, system_usage'dır. En azından mahsuplasma_related_tariff (abone grubu başına) dolu olmalıdır — bu olmadan o dönem için uygunluk kuralı R00T bloklayıcı FAIL verir (bkz. Uygunluk Kuralları) ve gruplar "bedelsiz riskiyle" simüle edilir.

price_purpose alanının 5 sorusu:

  1. Ne? Fiyat satırının hangi tarife kalemi olduğu (yukarıdaki 9 değerden biri).
  2. Zorunlu mu? Evet — her fiyat satırında zorunludur (CSV/XLSX'te de zorunlu başlık).
  3. Ne yazacağım? EPDK tablosundaki kaleme karşılık gelen teknik değeri (küçük harf, alt çizgili). Türkçe etiket yazmayın; teknik değeri yazın.
  4. Nereden bulunur? EPDK'nın yayımladığı tarife tablosundaki kalem adından eşleştirin (aşağıdaki "EPDK fiyat rakamlarını nereden alırım?" bölümü). Tam enum sözlüğü: Alan Sözlüğü — Tarife amacı.
  5. Boş/yanlış olursa? Whitelist dışı bir değer → import 422 ile reddedilir (atomik: hiçbiri yazılmaz). Whitelist içi ama yanlış kalem seçerseniz satır yazılır fakat hesap motoru doğru fiyatı bulamaz; ilgili tutar satırı hiç üretilmez veya uyarı ("fiyat çözülemedi") ile geçer.

Abone grupları — tesisteki 6 grup + tarifeye özel 2 üretici grubu

Tarife satırındaki abone_grubu alanı, tesis formundaki abone grubu listesinden daha geniştir. Tesis (resmî tesis) formunda 6 grup vardır ve değişmedi: mesken, ticarethane, sanayi, tarimsal_sulama, aydinlatma, other. Tarife satırlarında bunlara ek iki üretici grubu kullanılabilir:

Teknik değerDüz-TürkçeNerede geçerli?Ne için
lisanssiz_uretici_1Lisanssız Üretici 1 (LÜ1)Yalnız tarife satırıEPDK tablosundaki veriş yönlü dağıtım bedeli (üreticinin şebekeye verdiği enerji için ödediği dağıtım bedeli). 5346 sayılı Kanun'a ekli I Sayılı Cetvel'in (e) bendi kapsamında OLMAYAN lisanssız üreticiler bu gruba girer.
lisanssiz_uretici_2Lisanssız Üretici 2 (LÜ2)Yalnız tarife satırıAynı veriş yönlü dağıtım bedeli; 5346 sayılı Kanun'a ekli I Sayılı Cetvel'in (e) bendi kapsamındaki lisanssız üreticiler bu gruba girer.

Bu kalemleri price_purpose = system_usage (veriş yönlü dağıtım bedeli bir SKB kalemidir) + abone_grubu = lisanssiz_uretici_1/2 kombinasyonuyla girin — Md.4-l kapsamındaki EPDK tablosunda "Lisanssız Üretici 1/2" satırı olarak görünür.

Üretici grupları tesisin ABONE GRUBU listesine ATANMAZ

lisanssiz_uretici_1/2 abone grubu (abone_grubu) değeri değildir: tesis formundaki abone grubu listesinde görünmez ve tesisin abone grubu olarak seçilemez. Tesisin abone grubu şeması 6 grupla kalır; üretici grupları EPDK veriş yönlü dağıtım bedeli fiyat satırının özelliğidir.

Bu fiyatlar artık SKB tutarına GİRİYOR (yeni davranış)

Önceden bu satırlar yalnızca kayıpsız saklanıyordu. Artık hesap motoru SKB (sistem kullanım bedeli) tutarını doğrudan bu LÜ1/LÜ2 system_usage fiyatlarından çözer — üretim tesisinin veriş yönlü dağıtım bedeli üzerinden (Md.4-l). Eskiden SKB, tüketicinin abone grubu fiyatından yaklaşık çözülüyordu; bu yaklaştırma kaldırıldı. Bir üretim tesisinin hangi LÜ grubuna düştüğü, tesis formundaki "Üretici tarife grubu" (producer_tariff_group) alanı ve tesisin kaynak türü (source_type) ile belirlenir (Hesap Çekirdeği — SKB fiyat tabanı). Bu yüzden her dönem için LÜ1 ve/veya LÜ2 system_usage satırını girmek kritiktir — girilmezse SKB satırı fiyatsız (yalnız miktar) kalır.


EPDK fiyat rakamlarını nereden alırım?

Regüle tarife fiyatları Zeus dışı resmî bir kaynaktan gelir: bunları platform üretmez, siz EPDK'nın yayımladığı dönemsel tarife tablosundan elle girer/import edersiniz.

Kaynak belge: EPDK (Enerji Piyasası Düzenleme Kurumu), elektrik tarifelerini dönemsel Kurul Kararı ve tarife tabloları ile yayımlar (faaliyet bazlı: perakende satış / dağıtım / iletim / son kaynak tedarik vb.). Fiyat rakamlarını o dönem için geçerli resmî tablodan alın ve hangi belgeden aldığınızı kayıt altına alın:

  • Paket düzeyinde: source_doc alanına belgenin adını/numarasını yazın (ör. paket oluştururken "source_doc": "EPDK 2026-07 tarife tablosu"). İsteğe bağlı source_doc_hash ile belgenin bütünlük özetini saklayabilirsiniz (provenance/denetim izi).
  • Satır düzeyinde: her fiyat satırının source_note alanına o rakamın hangi kalemden geldiğini yazın (ör. "EPDK 2026-07 dağıtım bedeli kademe 1"). Hazır şablonun örnek satırlarında bu alan doldurulmuş gelir.

EPDK kalemi → price_purpose eşleme rehberi (yönlendirme; nihai eşleme kalemin adına ve mevzuata göre operatörün kararıdır):

EPDK tablosundaki kalem (tipik)Uygun price_purpose
Mahsuplaşmaya esas perakende/aktif enerji tarifesimahsuplasma_related_tariff
Karışık gruplarda en düşük ilişkili aktif enerji tarifesimahsuplasma_lowest_related_tariff
Son Kaynak Tedarik Tarifesi (SKTT) aktif enerjisktt_active_energy
Sistem kullanım / dağıtım-iletim bedeli (SKB)system_usage
Güç bedeli (kr/kW/ay)capacity (birim: kurus_per_kw_month)
Reaktif enerji bedeli (kr/kVArh)reactive (birim: kurus_per_kvarh)
Veriş yönlü dağıtım bedeli (Lisanssız Üretici 1/2 satırı)system_usage + abone_grubu = lisanssiz_uretici_1/2
Müşteri faturasındaki aktif enerji (referans)customer_bill_active_energy
Dağıtım bedeli (ayrı kayıt)distribution

Örnek: EPDK 04.04.2026 tarife tablosunun eşlenmesi

EPDK'nın 04.04.2026 tarihli tarife matrisindeki kolonlar Zeus alanlarına şöyle düşer (AG mesken satırı üzerinden somut örnek):

EPDK 04.04.2026 kolonuprice_purposeunitNot
Dağıtım Bedeli (kr/kWh)system_usagekurus_per_kwhHesap motoru SKB tutarını bu kalemden çözer.
Güç Bedeli (kr/kW/ay)capacitykurus_per_kw_monthGüç aşım kolonu girilmez — aşım = 2 × güç bedeli, sistem türetir.
Reaktif (kr/kVArh)reactivekurus_per_kvarh
Enerji (aktif enerji) bedelimahsuplasma_related_tariffkWh birimi (ör. kurus_per_kwh)AG mesken 8 kWh/gün kademesiiki satır girin: step_no=1 (kademe 1) + step_no=2 (kademe 2); diğer alanlar aynı.
Lisanssız Üretici 1/2 — veriş yönlü dağıtım bedelisystem_usagekurus_per_kwhabone_grubu = lisanssiz_uretici_1 veya lisanssiz_uretici_2 (bkz. Abone grupları).

price (fiyat) alanının 5 sorusu:

  1. Ne? Birim enerji fiyatı (o kalem, o abone grubu, o zaman dilimi/kademe için).
  2. Zorunlu mu? Evet — her satırda zorunlu ve pozitif (> 0) olmalıdır.
  3. Ne yazacağım? EPDK tablosundaki sayıyı; en fazla 8 ondalık basamak (NUMERIC(16,8)), ondalık ayırıcı nokta (ör. 2.45120000). Binlik ayırıcı kullanmayın.
  4. Nereden bulunur? EPDK'nın o dönem için yayımladığı tarife tablosundan.
  5. Boş/yanlış olursa? Boş veya 0/negatif → satır 422 ile reddedilir (atomik). Birimi (unit) yanlış girerseniz (ör. TL/kWh yerine kuruş/kWh) sayı yazılır ama hesap 1000× hatalı çıkar — birimi mutlaka doğrulayın.
Birim (unit) tuzağı — 1000× hata riski

Fiyatın birimini doğru seçin. EPDK tabloları bazen kuruş/kWh, bazen TL/kWh (TRY_PER_KWH), bazen TL/MWh (TRY_PER_MWH) verir. unit gönderilmezse varsayılan TRY_PER_KWH kabul edilir. Rakamı kuruş cinsinden girip birimi TL/kWh bırakırsanız fiyat 100 kat; MWh rakamını kWh birimiyle girerseniz 1000 kat yanlış olur. Şablonu doldururken hem sayıyı hem unit sütununu birlikte kontrol edin.

Amaç ↔ birim zorunlu eşlemesi

Güç ve reaktif kalemleriyle birlikte iki kWh-dışı birim eklendi: kurus_per_kw_month (kuruş/kW/ay) ve kurus_per_kvarh (kuruş/kVArh). Her amaç yalnızca kendi doğasına uyan birimle anlamlıdır:

price_purposeZorunlu / uygun unit
capacity (güç bedeli)Yalnız kurus_per_kw_month
reactive (reaktif enerji bedeli)Yalnız kurus_per_kvarh
Enerji amaçları (kWh bazlı: mahsuplasma_related_tariff, mahsuplasma_lowest_related_tariff, sktt_active_energy, system_usage, customer_bill_active_energy)kWh birimlerinden biri: TRY_PER_KWH / TRY_PER_MWH / kurus_per_kwh
distribution / otherSerbest (kısıt uygulanmaz; kayıt amaçlı kalemler — pratikte kWh birimi önerilir)
Sistem bu eşlemeyi sizin yerinize DOĞRULAR

Amaç–birim uyuşmazlığı import'ta satır-numaralı hatayla reddedilir (tek satır API'de 422): örneğin capacity satırına TRY_PER_KWH yazarsanız satır yazılmaz, hata mesajı kabul edilen birimi açıkça söyler. Dikkat: unit boş bırakılırsa varsayılan TRY_PER_KWH sayılır — bu yüzden capacity/reactive satırlarında birimi açıkça yazmak zorunludur (boş bırakmak da reddedilir). distribution/other serbesttir; kısıt yalnız yukarıdaki eşlemeli amaçlara uygulanır. XLSX şablonunun "gecerli-degerler" sayfası tüm geçerli birimleri listeler.


Paket yaşam döngüsü (state-machine)

Bir tarife paketi her zaman draft doğar, onaylanınca immutable (değişmez) olur, ve gerektiğinde arşive alınır. Geçişler tek yönlüdür:

DurumAnlamıYapılabilenler
draftTaslak — hazırlanıyorMetadata düzenle, fiyat ekle / CSV-XLSX import, sil, onayla
approvedOnaylı — kullanıma hazırYalnız arşivle; fiyatlar ve metadata IMMUTABLE
archivedArşivlenmiş — geçmiş versiyonDeğiştirilemez (yalnız görüntülenir)
Onay sonrası DEĞİŞMEZLİK (immutability)

Bir paket onaylandığında (approved) hem fiyat satırları hem metadata'sı (name/source_doc/billing_period) değiştirilemez hâle gelir. Onaylı pakete fiyat eklemek/CSV-XLSX import etmek/PATCH yapmak → 409 (TARIFF_SET_APPROVED_IMMUTABLE). Bir hata varsa: onaylı paketi arşivleyip (PATCH approval_status='archived') yeni bir draft paket oluşturun. Onaylı paket silinemez (DELETE → 409 TARIFF_SET_NOT_DELETABLE) — regülasyon izidir.


Adım adım: yeni dönem tarifesi girme

  1. Paket oluştur (draft):

    POST /api/v1/admin/regulated-tariffs/price-sets
    { "name": "2026 Temmuz — EPDK Faaliyet Tarifesi", "billing_period": "2026-07-01",
    "source_doc": "EPDK-...-2026" }

    Paket her zaman draft doğar; created_by token'daki superadmin'dir.

  2. Fiyatları CSV/XLSX ile toplu import et (aşağıda) veya tek tek ekle:

    POST /api/v1/admin/regulated-tariffs/price-sets/{id}/prices
    { "abone_grubu": "mesken", "price_purpose": "mahsuplasma_related_tariff",
    "time_segment": "tek", "price": 2.85 }
  3. Paketi gözden geçir:

    GET /api/v1/admin/regulated-tariffs/price-sets/{id}/prices
  4. Onayla:

    POST /api/v1/admin/regulated-tariffs/price-sets/{id}/approve

    approved_by (token) + approved_at (sunucu UTC) set edilir; paket immutable olur.


CSV / XLSX import formatı

POST /api/v1/admin/regulated-tariffs/price-sets/{id}/import-csv    (multipart, dosya)

Endpoint CSV ve XLSX kabul eder — path adı (/import-csv) tarihseldir; format dosya uzantısından belirlenir (.csv / .xlsx).

Zorunlu başlıklar: valid_from, billing_period, abone_grubu, price_purpose, price

Opsiyonel başlıklar: valid_to, gerilim_seviyesi, tariff_code, tariff_class, time_segment, step_no, unit, source_note

KolonKural
valid_from / valid_to / billing_periodISO tarih (YYYY-MM-DD); valid_from <= valid_to
abone_grubumesken / ticarethane / sanayi / tarimsal_sulama / aydinlatma / other + tarifeye özel lisanssiz_uretici_1 / lisanssiz_uretici_2 (bkz. Abone grupları; üretici grupları tesis formunda yoktur)
price_purposemahsuplasma_related_tariff / mahsuplasma_lowest_related_tariff / sktt_active_energy / customer_bill_active_energy / system_usage / distribution / other / capacity / reactive
time_segmenttek / gunduz / puant / gece veya boş (tek-zamanlı tarifede boş)
step_noTam sayı veya boş (kademesiz tarifede boş)
pricePozitif sayı (> 0); en fazla 8 ondalık (NUMERIC(16,8)), ondalık ayırıcı nokta (2,45 gibi salt-ondalık virgül otomatik noktaya çevrilir; binlik ayraç reddedilir)
unitTRY_PER_KWH / TRY_PER_MWH / kurus_per_kwh / kurus_per_kw_month / kurus_per_kvarh; boş bırakılırsa varsayılan TRY_PER_KWH (bkz. birim tuzağı + amaç ↔ birim eşlemesi)

Örnek CSV başlık satırı:

valid_from,valid_to,billing_period,abone_grubu,price_purpose,time_segment,step_no,unit,price,source_note

Hazır şablon indirme

GET /api/v1/admin/regulated-tariffs/import-template?format=csv|xlsx

Doğru başlıklar ve 6 gerçekçi örnek satırla hazır import şablonu indirir (regule-tarife-sablon.csv / regule-tarife-sablon.xlsx). Örnekler tüm tipik kurguları kapsar: tek-zamanlı mesken enerji satırı, kademeli (step_no 1/2) dağıtım bedeli çifti, güç bedeli (capacity + kurus_per_kw_month), reaktif bedel (reactive + kurus_per_kvarh) ve veriş yönlü dağıtım bedeli (system_usage + lisanssiz_uretici_1). Örnek satırlar import doğrulamasından hatasız geçer ve doğal anahtarları birbirinden farklıdır — şablonu indirip örnekleri kendi fiyatlarınızla değiştirmeniz yeterlidir. CSV şablonu UTF-8 BOM'ludur (Excel Türkçe karakter uyumu). XLSX şablonu iki sayfadır: 1. sayfa veri (kalın başlık + örnek satırlar), 2. sayfa "gecerli-degerler"abone_grubu / price_purpose / time_segment / unit alanlarının tüm geçerli değerlerini listeleyen bilgi sayfası (import yalnız ilk sayfayı okur; bu sayfayı silmenize gerek yoktur). Konsol ekranındaki "Şablonu indir" butonları da bu endpoint'i kullanır (aşağıda).

Gerçek veriyi yüklemeden önce örnek satırları silin / değiştirin

Şablondaki 6 örnek satır gerçek EPDK verisi değildir. Kendi verinizi eklerken örnekleri silmeden bırakırsanız iki risk doğar: (1) örnek satır, gerçek EPDK kaleminizle aynı doğal anahtara (abone grubu + amaç + zaman dilimi + kademe) düşerse import satır-numaralı çakışma hatasıyla toplu (atomik) reddedilir — hiçbir satır yazılmaz; (2) çakışma olmasa bile örnek rakamlar pakete sahte fiyat olarak girer. Sistem örnek satırları tanır ve import sonrası bilgilendirici uyarı gösterir ("yüklenen satırların tamamı/bir kısmı şablon örneği"), ama uyarı import'u durdurmaz — örnekleri silmek/değiştirmek sizin sorumluluğunuzdadır.

XLSX kuralları

  • Yalnız ilk sayfa okunur; diğer sayfalar dikkate alınmaz — birden çok sayfa varsa import sonucu bilgilendirici uyarı içerir ("yalnızca ilk sayfa okundu; diğer N sayfa yok sayıldı"). Şablonun "gecerli-degerler" bilgi sayfasını silmeden yüklemek bu yüzden sorun değildir.
  • 1. satır başlık olmalıdır (CSV ile aynı başlık adları).
  • Tarih hücreleri ISO tarihe (YYYY-MM-DD) çevrilir; hücrede saat varsa atılır. Metin olarak YYYY-MM-DD yazmak da geçerlidir.
  • Tamamen boş satırlar atlanır (veri sayılmaz; satır numarası ilerler).
  • Formül değil, hesaplanmış değer okunur.
  • .xls (eski Excel) DESTEKLENMEZ → 422 CSV_IMPORT_INVALID_TYPE ("dosyayı Excel'de .xlsx olarak kaydedin" yönlendirmesiyle).
  • Bozuk/açılamayan .xlsx → 422 XLSX_IMPORT_INVALID.

İçe aktarma toleransları ve bilgilendirici uyarılar

Import, Excel'in Türkçe bölgesel ayarlarından kaynaklanan tipik biçim farklarını kendisi düzeltir ve şüpheli-ama-geçerli durumlarda import'u durdurmayan uyarılar üretir:

  • Noktalı virgül (;) toleransı: CSV'nin başlık satırı , içermiyor ama ; içeriyorsa dosya, noktalı-virgül ayraçlı kabul edilip normal okunur (Excel Türkçe bölgesel ayarı CSV'yi ; ile kaydeder). Dosyanızı bu yüzden yeniden kaydetmeniz gerekmez.
  • Ondalık virgül toleransı: price alanında 2,4512 gibi salt-ondalık virgül otomatik 2.4512'ye çevrilir. Binlik ayraç içeren karışık desenler (1.234,56, 1,234,567) düzeltilmez — satır, "binlik ayraç yasak; ondalık için nokta" hatasıyla reddedilir.
  • Satır-numaralı çakışma (duplicate) ön-kontrolü: İçe aktarmadan önce iki çakışma sınıfı taranır ve hangi satırın çakıştığı fiziksel satır numarasıyla hata listesinde raporlanır (atomik reddin parçası):
    • Dosya içi çakışma — aynı doğal anahtarlı (abone grubu + amaç + zaman dilimi + kademe) iki satır; mesajda ilk görülen satırın numarası verilir.
    • Paketteki mevcut fiyatla çakışma — satır, hedef pakette zaten var olan bir fiyatla aynı anahtara sahipse; çakışan satır şablon örneğiyle birebir aynıysa "şablonun örnek satırlarını silmemiş olabilirsiniz" ipucu eklenir.
  • Uyarı paneli (bloklamaz): İçe aktarma penceresi, import'u durdurmayan bilgilendirici uyarıları "İçe aktarma uyarıları" panelinde listeler: yüklenen satırların tamamı/bir kısmı şablon örneğiyse (kısmi durumda satır numaralarıyla), dosyada hiç veri satırı yoksa ve XLSX'te birden çok sayfa varsa. Uyarılar imported sayısını etkilemez.

Güvenlik kısıtları

KısıtDeğerAşılırsa
Dosya boyutu≤ 2 MB (CSV ve XLSX ortak)413/422 CSV_IMPORT_TOO_LARGE
Content-type / uzantı.csv + CSV content-type veya .xlsx + XLSX content-type422 CSV_IMPORT_INVALID_TYPE
.xls (eski Excel/BIFF)Desteklenmez — .xlsx olarak kaydedin422 CSV_IMPORT_INVALID_TYPE
Bozuk/açılamayan .xlsxZIP imzası yok veya dosya açılamıyor422 XLSX_IMPORT_INVALID
Satır sayısı≤ 10.000 veri satırı (XLSX'te ayrıca fiziksel tavan 20.000)422 CSV_IMPORT_TOO_MANY_ROWS
Kolon sayısı (XLSX)İlk 64 kolon okunur; fazlası dikkate alınmaz
Kodlama (yalnız CSV)UTF-8422 CSV_IMPORT_INVALID_ENCODING
BaşlıklarTüm zorunlu başlıklar422 CSV_IMPORT_MISSING_HEADERS
CSV-injection=, +, @, -, tab ile başlayan hücre reddedilir (XLSX hücreleri dahil)422
Import ATOMIKTIR

Herhangi bir satırda hata varsa hiçbir satır yazılmaz — yanıt imported=0 ve satır-bazlı hata listesi (errors: [{row, message, code}]) döner. Hata listesindeki row dosyada görünen gerçek (fiziksel) satır numarasıdır: başlık = satır 1, ilk veri = satır 2 (CSV ve XLSX ortak). Doğal anahtar (abone_grubu + price_purpose + time_segment + step_no; NULLS NOT DISTINCT) tekrarları da bu listede satır numarasıyla raporlanır — dosya içi tekrar ve paketteki mevcut fiyatla çakışma ayrı kodlarla (yukarıdaki ön-kontrol bölümü). 409 (TARIFF_PRICE_DUPLICATE) yalnızca eşzamanlı iki import'un yarıştığı nadir durumda görülür. Yalnızca draft pakete import yapılabilir.


Konsol ekranı kullanımı

/console/regulated-tariffs ekranı üzerinden:

  • Paketleri onay durumu (Tümü / Taslak / Onaylı / Arşivli) ve fatura dönemi ile filtreleyin — dönem filtresi üst bardaki tarih seçicisidir; temizlenince tüm dönemler listelenir. Filtre değişince liste ilk sayfaya döner.
  • Paket satırına tıklayarak (satırın herhangi bir yerine) fiyat detay panelini açın — paketin tüm fiyat satırları salt-okunur tabloda görüntülenir,
  • Yeni draft paket oluşturun, CSV/XLSX import edin, fiyatları gözden geçirin,
  • Satır sonundaki ⋮ menüsünden (menü tıklaması detay panelini açmaz) altı öğe bulunur. Duruma uymayan öğeler menüden kaybolmazpasif/gri görünür (tıklanamaz), yani bir onaylı pakette "Düzenle"yi gri de olsa görürsünüz ama seçemezsiniz:
    • Fiyatları görüntüle — her durumda seçilebilir; paketin fiyat detay panelini açar (satıra tıklamakla aynı sonuç).
    • Düzenleyalnız taslak (draft) pakette etkindir: ad / kaynak doküman / fatura dönemi metadata'sını değiştirir. Onaylı/arşivli pakette pasif/gri görünür (tıklanamaz) — immutability (değişmezlik) gereği.
    • CSV/XLSX içe aktaryalnız draft: "CSV/XLSX ile Fiyat İçe Aktar" penceresini açar (toplu fiyat import'u). Onaylı/arşivli pakette pasiftir.
    • Onaylayalnız draft: paket immutable olur.
    • Arşivleyalnız onaylı: paketi geçmiş versiyona çevirir.
    • Silyalnız draft: artık tek tıkla silmez — bir onay penceresi açılır ve paketin tüm fiyat satırlarıyla birlikte silineceği, işlemin geri alınamayacağı belirtilir; silme ancak onayla gerçekleşir. (Onaylı paket silinemez — 409 TARIFF_SET_NOT_DELETABLE; regülasyon izi.)

Konsol yalnızca süper yöneticiye açıktır; /console/* rotaları superadmin istisnasıdır.

Şablon indirme + Excel ile içe aktarma (adım adım)

  1. Taslak paketin satır sonundaki ⋮ menüsünü açın → "CSV/XLSX içe aktar" öğesini seçin — "CSV/XLSX ile Fiyat İçe Aktar" penceresi açılır (import yalnız draft pakete yapılabilir; satır üzerinde ayrı bir "İçe Aktar" düğmesi yoktur — import bu menü öğesinden başlar, onay penceresindeki "İçe Aktar" düğmesi ise import'u tamamlar).
  2. "Şablonu indir (.csv)" veya "Şablonu indir (.xlsx)" düğmesiyle hazır şablonu indirin. Şablon, doğru sıralı başlıklar ve doğrulamadan hatasız geçen örnek satırlarla gelir.
  3. Şablonu Excel'de (veya bir metin editöründe) doldurun: 6 örnek satırı silin veya kendi fiyatlarınızla değiştirin (bkz. örnek satır uyarısı — silinmeyen örnekler gerçek verinizle çakışıp toplu redde yol açabilir). Dosyayı .xlsx veya .csv olarak kaydedin — .xls (eski Excel) desteklenmez; seçilirse pencere "dosyayı .xlsx olarak kaydedin" uyarısıyla erken reddeder.
  4. "Dosya Seç" ile dosyayı seçin — dosya adının yanında CSV / XLSX format rozeti görünür; 2 MB üstü dosyalar daha yüklenmeden reddedilir.
  5. **"İçe Aktar"**a tıklayın. Başarıda kaç satırın aktarıldığı bildirilir; herhangi bir satır hatalıysa hiçbir satır kaydedilmez ve pencere içinde satır-numaralı hata listesi gösterilir (çakışan/tekrarlanan satırlar da bu listede numarasıyla yer alır). Import'u durdurmayan durumlar (şablon örneği satırlar, boş dosya, XLSX'te ek sayfalar) pencere içindeki "İçe aktarma uyarıları" panelinde ayrıca listelenir.
Hata listesindeki satır numarası

"Satır N" ifadesindeki numara dosyada görünen gerçek satırdır (başlık = satır 1, ilk veri = satır 2). Excel'de aynı numaralı satıra gidip düzeltin ve dosyayı yeniden yükleyin — numaraya ekleme/çıkarma yapmanız gerekmez.


İlgili sayfalar