Skip to main content

Nilvera E-Fatura ve E-Arşiv REST API için Python client kütüphanesi

Project description

Nilvera Python Client

License: MIT Python 3.7+

Nilvera E-Fatura ve E-Arşiv REST API için resmi olmayan Python client kütüphanesi.

Özellikler

  • İhracat E-Fatura oluşturma ve gönderme
  • İç Piyasa E-Fatura ve E-Arşiv Fatura desteği
  • Otomatik Mükellef Kontrolü (E-Fatura vs E-Arşiv tespit)
  • Seri Yönetimi (Dinamik seri algılama ve numara üretme)
  • ✅ Taslak fatura yönetimi
  • ✅ Fatura durum sorgulama
  • ✅ GTB (Gümrük) entegrasyonu (ihracat için)
  • ✅ PDF, HTML, XML formatlarında fatura indirme
  • ✅ Gelen fatura yönetimi
  • Toplu Fatura Gönderimi
  • Para Birimi ve Döviz Kuru desteği
  • ✅ TCMB döviz kuru servisi (bonus!)
  • ✅ Test ve Production ortam desteği
  • ✅ Detaylı hata yönetimi ve loglama
  • ✅ Type hints desteği

Kurulum

GitHub'dan Kurulum

# Direkt olarak kurulum
pip install git+https://github.com/abdullahapaydin/nilverapython.git

# veya klonlayarak geliştirici modunda
git clone github.com/abdullahapaydin/nilverapython.git
cd nilverapython
pip install -e .

PyPI'dan Kurulum

pip install nilvera-client

Hızlı Başlangıç

Bağlantı Testi

from nilvera_client import NilveraClient

# Test ortamı için
client = NilveraClient(api_key='your-api-key', environment='test')

# Bağlantıyı test et
result = client.test_connection()
if result['success']:
    print("Bağlantı başarılı!")
    print(f"Firma: {result['data']['Name']}")
else:
    print(f"Hata: {result['error']}")

E-Fatura Serileri

# Tüm serileri listele
series = client.get_einvoice_series()
if series['success']:
    for s in series['data']:
        print(f"Seri: {s['Name']} - Aktif: {s['IsActive']}")

# Belirli bir seri detayını al
detail = client.get_series_detail(series_id=123)
if detail['success']:
    print(f"Son kullanılan numara: {detail['data']['last_used_number']}")

Taslak Fatura Oluşturma

invoice_data = {
    "InvoiceInfo": {
        "UUID": "550e8400-e29b-41d4-a716-446655440000",
        "InvoiceType": 2,  # ISTISNA
        "InvoiceProfile": 3,  # IHRACAT
        "InvoiceSerieOrNumber": "IHR",
        "IssueDate": "2026-02-15T10:00:00.000Z",
        "CurrencyCode": "USD",
        "ExchangeRate": 34.50,
        # ... diğer alanlar
    },
    "CompanyInfo": {
        "TaxNumber": "1234567890",
        "Name": "Şirket Adı",
        # ... diğer alanlar
    },
    "ExportCustomerInfo": {
        "LegalRegistrationName": "Customer Name",
        "Country": "USA",
        # ... diğer alanlar
    },
    "InvoiceLines": [
        {
            "Index": "1",
            "Name": "Ürün Adı",
            "Quantity": 100,
            "UnitType": "C62",
            "Price": 10.50,
            # ... diğer alanlar
        }
    ]
}

# Taslak oluştur
result = client.create_draft_invoice(invoice_data)
if result['success']:
    print("Taslak fatura oluşturuldu!")
    
    # Taslağı onayla ve gönder (ihracat için)
    invoice_uuid = invoice_data['InvoiceInfo']['UUID']
    send_result = client.confirm_and_send_draft(
        [invoice_uuid],
        alias="urn:mail:ihracatpk@gtb.gov.tr"  # İhracat için GTB
    )
    
    if send_result['success']:
        print("Fatura gönderildi!")

Mükellef Kontrolü (E-Fatura vs E-Arşiv)

# Müşterinin e-fatura mükellefiyetini kontrol et
tax_number = "1234567890"
result = client.check_taxpayer_status(tax_number)

