{
  "info": {
    "name": "JOI_ULUPINAR.API",
    "description": "ETA muhasebe verisine ve entegratörden gelen e-Fatura / e-İrsaliye belgelerine kiracı bazlı erişim sağlayan REST API. Önce '2 · Token al' isteğini çalıştırın; dönen token otomatik olarak {{token}} değişkenine yazılır ve korumalı isteklerde kullanılır. baseUrl değişkenini kendi sunucu adresinizle güncelleyin.\n\nUçlar verinin NEREDEN geldiğine göre üç gruba ayrılır: KARTLAR (firma ETA veritabanı, etaDb ister), BELGELER (entegratör; etaDb ister ama veriyi oradan okumaz, entegratör kimliğini oradan okur) ve MASTER TANIMLARI (ETA kurulumunun master veritabanı, masterDb ister).",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    { "key": "baseUrl", "value": "https://sunucu-adresiniz", "type": "string" },
    { "key": "kullaniciAdi", "value": "", "type": "string" },
    { "key": "sifre", "value": "", "type": "string" },
    { "key": "apiKey", "value": "", "type": "string" },
    { "key": "token", "value": "", "type": "string" },
    { "key": "etaDb", "value": "", "type": "string" },
    { "key": "masterDb", "value": "", "type": "string" },
    { "key": "masterSatirId", "value": "", "description": "20 numarali istek basarili olunca otomatik doldurulur." },
    { "key": "belgeUuid", "value": "", "type": "string" }
  ],
  "item": [
    {
      "name": "1 · Ping (açık)",
      "request": {
        "method": "GET",
        "header": [],
        "url": { "raw": "{{baseUrl}}/api/v1/ping", "host": ["{{baseUrl}}"], "path": ["api", "v1", "ping"] },
        "description": "Servisin ayakta olduğunu ve sürümünü döner. Kimlik doğrulama istemez."
      }
    },
    {
      "name": "2 · Token al (açık)",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if (pm.response.code === 200) {",
              "    var d = pm.response.json();",
              "    pm.collectionVariables.set('token', d.token);",
              "    pm.test('token alindi', function () { pm.expect(d.token).to.be.a('string'); });",
              "}"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [{ "key": "Content-Type", "value": "application/json" }],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"kullaniciAdi\": \"{{kullaniciAdi}}\",\n  \"sifre\": \"{{sifre}}\",\n  \"apiKey\": \"{{apiKey}}\"\n}"
        },
        "url": { "raw": "{{baseUrl}}/api/auth/token", "host": ["{{baseUrl}}"], "path": ["api", "auth", "token"] },
        "description": "Kullanıcı adı, şifre ve apiKey ile JWT üretir. Başarılıysa token {{token}} değişkenine yazılır.\n\nGüvenlik gereği hangi alanın yanlış olduğu ayrıştırılmaz: eksik alan, olmayan kullanıcı, yanlış şifre ve yanlış apiKey aynı 401 KIMLIK_GECERSIZ yanıtını döndürür."
      }
    },
    {
      "name": "3 · Firmalar (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": { "raw": "{{baseUrl}}/api/v1/firmalar", "host": ["{{baseUrl}}"], "path": ["api", "v1", "firmalar"] },
        "description": "Token sahibinin erişebildiği ETA FIRMA veritabanlarını listeler. etaDb parametresinin geçerli değerleri budur. Master veritabanı adları bu listede YOKTUR; kurulumu yapan taraftan alınır."
      }
    },
    {
      "name": "4 · Kartlar · Cariler (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/cariler?etaDb={{etaDb}}&kodOnek=120&aktif=true&skip=0&take=100",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "cariler"],
          "query": [
            { "key": "etaDb", "value": "{{etaDb}}", "description": "Zorunlu. /firmalar'dan gelen bir değer." },
            { "key": "kodOnek", "value": "120", "description": "Cari kodu başlangıcı (örn. 120 = müşteri, 320 = satıcı; firmadan firmaya değişir)." },
            { "key": "aktif", "value": "true", "description": "true / false / boş (hepsi)." },
            { "key": "skip", "value": "0", "description": "Atlanacak kayıt sayısı." },
            { "key": "take", "value": "100", "description": "Sayfa boyu. Öntanımlı 100, azami 500." }
          ]
        },
        "description": "Cari kartları sayfalı döner; her kayıtta adres ve kimlik satırları iç içedir. Alanlar ETA kolon adlarının küçük harfli halidir ve değerler HAMDIR (metinler dolgu boşluklu, boş tarihler 1900-01-01) — istemci karşılaştırmadan önce trim uygular."
      }
    },
    {
      "name": "5 · Kartlar · Stoklar (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/stoklar?etaDb={{etaDb}}&aktif=true&fiyatlar=false&skip=0&take=100",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "stoklar"],
          "query": [
            { "key": "etaDb", "value": "{{etaDb}}", "description": "Zorunlu." },
            { "key": "kodOnek", "value": "", "description": "Stok kodu başlangıcı.", "disabled": true },
            { "key": "aktif", "value": "true", "description": "true / false / boş (hepsi)." },
            { "key": "fiyatlar", "value": "false", "description": "ÖNTANIMLI KAPALI. Açılırsa her kayda fiyatlar dizisi eklenir; bir stokta 70'e kadar fiyat satırı bulunabildiği için yanıt hızla büyür." },
            { "key": "skip", "value": "0" },
            { "key": "take", "value": "100", "description": "Öntanımlı 100, azami 500." }
          ]
        },
        "description": "Stok kartları. fiyatlar=true verilmedikçe fiyat satırları GELMEZ."
      }
    },
    {
      "name": "6 · Kartlar · Hizmetler (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/hizmetler?etaDb={{etaDb}}&skip=0&take=100",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "hizmetler"],
          "query": [
            { "key": "etaDb", "value": "{{etaDb}}", "description": "Zorunlu." },
            { "key": "kodOnek", "value": "", "description": "Hizmet kodu başlangıcı.", "disabled": true },
            { "key": "skip", "value": "0" },
            { "key": "take", "value": "100" }
          ]
        },
        "description": "Hizmet kartları. AKTIF PARAMETRESI YOKTUR: ETA'nın HIZMET tablosunda aktiflik alanı bulunmamaktadır."
      }
    },
    {
      "name": "7 · Belgeler · Gelen e-Faturalar (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/gelen-faturalar?etaDb={{etaDb}}&baslangicTarihi=2026-07-01&bitisTarihi=2026-07-31&skip=0&take=100",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "gelen-faturalar"],
          "query": [
            { "key": "etaDb", "value": "{{etaDb}}", "description": "Zorunlu. Veri bu veritabanından OKUNMAZ; entegratör kimliği (kullanıcı/şifre/tip) buradaki SABITLER tablosundan okunur." },
            { "key": "baslangicTarihi", "value": "2026-07-01", "description": "ZORUNLU. yyyy-MM-dd, bu tarih DAHİL." },
            { "key": "bitisTarihi", "value": "2026-07-31", "description": "ZORUNLU. yyyy-MM-dd, bu tarih DAHİL. Aralık en fazla 31 GÜN; daha genişi 400 TARIH_ARALIGI_GECERSIZ döner." },
            { "key": "gonderenVkn", "value": "", "description": "Gönderenin 10 haneli VKN'si veya 11 haneli TCKN'si. Başka uzunluk 400 döner.", "disabled": true },
            { "key": "belgeNo", "value": "", "description": "Belge numarasına göre daraltır.", "disabled": true },
            { "key": "skip", "value": "0" },
            { "key": "take", "value": "100", "description": "Öntanımlı 100, azami 500." }
          ]
        },
        "description": "Entegratörden (EDM / Digital Planet) GELEN e-Fatura başlıkları.\n\n⚠ toplam alanı bu uçta null GELEBİLİR: entegratör gerçek bir 'eşleşen kayıt sayısı' döndürmez. Sayfalamanın bittiği, dönen kayıt sayısının take'ten küçük olmasıyla anlaşılır.\n\nYalnız GELEN (alış) belgeler listelenir ve entegratördeki okundu/okunmadı işareti DEĞİŞTİRİLMEZ. Liste ucu UBL indirmez; satır ayrıntısı için 8 numaralı isteği kullanın.\n\nEntegratör bu belge türünü sunmuyorsa 501 BELGE_TURU_DESTEKLENMIYOR döner — bu bir yetki hatası değildir."
      }
    },
    {
      "name": "8 · Belgeler · Gelen e-Fatura detayı (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/gelen-faturalar/{{belgeUuid}}?etaDb={{etaDb}}",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "gelen-faturalar", "{{belgeUuid}}"],
          "query": [
            { "key": "etaDb", "value": "{{etaDb}}", "description": "Zorunlu." }
          ]
        },
        "description": "Tek bir gelen e-Faturayı UBL'inden çözümleyerek tam detayıyla döner: taraflar, satırlar, vergiler, referanslar. belgeUuid değişkenine 7 numaralı istekten dönen bir uuid yazın.\n\nBulunamayan uuid için 404 BELGE_BULUNAMADI döner. Liste ucuna göre yavaştır (UBL indirilir), tek belge içindir."
      }
    },
    {
      "name": "9 · Belgeler · Gelen e-İrsaliyeler (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/gelen-irsaliyeler?etaDb={{etaDb}}&baslangicTarihi=2026-07-01&bitisTarihi=2026-07-31&skip=0&take=100",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "gelen-irsaliyeler"],
          "query": [
            { "key": "etaDb", "value": "{{etaDb}}", "description": "Zorunlu." },
            { "key": "baslangicTarihi", "value": "2026-07-01", "description": "ZORUNLU. yyyy-MM-dd, dahil." },
            { "key": "bitisTarihi", "value": "2026-07-31", "description": "ZORUNLU. yyyy-MM-dd, dahil. Aralık en fazla 31 gün." },
            { "key": "gonderenVkn", "value": "", "description": "10 haneli VKN veya 11 haneli TCKN.", "disabled": true },
            { "key": "belgeNo", "value": "", "disabled": true },
            { "key": "skip", "value": "0" },
            { "key": "take", "value": "100" }
          ]
        },
        "description": "Entegratörden GELEN e-İrsaliye başlıkları. Kurallar 7 numaralı istekle aynıdır.\n\n⚠ e-İrsaliye desteği ENTEGRATÖRE BAĞLIDIR: kiracının entegratörü bu belge türünü sunmuyorsa 501 BELGE_TURU_DESTEKLENMIYOR döner."
      }
    },
    {
      "name": "10 · Belgeler · Gelen e-İrsaliye detayı (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/gelen-irsaliyeler/{{belgeUuid}}?etaDb={{etaDb}}",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "gelen-irsaliyeler", "{{belgeUuid}}"],
          "query": [
            { "key": "etaDb", "value": "{{etaDb}}", "description": "Zorunlu." }
          ]
        },
        "description": "Tek bir gelen e-İrsaliyeyi UBL'inden çözümleyerek döner: taraflar, teslimat adresi, taşıyıcı (plaka, şoför) ve satırlar. Faturadan farklı olarak irsaliyede TUTAR/VERGİ ALANLARI YOKTUR — UBL'de taşınmazlar."
      }
    },
    {
      "name": "11 · Master · Fatura fiş tipleri (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/master/fatura-fis-tipleri?masterDb={{masterDb}}&skip=0&take=100",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "master", "fatura-fis-tipleri"],
          "query": [
            { "key": "masterDb", "value": "{{masterDb}}", "description": "ZORUNLU DEĞİL: kiracıda tek master tanımlıysa boş bırakılabilir. Birden fazla tanım varsa (ETA_MASTER / ETA_MASTERV8) zorunludur, verilmezse 400 döner. Hiç tanım yoksa 409 MASTER_DB_TANIMSIZ. Değer /firmalar'dan ÖĞRENİLEMEZ, kurulumu yapan taraftan alınır." },
            { "key": "kodOnek", "value": "", "description": "Fiş tipi kodunun başlangıcı (FATGENFTKOD), örn. SATIŞ.", "disabled": true },
            { "key": "skip", "value": "0" },
            { "key": "take", "value": "100", "description": "Öntanımlı 100, azami 500." }
          ]
        },
        "description": "FATGENFISTIP: fatura fiş tipleri. ETA MASTER veritabanından okur — bu veriler bir firmaya değil kurulumun tamamına aittir, bu yüzden etaDb DEĞİL masterDb alır.\n\n⛔ FİŞ TİPİ ≠ BELGE: bu uç tanım döndürür, fatura döndürmez. Gelen faturalar için 7 numaralı isteği kullanın."
      }
    },
    {
      "name": "12 · Master · İrsaliye fiş tipleri (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/master/irsaliye-fis-tipleri?masterDb={{masterDb}}&skip=0&take=100",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "master", "irsaliye-fis-tipleri"],
          "query": [
            { "key": "masterDb", "value": "{{masterDb}}", "description": "Zorunlu değil; bkz. 11 numaralı istek." },
            { "key": "kodOnek", "value": "", "description": "IRSGENFTKOD ön eki.", "disabled": true },
            { "key": "skip", "value": "0" },
            { "key": "take", "value": "100" }
          ]
        },
        "description": "IRSGENFISTIP: irsaliye fiş tipi TANIMLARI (irsaliye belgesi değil)."
      }
    },
    {
      "name": "13 · Master · Cari fiş tipleri (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/master/cari-fis-tipleri?masterDb={{masterDb}}&skip=0&take=100",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "master", "cari-fis-tipleri"],
          "query": [
            { "key": "masterDb", "value": "{{masterDb}}", "description": "Zorunlu değil; bkz. 11 numaralı istek." },
            { "key": "kodOnek", "value": "", "description": "CARGENFTKOD ön eki.", "disabled": true },
            { "key": "skip", "value": "0" },
            { "key": "take", "value": "100" }
          ]
        },
        "description": "CARGENFISTIP: cari fiş tipleri."
      }
    },
    {
      "name": "14 · Master · Stok fiş tipleri (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/master/stok-fis-tipleri?masterDb={{masterDb}}&skip=0&take=100",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "master", "stok-fis-tipleri"],
          "query": [
            { "key": "masterDb", "value": "{{masterDb}}", "description": "Zorunlu değil; bkz. 11 numaralı istek." },
            { "key": "kodOnek", "value": "", "description": "STKGENFTKOD ön eki, örn. DEPO-A.", "disabled": true },
            { "key": "skip", "value": "0" },
            { "key": "take", "value": "100" }
          ]
        },
        "description": "STKGENFISTIP: stok fiş tipleri (depo fişi, giriş/çıkış ayrımı dahil)."
      }
    },
    {
      "name": "15 · Master · Muhasebe fiş tipleri (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/master/muhasebe-fis-tipleri?masterDb={{masterDb}}&skip=0&take=100",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "master", "muhasebe-fis-tipleri"],
          "query": [
            { "key": "masterDb", "value": "{{masterDb}}", "description": "Zorunlu değil; bkz. 11 numaralı istek." },
            { "key": "kodOnek", "value": "", "description": "MUHGENFTKOD ön eki.", "disabled": true },
            { "key": "skip", "value": "0" },
            { "key": "take", "value": "100" }
          ]
        },
        "description": "MUHGENFISTIP: muhasebe fiş tipleri."
      }
    },
    {
      "name": "16 · Master · KDV kısımları (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/master/kdv-kisimlari?masterDb={{masterDb}}&skip=0&take=100",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "master", "kdv-kisimlari"],
          "query": [
            { "key": "masterDb", "value": "{{masterDb}}", "description": "Zorunlu değil; bkz. 11 numaralı istek." },
            { "key": "kodOnek", "value": "", "description": "KDVKISOZELKOD ön eki. Bu alan çoğu kurulumda BOŞTUR, filtre sonuç döndürmeyebilir.", "disabled": true },
            { "key": "skip", "value": "0" },
            { "key": "take", "value": "100" }
          ]
        },
        "description": "KDVKISIM: KDV oran tanımları. Oran kdvkisoran alanındadır ve yüzde olarak gelir (20 = %20); açıklama metnindeki yüzde (örn. 'TEMEL GIDA %8') kurulumla birlikte eskimiş olabilir — güvenilecek değer orandır."
      }
    },
    {
      "name": "17 · Master · Döviz tanımları (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/master/doviz-tanimlari?masterDb={{masterDb}}&skip=0&take=100",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "master", "doviz-tanimlari"],
          "query": [
            { "key": "masterDb", "value": "{{masterDb}}", "description": "Zorunlu değil; bkz. 11 numaralı istek." },
            { "key": "kodOnek", "value": "", "description": "DOVTANKOD ön eki.", "disabled": true },
            { "key": "skip", "value": "0" },
            { "key": "take", "value": "100" }
          ]
        },
        "description": "DOVTAN: kurulumda tanımlı döviz cinsleri (dovtankod / dovtanadi). dovtaneslkod ETA kodunun ISO 4217 karşılığıdır (EURO -> EUR) — kendi sisteminde ISO kod kullanan istemcinin eşleme alanı budur. dovtancarpan / dovtanbolen ölçülen kurulumların hepsinde 0 geldi, bölme işleminde doğrudan kullanılmamalıdır.\n\n⛔ BU LİSTE 19 numaralı isteğin dovizKodu parametresi için GEÇERLİ DEĞERLER LİSTESİ DEĞİLDİR: ölçülen bir kurulumda DOVHAR'da kur satırı bulunan AZN/AED/EUR/KRW/PKR/QAR/STERLİN/XDR kodları DOVTAN'da hiç yoktu, DOVTAN'daki ILS/JOD/SYP için ise DOVHAR'da tek satır yoktu."
      }
    },
    {
      "name": "18 · Master · Kur türleri (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/master/doviz-kur-turleri?masterDb={{masterDb}}&skip=0&take=100",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "master", "doviz-kur-turleri"],
          "query": [
            { "key": "masterDb", "value": "{{masterDb}}", "description": "Zorunlu değil; bkz. 11 numaralı istek." },
            { "key": "kodOnek", "value": "", "description": "DOVTURKOD ön eki.", "disabled": true },
            { "key": "skip", "value": "0" },
            { "key": "take", "value": "100" }
          ]
        },
        "description": "DOVTUR: kur türü tanımları (dovturkod / dovturadi) — 19 numaralı isteğin kurTuru parametresinin sözlüğü. Liste 'kur bulunan türler' değil 'TANIMLI türler'dir: ölçülen bir kurulumda 13 tanımlı türden 8'inin hiç kur satırı yoktu. Kodlar Türkçe karakter içerebilir (örn. DEĞERLEMEK); kurTuru olarak gönderilirken sorgu dizesinde UTF-8 yüzde kodlaması gerekir."
      }
    },
    {
      "name": "19 · Master · Döviz kurları (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/master/doviz-kurlari?masterDb={{masterDb}}&dovizKodu=USD&baslangicTarihi=2026-01-01&bitisTarihi=2026-06-30&skip=0&take=500",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "master", "doviz-kurlari"],
          "query": [
            { "key": "masterDb", "value": "{{masterDb}}", "description": "Zorunlu değil; bkz. 11 numaralı istek." },
            { "key": "dovizKodu", "value": "USD", "description": "TAM EŞLEŞME (ön ek DEĞİL): aynı kurulumda hem EUR hem EURO bulunabilir. Kodlar ETA'nın kendi tanımlarıdır, ISO 4217 olmak zorunda değildir. ⛔ Geçerli kod kümesi 17 numaralı istekten (DOVTAN) ÖĞRENİLEMEZ — iki tablo birbirini kapsamaz." },
            { "key": "kurTuru", "value": "", "description": "TAM EŞLEŞME. Örn. MBNKALS / MBNKSAT / MBNKEALS / MBNKESAT. Kümesi kuruluma göre değişir; tanımlı değerler 18 numaralı istekten (DOVTUR) okunabilir.", "disabled": true },
            { "key": "baslangicTarihi", "value": "2026-01-01", "description": "yyyy-MM-dd, bu tarih DAHİL. Verilmezse sınır yok. Geçerli aralık 1753-01-01 .. 9999-12-30." },
            { "key": "bitisTarihi", "value": "2026-06-30", "description": "yyyy-MM-dd, bu tarih DAHİL. Verilmezse sınır yok." },
            { "key": "skip", "value": "0" },
            { "key": "take", "value": "500", "description": "Azami 500." }
          ]
        },
        "description": "DOVHAR: döviz kuru geçmişi. Katalog değil GEÇMİŞTİR (ölçülen bir kurulumda 55.000+ satır) — tarih aralığında gün sınırı yoktur ama sayfalama vardır. Sıralama dovhartar + dovharkod + dovhartur üzerinde artandır; yeni kurlar listenin sonuna eklenir, devam eden bir tarama kaymaz."
      }
        },
    {
      "name": "20 · Fişler · Fatura yaz (JWT, YAZMA)",
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "if (pm.response.code === 201) {",
              "    var d = pm.response.json();",
              "    pm.collectionVariables.set('masterSatirId', d.masterSatirId);",
              "    pm.test('fis yazildi', function () { pm.expect(d.masterSatirId).to.be.above(0); });",
              "}",
              "if (pm.response.code === 409) {",
              "    pm.test('mukerrer koruma calisti', function () {",
              "        pm.expect(pm.response.json().hataKodu).to.eql('FIS_ZATEN_KAYITLI');",
              "    });",
              "}"
            ]
          }
        }
      ],
      "request": {
        "method": "POST",
        "header": [
          { "key": "Authorization", "value": "Bearer {{token}}" },
          { "key": "Content-Type", "value": "application/json" }
        ],
        "body": {
          "mode": "raw",
          "raw": "{\n  \"belgeTuru\": \"fatura\",\n  \"disReferans\": \"SIP-2026-000123\",\n  \"tarih\": \"2026-08-28\",\n  \"fisTipi\": 3,\n  \"girisCikis\": 2,\n  \"cariKodu\": \"120 01 01 0773\",\n  \"kdvDahil\": false,\n  \"satirlar\": [\n    {\n      \"stokKodu\": \"STOK-KODU\",\n      \"birim\": \"ADET\",\n      \"depoKodu\": \"MERKEZ\",\n      \"miktar\": 10,\n      \"fiyat\": 100,\n      \"kdvOrani\": 20\n    }\n  ]\n}"
        },
        "url": {
          "raw": "{{baseUrl}}/api/v1/rf-fisleri?etaDb={{etaDb}}",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "rf-fisleri"],
          "query": [{ "key": "etaDb", "value": "{{etaDb}}", "description": "Zorunlu." }]
        },
        "description": "YAZMA UCU. Fişi ETA'nın aktarım (RF) tablolarına tek bir veritabanı işlemi içinde yazar ve 201 ile masterSatirId döner (yanıt {{masterSatirId}} değişkenine yazılır).\n\n⛔ GERÇEK ETA BELGESİ BURADA OLUŞMAZ: fişi FATFIS/IRSFIS belgesine çeviren saklı yordamı ETA tarafındaki kendi işiniz çağırır. Sonuç 21 numaralı istekle izlenir.\n\ndisReferans mükerrer yazımı engelleyen anahtardır: aynı değerle ikinci istek 409 FIS_ZATEN_KAYITLI döner ve detayda mevcut kaydın masterSatirId'si bildirilir. Bu isteği iki kez çalıştırarak korumayı görebilirsiniz.\n\nÖN KOŞUL: cariKodu CARKART'ta, stokKodu STKKART'ta TANIMLI olmalıdır (yoksa 409 KART_BULUNAMADI). Kod karşılaştırması ETA harmanlamasına göre büyük/küçük harf duyarlı olabilir — yukarıdaki örnek kodları kendi kurulumunuzdaki gerçek kodlarla değiştirin.\n\nİRSALİYE için: belgeTuru=\"irsaliye\" ve belgeNo ZORUNLUDUR (ETA irsaliye numarasını kendisi üretmez). Faturada belgeNo isteğe bağlıdır ve aktarım sırasında ETA kendi numarasını yazar.\n\nTutarlar (satır tutarı, KDV matrahı, KDV kırılımı, iskonto satırları) API tarafından hesaplanır ve yanıtta döner.\n\nAdlandırılmış alanların yetmediği yerde hamAlanlar sözlüğüyle istediğiniz ETA kolonu doğrudan yazılabilir; tanınmayan kolon adı sessizce yok sayılmaz, 400 döner."
      }
    },
    {
      "name": "21 · Fişler · Fiş durumu (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/rf-fisleri/{{masterSatirId}}?etaDb={{etaDb}}",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "rf-fisleri", "{{masterSatirId}}"],
          "query": [{ "key": "etaDb", "value": "{{etaDb}}", "description": "Zorunlu." }]
        },
        "description": "Yazılan fişin ETA belgesine çevrilip çevrilmediğini gösterir. masterSatirId 20 numaralı istekten otomatik gelir.\n\naktarildi alanı ENTEGRASYONDONE bayrağına DEĞİL, belge türüne karşılık gelen referans numarasının (faturada fatFisRefNo, irsaliyede irsFisRefNo) üretilmiş olmasına bakar — bayrağı irsaliye yordamı kendisi set etmediği için tek başına güvenilir değildir.\n\nBu uç aynı tabloya yazan BAŞKA uygulamaların fişlerini de okuyabilir; öyle bir kayıtta kaynakEtiketi ULUPINAR'dan farklıdır ve tanınmayan bir modülde belgeTuru boş döner."
      }
    },
    {
      "name": "22 · Kartlar · Stok birimleri (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/stoklar/birimler?etaDb={{etaDb}}&skip=0&take=100",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "stoklar", "birimler"],
          "query": [
            { "key": "etaDb", "value": "{{etaDb}}", "description": "Zorunlu." },
            { "key": "kodOnek", "value": "", "description": "Birim kodu baslangici.", "disabled": true },
            { "key": "skip", "value": "0" },
            { "key": "take", "value": "100", "description": "Azami 500." }
          ]
        },
        "description": "STKBIRIM: birim tanimlari (stkbirimkod / stkbirimad / stkbirimcarpan / stkbirimbolen).\n\nBu tablo stok kartina BAGLI DEGILDIR: kurulum geneli kucuk bir katalogdur (olculen dort kurulumda 21-31 satir) ve stok kartlarindaki birim alanlari buna atifta bulunur.\n\n⚠ stkbirimcarpan ve stkbirimbolen olculen kurulumlarin TAMAMINDA 0'dir; birim donusumunde dogrudan kullanilamazlar.\n\n⚠ Siralama stkbirimkod + stkbirimad uzerindedir ama bu bilesim TEKIL OLMAYABILIR: olculen bir kurulumda ayni birim kodu iki kez tanimlanmisti. Tablo tek sayfaya sigdigi icin pratikte etkisizdir."
      }
    },
    {
      "name": "23 · Kartlar · Stok fiyatlari (JWT)",
      "request": {
        "method": "GET",
        "header": [{ "key": "Authorization", "value": "Bearer {{token}}" }],
        "url": {
          "raw": "{{baseUrl}}/api/v1/stoklar/fiyatlar?etaDb={{etaDb}}&skip=0&take=100",
          "host": ["{{baseUrl}}"],
          "path": ["api", "v1", "stoklar", "fiyatlar"],
          "query": [
            { "key": "etaDb", "value": "{{etaDb}}", "description": "Zorunlu." },
            { "key": "stokKodu", "value": "", "description": "TAM ESLESME. Tek bir stokun fiyatlari icin bunu kullanin.", "disabled": true },
            { "key": "kodOnek", "value": "", "description": "ON EK. Dikkat: '159' on eki '159 03 01 001' gibi alt kodlari da getirir.", "disabled": true },
            { "key": "depoKodu", "value": "", "description": "TAM ESLESME. ⚠ Bu alan bazi kurulumlarda TAMAMEN BOSTUR; filtre o kurulumlarda hic sonuc dondurmez.", "disabled": true },
            { "key": "fiyatNo", "value": "", "description": "Fiyat listesi numarasi (STKFIYNO). Olculen kurulumda 1..5.", "disabled": true },
            { "key": "skip", "value": "0" },
            { "key": "take", "value": "100", "description": "Azami 500." }
          ]
        },
        "description": "STKFIYAT: fiyat satirlari. Ayni satirlar 5 numarali istekte (stoklar) fiyatlar=true ile stok kartinin ICINDE de donebilir; bu uc onlari karttan BAGIMSIZ cekmek icindir. Fiyatlar sik, katalog seyrek degisir - ayri uc olmasaydi fiyat tazelemek icin 157 kolonluk stok kartlarini da her seferinde indirmek gerekirdi.\n\n⛔ MUKERRER SATIRLAR OLABILIR: bu tabloda hicbir kolon bilesimi tekil degildir ve olculen kurulumlarda 26 KOLONUN TAMAMI ayni olan TAM KOPYA satirlar bulundu (bir kurulumda 12.170 satirin 11.975'i farkli; bir grupta 7 kopya). Bunun sonucu: art arda cekilen iki sayfada bir kopya iki kez gorunup digeri hic gorunmeyebilir. Satirlar birbirinin aynisi oldugu icin veri kumesi yine de dogrudur; 'kayit kayboldu' diye yorumlanmamalidir.\n\nSiralama stkfiystkkod + stkfiyno ile baslar: tablodaki tek indeks (STKFIYATIND) tam olarak bu ikili uzerindedir."
    }
    }
  ]
}
