TSE Uyumluluğu — Vergi denetçileri için dokümantasyon¶
Bu belge vergi denetçilerine, mali makamlara ve mali müşavirlere yöneliktir ve DiKAS kasa sistemindeki TSE bağlantısının teknik uygulamasını geçerli yasal gereklilikler uyarınca açıklar.
1. Yasal Dayanaklar¶
DiKAS aşağıdaki düzenlemelerin gerekliliklerini karşılar:
| Düzenleme | İçerik |
|---|---|
| § 146a AO | Düzgün kasa yönetimi, bir TSE kullanma zorunluluğu |
| KassenSichV | Kasa Güvenlik Yönetmeliği — TSE için teknik gereklilikler |
| AEAO zu § 146a AO | ProcessTypes, ProcessData, QR koduna ilişkin ayrıntılı hükümler içeren uygulama yönergesi |
| DSFinV-K | Kasa sistemleri için mali idarenin dijital arayüzü |
| GDPdU / GoBD | Defterlerin düzgün tutulması ve saklanmasına ilişkin esaslar (dijital işletme denetimi) |
2. İmzalanan İşlem Türleri (ProcessTypes)¶
DiKAS, §146a AO'ya ilişkin AEAO uyarınca kasayla ilgili tüm işlemleri imzalar — yalnızca fişleri değil. DSFinV-K uyarınca üç ProcessType kullanılır:
2.1 Kassenbeleg-V1¶
| Özellik | Değer |
|---|---|
| ProcessType | Kassenbeleg-V1 |
| Tetikleyen işlemler | Tamamlanan her ödeme (Doğrudan satış, masa ödemesi, iptal) |
| Entities | Receipt (DocumentType: Receipt2) |
ProcessData formatı:
Örnekler:
Beleg^119.00_19.00:19.00 # Ein Steuersatz (19%)
Beleg^50.00_19.00:5.00_7.00:2.00 # Zwei Steuersätze (19% + 7%)
Beleg^0.00_0.00:0.00 # Nullbeleg
Tüm tutarlar iki ondalık basamak ve ondalık ayırıcı olarak nokta ile biçimlendirilir (Invariant Culture), DSFinV-K spesifikasyonuna uygundur.
2.2 Bestellung-V1¶
| Özellik | Değer |
|---|---|
| ProcessType | Bestellung-V1 |
| Tetikleyen işlemler | Masa servisindeki her sipariş verme |
| Entities | OpenBon (DocumentType: OpenBon) |
ProcessData formatı:
Örnek:
Toplu siparişlerde (Batch) TSE imzası, partinin ilk fişine kaydedilir. ProcessData, tüm siparişin tüm pozisyonlarını içerir.
2.3 SonstigerVorgang¶
| Özellik | Değer |
|---|---|
| ProcessType | SonstigerVorgang |
| Tetikleyen işlemler | Vardiya açılışı, vardiya kapanışı, gün sonu raporu, giderler |
| Entities | Exchange, DayClose, Spending |
ProcessData formatı:
Somut işlem türleri:
| İşlem türü | Açıklama | Örnek ProcessData |
|---|---|---|
AVSichOpen |
Vardiya açılışı | AVSichOpen^Schichteroeffnung^200.00 |
AVSichClose |
Vardiya kapanışı | AVSichClose^Schichtschliessung^350.00 |
AVKassenschnitt |
Gün sonu raporu (Z raporu) | AVKassenschnitt^Tagesabschluss^1500.00 |
AVBelegabbruch |
İptal işlemi | AVBelegabbruch^Storno |
AVSons662 |
Gider/Nakit çıkışı | AVSonstige^Ausgabe^50.00 |
3. Belgeler Üzerindeki TSE Veri Alanları¶
İmzalanan her belge, aşağıdaki 9 TSE alanını saklar (ITseDataHolder arayüzü üzerinden uygulanmıştır):
| Alan | Tür | Açıklama |
|---|---|---|
TseTransactionNumber |
String | TSE'nin benzersiz işlem numarası |
TseSignature |
String | Dijital imza (Base64 kodlu) |
TseStartTime |
DateTime | İmzalamanın başlangıcı (UTC) |
TseEndTime |
DateTime | İmzalamanın sonu (UTC) |
TseSignatureCounter |
UInt64 | Monoton artan imza sayacı |
TseProcessData |
String | İmzalanan işlem verileri (bkz. Bölüm 2) |
TseProcessType |
String | ProcessType tanımlayıcısı |
TseSerialNumber |
String | Kullanılan TSE'nin seri numarası |
TseError |
String | İmzalama hatasında hata mesajı (başarıda null) |
Bu alanlar aşağıdaki varlıklarda saklanır:
- Receipt — Fişler (Satış, iptal, iade)
- OpenBon — Sipariş pozisyonları (Toplu siparişlerde Lead-Bon)
- Exchange — Vardiya açılışları ve kapanışları
- DayClose — Gün sonu raporları (Z raporları)
- Spending — Giderler ve nakit çıkışları
4. QR Kod Formatı (DSFinV-K Ek I)¶
Her fiş, TSE verilerini DSFinV-K Ek I uyarınca standartlaştırılmış formatta içeren bir QR kodu barındırır:
V0;{KassenSeriennummer};{ProcessType};{ProcessData};{TransaktionsNr};{SignaturZähler};{StartZeit};{EndZeit};{SigAlgorithmus};{LogZeitformat};{Signatur};{PublicKey}
Somut:
V0;KASSE-001;Kassenbeleg-V1;Beleg^29.30_19.00:4.68;12345;67890;2026-03-13T18:30:00.000Z;2026-03-13T18:30:01.000Z;ecdsa-plain-SHA256;unixTime;a8f3c2d1e5b7...;PK123...
| Konum | Alan | Kaynak |
|---|---|---|
| 1 | Sürüm | Her zaman V0 |
| 2 | Kasa seri numarası | BackendConfig'ten CashPointSerialNumber |
| 3 | ProcessType | Belgeden TseProcessType |
| 4 | ProcessData | Belgeden TseProcessData |
| 5 | İşlem numarası | Belgeden TseTransactionNumber |
| 6 | İmza sayacı | Belgeden TseSignatureCounter |
| 7 | Başlangıç zamanı | TseStartTime (ISO 8601, UTC) |
| 8 | Bitiş zamanı | TseEndTime (ISO 8601, UTC) |
| 9 | İmza algoritması | TseConfig'ten SigAlg (Standart: ecdsa-plain-SHA256) |
| 10 | Günlük zaman formatı | TseConfig'ten LogTimeFormat (Standart: unixTime) |
| 11 | İmza | Belgeden TseSignature |
| 12 | Açık anahtar | TseConfig'ten PublicKey |
5. Kasa Tanımlaması (ClientId)¶
Kasa tanımlaması üç aşamalı bir geri dönüş zincirini izler:
| Öncelik | Kaynak | Açıklama |
|---|---|---|
| 1 | CashPointSerialNumber |
Açıkça yapılandırılmış kasa seri numarası (Lisans) |
| 2 | BonIdServer |
BackendConfig'ten fiş sunucusu tanımlayıcısı |
| 3 | "1" |
Geri dönüş varsayılan değeri |
Bu ClientId, her TSE imzalamasında kasa tanımlayıcısı olarak iletilir ve QR kodunda kasa seri numarası olarak görünür.
6. TSE Yapılandırması¶
TSE yapılandırması configTSE (TseConfig) belgesinde saklanır:
| Alan | Açıklama |
|---|---|
PublicKey |
TSE'nin açık anahtarı |
Serial |
TSE'nin seri numarası |
SigAlg |
İmza algoritması (Standart: ecdsa-plain-SHA256) |
LogTimeFormat |
TSE günlüklerinin zaman formatı (Standart: unixTime) |
LocalPath |
Donanım TSE'sine yerel yol |
SetupDate |
TSE devreye alma tarihi |
DecomissionDate |
TSE devreden çıkarma tarihi |
TSESerialId |
Dahili seri kimliği |
Desteklenen TSE Bağlantıları¶
| Tür | Uygulama | Açıklama |
|---|---|---|
| Donanım (Swissbit) | SwissbitTseService |
Swissbit TSE'ye doğrudan USB erişimi |
| Proxy (Ağ) | TseProxyService |
HTTP proxy üzerinden TSE (örn. Fiskaltrust) |
| Router | TseServiceRouter |
Otomatik yönlendirme: Proxy tercih edilir, donanıma geri dönüş |
7. Arıza Güvenliği ve Protokolleme¶
TSE Arıza Protokolü (TseOutageLog)¶
§146a AO'ya ilişkin AEAO uyarınca DiKAS her TSE arızasını otomatik olarak belgeler:
| Alan | Açıklama |
|---|---|
StartTime |
Arızanın başlangıcı (UTC) |
EndTime |
Arızanın sonu (UTC, hâlâ devam ediyorsa null) |
Reason |
Neden (örn. „TSE not available", „TSE timeout") |
AffectedTransactions |
Etkilenen işlem sayısı |
TSE arızasında akış:
- TSE imzalaması başarısız olur → Belge üzerindeki
TseErroralanı ayarlanır - Yeni bir
TseOutageLogkaydı oluşturulur (StartTime ve Reason ile) - Kasa işlemi engellenmez — işlem imzasız olarak saklanır
- Bir sonraki başarılı imzalamada tüm açık arıza kayıtları kapatılır (EndTime ayarlanır)
Timeout: Her TSE imzalamasının 5 saniyelik bir zaman aşımı vardır. Aşıldığında TseError = "TSE timeout" ayarlanır.
Denetimde Doğrulama¶
TseError != null olan her belgede, belgelenmiş bir imzalama hatası mevcuttur. İlgili TseOutageLog kaydı, arızanın dönemini ve nedenini kanıtlar.
8. İşletme Denetimi için Veri Dışa Aktarma¶
8.1 DSFinV-K Dışa Aktarma¶
DiKAS, tüm kasa verilerini DSFinV-K formatında (Kasa sistemleri için mali idarenin dijital arayüzü) dışa aktarır:
- DSFinV-K spesifikasyonu uyarınca zorunlu tüm CSV dosyaları
- Döneme bağlı dışa aktarma mümkün
- İçerir: Tekil kayıtlar, ana veriler, TSE verileri, kasa kesimleri
8.2 TSE-TAR Dışa Aktarma¶
TSE günlük verilerinin doğrudan TAR arşivi olarak dışa aktarımı:
- Tam dışa aktarma: TSE'nin saklanan tüm işlemleri
- Filtreli dışa aktarma: Döneme göre (startDate/endDate)
- API uç noktası:
GET /api/v1/tse/export/tar
8.3 GDPdU Dışa Aktarma¶
GDPdU/GoBD uyarınca dijital işletme denetimi için:
- Vergi açısından ilgili tüm verileri içeren yapılandırılmış dışa aktarma dosyası
- Denetim yazılımları için makine tarafından okunabilir (IDEA, AIS, etc.)
8.4 DATEV Dışa Aktarma¶
Mali müşavirde devam eden muhasebe için:
- 7 dışa aktarma modu (Gün sonu raporu, ProBon, ProÖffnungstag, WGR, WGR2, NachRechnung, Giderler)
- Doğru BU anahtarlarıyla EXTF formatı v13 (USt 3/2/40, VSt 9/8/40)
- İsteğe bağlı şifreli (AES-256 ZIP) ve e-posta ile gönderilebilir
9. İmzalama Sürecinin Ayrıntıları¶
9.1 Bir imzalamanın akışı¶
Kassenvorgang → TseSigningHelper → ITseService → TSE (Hardware/Proxy)
│ │
│ 1. BackendConfig laden │
│ 2. Prüfen: TSE verfügbar? │
│ 3. ProcessData aufbauen │
│ 4. ClientId auflösen │
│ 5. SignReceiptAsync aufrufen ───────→│
│ 6. Ergebnis auf Entity speichern ←──│
│ 7. OutageLog aktualisieren │
└──────────────────────────────────────┘
9.2 Hangi Handler'lar imzalar?¶
| Handler | İşlem | ProcessType |
|---|---|---|
ProcessDirectSaleCommand |
Doğrudan satış | Kassenbeleg-V1 |
ProcessTablePaymentCommand |
Masa ödemesi | Kassenbeleg-V1 |
VoidReceiptCommand |
İptal | Kassenbeleg-V1 |
CreateOpenBonCommand |
Tekil sipariş | Bestellung-V1 |
CreateOpenBonsBatchCommand |
Toplu sipariş | Bestellung-V1 |
OpenExchangeCommand |
Vardiya açılışı | SonstigerVorgang |
CloseExchangeCommand |
Vardiya kapanışı | SonstigerVorgang |
PerformDayCloseCommand |
Gün sonu raporu | SonstigerVorgang |
CreateSpendingCommand |
Gider/Nakit çıkışı | SonstigerVorgang |
9.3 Hata İşleme¶
TSE imzalaması engellemeyen olarak uygulanmıştır:
- TSE hataları
TseErroralanında belgelenir, işlem yine de saklanır - Tüm imzalama sürecini saran bir
try/catch, TSE sorunlarının kasa işletmesini aksatmasını engeller HandleOutageLogAsyncmetodu, her imzalamadan sonra arıza protokolünü günceller (başarı veya hata)
10. Kayıtların Eksiksizliği¶
Kesintisiz İmzalama¶
DiKAS, kasayla ilgili tüm işlemlerin kesintisiz imzalanmasını şu şekilde garanti eder:
- Merkezi imzalama mantığı: Tüm imzalamalar
TseSigningHelperüzerinden çalışır — kasayla ilgili bir işlemi TSE çağrısı olmadan tamamlamanın hiçbir yolu yoktur - Monoton imza sayacı:
TseSignatureCounterTSE tarafından yönetilir ve monoton olarak artar. Sayaçtaki boşluklar,TseOutageLogiçinde belgelenen arızalara işaret eder - İşlem numaraları: Her TSE işlemi benzersiz bir
TseTransactionNumberalır - Zaman damgaları: Her imzalamanın başlangıç ve bitiş zamanı saklanır
Manipülasyona Karşı Koruma¶
- İmza algoritması: SHA-256 ile ECDSA (ecdsa-plain-SHA256)
- TSE donanımı BSI sertifikalıdır (Common Criteria)
- TSE'nin açık anahtarı TseConfig içinde saklanır ve imza doğrulaması için kullanılabilir
- İmzalanan belgelerdeki sonraki değişiklikler, kriptografik imza sayesinde tespit edilebilir
11. Vergi denetçileri için denetim notları¶
TSE verilerini nerede bulursunuz?¶
| Veri kaynağı | Erişim |
|---|---|
| Belgeler üzerindeki TSE alanları | Her Receipt/OpenBon/Exchange/DayClose/Spending belgesinde |
| QR kodları | Basılı fişlerde |
| TSE arıza protokolü | Veritabanındaki TseOutageLog belgeleri |
| TSE yapılandırması | configTSE belgesi |
| DSFinV-K Dışa Aktarma | Yönetici → Ayarlar → Dışa aktar → DSFinV-K |
| TSE-TAR Dışa Aktarma | Yönetici → Ayarlar → TSE → Dışa aktar |
| GDPdU Dışa Aktarma | Yönetici → Ayarlar → Dışa aktar → GDPdU |
İmzaları nasıl denetlersiniz?¶
- QR kodunu tarayın: Her fiş, V0 formatında bir QR kodu içerir (DSFinV-K Ek I)
- TSE-TAR dışa aktarın: TAR dosyası tüm TSE günlük verilerini içerir ve denetim araçlarıyla doğrulanabilir
- İmza sayacını kontrol edin: Monoton artan sayaç, açıklanamayan boşluklar içermemelidir
- Arıza protokolü: İmza sayacındaki boşluklar TseOutageLog kayıtlarıyla açıklanmalıdır
- Açık anahtar: TseConfig içinde bulunur ve tekil imzaların hesaplamalı denetimi için kullanılabilir
Kasa denetimi için kontrol listesi¶
- TSE seri numarası, maliyeye bildirilenle eşleşir
- İmza sayacı kesintisizdir (Boşluklar arıza protokolleriyle açıklanabilir)
- ProcessTypes, AEAO hükümlerine uygundur (Kassenbeleg-V1, Bestellung-V1, SonstigerVorgang)
- ProcessData formatları DSFinV-K uyumludur
- QR kod formatı DSFinV-K Ek I'e uygundur (V0 formatı)
- Zaman damgaları makuldür (Başlangıç < Bitiş, kronolojik artan)
- TSE arıza süreleri belgelenmiş ve izlenebilirdir
- Kasayla ilgili tüm işlem türleri imzalanır (yalnızca fişler değil)
- DSFinV-K dışa aktarımı eksiksiz ve makine tarafından okunabilirdir
- TSE sertifikası denetim döneminde geçerliydi
12. Teknik Temel Veriler¶
| Özellik | Değer |
|---|---|
| İmza algoritması | SHA-256 ile ECDSA (ecdsa-plain-SHA256) |
| QR kod formatı | DSFinV-K Ek I, Sürüm V0 |
| Zaman formatı | ISO 8601, UTC (yyyy-MM-ddTHH |
| Tutar formatı | Invariant Culture, 2 ondalık basamak (örn. 119.00) |
| TSE-Timeout | İmzalama başına 5 saniye |
| Desteklenen TSE | Swissbit (USB), ağ proxy'si |
| Arıza davranışı | Engellemeyen, otomatik protokolleme |
| Veritabanı | CouchDB veya SQLite/SQL Server (yapılandırılabilir) |
| API tabanı | .NET 10, Clean Architecture, MediatR ile CQRS |
| Test kapsamı | 17 özel TSE testi (İmzalama, ProcessData, QR kod, geri dönüş) |
Ek: İşlem türü → Belge → Veritabanı eşlemesi¶
| Kasa işlemi | ProcessType | Entity | DocumentType | Veritabanı koleksiyonu |
|---|---|---|---|---|
| Doğrudan satış (nakit/kart) | Kassenbeleg-V1 | Receipt | Receipt2 | receipt2 |
| Masa ödemesi | Kassenbeleg-V1 | Receipt | Receipt2 | receipt2 |
| İptal | Kassenbeleg-V1 | Receipt | Receipt2 | receipt2 |
| Sipariş (Masa) | Bestellung-V1 | OpenBon | OpenBon | openbon |
| Toplu sipariş | Bestellung-V1 | OpenBon | OpenBon | openbon |
| Vardiya açılışı | SonstigerVorgang | Exchange | Exchange2 | exchange2 |
| Vardiya kapanışı | SonstigerVorgang | Exchange | Exchange2 | exchange2 |
| Gün sonu raporu (Z raporu) | SonstigerVorgang | DayClose | DayClose2 | dayclose2 |
| Gider/Nakit çıkışı | SonstigerVorgang | Spending | CashPointSpending | cashpointspending |