if result['success']:
    taxpayer_data = result['data']
    
    # E-Fatura mükellefi mi?
    is_taxpayer = taxpayer_data.get('isTaxpayer', False)
    
    if is_taxpayer:
        print("✅ E-Fatura mükellefi - E-Fatura kesilmeli")
        customer_alias = taxpayer_data.get('alias')  # Müşteri alias'ı
        print(f"Müşteri Alias: {customer_alias}")
    else:
        print("❌ E-Fatura mükellefi değil - E-Arşiv kesilmeli")

E-Arşiv Fatura Oluşturma

# E-Arşiv fatura verisi hazırla
archive_invoice = {
    "InvoiceInfo": {
        "UUID": "550e8400-e29b-41d4-a716-446655440001",
        "InvoiceType": "SATIS",
        "InvoiceSerieOrNumber": "CFF",  # E-Arşiv seri
        "IssueDate": "2026-02-15T10:00:00.000Z",
        "CurrencyCode": "TRY",
        "LineExtensionAmount": 100.00,
        "PayableAmount": 118.00,
        "KdvTotal": 18.00,
        # ... diğer alanlar
    },
    "CompanyInfo": {
        # Firma bilgileri
    },
    "CustomerInfo": {
        # Müşteri bilgileri (bireysel müşteri için TaxNumber boş olabilir)
    },
    "InvoiceLines": [
        # Fatura kalemleri
    ]
}

# E-Arşiv fatura oluştur
result = client.create_archive_invoice(archive_invoice)
if result['success']:
    print("E-Arşiv fatura taslağı oluşturuldu!")
    invoice_uuid = result['data']['UUID']
    
    # Taslağı onayla ve gönder
    send_result = client.confirm_and_send_archive_drafts([invoice_uuid])
    if send_result['success']:
        print("E-Arşiv fatura gönderildi!")

E-Fatura Serileri

# E-Fatura serilerini listele
series_result = client.get_einvoice_series()
if series_result['success']:
    for series in series_result['data']:
        print(f"Seri: {series['Name']} - ID: {series['ID']}")

# E-Arşiv serilerini listele
archive_series_result = client.get_earchive_series()
if archive_series_result['success']:
    for series in archive_series_result['data']:
        print(f"E-Arşiv Seri: {series['Name']} - ID: {series['ID']}")

Toplu Fatura Gönderimi

# Birden fazla taslak faturayı toplu gönder
invoice_uuids = [
    "uuid-1",
    "uuid-2",
    "uuid-3"
]

# E-Fatura için (ihracat)
result = client.confirm_and_send_draft(
    invoice_uuids, 
    alias="urn:mail:ihracatpk@gtb.gov.tr"  # İhracat için GTB
)

# E-Fatura için (iç piyasa - müşteri alias'ı ile)
result = client.confirm_and_send_draft(
    invoice_uuids,
    alias="urn:mail:customer@firma.com"  # Müşteri alias'ı
)

# E-Arşiv için
result = client.confirm_and_send_archive_drafts(invoice_uuids)

if result['success']:
    print(f"{len(invoice_uuids)} fatura başarıyla gönderildi!")

Fatura Sorgulama

invoice_uuid = "550e8400-e29b-41d4-a716-446655440000"

# Durum sorgula
status = client.get_invoice_status(invoice_uuid)
print(f"Durum: {status['data']}")

# GTB'den sorgula (ihracat için)
gtb_status = client.check_from_gtb(invoice_uuid)
if gtb_status['success']:
    print(f"Gümrük Tescil No: {gtb_status['data'].get('CustomsRegistrationNumber')}")

# Detayları al
details = client.get_invoice_details(invoice_uuid)
if details['success']:
    print(f"Fatura No: {details['data']['InvoiceNumber']}")

Fatura İndirme

invoice_uuid = "550e8400-e29b-41d4-a716-446655440000"

# PDF indir
pdf_result = client.get_invoice_pdf(invoice_uuid)
if pdf_result['success']:
    with open('fatura.pdf', 'wb') as f:
        f.write(pdf_result['data'])
    print(f"PDF indirildi ({pdf_result['size']} bytes)")

# HTML indir
html_result = client.get_invoice_html(invoice_uuid)
if html_result['success']:
    with open('fatura.html', 'wb') as f:
        f.write(html_result['data'])

# XML indir
xml_result = client.get_invoice_xml(invoice_uuid)
if xml_result['success']:
    with open('fatura.xml', 'wb') as f:
        f.write(xml_result['data'])

Gelen Faturalar

