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).
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ğer | Düz-Türkçe | Hesaba girer mi? | Hangi hesapta / ne zaman bunu seç |
|---|---|---|---|
mahsuplasma_related_tariff | Mahsuplaşmayla ilişkili (ana) tarife | ✅ Ana girdi | Mahsuplaş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_tariff | En düşük ilişkili tarife | ✅ Evet | Yalnı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_energy | SKTT aktif enerji | ✅ Evet | Son 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_usage | Sistem kullanım bedeli (SKB) | ✅ Evet | Sistem 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_energy | Müş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. |
distribution | Dağı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. |
capacity | Güç 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. |
reactive | Reaktif 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. |
other | Diğer | ⚪ Hayır (bilgi) | Yukarıdakilerin dışında kalan, yalnız kayıt amaçlı bir kalem. Hesaba girmez. |
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:
- Ne? Fiyat satırının hangi tarife kalemi olduğu (yukarıdaki 9 değerden biri).
- Zorunlu mu? Evet — her fiyat satırında zorunludur (CSV/XLSX'te de zorunlu başlık).
- 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.
- 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ı.
- 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ğer | Düz-Türkçe | Nerede geçerli? | Ne için |
|---|---|---|---|
lisanssiz_uretici_1 | Lisanssı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_2 | Lisanssı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.
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.
Ö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_docalanı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_hashile belgenin bütünlük özetini saklayabilirsiniz (provenance/denetim izi). - Satır düzeyinde: her fiyat satırının
source_notealanı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 tarifesi | mahsuplasma_related_tariff |
| Karışık gruplarda en düşük ilişkili aktif enerji tarifesi | mahsuplasma_lowest_related_tariff |
| Son Kaynak Tedarik Tarifesi (SKTT) aktif enerji | sktt_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 kolonu | price_purpose | unit | Not |
|---|---|---|---|
| Dağıtım Bedeli (kr/kWh) | system_usage | kurus_per_kwh | Hesap motoru SKB tutarını bu kalemden çözer. |
| Güç Bedeli (kr/kW/ay) | capacity | kurus_per_kw_month | Güç aşım kolonu girilmez — aşım = 2 × güç bedeli, sistem türetir. |
| Reaktif (kr/kVArh) | reactive | kurus_per_kvarh | — |
| Enerji (aktif enerji) bedeli | mahsuplasma_related_tariff | kWh birimi (ör. kurus_per_kwh) | AG mesken 8 kWh/gün kademesi → iki 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 bedeli | system_usage | kurus_per_kwh | abone_grubu = lisanssiz_uretici_1 veya lisanssiz_uretici_2 (bkz. Abone grupları). |
price (fiyat) alanının 5 sorusu:
- Ne? Birim enerji fiyatı (o kalem, o abone grubu, o zaman dilimi/kademe için).
- Zorunlu mu? Evet — her satırda zorunlu ve pozitif (> 0) olmalıdır.
- 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. - Nereden bulunur? EPDK'nın o dönem için yayımladığı tarife tablosundan.
- 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.
unit) tuzağı — 1000× hata riskiFiyatı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_purpose | Zorunlu / 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 / other | Serbest (kısıt uygulanmaz; kayıt amaçlı kalemler — pratikte kWh birimi önerilir) |
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:
| Durum | Anlamı | Yapılabilenler |
|---|---|---|
draft | Taslak — hazırlanıyor | Metadata düzenle, fiyat ekle / CSV-XLSX import, sil, onayla |
approved | Onaylı — kullanıma hazır | Yalnız arşivle; fiyatlar ve metadata IMMUTABLE |
archived | Arşivlenmiş — geçmiş versiyon | Değiştirilemez (yalnız görüntülenir) |
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
-
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
draftdoğar;created_bytoken'daki superadmin'dir. -
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 } -
Paketi gözden geçir:
GET /api/v1/admin/regulated-tariffs/price-sets/{id}/prices -
Onayla:
POST /api/v1/admin/regulated-tariffs/price-sets/{id}/approveapproved_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
| Kolon | Kural |
|---|---|
valid_from / valid_to / billing_period | ISO tarih (YYYY-MM-DD); valid_from <= valid_to |
abone_grubu | mesken / ticarethane / sanayi / tarimsal_sulama / aydinlatma / other + tarifeye özel lisanssiz_uretici_1 / lisanssiz_uretici_2 (bkz. Abone grupları; üretici grupları tesis formunda yoktur) |
price_purpose | mahsuplasma_related_tariff / mahsuplasma_lowest_related_tariff / sktt_active_energy / customer_bill_active_energy / system_usage / distribution / other / capacity / reactive |
time_segment | tek / gunduz / puant / gece veya boş (tek-zamanlı tarifede boş) |
step_no | Tam sayı veya boş (kademesiz tarifede boş) |
price | Pozitif 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) |
unit | TRY_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).
Ş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 olarakYYYY-MM-DDyazmak 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 → 422CSV_IMPORT_INVALID_TYPE("dosyayı Excel'de .xlsx olarak kaydedin" yönlendirmesiyle).- Bozuk/açılamayan
.xlsx→ 422XLSX_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ı:
pricealanında2,4512gibi salt-ondalık virgül otomatik2.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
importedsayısını etkilemez.
Güvenlik kısıtları
| Kısıt | Değer | Aşı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-type | 422 CSV_IMPORT_INVALID_TYPE |
.xls (eski Excel/BIFF) | Desteklenmez — .xlsx olarak kaydedin | 422 CSV_IMPORT_INVALID_TYPE |
Bozuk/açılamayan .xlsx | ZIP imzası yok veya dosya açılamıyor | 422 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-8 | 422 CSV_IMPORT_INVALID_ENCODING |
| Başlıklar | Tüm zorunlu başlıklar | 422 CSV_IMPORT_MISSING_HEADERS |
| CSV-injection | =, +, @, -, tab ile başlayan hücre reddedilir (XLSX hücreleri dahil) | 422 |
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 kaybolmaz — pasif/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üzenle — yalnı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 aktar — yalnız draft: "CSV/XLSX ile Fiyat İçe Aktar" penceresini açar (toplu fiyat import'u). Onaylı/arşivli pakette pasiftir.
- Onayla — yalnız draft: paket immutable olur.
- Arşivle — yalnız onaylı: paketi geçmiş versiyona çevirir.
- Sil — yalnı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)
- 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
draftpakete 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). - "Ş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.
- Ş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ı
.xlsxveya.csvolarak kaydedin —.xls(eski Excel) desteklenmez; seçilirse pencere "dosyayı .xlsx olarak kaydedin" uyarısıyla erken reddeder. - "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.
- **"İç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.
"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
- Genel Bakış — iki yüzey — mahsuplaşma vs regüle tarife.
- Alan Sözlüğü — tüm alanların "nedir / nereden bulunur"
master referansı;
price_purposeenum tablosu. - Uygunluk Kuralları — R00T (onaylı regüle tarife seti yoksa bloklayıcı FAIL) ve diğer kurallar.
- Limit Hesapları — bedelli ihtiyaç fazlası ve limit hareketleri (regüle tarifenin tutara dönüştüğü yer).
- Hesap Çekirdeği — tutar hesabının akışı.
- SSS ve Sorun Giderme — "CSV import neden 0 satır?".
- Teknik: Veri Modeli — tariff_price_sets / tariff_prices
- Operasyonel: Migration runbook
0095/0096+0109(price_purposewhitelist'inin 7 → 9 değere genişletilmesi:capacity+reactive).