# Son 30 gün
from datetime import datetime, timedelta

end_date = datetime.now()
start_date = end_date - timedelta(days=30)

result = client.get_incoming_invoices(
    start_date=start_date.isoformat() + '.000Z',
    end_date=end_date.isoformat() + '.999Z',
    page=1,
    page_size=50
)

if result['success']:
    invoices = result['data']['Content']
    print(f"Toplam {len(invoices)} fatura bulundu")
    
    for invoice in invoices:
        print(f"- {invoice['InvoiceNumber']} | {invoice['SenderTitle']}")

TCMB Döviz Kuru Servisi

from nilvera_client import TCMBCurrencyService

# Bugünün USD alış kuru
result = TCMBCurrencyService.get_latest_usd_buy_rate()
if result['success']:
    print(f"USD/TRY: {result['rate']:.4f} ({result['date']})")

# EUR alış kuru
result = TCMBCurrencyService.get_latest_eur_buy_rate()
if result['success']:
    print(f"EUR/TRY: {result['rate']:.4f}")

# Belirli bir tarih için
from datetime import datetime
date = datetime(2026, 1, 15)
result = TCMBCurrencyService.get_exchange_rate('USD', date=date)

Hata Yönetimi

from nilvera_client import (
    NilveraClient,
    NilveraException,
    NilveraConnectionError,
    NilveraTimeoutError,
    NilveraAPIError
)

try:
    client = NilveraClient(api_key='your-key')
    result = client.test_connection()
    
except NilveraConnectionError as e:
    print(f"Bağlantı hatası: {e}")
    
except NilveraTimeoutError as e:
    print(f"Zaman aşımı: {e}")
    
except NilveraAPIError as e:
    print(f"API Hatası [{e.status_code}]: {e}")
    print(f"Ham yanıt: {e.response}")
    
except NilveraException as e:
    print(f"Genel hata: {e}")

Loglama

import logging

# DEBUG seviyesinde detaylı loglar
logging.basicConfig(level=logging.DEBUG)

# Sadece nilvera_client logları
logger = logging.getLogger('nilvera_client')
logger.setLevel(logging.DEBUG)

Production Ortamı

# Production API kullanımı
client = NilveraClient(
    api_key='production-api-key',
    environment='production'
)

# Özel URL (gerekirse)
client = NilveraClient(
    api_key='your-key',
    environment='production',
    production_url='https://custom-api.example.com'
)

Gereksinimler

  • Python 3.7+
  • requests >= 2.25.0

Lisans

MIT License - Detaylar için LICENSE dosyasına bakın.

Katkıda Bulunma

Pull request'ler memnuniyetle karşılanır! Büyük değişiklikler için lütfen önce bir issue açarak ne değiştirmek istediğinizi tartışın.

Destek

Yasal Uyarı

Bu kütüphane Nilvera tarafından resmi olarak desteklenmemektedir. Kullanımınız tamamen kendi sorumluluğunuzdadır.

Teşekkürler

  • Nilvera API dokümantasyonu
  • TCMB döviz kuru servisi

Not: Bu kütüphane aktif geliştirme aşamasındadır. Production ortamında kullanmadan önce detaylı testler yapmanız önerilir.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nilvera_client-1.1.1.tar.gz (15.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nilvera_client-1.1.1-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file nilvera_client-1.1.1.tar.gz.

File metadata

  • Download URL: nilvera_client-1.1.1.tar.gz
  • Upload date:
  • Size: 15.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.0

File hashes

Hashes for nilvera_client-1.1.1.tar.gz
Algorithm Hash digest
SHA256 88f71f4f684ae6b406af209a693027a6ca7079caaf9a61ec14c91915bdfe00d4
MD5 3eb1dfa8de9ddf212efa1369a7bd018d
BLAKE2b-256 0e7434033a1d33122565b4fcb254e287c460607a601c2f7012332b73dc24f7d2

See more details on using hashes here.

File details

Details for the file nilvera_client-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: nilvera_client-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 13.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.0

File hashes

Hashes for nilvera_client-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 0ed4d82b1c31106974ccf5b37e2d416860c9386ad954db1cd444d855441af77e
MD5 5440eb51b3b6f4f1ed6e38c71d171d77
BLAKE2b-256 0f99a8146fe2df52ce76dd1fd62be265d347705367f7222c151a634ca1a764cc

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page