{"openapi":"3.1.0","info":{"title":"IDIS Integration Service","description":"SAP ↔ portal.idis.gov.tr köprü servisi.\n\n**Auth**: İki yöntem desteklenir:\n1. **Username/password → JWT** (insanlar için). `POST /auth/login` ile token al, `Authorization: Bearer <token>` ile diğer endpoint'lere eriş.\n2. **API Key** (servisler için). Login sonrası `POST /auth/api-keys` ile üret. `X-API-Key: <key>` veya `Authorization: Bearer <key>` ile kullan.\n\nİlk admin kullanıcıyı oluşturmak için: `python -m scripts.create_admin`","version":"0.1.0"},"paths":{"/health":{"get":{"tags":["Sistem"],"summary":"Servis sağlık kontrolü","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Health Get"}}}}}}},"/health/ready":{"get":{"tags":["Sistem"],"summary":"Servis hazirlik kontrolu","operationId":"readiness_health_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/token":{"post":{"tags":["Kimlik: Giriş & Token"],"summary":"OAuth2 password flow — Swagger UI 🔒 Authorize butonu için","description":"OAuth2 standart token endpoint — `application/x-www-form-urlencoded` body.\n\nSwagger UI'daki **🔒 Authorize → OAuth2** butonu bunu otomatik çağırır.\nTek seferlik login → Swagger tüm sonraki istekleri otomatik Bearer ile atar.\n\nProgramatik kullanım için `POST /auth/login` (JSON body) tercih edilir.","operationId":"oauth2_token_endpoint_api_v1_auth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_oauth2_token_endpoint_api_v1_auth_token_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"object","title":"Response Oauth2 Token Endpoint Api V1 Auth Token Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["Kimlik: Giriş & Token"],"summary":"Kullanıcı login JSON body (programatik) — username/password → JWT","description":"Servisimizdeki kullanıcı (MongoDB) ile login.\n\nUsername veya email kabul edilir. Başarılıysa **1 saat geçerli JWT** döner.\nDiğer endpoint'lerde `Authorization: Bearer <token>` ile kullan.","operationId":"login_endpoint_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/me":{"get":{"tags":["Kimlik: Giriş & Token"],"summary":"Şu anki bağlı kullanıcı bilgisi","operationId":"me_endpoint_api_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserView"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/auth/change-password":{"post":{"tags":["Kimlik: Giriş & Token"],"summary":"Kendi şifreni değiştir","operationId":"change_password_endpoint_api_v1_auth_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Change Password Endpoint Api V1 Auth Change Password Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/auth/api-keys":{"get":{"tags":["Kimlik: API Anahtarları"],"summary":"API key listesi (admin: tümü, normal: sadece kendi)","operationId":"list_api_keys_endpoint_api_v1_auth_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApiKeyView"},"type":"array","title":"Response List Api Keys Endpoint Api V1 Auth Api Keys Get"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]},"post":{"tags":["Kimlik: API Anahtarları"],"summary":"Yeni API key üret (login zorunlu)","description":"Yeni API key üretir. **Ham key sadece bu cevapta görünür** —\nsonradan asla geri okunamaz.\n\nLogin olan herkes kendi adına API key üretebilir.","operationId":"create_api_key_endpoint_api_v1_auth_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/auth/api-keys/{api_key_id}":{"delete":{"tags":["Kimlik: API Anahtarları"],"summary":"API key revoke (sahibi veya admin)","operationId":"revoke_api_key_endpoint_api_v1_auth_api_keys__api_key_id__delete","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"api_key_id","in":"path","required":true,"schema":{"type":"string","title":"Api Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Revoke Api Key Endpoint Api V1 Auth Api Keys  Api Key Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/users":{"get":{"tags":["Kimlik: Kullanıcılar"],"summary":"Kullanıcılar (superadmin: tümü, admin: kendi tenant'ı)","operationId":"list_users_endpoint_api_v1_auth_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserView"},"type":"array","title":"Response List Users Endpoint Api V1 Auth Users Get"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]},"post":{"tags":["Kimlik: Kullanıcılar"],"summary":"Yeni kullanıcı oluştur (admin only)","operationId":"create_user_endpoint_api_v1_auth_users_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/auth/idis-session":{"get":{"tags":["IDIS Bağlantı: Portal Cookie"],"summary":"IDIS portal session durumu (giriş yapan kullanıcının kendi cookie'si)","operationId":"idis_session_status_api_v1_auth_idis_session_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionStatus"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]},"post":{"tags":["IDIS Bağlantı: Portal Cookie"],"summary":"IDIS portal cookie inject (Chrome'dan kopyala — kullanıcı bazlı saklanır)","description":"Chrome'dan kopyalanan `_rails8_session` + `remember_user_token` +\n`csrf_token`'ı şifreleyerek **giriş yapan kullanıcının kendi kaydına** yazar.\n14 gün boyunca o kullanıcının IDIS çağrıları bu cookie'yi kullanır.","operationId":"inject_idis_session_api_v1_auth_idis_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionInjectRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]},"delete":{"tags":["IDIS Bağlantı: Portal Cookie"],"summary":"IDIS portal session sil (sadece giriş yapan kullanıcının kendi cookie'si)","operationId":"clear_idis_session_api_v1_auth_idis_session_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Clear Idis Session Api V1 Auth Idis Session Delete"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/auth/idis-session/import-capture":{"post":{"tags":["IDIS Bağlantı: Portal Cookie"],"summary":"IDIS login capture'dan session import (txt dosyasız)","description":"POST `/users/sign_in` request/response ham metninden cookie'leri alır ve\n**giriş yapan kullanıcının** kaydına yazar.\n\n`set-cookie: _rails8_session=...` ve mümkünse\n`set-cookie: remember_user_token=...` satırlarını parse eder, IDIS'ten taze\nCSRF token alır ve encrypted session store'a yazar.","operationId":"import_idis_session_capture_api_v1_auth_idis_session_import_capture_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionCaptureImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/admin/tenants":{"get":{"tags":["Yönetim: Tenant"],"summary":"Tüm tenant'ları listele (superadmin)","operationId":"list_tenants_endpoint_api_v1_admin_tenants_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TenantView"},"type":"array","title":"Response List Tenants Endpoint Api V1 Admin Tenants Get"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]},"post":{"tags":["Yönetim: Tenant"],"summary":"Yeni tenant oluştur (superadmin)","operationId":"create_tenant_endpoint_api_v1_admin_tenants_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/admin/tenants/{tenant_id}":{"get":{"tags":["Yönetim: Tenant"],"summary":"Tenant detay (superadmin)","operationId":"get_tenant_endpoint_api_v1_admin_tenants__tenant_id__get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Yönetim: Tenant"],"summary":"Tenant güncelle (superadmin)","operationId":"update_tenant_endpoint_api_v1_admin_tenants__tenant_id__patch","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Yönetim: Tenant"],"summary":"Tenant sil (superadmin — kullanıcısı yoksa)","operationId":"delete_tenant_endpoint_api_v1_admin_tenants__tenant_id__delete","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Delete Tenant Endpoint Api V1 Admin Tenants  Tenant Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/tenants/{tenant_id}/users":{"get":{"tags":["Yönetim: Tenant Kullanıcıları"],"summary":"Tenant'ın kullanıcılarını listele","operationId":"list_tenant_users_endpoint_api_v1_admin_tenants__tenant_id__users_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UserView"},"title":"Response List Tenant Users Endpoint Api V1 Admin Tenants  Tenant Id  Users Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Yönetim: Tenant Kullanıcıları"],"summary":"Tenant'a kullanıcı ekle","operationId":"create_tenant_user_endpoint_api_v1_admin_tenants__tenant_id__users_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}":{"patch":{"tags":["Yönetim: Tenant Kullanıcıları"],"summary":"Kullanıcı güncelle (rol, tenant, aktiflik)","operationId":"update_user_endpoint_api_v1_admin_users__user_id__patch","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}/idis-credentials":{"put":{"tags":["Yönetim: Tenant Kullanıcıları"],"summary":"Kullanıcının IDIS credential'larını ayarla","operationId":"set_user_idis_credentials_endpoint_api_v1_admin_users__user_id__idis_credentials_put","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdisCredentialSetRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Yönetim: Tenant Kullanıcıları"],"summary":"Kullanıcının IDIS credential'larını sil","operationId":"clear_user_idis_credentials_endpoint_api_v1_admin_users__user_id__idis_credentials_delete","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Clear User Idis Credentials Endpoint Api V1 Admin Users  User Id  Idis Credentials Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Yönetim: Tenant Kullanıcıları"],"summary":"Kullanıcının IDIS credential DURUMUNU al (plaintext döndürmez)","description":"IDIS e-postası + kimlik olup olmadığını döndürür. **Güvenlik:** decrypted şifreyi DÖNDÜRMEZ — görüntülemek için re-auth'lu `POST .../reveal` kullanın. Yetki: superadmin → herkes; admin → kendi tenant'ındaki kullanıcılar.","operationId":"user_idis_credentials_status_endpoint_api_v1_admin_users__user_id__idis_credentials_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"boolean"},{"type":"null"}]},"title":"Response User Idis Credentials Status Endpoint Api V1 Admin Users  User Id  Idis Credentials Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}/idis-credentials/reveal":{"post":{"tags":["Yönetim: Tenant Kullanıcıları"],"summary":"Kullanıcının IDIS şifresini re-auth ile göster (admin/superadmin)","description":"Çağıranın **kendi sistem şifresini** tekrar girmesini ister (re-auth); doğrulanırsa DB'deki AES-256-GCM şifreli IDIS şifresini çözüp döndürür.\n\nYetki: superadmin → herkes; admin → kendi tenant'ı. Her görüntüleme audit log'lanır. Sistem/giriş şifresi tek yönlü hash olduğundan asla gösterilemez — yalnızca doğrulama için kullanılır.","operationId":"reveal_user_idis_password_endpoint_api_v1_admin_users__user_id__idis_credentials_reveal_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevealSecretRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"boolean"},{"type":"null"}]},"title":"Response Reveal User Idis Password Endpoint Api V1 Admin Users  User Id  Idis Credentials Reveal Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/users/{user_id}/idis-session":{"get":{"tags":["Yönetim: Tenant Kullanıcıları"],"summary":"Başka bir kullanıcının IDIS portal cookie durumu (admin/superadmin)","operationId":"get_user_idis_session_endpoint_api_v1_admin_users__user_id__idis_session_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Yönetim: Tenant Kullanıcıları"],"summary":"Başka bir kullanıcı için IDIS portal cookie inject et (admin/superadmin)","description":"Hedef kullanıcının IDIS portal cookie'sini ayarlar. `user_email` boşsa\nkullanıcının `idis_email` veya `email` alanı otomatik kullanılır.","operationId":"inject_user_idis_session_endpoint_api_v1_admin_users__user_id__idis_session_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionInjectRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Yönetim: Tenant Kullanıcıları"],"summary":"Başka bir kullanıcının IDIS portal cookie'sini sil (admin/superadmin)","operationId":"clear_user_idis_session_endpoint_api_v1_admin_users__user_id__idis_session_delete","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Clear User Idis Session Endpoint Api V1 Admin Users  User Id  Idis Session Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/tenants/{tenant_id}/system-settings":{"get":{"tags":["Yönetim: Sistem Ayarları"],"summary":"Tenant sistem ayarlarını getir (SMTP + bildirimler)","operationId":"get_system_settings_endpoint_api_v1_admin_tenants__tenant_id__system_settings_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemSettingsView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Yönetim: Sistem Ayarları"],"summary":"Tenant sistem ayarlarını kaydet (SMTP + bildirim kuralları)","operationId":"update_system_settings_endpoint_api_v1_admin_tenants__tenant_id__system_settings_put","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemSettingsUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemSettingsView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/tenants/{tenant_id}/system-settings/test-email":{"post":{"tags":["Yönetim: Sistem Ayarları"],"summary":"Kayıtlı SMTP ayarlarıyla test e-postası gönder","description":"Önce ayarları kaydedin, sonra bu uçla verilen adrese bir test e-postası gönderilir. SMTP yapılandırması doğrulanmış olur. Sonuç `{ok, error}`.","operationId":"send_test_email_endpoint_api_v1_admin_tenants__tenant_id__system_settings_test_email_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestEmailRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestEmailResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/tenants/{tenant_id}/system-settings/notifications/{event}/trigger":{"post":{"tags":["Yönetim: Sistem Ayarları"],"summary":"Bir bildirimi elle tetikle (test + anlık durum)","description":"Seçilen bildirimi **o anki gerçek durumla** (portal.idis.gov.tr oturum durumu / agent çevrimiçi mi) doldurup hemen gönderir. Throttle ve aktif/pasif ayarını **atlar** — test ve durum kontrolü içindir. `to` verilirse yalnızca o adrese; boşsa olayın yapılandırılmış alıcılarına. Kayıtlı ayarlarla çalışır. Dönüşte o anki durum özeti (`detail`) gelir.","operationId":"trigger_notification_endpoint_api_v1_admin_tenants__tenant_id__system_settings_notifications__event__trigger_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"event","in":"path","required":true,"schema":{"type":"string","title":"Event"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualTriggerRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualTriggerResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/rate-limits":{"get":{"tags":["Yönetim: Rate Limits"],"summary":"List Rate Limits","operationId":"list_rate_limits_api_v1_admin_rate_limits_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"blocked_only","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Blocked Only"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RateLimitBucketView"},"title":"Response List Rate Limits Api V1 Admin Rate Limits Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/admin/rate-limits/{scope}/{bucket_id}":{"delete":{"tags":["Yönetim: Rate Limits"],"summary":"Unblock","operationId":"unblock_api_v1_admin_rate_limits__scope___bucket_id__delete","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"scope","in":"path","required":true,"schema":{"type":"string","title":"Scope"}},{"name":"bucket_id","in":"path","required":true,"schema":{"type":"string","title":"Bucket Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/logs/executions":{"get":{"tags":["Logs"],"summary":"List Executions","operationId":"list_executions_api_v1_logs_executions_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Date To"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Event Type"}},{"name":"operation","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Operation"}},{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Provider"}},{"name":"environment","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Environment"}},{"name":"success","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Success"}},{"name":"status_code","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":599,"minimum":100},{"type":"null"}],"title":"Status Code"}},{"name":"actor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Actor"}},{"name":"request_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Request Id"}},{"name":"correlation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Correlation Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_ExecutionLogView_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/logs/executions/{log_id}":{"get":{"tags":["Logs"],"summary":"Execution Detail","operationId":"execution_detail_api_v1_logs_executions__log_id__get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"log_id","in":"path","required":true,"schema":{"type":"string","example":"5eb7cf5a86d9755df3a6c593","title":"Log Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecutionLogView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/logs/audit":{"get":{"tags":["Logs"],"summary":"List Audit","operationId":"list_audit_api_v1_logs_audit_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Action"}},{"name":"actor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Actor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_AuditLogView_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/logs/audit/{log_id}":{"get":{"tags":["Logs"],"summary":"Audit Detail","operationId":"audit_detail_api_v1_logs_audit__log_id__get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"log_id","in":"path","required":true,"schema":{"type":"string","example":"5eb7cf5a86d9755df3a6c593","title":"Log Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLogView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/logs/summary":{"get":{"tags":["Logs"],"summary":"Summary","operationId":"summary_api_v1_logs_summary_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stakeholders":{"get":{"tags":["Veri: Kuruluş"],"summary":"/stakeholders sayfasını getir (kuruluş bilgisi + cookie ispat testi)","operationId":"get_stakeholders_api_v1_stakeholders_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StakeholdersPage"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/inventory":{"get":{"tags":["Veri: Envanter"],"summary":"/rebar_bundle_inventories — envanter listesi (filtre + pagination)","description":"Envanteri sayfalı + filtreli olarak döndürür.","operationId":"list_inventory_api_v1_inventory_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"facility_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facility Id"}},{"name":"steel_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Type"}},{"name":"steel_diameter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Diameter"}},{"name":"steel_length","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Steel Length"}},{"name":"casting_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Casting Number"}},{"name":"bundle_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bundle Number"}},{"name":"tag_serial_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag Serial Number"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/BundleState"}},{"type":"null"}],"title":"State"}},{"name":"updated_at_range","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At Range"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InventoryPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/inventory/{inventory_id}":{"get":{"tags":["Veri: Envanter"],"summary":"/rebar_bundle_inventories/{id}/rebar_bundle — bağ detayı + etiketler","description":"Bir bağın detay sayfasını döndürür:\n- **Özet**: bağ no, üretici, tesis, çelik tipi/çapı, uzunluk, çubuk adedi, döküm no\n- **Etiketler**: bağa ait fiziksel etiket(ler) — seri no + aktivasyon/deaktivasyon tarihleri\n- **inventory_number**: breadcrumb'taki 'EN-XXXXXXXX' numarası","operationId":"get_inventory_detail_api_v1_inventory__inventory_id__get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"inventory_id","in":"path","required":true,"schema":{"type":"string","description":"Envanter UUID'si","title":"Inventory Id"},"description":"Envanter UUID'si"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InventoryDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/acceptances":{"get":{"tags":["Veri: Bağ Kabulleri"],"summary":"/rebar_bundle_acceptances — Bağ Kabulleri listesi","operationId":"list_acceptances_api_v1_acceptances_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"acceptance_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"BK-XXXXXXXX","title":"Acceptance Number"},"description":"BK-XXXXXXXX"},{"name":"bundle_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bundle Number"}},{"name":"tag_serial_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag Serial Number"}},{"name":"steel_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Type"}},{"name":"steel_diameter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Diameter"}},{"name":"dispatch_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SE-XXXXXXX (geliş sevkiyat)","title":"Dispatch Number"},"description":"SE-XXXXXXX (geliş sevkiyat)"},{"name":"casting_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Casting Number"}},{"name":"created_at_range","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At Range"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptancesPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pre-dispatches":{"get":{"tags":["Veri: Bağ Yükleme"],"summary":"/pre_dispatches — Bağ Yükleme listesi","operationId":"list_pre_dispatches_api_v1_pre_dispatches_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"transaction_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"GSN-...","title":"Transaction Number"},"description":"GSN-..."},{"name":"plate_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plate Number"}},{"name":"tag_serial_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag Serial Number"}},{"name":"search_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"dd.mm.yyyy","title":"Search Date"},"description":"dd.mm.yyyy"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreDispatchesPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/pre-dispatches/{pre_dispatch_id}/cancel":{"post":{"tags":["Veri: Bağ Yükleme"],"summary":"Bağ İptal — tek bir pre_dispatch'i iptal et","description":"Portal'daki `POST /pre_dispatches/{id}` (`_method=delete`) işleminin API karşılığı.\n\nTek bir bağı havuzdan iptal eder. Sevk iptal akışında her bağ için tek tek\nçağrılır; doğrudan da (yeniden deneme için) kullanılabilir. Bağ zaten yoksa\nidempotent başarı döner.","operationId":"cancel_pre_dispatch_endpoint_api_v1_pre_dispatches__pre_dispatch_id__cancel_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"pre_dispatch_id","in":"path","required":true,"schema":{"type":"string","description":"Bağ (pre_dispatch) UUID'si","title":"Pre Dispatch Id"},"description":"Bağ (pre_dispatch) UUID'si"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelPreDispatchResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dispatches":{"get":{"tags":["Veri: Sevk İşlemleri"],"summary":"/dispatches — Sevk İşlemleri listesi","description":"Tüm sevkiyatlar — başlatılmış, tamamlanmış, iptal edilmiş.","operationId":"list_dispatches_api_v1_dispatches_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"plate_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plate Number"}},{"name":"dispatch_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"SE-XXXXXXX","title":"Dispatch Number"},"description":"SE-XXXXXXX"},{"name":"search_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search Date"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DispatchesPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Veri: Sevk İşlemleri"],"summary":"Sevk Başlat — pre-dispatch kalemlerinden dispatch oluştur","description":"Portal'daki **Sevk Başlat** butonunun karşılığı.\n\n`/pre-dispatches` endpoint'inden alınan kalemler seçilip bu endpoint'e\ngönderilir. Başarılı olursa yeni dispatch'in UUID'si döner;\nardından `GET /dispatches/{id}` ile SE numarası ve irsaliye QR okunabilir.","operationId":"start_dispatch_api_v1_dispatches_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDispatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDispatchResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dispatches/{dispatch_id}":{"get":{"tags":["Veri: Sevk İşlemleri"],"summary":"/dispatches/{id} — Sevkiyat detayı (SE numarası + kalemler)","description":"Bir sevkiyatın **tam detayı**:\n\n- **dispatch_number** (SE-XXXXXXX) — SAP'ye geri yazılacak değer\n- **delivery_number** (RY...) — irsaliye QR\n- **delivery_document_url** — irsaliye PDF\n- **items** — sevkiyattaki bağlar (her birinin GSN-, etiket, çelik bilgileri)\n- **status_label** — sevk durumu\n\nSAP entegrasyon akışında **son adım**: sevk başlatıldıktan sonra bu\nendpoint'le SE numarası okunur ve SAP'ye dönülür.","operationId":"get_dispatch_detail_api_v1_dispatches__dispatch_id__get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"dispatch_id","in":"path","required":true,"schema":{"type":"string","description":"Sevkiyat UUID'si","title":"Dispatch Id"},"description":"Sevkiyat UUID'si"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DispatchDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dispatches/{dispatch_id}/delivery-info":{"post":{"tags":["Veri: Sevk İşlemleri"],"summary":"Sevk irsaliye bilgisini ekle — PDF/QR yükle","description":"IDIS portalındaki `POST /dispatches/{id}/add_delivery_info` formunun API karşılığı.\n\nBaşarılı işlemde portal 302 ile tekrar sevk detayına döner; bu endpoint bunu\nbaşarı kabul eder, detay sayfasını tekrar okuyup `dispatch_number`,\n`delivery_number`, `status_label` ve kalemleri döndürür.","operationId":"add_dispatch_delivery_info_api_v1_dispatches__dispatch_id__delivery_info_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"dispatch_id","in":"path","required":true,"schema":{"type":"string","description":"Sevkiyat UUID'si","title":"Dispatch Id"},"description":"Sevkiyat UUID'si"}],"requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_add_dispatch_delivery_info_api_v1_dispatches__dispatch_id__delivery_info_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddDeliveryInfoResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dispatches/{dispatch_id}/cancel-status":{"get":{"tags":["Veri: Sevk İşlemleri"],"summary":"Sevkiyat iptal mi? — hafif iptal durumu sorgusu","description":"Bir sevkiyatın iptal edilip edilmediğini döndürür (`is_cancelled`).\n\nSAP, tüm sevk detayını çekmeden sadece iptal durumunu öğrenmek için bunu\nkullanır. `is_cancelled=true` ise sevkiyat IDIS'te iptal edilmiştir.","operationId":"get_dispatch_cancel_status_endpoint_api_v1_dispatches__dispatch_id__cancel_status_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"dispatch_id","in":"path","required":true,"schema":{"type":"string","description":"Sevkiyat UUID'si","title":"Dispatch Id"},"description":"Sevkiyat UUID'si"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DispatchCancelStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dispatches/{dispatch_id}/cancel":{"post":{"tags":["Veri: Sevk İşlemleri"],"summary":"Sevk İptal — sevkiyatı ve (cascade) tüm bağlarını iptal et","description":"Portal'daki sevk iptali (`POST /dispatches/{id}` `_method=delete`) işleminin\nAPI karşılığı + bağ iptal cascade'i.\n\nÖnce SE-numaralı sevkiyat iptal edilir (durum \"İptal Edildi\", kalem sayısı 0),\nardından sevkiyattaki her bağ /pre_dispatches havuzunda **tag serial** ile\nyeniden bulunup tek tek iptal edilir. Bağ sonuçları `bundles[]` içinde döner;\nkısmi başarısızlık `bundles_cancelled < bundles_total` ile görülür.\n\nİdempotent: sevk zaten iptal edilmişse `already_cancelled=True` ile başarı döner.","operationId":"cancel_dispatch_endpoint_api_v1_dispatches__dispatch_id__cancel_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"dispatch_id","in":"path","required":true,"schema":{"type":"string","description":"Sevkiyat UUID'si","title":"Dispatch Id"},"description":"Sevkiyat UUID'si"},{"name":"cancel_bundles","in":"query","required":false,"schema":{"type":"boolean","description":"True ise sevk iptalinden sonra her bağ tek tek iptal edilir","default":true,"title":"Cancel Bundles"},"description":"True ise sevk iptalinden sonra her bağ tek tek iptal edilir"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelDispatchResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bulk-dispatches":{"get":{"tags":["Veri: Toplu Sevk"],"summary":"/bulk_dispatches — Toplu Sevk Başlatma adayları","operationId":"list_bulk_dispatches_api_v1_bulk_dispatches_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"plate_number","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plate Number"}},{"name":"search_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"dd.mm.yyyy","title":"Search Date"},"description":"dd.mm.yyyy"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDispatchesPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/stock-declarations":{"get":{"tags":["Veri: Stok Beyanı"],"summary":"/stock_declarations sayfasını getir","operationId":"list_stock_declarations_api_v1_stock_declarations_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"steel_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Type"}},{"name":"steel_diameter","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Diameter"}},{"name":"stock_entry_at_range","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stock Entry At Range"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StockDeclarationsPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/rebar-bundles/label-owner":{"get":{"tags":["SAP: Mal Kabul"],"summary":"Tek tag mal kabul (agent)","description":"Etiketi gerçek telefonda İDİS app'i üzerinden mal kabul eder (agent). `200`: kabul sonucu; agent yoksa `401`.","operationId":"label_owner_endpoint_api_v1_mobile_rebar_bundles_label_owner_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"tagSerialNumber","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":64,"description":"Etiket seri numarası (ör. 'CR0255834')","title":"Tagserialnumber"},"description":"Etiket seri numarası (ör. 'CR0255834')"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelOwnerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/rebar-bundles/my-label":{"get":{"tags":["SAP: Sevk Bildirim"],"summary":"Tek tag sevk ön-kontrolü — envanterde + sevke uygun mu (agent'a gitmeden)","description":"Bir bağın İДİS envanterinde ve sevke uygun durumda olup olmadığını web'den (scraping) doğrular. `found`=envanterde, `code`=1000 uygun / -4000 değil.","operationId":"my_label_endpoint_api_v1_mobile_rebar_bundles_my_label_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"tagSerialNumber","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":64,"title":"Tagserialnumber"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelOwnerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mobile/rebar-bundles/batch-verify":{"post":{"tags":["SAP: Mal Kabul"],"summary":"Toplu mal kabul (agent) — SAP","description":"**SAP mal kabul endpoint'i.** e-irsaliyedeki tüm bağ etiketlerini (1-500) tek istekte gönderir; iş telefon agent'ına gider, her etiket gerçek İDİS app'inde kabul edilir. Response şekli SAP açısından aynı: her zaman `200`, per-tag sonuçlar `results[]` içinde (`success`/`message`). Agent yoksa `401`.\n\n`Idempotency-Key` header'ı desteklenir (24 saat, çift kayıt önleme).","operationId":"batch_verify_endpoint_api_v1_mobile_rebar_bundles_batch_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchVerifyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/mobile/rebar-bundles/batch-accept":{"post":{"tags":["SAP: Mal Kabul"],"summary":"Toplu kabul (agent)","description":"Bağ kodları için mal kabulü agent üzerinden yapar. Agent yoksa `401`.","operationId":"batch_accept_endpoint_api_v1_mobile_rebar_bundles_batch_accept_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchVerifyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/mobile/rebar-bundles/batch-check-dispatch":{"post":{"tags":["SAP: Sevk Bildirim"],"summary":"Toplu sevk ön-kontrolü — envanterde + sevke uygun mu (agent'a gitmeden)","description":"Sevk YAPMADAN, her bağın İДİS envanterinde ve sevke uygun durumda (Envanterde / Bağ Yükleme aşamasında) olup olmadığını web'den (scraping, `with_tag_serial_number` araması) doğrular. `results[]` per-tag `found`/`success`; uygun olmayanlar `error_message` ile döner. Gerçek sevk (`batch-dispatch-*`) aynı kontrolü zaten içeride yapar.","operationId":"batch_check_dispatch_endpoint_api_v1_mobile_rebar_bundles_batch_check_dispatch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchVerifyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/mobile/rebar-bundles/batch-dispatch-declare":{"post":{"tags":["SAP: Sevk Bildirim"],"summary":"Toplu sevk bildirimi / bağ yükleme (agent)","description":"**SAP sevk bildirim endpoint'i.** Plaka + etiketler; agent gerçek İDİS app'inde bağ yüklemeyi (pre-dispatch) yapar. Response şekli aynı; agent yoksa `401`.","operationId":"batch_dispatch_declare_endpoint_api_v1_mobile_rebar_bundles_batch_dispatch_declare_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDispatchDeclareRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDispatchDeclareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/mobile/rebar-bundles/batch-dispatch-complete":{"post":{"tags":["SAP: Sevk Bildirim"],"summary":"Toplu sevk tamamla — bağ yükleme (agent) + portal sevk onayı + SE no","description":"SAP'in uçtan uca sevk endpoint'i. Agent bağ yüklemeyi yapar; backend portaldaki bağ yüklemelerini bulup `/dispatches` ile sevki onaylar ve `dispatch_number` (SE no) + `dispatch_id` döner. Agent yoksa `401`.","operationId":"batch_dispatch_complete_endpoint_api_v1_mobile_rebar_bundles_batch_dispatch_complete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDispatchDeclareRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDispatchCompleteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/waybills/upload":{"post":{"tags":["İrsaliye"],"summary":"İrsaliye dosyası yükle (Excel / CSV / PDF / HTML)","description":"İrsaliye dosyasını (`.xlsx`, `.csv`, `.pdf` veya `.html`) yükler, parse eder ve veritabanına kaydeder.\n\nİrsaliye, giriş yapan kullanıcının tenant'ına bağlı saklanır; aynı tenant'ın tüm kullanıcıları görür.\n\n**Parse edilen bilgiler**:\n- Satır kalemleri (malzeme kodu, tanım, miktar, adet)\n- Tag seri numaraları (Açıklama sütunundan çıkarılır)\n- Çelik tipi ve çapı (malzeme tanımından çıkarılır)\n\n**HTML desteği**: e-İrsaliye / UBL XSLT çıktıları (.html / .htm / .xhtml) PDF ile aynı şekilde işlenir; tablo + metadata (irsaliye no, ETTN, plaka, tedarikçi) çıkarılır.\n\nYüklendikten sonra:\n1. `POST /verify` ile bağ kodlarını kontrol edin\n2. `POST /accept` ile mal kabul yapın\n3. `POST /verify-dispatch` ile sevk kontrolü yapın\n4. `POST /dispatch` ile sevk bildirimi oluşturun","operationId":"upload_waybill_api_v1_waybills_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_waybill_api_v1_waybills_upload_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaybillDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/waybills":{"get":{"tags":["İrsaliye"],"summary":"İrsaliye listesi (paginated)","description":"Kayıtlı irsaliyeleri sayfalı olarak listeler. Status ile filtreleme yapılabilir.\n\n**Tenant scope**: Operatör/admin yalnızca kendi tenant'ının irsaliyelerini görür. Superadmin tüm tenant'ları görür; `tenant_id` query parametresiyle filtreleyebilir.","operationId":"list_waybills_endpoint_api_v1_waybills_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Sayfa numarası","default":1,"title":"Page"},"description":"Sayfa numarası"},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Sayfa başına kayıt","default":25,"title":"Per Page"},"description":"Sayfa başına kayıt"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Durum filtresi (ör. 'uploaded', 'verified')","title":"Status"},"description":"Durum filtresi (ör. 'uploaded', 'verified')"},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"(Superadmin) Belirli bir tenant'a göre filtre","title":"Tenant Id"},"description":"(Superadmin) Belirli bir tenant'a göre filtre"},{"name":"mine_only","in":"query","required":false,"schema":{"type":"boolean","description":"Sadece kendi yüklediklerimi göster","default":false,"title":"Mine Only"},"description":"Sadece kendi yüklediklerimi göster"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaybillListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/waybills/{waybill_id}":{"get":{"tags":["İrsaliye"],"summary":"İrsaliye detayı","description":"Belirtilen irsaliyenin tüm detaylarını (satır kalemleri, tag'ler, sonuçlar, audit log) döndürür.","operationId":"get_waybill_endpoint_api_v1_waybills__waybill_id__get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"waybill_id","in":"path","required":true,"schema":{"type":"string","title":"Waybill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaybillDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["İrsaliye"],"summary":"İrsaliye sil","operationId":"delete_waybill_endpoint_api_v1_waybills__waybill_id__delete","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"waybill_id","in":"path","required":true,"schema":{"type":"string","title":"Waybill Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/waybills/{waybill_id}/verify":{"post":{"tags":["İrsaliye"],"summary":"Bağ kodu kontrolü — IDIS'te sorgulama (sahiplik transferi yok)","operationId":"verify_waybill_endpoint_api_v1_waybills__waybill_id__verify_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"waybill_id","in":"path","required":true,"schema":{"type":"string","title":"Waybill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaybillDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/waybills/{waybill_id}/accept":{"post":{"tags":["İrsaliye"],"summary":"Mal kabul — sahiplik transferi (kontrol sonrası)","operationId":"accept_waybill_endpoint_api_v1_waybills__waybill_id__accept_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"waybill_id","in":"path","required":true,"schema":{"type":"string","title":"Waybill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaybillDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/waybills/{waybill_id}/accept/complete":{"post":{"tags":["İrsaliye"],"summary":"Mal kabul zinciri — kontrol + içeri al","operationId":"complete_acceptance_waybill_endpoint_api_v1_waybills__waybill_id__accept_complete_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"waybill_id","in":"path","required":true,"schema":{"type":"string","title":"Waybill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaybillDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/waybills/{waybill_id}/verify-dispatch":{"post":{"tags":["İrsaliye"],"summary":"Sevk kontrolü — envanter kontrolü (sevk oluşturma yok)","operationId":"verify_dispatch_waybill_endpoint_api_v1_waybills__waybill_id__verify_dispatch_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"waybill_id","in":"path","required":true,"schema":{"type":"string","title":"Waybill Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaybillDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/waybills/{waybill_id}/dispatch":{"post":{"tags":["İrsaliye"],"summary":"Bağ yükleme — IDIS pre-dispatch oluşturma (kontrol sonrası)","operationId":"dispatch_waybill_endpoint_api_v1_waybills__waybill_id__dispatch_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"waybill_id","in":"path","required":true,"schema":{"type":"string","title":"Waybill Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaybillDispatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaybillDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/waybills/{waybill_id}/dispatch/complete":{"post":{"tags":["İrsaliye"],"summary":"Sevk zinciri — kontrol + bağ yükleme + sevk başlat + SE no oku","operationId":"complete_dispatch_waybill_endpoint_api_v1_waybills__waybill_id__dispatch_complete_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"waybill_id","in":"path","required":true,"schema":{"type":"string","title":"Waybill Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaybillDispatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaybillDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/waybills/{waybill_id}/dispatch/delivery-info":{"post":{"tags":["İrsaliye"],"summary":"Sevk irsaliyesini ekle — kayitli PDF'i IDIS sevk detayina yukle","operationId":"add_waybill_dispatch_delivery_info_endpoint_api_v1_waybills__waybill_id__dispatch_delivery_info_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"waybill_id","in":"path","required":true,"schema":{"type":"string","title":"Waybill Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaybillDeliveryInfoRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaybillDetailOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/agent/redeem":{"post":{"tags":["Agent Köprüsü"],"summary":"Eşleştirme kodunu agent token'a çevir (public)","operationId":"redeem_pairing_code_api_agent_redeem_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RedeemRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Redeem Pairing Code Api Agent Redeem Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent/pairing-codes":{"post":{"tags":["Agent Köprüsü"],"summary":"Yeni eşleştirme kodu üret (tenant kullanıcısı)","operationId":"generate_pairing_code_api_v1_agent_pairing_codes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeneratePairingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PairingCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/agent/devices":{"get":{"tags":["Agent Köprüsü"],"summary":"Tenant cihazları + çevrimiçi durumu","operationId":"list_devices_api_v1_agent_devices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DeviceInfo"},"type":"array","title":"Response List Devices Api V1 Agent Devices Get"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/agent/devices/{device_id}":{"delete":{"tags":["Agent Köprüsü"],"summary":"Cihazı devre dışı bırak","operationId":"deactivate_device_api_v1_agent_devices__device_id__delete","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"device_id","in":"path","required":true,"schema":{"type":"string","title":"Device Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Deactivate Device Api V1 Agent Devices  Device Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/browser-session/redeem":{"post":{"tags":["Tarayıcı Oturumu"],"summary":"Eşleştirme kodunu sync_token'a çevir (public)","operationId":"redeem_pairing_code_api_browser_session_redeem_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserRedeemRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Redeem Pairing Code Api Browser Session Redeem Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/browser-session/push":{"post":{"tags":["Tarayıcı Oturumu"],"summary":"İDİS cookie'lerini oturuma yaz (public, sync_token ile)","operationId":"push_session_api_browser_session_push_post","parameters":[{"name":"X-Sync-Token","in":"header","required":true,"schema":{"type":"string","title":"X-Sync-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserPushRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Push Session Api Browser Session Push Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/browser-session/pairing-codes":{"post":{"tags":["Tarayıcı Oturumu"],"summary":"Tarayıcı eklentisi için eşleştirme kodu üret","operationId":"generate_pairing_code_api_v1_browser_session_pairing_codes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateBrowserPairingRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserPairingCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/browser-session/extensions":{"get":{"tags":["Tarayıcı Oturumu"],"summary":"Tenant'ın eşleşmiş tarayıcı eklentileri","operationId":"list_extensions_api_v1_browser_session_extensions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BrowserExtInfo"},"type":"array","title":"Response List Extensions Api V1 Browser Session Extensions Get"}}}}},"security":[{"OAuth2 (username/password)":[]},{"API Key":[]}]}},"/api/v1/browser-session/extensions/{ext_id}":{"delete":{"tags":["Tarayıcı Oturumu"],"summary":"Eklentiyi devre dışı bırak","operationId":"deactivate_extension_api_v1_browser_session_extensions__ext_id__delete","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"ext_id","in":"path","required":true,"schema":{"type":"string","title":"Ext Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Deactivate Extension Api V1 Browser Session Extensions  Ext Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent-app/latest":{"get":{"tags":["Agent Uygulaması (APK)"],"summary":"En güncel APK sürümü (metadata)","operationId":"latest_release_api_v1_agent_app_latest_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"platform","in":"query","required":false,"schema":{"type":"string","default":"android","title":"Platform"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent-app/releases":{"get":{"tags":["Agent Uygulaması (APK)"],"summary":"Sürüm listesi","operationId":"list_releases_api_v1_agent_app_releases_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"platform","in":"query","required":false,"schema":{"type":"string","default":"android","title":"Platform"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReleaseView"},"title":"Response List Releases Api V1 Agent App Releases Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Agent Uygulaması (APK)"],"summary":"Yeni APK sürümü yükle (superadmin)","operationId":"upload_release_api_v1_agent_app_releases_post","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_release_api_v1_agent_app_releases_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseView"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent-app/releases/{release_id}/download":{"get":{"tags":["Agent Uygulaması (APK)"],"summary":"APK indir (stream)","operationId":"download_release_api_v1_agent_app_releases__release_id__download_get","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"release_id","in":"path","required":true,"schema":{"type":"string","title":"Release Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/agent-app/releases/{release_id}":{"delete":{"tags":["Agent Uygulaması (APK)"],"summary":"Sürümü sil (superadmin)","operationId":"delete_release_api_v1_agent_app_releases__release_id__delete","security":[{"OAuth2 (username/password)":[]},{"API Key":[]}],"parameters":[{"name":"release_id","in":"path","required":true,"schema":{"type":"string","title":"Release Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Release Api V1 Agent App Releases  Release Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AcceptanceItem":{"properties":{"acceptance_number":{"type":"string","title":"Acceptance Number","description":"BK-XXXXXXXX"},"bundle_number":{"type":"string","title":"Bundle Number","description":"Bağ No (UUID)"},"dispatch_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatch Number","description":"SE-XXXXXXX (geliş sevkiyat)"},"accepted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Accepted At"},"steel_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Type"},"steel_diameter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Diameter"},"casting_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Casting Number"}},"type":"object","required":["acceptance_number","bundle_number"],"title":"AcceptanceItem"},"AcceptancePagination":{"properties":{"current_page":{"type":"integer","title":"Current Page","default":1},"last_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"has_prev":{"type":"boolean","title":"Has Prev","default":false}},"type":"object","title":"AcceptancePagination"},"AcceptanceSummary":{"properties":{"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count"}},"type":"object","title":"AcceptanceSummary"},"AcceptancesPage":{"properties":{"authenticated":{"type":"boolean","title":"Authenticated","default":true},"summary":{"$ref":"#/components/schemas/AcceptanceSummary"},"items":{"items":{"$ref":"#/components/schemas/AcceptanceItem"},"type":"array","title":"Items"},"pagination":{"$ref":"#/components/schemas/AcceptancePagination"},"csrf_token_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Csrf Token Prefix"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["summary","items","pagination"],"title":"AcceptancesPage"},"AcceptedLabel":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"inventory_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Inventory Number"},"rebar_bundle_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rebar Bundle Id"},"facility_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facility Id"},"stakeholder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stakeholder Id"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deleted At"},"delete_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delete Note"},"sold_amount":{"anyOf":[{"type":"integer"},{"type":"number"},{"type":"null"}],"title":"Sold Amount"},"previous_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous State"}},"additionalProperties":true,"type":"object","title":"AcceptedLabel","description":"update_label_owner PUT response'undaki data bloğu."},"AddDeliveryInfoResult":{"properties":{"success":{"type":"boolean","title":"Success"},"dispatch_id":{"type":"string","title":"Dispatch Id"},"dispatch_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatch Number"},"delivery_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Number"},"redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Url"},"app_redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Redirect Url"},"detail":{"anyOf":[{"$ref":"#/components/schemas/DispatchDetail"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"confirmed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmed By"}},"type":"object","required":["success","dispatch_id"],"title":"AddDeliveryInfoResult","description":"POST /dispatches/{id}/add_delivery_info yanıtı."},"ApiKeyCreateRequest":{"properties":{"name":{"type":"string","maxLength":128,"minLength":3,"title":"Name","description":"İnsan-okunur etiket (ör. 'SAP Production')"},"prefix":{"type":"string","maxLength":16,"minLength":2,"pattern":"^[a-zA-Z][a-zA-Z0-9_]*$","title":"Prefix","description":"Anahtar prefix'i — sadece harf/rakam/_ ; harf ile başlamalı","default":"sap"},"expires_in_days":{"anyOf":[{"type":"integer","maximum":3650.0,"minimum":1.0},{"type":"null"}],"title":"Expires In Days","description":"Süre (gün). None = süresiz."}},"type":"object","required":["name"],"title":"ApiKeyCreateRequest"},"ApiKeyCreatedResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"raw_key":{"type":"string","title":"Raw Key","description":"⚠️ Tam anahtar — BU CEVAPTAN SONRA BİR DAHA GÖRÜNMEZ. Hemen sakla."},"key_prefix":{"type":"string","title":"Key Prefix"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["id","name","raw_key","key_prefix","created_at","expires_at"],"title":"ApiKeyCreatedResponse","description":"Anahtar üretildiğinde dönen — `raw_key` SADECE BU SEFER görünür!"},"ApiKeyView":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"owner_username":{"type":"string","title":"Owner Username"},"is_active":{"type":"boolean","title":"Is Active"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"last_used_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used Ip"},"use_count":{"type":"integer","title":"Use Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","key_prefix","owner_username","is_active","expires_at","revoked_at","last_used_at","last_used_ip","use_count","created_at"],"title":"ApiKeyView","description":"Listeleme için — ham key dönmez."},"AuditLogView":{"properties":{"id":{"type":"string","title":"Id"},"action":{"type":"string","title":"Action"},"actor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Id"},"actor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Name"},"actor_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Role"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"target_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Type"},"target_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Id"},"detail":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Detail"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"},"ip_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ip Address"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","action","actor_id","actor_name","actor_role","tenant_id","target_type","target_id","detail","request_id","ip_address","created_at"],"title":"AuditLogView"},"BatchDispatchCompleteResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Yalnızca tüm bağlar başarılı ve portal sevki oluşturulmuşsa true. SAP ana başarı sinyali olarak bu alanı kullanmalıdır.","default":false},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Tam, kısmi veya başarısız sevkin özet mesajı."},"batch_id":{"type":"string","title":"Batch Id"},"plate_number":{"type":"string","title":"Plate Number","description":"Normalize edilmis plaka"},"summary":{"$ref":"#/components/schemas/BatchVerifySummary"},"results":{"items":{"$ref":"#/components/schemas/TagVerifyResult"},"type":"array","title":"Results"},"duration_ms":{"type":"integer","title":"Duration Ms"},"all_successful":{"type":"boolean","title":"All Successful"},"pre_dispatch_created":{"type":"boolean","title":"Pre Dispatch Created","default":false},"dispatch_created":{"type":"boolean","title":"Dispatch Created","default":false},"dispatch_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatch Id"},"dispatch_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatch Number","description":"SE-XXXXXXX"},"app_redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Redirect Url"},"status_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Label"},"item_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Item Count"},"pre_dispatch":{"anyOf":[{"$ref":"#/components/schemas/PreDispatchResult"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["batch_id","plate_number","summary","results","duration_ms","all_successful"],"title":"BatchDispatchCompleteResponse","description":"Sevk batch response — dogrulama + bag yukleme + portal sevk onayi."},"BatchDispatchDeclareRequest":{"properties":{"plate_number":{"type":"string","maxLength":16,"minLength":2,"title":"Plate Number","description":"Araç plakası (ör. '34ABC123')"},"tag_serial_numbers":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":1,"title":"Tag Serial Numbers","description":"Sevk edilecek bağ etiketleri (e-irsaliye)"}},"type":"object","required":["plate_number","tag_serial_numbers"],"title":"BatchDispatchDeclareRequest","description":"SAP'den gelen toplu sevk bildirim isteği.\n\nMobile app akışı: önce plaka girilir → sonra etiketler okutulur.\nBizim servis: tüm etiketleri bizim envanterimizde mi diye paralel doğrular,\nplakayı saklar, sonuçları aggregate eder."},"BatchDispatchDeclareResponse":{"properties":{"batch_id":{"type":"string","title":"Batch Id"},"plate_number":{"type":"string","title":"Plate Number","description":"Normalize edilmiş plaka"},"summary":{"$ref":"#/components/schemas/BatchVerifySummary"},"results":{"items":{"$ref":"#/components/schemas/TagVerifyResult"},"type":"array","title":"Results"},"duration_ms":{"type":"integer","title":"Duration Ms"},"all_successful":{"type":"boolean","title":"All Successful","description":"True ise tüm etiketler bende, sevke uygun"},"dispatch_created":{"type":"boolean","title":"Dispatch Created","description":"True ise IDIS'te sevk bildirimi başarıyla oluşturuldu","default":false},"dispatch":{"anyOf":[{"$ref":"#/components/schemas/PreDispatchResult"},{"type":"null"}],"description":"Sevk bildirimi sonucu (POST pre_dispatches response'u)"}},"type":"object","required":["batch_id","plate_number","summary","results","duration_ms","all_successful"],"title":"BatchDispatchDeclareResponse","description":"Sevk bildirim batch response — doğrulama + sevk oluşturma."},"BatchVerifyRequest":{"properties":{"tag_serial_numbers":{"items":{"type":"string"},"type":"array","maxItems":500,"minItems":1,"title":"Tag Serial Numbers","description":"Etiket seri no listesi (SAP e-irsaliyedeki bağ etiketleri)"}},"type":"object","required":["tag_serial_numbers"],"title":"BatchVerifyRequest","description":"SAP'den gelen toplu etiket doğrulama isteği.\n\nSAP, e-irsaliyedeki tüm bağ etiketlerini TEK istekte gönderir.\nServis her birini IDIS mobile API'sine paralel olarak sorar, sonuçları\naggregate eder ve döner.\n\nTag listesi:\n- boş olamaz\n- max 500 etiket (DDoS / IDIS rate-limit koruması)\n- duplicate'lar otomatik unique'lenir\n- whitespace strip edilir"},"BatchVerifyResponse":{"properties":{"batch_id":{"type":"string","title":"Batch Id","description":"Bu batch'in tracing ID'si (audit log + SAP korelasyonu)"},"summary":{"$ref":"#/components/schemas/BatchVerifySummary"},"results":{"items":{"$ref":"#/components/schemas/TagVerifyResult"},"type":"array","title":"Results","description":"Input ile aynı sırada per-tag sonuç"},"duration_ms":{"type":"integer","title":"Duration Ms","description":"Toplam batch süresi"},"all_successful":{"type":"boolean","title":"All Successful","description":"True ise tümü başarılı (SAP hızlı kontrol için)"},"all_accepted":{"type":"boolean","title":"All Accepted","description":"True ise tüm etiketlerin sahiplik transferi tamamlandı","default":false}},"type":"object","required":["batch_id","summary","results","duration_ms","all_successful"],"title":"BatchVerifyResponse","description":"Toplu doğrulama + kabul response — SAP için kapsamlı + structured."},"BatchVerifySummary":{"properties":{"total":{"type":"integer","title":"Total","description":"İstenen etiket sayısı"},"successful":{"type":"integer","title":"Successful","description":"Geçerli + sahip bulunan etiket sayısı"},"accepted":{"type":"integer","title":"Accepted","description":"Sahiplik transferi başarılı olan etiket sayısı","default":0},"accept_failed":{"type":"integer","title":"Accept Failed","description":"Etiket bulundu ama kabul edilemedi (SAP retry kararı verir)","default":0},"not_found":{"type":"integer","title":"Not Found","description":"IDIS'te bulunamayan etiket sayısı"},"errored":{"type":"integer","title":"Errored","description":"Beklenmedik hata olan etiket sayısı"}},"type":"object","required":["total","successful","not_found","errored"],"title":"BatchVerifySummary","description":"Aggregate sayım — SAP için tek bakışta durum."},"Body_add_dispatch_delivery_info_api_v1_dispatches__dispatch_id__delivery_info_post":{"properties":{"delivery_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Number","description":"İrsaliye QR / teslimat numarası"},"delivery_document":{"anyOf":[{"type":"string","contentMediaType":"application/octet-stream"},{"type":"null"}],"title":"Delivery Document","description":"Resmi irsaliye PDF dosyası"}},"type":"object","title":"Body_add_dispatch_delivery_info_api_v1_dispatches__dispatch_id__delivery_info_post"},"Body_oauth2_token_endpoint_api_v1_auth_token_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"^password$"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","format":"password","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"format":"password","title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_oauth2_token_endpoint_api_v1_auth_token_post"},"Body_upload_release_api_v1_agent_app_releases_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"APK dosyası"},"version":{"type":"string","title":"Version","description":"Sürüm (ör. 1.0.4)"},"version_code":{"type":"integer","title":"Version Code","description":"Sürüm kodu (monoton artan)"},"notes":{"type":"string","title":"Notes","description":"Sürüm notları","default":""},"platform":{"type":"string","title":"Platform","default":"android"}},"type":"object","required":["file","version","version_code"],"title":"Body_upload_release_api_v1_agent_app_releases_post"},"Body_upload_waybill_api_v1_waybills_upload_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"İrsaliye dosyası (.xlsx, .csv, .pdf veya .html)"},"irsaliye_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Irsaliye No","description":"İrsaliye numarası (PDF/HTML'den otomatik çıkarılır)"},"tedarikci":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tedarikci","description":"Tedarikçi adı (PDF/HTML'den otomatik çıkarılır)"},"tarih":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Tarih","description":"İrsaliye tarihi (PDF/HTML'den otomatik çıkarılır)"}},"type":"object","required":["file"],"title":"Body_upload_waybill_api_v1_waybills_upload_post"},"BrowserExtInfo":{"properties":{"ext_id":{"type":"string","title":"Ext Id"},"label":{"type":"string","title":"Label"},"browser":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Browser"},"user_email":{"type":"string","title":"User Email"},"is_active":{"type":"boolean","title":"Is Active"},"last_sync_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Sync At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["ext_id","label","browser","user_email","is_active","last_sync_at","created_at"],"title":"BrowserExtInfo"},"BrowserPairingCodeResponse":{"properties":{"code":{"type":"string","title":"Code"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"ttl_seconds":{"type":"integer","title":"Ttl Seconds"},"tenant_id":{"type":"string","title":"Tenant Id"}},"type":"object","required":["code","expires_at","ttl_seconds","tenant_id"],"title":"BrowserPairingCodeResponse"},"BrowserPushRequest":{"properties":{"railsSession":{"type":"string","minLength":10,"title":"Railssession","description":"_rails8_session cookie değeri"},"rememberToken":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Remembertoken","description":"remember_user_token cookie değeri"},"csrfToken":{"type":"string","minLength":10,"title":"Csrftoken","description":"Sayfadaki <meta name=csrf-token> değeri"}},"type":"object","required":["railsSession","csrfToken"],"title":"BrowserPushRequest"},"BrowserRedeemRequest":{"properties":{"pairingCode":{"type":"string","maxLength":32,"minLength":4,"title":"Pairingcode"},"browser":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Browser","description":"Tarayıcı + sürüm"}},"type":"object","required":["pairingCode"],"title":"BrowserRedeemRequest"},"BulkDispatchItem":{"properties":{"pre_dispatch_id":{"type":"string","title":"Pre Dispatch Id"},"transaction_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Id"},"transaction_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Number"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"plate_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plate Number"},"loaded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Loaded At"},"tag_serial_numbers":{"items":{"type":"string"},"type":"array","title":"Tag Serial Numbers"},"steel_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Type"},"steel_diameter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Diameter"},"length_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Length Meters"},"rod_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rod Count"},"casting_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Casting Number"}},"type":"object","required":["pre_dispatch_id"],"title":"BulkDispatchItem"},"BulkDispatchPagination":{"properties":{"current_page":{"type":"integer","title":"Current Page","default":1},"last_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"has_prev":{"type":"boolean","title":"Has Prev","default":false}},"type":"object","title":"BulkDispatchPagination"},"BulkDispatchSummary":{"properties":{"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count"}},"type":"object","title":"BulkDispatchSummary"},"BulkDispatchesPage":{"properties":{"authenticated":{"type":"boolean","title":"Authenticated","default":true},"summary":{"$ref":"#/components/schemas/BulkDispatchSummary"},"items":{"items":{"$ref":"#/components/schemas/BulkDispatchItem"},"type":"array","title":"Items"},"pagination":{"$ref":"#/components/schemas/BulkDispatchPagination"},"csrf_token_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Csrf Token Prefix"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"max_bulk_dispatch_count":{"type":"integer","title":"Max Bulk Dispatch Count","default":5000}},"type":"object","required":["summary","items","pagination"],"title":"BulkDispatchesPage"},"BundleCancelOutcome":{"properties":{"transaction_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Number","description":"GSN-... (eşleme anahtarı)"},"tag_serial_numbers":{"items":{"type":"string"},"type":"array","title":"Tag Serial Numbers"},"pre_dispatch_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pre Dispatch Id","description":"Sevk iptali sonrası havuzda bulunan canlı bağ UUID'si"},"matched":{"type":"boolean","title":"Matched","description":"Bağ, havuzda tag serial ile yeniden bulunabildi mi?","default":false},"success":{"type":"boolean","title":"Success","default":false},"already_cancelled":{"type":"boolean","title":"Already Cancelled","default":false},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","title":"BundleCancelOutcome","description":"Sevk iptal cascade'inde tek bir bağın iptal sonucu."},"BundleState":{"type":"string","enum":["in_pre_dispatch","in_inventory","during_reduction_phase","partially_sold","pre_cancel","cancel"],"title":"BundleState"},"CancelDispatchResult":{"properties":{"success":{"type":"boolean","title":"Success","description":"Sevk iptali başarılı mı (bağ sonuçlarından bağımsız)"},"dispatch_id":{"type":"string","title":"Dispatch Id"},"dispatch_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatch Number","description":"SE-XXXXXXX"},"status_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Label","description":"İptal sonrası — ör. 'İptal Edildi'"},"already_cancelled":{"type":"boolean","title":"Already Cancelled","description":"Sevk zaten iptal edilmişti — idempotent","default":false},"redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Url"},"app_redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Redirect Url"},"detail":{"anyOf":[{"$ref":"#/components/schemas/DispatchDetail"},{"type":"null"}],"description":"İptal sonrası yeniden okunan sevk detayı"},"bundles":{"items":{"$ref":"#/components/schemas/BundleCancelOutcome"},"type":"array","title":"Bundles","description":"Sevkiyattaki her bağın iptal sonucu"},"bundles_total":{"type":"integer","title":"Bundles Total","description":"Sevkiyattaki bağ (kalem) sayısı","default":0},"bundles_cancelled":{"type":"integer","title":"Bundles Cancelled","description":"Başarıyla iptal edilen bağ sayısı","default":0},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"confirmed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmed By"}},"type":"object","required":["success","dispatch_id"],"title":"CancelDispatchResult","description":"POST /dispatches/{id}/cancel yanıtı.\n\nÖnce SE-numaralı sevkiyatı iptal eder, ardından (cancel_bundles=True ise)\nsevkiyattaki her bağı havuzda yeniden bulup tek tek iptal eder."},"CancelPreDispatchResult":{"properties":{"success":{"type":"boolean","title":"Success"},"pre_dispatch_id":{"type":"string","title":"Pre Dispatch Id"},"already_cancelled":{"type":"boolean","title":"Already Cancelled","description":"Bağ zaten havuzda değildi — iptal idempotent kabul edildi","default":false},"redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Url"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"confirmed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmed By"}},"type":"object","required":["success","pre_dispatch_id"],"title":"CancelPreDispatchResult","description":"Tek bir bağın (pre_dispatch) iptal sonucu.\n\nPortal karşılığı: POST /pre_dispatches/{id} + `_method=delete`.\nBaşarılı işlemde 302 ile /pre_dispatches listesine döner ve bağ havuzdan kalkar."},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string","minLength":8,"format":"password","title":"Current Password","writeOnly":true},"new_password":{"type":"string","maxLength":256,"minLength":8,"format":"password","title":"New Password","writeOnly":true}},"type":"object","required":["current_password","new_password"],"title":"ChangePasswordRequest"},"CreateDispatchRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DispatchItemInput"},"type":"array","minItems":1,"title":"Items"},"delivery_type":{"type":"string","title":"Delivery Type","description":"'dispatch' veya 'refund'","default":"dispatch"},"shipment_scope":{"type":"string","title":"Shipment Scope","description":"'domestic' (yurt içi) veya 'international' (yurt dışı)","default":"domestic"}},"type":"object","required":["items"],"title":"CreateDispatchRequest","description":"POST /dispatches — portalda sevk başlatma isteği."},"CreateDispatchResult":{"properties":{"success":{"type":"boolean","title":"Success"},"dispatch_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatch Id"},"dispatch_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatch Number","description":"SE-XXXXXXX"},"redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Url"},"app_redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Redirect Url"},"navigate_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Navigate To","description":"Frontend'in başarıdan sonra gitmesi gereken yerel rota"},"stop_polling":{"type":"boolean","title":"Stop Polling","description":"True ise frontend pre-dispatch/waybill polling'i durdurmalı","default":false},"detail":{"anyOf":[{"$ref":"#/components/schemas/DispatchDetail"},{"type":"null"}]},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"already_processed":{"type":"boolean","title":"Already Processed","default":false},"confirmed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmed By"}},"type":"object","required":["success"],"title":"CreateDispatchResult","description":"POST /dispatches yanıtı."},"DeviceInfo":{"properties":{"device_id":{"type":"string","title":"Device Id"},"label":{"type":"string","title":"Label"},"hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hostname"},"is_active":{"type":"boolean","title":"Is Active"},"online":{"type":"boolean","title":"Online"},"last_seen_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Seen At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["device_id","label","hostname","is_active","online","last_seen_at","created_at"],"title":"DeviceInfo"},"DispatchCancelStatus":{"properties":{"authenticated":{"type":"boolean","title":"Authenticated","default":true},"dispatch_id":{"type":"string","title":"Dispatch Id"},"dispatch_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatch Number","description":"SE-XXXXXXX"},"status_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Label","description":"Ör. 'İptal Edildi'"},"is_cancelled":{"type":"boolean","title":"Is Cancelled","description":"status_label sevkin iptal edildiğini gösteriyorsa True","default":false},"item_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Item Count","description":"İptalde 0'a düşer"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["dispatch_id"],"title":"DispatchCancelStatus","description":"GET /dispatches/{id}/cancel-status yanıtı — sevkiyat iptal mi sorgusu.\n\nSAP, bir sevkiyatın iptal edilip edilmediğini bu hafif endpoint ile kontrol\neder; tüm detayı çekmesine gerek kalmaz."},"DispatchDetail":{"properties":{"authenticated":{"type":"boolean","title":"Authenticated","default":true},"dispatch_id":{"type":"string","title":"Dispatch Id"},"dispatch_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatch Number","description":"SE-XXXXXXX"},"irsaliye_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Irsaliye Type","description":"'Sevk' veya 'İade'"},"plate_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plate Number"},"delivery_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Number","description":"İrsaliye QR (RY...) — SAP'ye dönecek değer"},"delivery_document_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Document Url","description":"İrsaliye PDF dosyası (active_storage URL)"},"status_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Label","description":"Ör. 'İrsaliye Numarası ve Belgesi Mevcut'"},"item_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Item Count"},"shipment_scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shipment Scope","description":"'Yurt içi sevkiyat' veya 'Yurt dışı sevkiyat'"},"plate_change_used":{"type":"boolean","title":"Plate Change Used","description":"Plaka değişimi yapılmışsa true (1 sefere mahsus hak kullanılmıştır)","default":false},"items":{"items":{"$ref":"#/components/schemas/DispatchItem"},"type":"array","title":"Items"},"csrf_token_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Csrf Token Prefix"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["dispatch_id"],"title":"DispatchDetail","description":"`/dispatches/{id}` — bir sevkiyatın tam detayı.\n\nSAP entegrasyonun en kritik parçası: SE numarası ve İrsaliye QR'ı buradan\nokunup SAP'ye geri yazılır."},"DispatchItem":{"properties":{"dispatch_item_id":{"type":"string","title":"Dispatch Item Id","description":"UUID — kalem silme için"},"transaction_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Number","description":"GSN-..."},"facility_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facility Name"},"tag_serial_numbers":{"items":{"type":"string"},"type":"array","title":"Tag Serial Numbers"},"steel_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Type"},"steel_diameter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Diameter"},"length_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Length Meters"},"rod_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rod Count"},"casting_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Casting Number"},"loaded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Loaded At"}},"type":"object","required":["dispatch_item_id"],"title":"DispatchItem","description":"Sevkiyat detayında listelenen bir sevk kalemi (içindeki bağ)."},"DispatchItemInput":{"properties":{"pre_dispatch_id":{"type":"string","title":"Pre Dispatch Id"},"tag_serial_numbers":{"type":"string","title":"Tag Serial Numbers","description":"Virgülle ayrılmış etiket numaraları (ör. 'EX0209608,EX0209609')"},"plate_number":{"type":"string","title":"Plate Number"},"steel_type":{"type":"string","title":"Steel Type"}},"type":"object","required":["pre_dispatch_id","tag_serial_numbers","plate_number","steel_type"],"title":"DispatchItemInput","description":"Sevk başlatılacak bir pre-dispatch kalemi."},"DispatchListItem":{"properties":{"dispatch_id":{"type":"string","title":"Dispatch Id","description":"UUID — detay sayfasında kullanılır"},"dispatch_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatch Number","description":"SE-XXXXXXX"},"plate_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plate Number"},"delivery_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Number","description":"İrsaliye QR (RY...)"},"item_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Item Count"},"status_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Label"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["dispatch_id"],"title":"DispatchListItem","description":"Liste sayfasındaki bir sevk satırı.\n\nNOT: Liste sayfasının HTML'i henüz alınmadı; alanlar tahminen detay\nsayfasıyla aynı temel veriler. Liste HTML'i geldiğinde refine edilecek."},"DispatchListPagination":{"properties":{"current_page":{"type":"integer","title":"Current Page","default":1},"last_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"has_prev":{"type":"boolean","title":"Has Prev","default":false}},"type":"object","title":"DispatchListPagination"},"DispatchesPage":{"properties":{"authenticated":{"type":"boolean","title":"Authenticated","default":true},"items":{"items":{"$ref":"#/components/schemas/DispatchListItem"},"type":"array","title":"Items"},"pagination":{"$ref":"#/components/schemas/DispatchListPagination"},"csrf_token_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Csrf Token Prefix"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["items","pagination"],"title":"DispatchesPage"},"DistributionItem":{"properties":{"name":{"type":"string","title":"Name"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["name","count"],"title":"DistributionItem"},"ExecutionLogView":{"properties":{"id":{"type":"string","title":"Id"},"event_type":{"type":"string","title":"Event Type"},"operation":{"type":"string","title":"Operation"},"service":{"type":"string","title":"Service"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"tenant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Name"},"endpoint_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Name"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"environment":{"type":"string","title":"Environment"},"success":{"type":"boolean","title":"Success"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"actor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Id"},"actor_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Name"},"actor_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Type"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"},"correlation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Correlation Id"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"request_summary":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Request Summary"},"response_summary":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Response Summary"}},"type":"object","required":["id","event_type","operation","service","tenant_id","tenant_name","endpoint_name","provider","environment","success","status_code","duration_ms","actor_id","actor_name","actor_type","request_id","correlation_id","error_code","error_message","created_at"],"title":"ExecutionLogView"},"Facility":{"properties":{"id":{"type":"string","title":"Id"},"stakeholder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stakeholder Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"city_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"City Id"},"county_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"County Id"},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postal Code"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"annual_production_amount":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Annual Production Amount"},"approved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Approved"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":true,"type":"object","required":["id"],"title":"Facility"},"GenerateBrowserPairingRequest":{"properties":{"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id","description":"Superadmin için hedef tenant; boşsa çağıranın tenant'ı kullanılır"}},"type":"object","title":"GenerateBrowserPairingRequest"},"GeneratePairingRequest":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label","description":"Cihaz için önerilen ad"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id","description":"Superadmin için hedef tenant; boşsa çağıranın tenant'ı kullanılır"}},"type":"object","title":"GeneratePairingRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IdisCredentialSetRequest":{"properties":{"idis_password":{"type":"string","maxLength":256,"minLength":1,"format":"password","title":"Idis Password","writeOnly":true},"idis_email":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Idis Email"}},"type":"object","required":["idis_password"],"title":"IdisCredentialSetRequest","description":"Kullanıcının IDIS portal şifresini ayarla.\n\n`idis_email` boş bırakılırsa user'ın kendi sistem email'i kullanılır\n(sistemdeki e-posta = IDIS hesabının e-postası)."},"InventoryDetail":{"properties":{"authenticated":{"type":"boolean","title":"Authenticated","default":true},"inventory_id":{"type":"string","title":"Inventory Id","description":"URL path'teki UUID"},"inventory_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inventory Number","description":"Breadcrumb'taki 'EN-XXXXXXXX' numarası"},"bundle_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bundle Number","description":"Bağ No (UUID)"},"producer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Producer","description":"Üretici firma adı"},"facility_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facility Name","description":"Üretim Tesisi"},"tag_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tag Count"},"steel_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Type"},"steel_diameter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Diameter"},"length_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Length Meters"},"rod_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rod Count"},"casting_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Casting Number"},"tags":{"items":{"$ref":"#/components/schemas/InventoryTag"},"type":"array","title":"Tags"},"csrf_token_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Csrf Token Prefix"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["inventory_id"],"title":"InventoryDetail","description":"`/rebar_bundle_inventories/{inventory_id}/rebar_bundle` — bağ detay sayfası."},"InventoryItem":{"properties":{"inventory_id":{"type":"string","title":"Inventory Id","description":"URL'deki UUID (detay sayfası ID'si)"},"bundle_number":{"type":"string","title":"Bundle Number","description":"Bağ no (görünen UUID)"},"facility_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facility Name"},"steel_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Type"},"steel_diameter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Diameter"},"length_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Length Meters"},"rod_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rod Count"},"casting_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Casting Number"},"activated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Activated At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"state":{"anyOf":[{"$ref":"#/components/schemas/BundleState"},{"type":"null"}]},"state_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State Label"},"rebar_bundle_id_for_reduction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rebar Bundle Id For Reduction","description":"'Bağ Eksilt' butonundaki rebar_bundle_id (eksiltme için)"}},"type":"object","required":["inventory_id","bundle_number"],"title":"InventoryItem","description":"Envanter tablosundaki bir satır."},"InventoryPage":{"properties":{"authenticated":{"type":"boolean","title":"Authenticated","default":true},"summary":{"$ref":"#/components/schemas/InventorySummary"},"items":{"items":{"$ref":"#/components/schemas/InventoryItem"},"type":"array","title":"Items"},"pagination":{"$ref":"#/components/schemas/InventoryPagination"},"csrf_token_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Csrf Token Prefix"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["summary","items","pagination"],"title":"InventoryPage"},"InventoryPagination":{"properties":{"current_page":{"type":"integer","title":"Current Page","default":1},"last_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"has_prev":{"type":"boolean","title":"Has Prev","default":false}},"type":"object","title":"InventoryPagination"},"InventorySummary":{"properties":{"bundle_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bundle Count"},"cancelled_bundle_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cancelled Bundle Count"}},"type":"object","title":"InventorySummary"},"InventoryTag":{"properties":{"serial_number":{"type":"string","title":"Serial Number"},"activated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Activated At"},"deactivated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deactivated At"},"state_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State Label"}},"type":"object","required":["serial_number"],"title":"InventoryTag","description":"Bir bağa ait fiziksel etiket (her bağda 2 etiket olur)."},"LabelOwner":{"properties":{"stakeholder":{"anyOf":[{"$ref":"#/components/schemas/Stakeholder"},{"type":"null"}]},"facility":{"anyOf":[{"$ref":"#/components/schemas/Facility"},{"type":"null"}]},"rebar_bundle":{"anyOf":[{"$ref":"#/components/schemas/RebarBundle"},{"type":"null"}]},"rebar_bundle_labels":{"items":{"$ref":"#/components/schemas/RebarBundleLabel"},"type":"array","title":"Rebar Bundle Labels"}},"additionalProperties":true,"type":"object","title":"LabelOwner","description":"get_label_owner response data — nested yapı."},"LabelOwnerResponse":{"properties":{"code":{"type":"integer","title":"Code"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"found":{"type":"boolean","title":"Found"},"owner":{"anyOf":[{"$ref":"#/components/schemas/LabelOwner"},{"type":"null"}]},"accepted":{"type":"boolean","title":"Accepted","description":"True ise update_label_owner ile sahiplik transferi yapıldı","default":false},"acceptance":{"anyOf":[{"$ref":"#/components/schemas/AcceptedLabel"},{"type":"null"}],"description":"Kabul response verisi (accepted=true ise dolu)"},"accept_error_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Accept Error Code","description":"Kabul hatası kodu (accepted=false ve found=true ise dolu)"},"accept_error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept Error Message","description":"Kabul hatası mesajı — neden kabul edilemedi"}},"type":"object","required":["code","found"],"title":"LabelOwnerResponse","description":"API endpoint'inin döndüreceği envelope-flatten response.\n\nServisimiz native envelope'u client'a olduğu gibi geçirir; ama bilinen\nhata durumlarını HTTP status'a çevirir (404 = etiket bulunamadı).\nEtiket bulunursa otomatik sahiplik transferi yapılır."},"LogSummary":{"properties":{"total":{"type":"integer","title":"Total"},"successful":{"type":"integer","title":"Successful"},"failed":{"type":"integer","title":"Failed"},"success_rate":{"type":"number","title":"Success Rate"},"average_duration_ms":{"type":"number","title":"Average Duration Ms"},"last_24_hours":{"type":"integer","title":"Last 24 Hours"},"by_provider":{"items":{"$ref":"#/components/schemas/DistributionItem"},"type":"array","title":"By Provider"},"by_operation":{"items":{"$ref":"#/components/schemas/DistributionItem"},"type":"array","title":"By Operation"}},"type":"object","required":["total","successful","failed","success_rate","average_duration_ms","last_24_hours"],"title":"LogSummary"},"LoginRequest":{"properties":{"username":{"type":"string","maxLength":128,"minLength":3,"title":"Username","description":"Username veya email kabul edilir"},"password":{"type":"string","maxLength":256,"minLength":8,"format":"password","title":"Password","writeOnly":true}},"type":"object","required":["username","password"],"title":"LoginRequest","description":"Servisimizdeki kullanıcı ile login (MongoDB'deki users)."},"LoginResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In","description":"Saniye cinsinden geçerlilik"},"user":{"$ref":"#/components/schemas/UserView"}},"type":"object","required":["access_token","expires_in","user"],"title":"LoginResponse"},"ManualTriggerRequest":{"properties":{"to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To","description":"Test adresi — boşsa yapılandırılan alıcılara gönderilir"}},"type":"object","title":"ManualTriggerRequest","description":"Bir bildirimi elle tetikle. `to` verilirse yalnızca o adrese (test);\nboşsa olayın yapılandırılmış alıcılarına gönderilir."},"ManualTriggerResult":{"properties":{"ok":{"type":"boolean","title":"Ok"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"sent_to":{"items":{"type":"string"},"type":"array","title":"Sent To"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail","description":"Tetiklendiği andaki gerçek durum özeti"}},"type":"object","required":["ok"],"title":"ManualTriggerResult"},"NotificationEventVar":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"}},"type":"object","required":["name","description"],"title":"NotificationEventVar","description":"Şablonda kullanılabilen bir yer tutucu değişken."},"NotificationRuleUpdate":{"properties":{"event":{"type":"string","title":"Event"},"enabled":{"type":"boolean","title":"Enabled","default":true},"recipients":{"items":{"type":"string"},"type":"array","title":"Recipients"},"cc":{"items":{"type":"string"},"type":"array","title":"Cc"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"}},"type":"object","required":["event"],"title":"NotificationRuleUpdate","description":"PUT gövdesinde tek bir olay kuralı."},"NotificationRuleView":{"properties":{"event":{"type":"string","title":"Event"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"},"enabled":{"type":"boolean","title":"Enabled"},"recipients":{"items":{"type":"string"},"type":"array","title":"Recipients"},"cc":{"items":{"type":"string"},"type":"array","title":"Cc"},"subject":{"type":"string","title":"Subject"},"body_html":{"type":"string","title":"Body Html"},"variables":{"items":{"$ref":"#/components/schemas/NotificationEventVar"},"type":"array","title":"Variables"}},"type":"object","required":["event","label","description","enabled","recipients","cc","subject","body_html","variables"],"title":"NotificationRuleView","description":"Bir olay kuralının UI görünümü — etkin (override + varsayılan merge) değerler + meta."},"Page_AuditLogView_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AuditLogView"},"type":"array","title":"Items"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total":{"type":"integer","title":"Total"},"pages":{"type":"integer","title":"Pages"}},"type":"object","required":["items","page","page_size","total","pages"],"title":"Page[AuditLogView]"},"Page_ExecutionLogView_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ExecutionLogView"},"type":"array","title":"Items"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total":{"type":"integer","title":"Total"},"pages":{"type":"integer","title":"Pages"}},"type":"object","required":["items","page","page_size","total","pages"],"title":"Page[ExecutionLogView]"},"PaginationMeta":{"properties":{"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"total":{"type":"integer","title":"Total"},"last_page":{"type":"integer","title":"Last Page"}},"type":"object","required":["page","per_page","total","last_page"],"title":"PaginationMeta","description":"Pagination bilgisi."},"PairingCodeResponse":{"properties":{"code":{"type":"string","title":"Code"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"ttl_seconds":{"type":"integer","title":"Ttl Seconds"},"tenant_id":{"type":"string","title":"Tenant Id"}},"type":"object","required":["code","expires_at","ttl_seconds","tenant_id"],"title":"PairingCodeResponse"},"PreDispatchPagination":{"properties":{"current_page":{"type":"integer","title":"Current Page","default":1},"last_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"has_prev":{"type":"boolean","title":"Has Prev","default":false}},"type":"object","title":"PreDispatchPagination"},"PreDispatchResult":{"properties":{"success":{"type":"boolean","title":"Success"},"items":{"items":{"$ref":"#/components/schemas/idis_integration__modules__mobile_api__rebar_bundles__models__PreDispatchItem"},"type":"array","title":"Items"},"error_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Error Code"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["success"],"title":"PreDispatchResult","description":"Sevk bildirimi POST sonucu."},"PreDispatchSummary":{"properties":{"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count"}},"type":"object","title":"PreDispatchSummary"},"PreDispatchesPage":{"properties":{"authenticated":{"type":"boolean","title":"Authenticated","default":true},"summary":{"$ref":"#/components/schemas/PreDispatchSummary"},"items":{"items":{"$ref":"#/components/schemas/idis_integration__modules__pre_dispatches__models__PreDispatchItem"},"type":"array","title":"Items"},"pagination":{"$ref":"#/components/schemas/PreDispatchPagination"},"csrf_token_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Csrf Token Prefix"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["summary","items","pagination"],"title":"PreDispatchesPage"},"RateLimitBucketView":{"properties":{"id":{"type":"string","title":"Id"},"scope":{"type":"string","title":"Scope"},"key_type":{"type":"string","title":"Key Type"},"identifier":{"type":"string","title":"Identifier"},"actor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"remaining":{"type":"number","title":"Remaining"},"capacity":{"type":"integer","title":"Capacity"},"blocked":{"type":"boolean","title":"Blocked"},"retry_after_seconds":{"type":"integer","title":"Retry After Seconds"},"blocked_count":{"type":"integer","title":"Blocked Count"},"last_seen_at":{"type":"string","format":"date-time","title":"Last Seen At"},"last_blocked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Blocked At"}},"type":"object","required":["id","scope","key_type","identifier","actor","tenant_id","remaining","capacity","blocked","retry_after_seconds","blocked_count","last_seen_at","last_blocked_at"],"title":"RateLimitBucketView"},"RebarBundle":{"properties":{"id":{"type":"string","title":"Id"},"rebar_bundle_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rebar Bundle Number"},"facility_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facility Id"},"steel_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Type"},"steel_diameter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Diameter"},"steel_length":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Length"},"steel_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Steel Count"},"rebar_casting_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rebar Casting Number"},"sku":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sku"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"},"deleted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deleted At"}},"additionalProperties":true,"type":"object","required":["id"],"title":"RebarBundle"},"RebarBundleLabel":{"properties":{"id":{"type":"string","title":"Id"},"rebar_bundle_label_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rebar Bundle Label Number"},"rebar_bundle_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rebar Bundle Id"},"tag_serial_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag Serial Number"},"activated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Activated At"},"deactivated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deactivated At"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":true,"type":"object","required":["id"],"title":"RebarBundleLabel"},"RedeemRequest":{"properties":{"pairingCode":{"type":"string","maxLength":32,"minLength":4,"title":"Pairingcode"},"hostname":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hostname"},"machineFingerprint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Machinefingerprint"}},"type":"object","required":["pairingCode"],"title":"RedeemRequest"},"ReleaseView":{"properties":{"id":{"type":"string","title":"Id"},"platform":{"type":"string","title":"Platform"},"version":{"type":"string","title":"Version"},"version_code":{"type":"integer","title":"Version Code"},"notes":{"type":"string","title":"Notes"},"file_name":{"type":"string","title":"File Name"},"size_bytes":{"type":"integer","title":"Size Bytes"},"sha256":{"type":"string","title":"Sha256"},"is_active":{"type":"boolean","title":"Is Active"},"uploaded_by_username":{"type":"string","title":"Uploaded By Username"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"download_path":{"type":"string","title":"Download Path"}},"type":"object","required":["id","platform","version","version_code","notes","file_name","size_bytes","sha256","is_active","uploaded_by_username","created_at","download_path"],"title":"ReleaseView"},"RevealSecretRequest":{"properties":{"password":{"type":"string","maxLength":200,"minLength":1,"format":"password","title":"Password","writeOnly":true}},"type":"object","required":["password"],"title":"RevealSecretRequest","description":"Hassas görüntüleme için çağıranın kendi sistem şifresi (re-auth)."},"SessionCaptureImportRequest":{"properties":{"raw_capture":{"type":"string","minLength":100,"title":"Raw Capture","description":"Login request/response ham metni; response set-cookie satırları olmalı."},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},"type":"object","required":["raw_capture"],"title":"SessionCaptureImportRequest","description":"POST /users/sign_in capture text'inden IDIS session import."},"SessionInjectRequest":{"properties":{"rails_session":{"type":"string","minLength":20,"title":"Rails Session"},"remember_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Remember Token"},"csrf_token":{"type":"string","minLength":20,"title":"Csrf Token"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},"type":"object","required":["rails_session","csrf_token"],"title":"SessionInjectRequest","description":"Elle Chrome'dan çıkarılan IDIS portal cookie'lerini inject.\n\n`user_email` boş bırakılırsa giriş yapan kullanıcının `idis_email` veya `email`\nalanı otomatik kullanılır."},"SessionStatus":{"properties":{"present":{"type":"boolean","title":"Present"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"issued_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Issued At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"is_expired":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Expired"},"has_remember_token":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Remember Token"},"rails_session_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rails Session Prefix"},"csrf_token_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Csrf Token Prefix"},"storage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage"}},"type":"object","required":["present"],"title":"SessionStatus"},"Stakeholder":{"properties":{"id":{"type":"string","title":"Id"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"company_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Title"},"tax_office":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tax Office"},"tax_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tax Number"},"city_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"City Id"},"city_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City Name"},"county_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"County Id"},"county_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"County Name"},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postal Code"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"approved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Approved"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":true,"type":"object","required":["id"],"title":"Stakeholder"},"StakeholdersPage":{"properties":{"authenticated":{"type":"boolean","title":"Authenticated","description":"Session geçerli mi? false ise cookie expire/yanlış"},"status_code":{"type":"integer","title":"Status Code"},"page_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Title"},"active_stakeholder_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Active Stakeholder Name","description":"Aktif kuruluş adı (ör. 'ORAYSAN İNŞAAT LOJ.SAN.VE TİC.A.Ş.')"},"menu_items":{"items":{"type":"string"},"type":"array","title":"Menu Items","description":"Sol sidebar menü öğeleri"},"csrf_token_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Csrf Token Prefix"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["authenticated","status_code"],"title":"StakeholdersPage","description":"`/stakeholders` sayfasından çıkarılan veriler."},"StockDeclarationItem":{"properties":{"declaration_id":{"type":"string","title":"Declaration Id"},"declaration_number":{"type":"string","title":"Declaration Number","description":"SB-XXXXXX"},"steel_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Type"},"steel_diameter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Diameter"},"length_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Length Meters"},"bundle_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Bundle Count"},"producer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Producer Name"},"casting_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Casting Number"},"declared_acceptance_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Declared Acceptance Date"},"declared_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Declared At"}},"type":"object","required":["declaration_id","declaration_number"],"title":"StockDeclarationItem"},"StockDeclarationPagination":{"properties":{"current_page":{"type":"integer","title":"Current Page","default":1},"last_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Page"},"has_next":{"type":"boolean","title":"Has Next","default":false},"has_prev":{"type":"boolean","title":"Has Prev","default":false}},"type":"object","title":"StockDeclarationPagination"},"StockDeclarationSummary":{"properties":{"total_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Count"}},"type":"object","title":"StockDeclarationSummary"},"StockDeclarationsPage":{"properties":{"authenticated":{"type":"boolean","title":"Authenticated","default":true},"summary":{"$ref":"#/components/schemas/StockDeclarationSummary"},"items":{"items":{"$ref":"#/components/schemas/StockDeclarationItem"},"type":"array","title":"Items"},"pagination":{"$ref":"#/components/schemas/StockDeclarationPagination"},"csrf_token_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Csrf Token Prefix"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["summary","items","pagination"],"title":"StockDeclarationsPage"},"SystemSettingsUpdateRequest":{"properties":{"smtp_enabled":{"type":"boolean","title":"Smtp Enabled","default":false},"smtp_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Smtp Host"},"smtp_port":{"type":"integer","title":"Smtp Port","default":587},"smtp_security":{"type":"string","title":"Smtp Security","default":"starttls"},"smtp_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Smtp Username"},"smtp_password":{"anyOf":[{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Smtp Password"},"clear_smtp_password":{"type":"boolean","title":"Clear Smtp Password","default":false},"smtp_from_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Smtp From Email"},"smtp_from_name":{"type":"string","title":"Smtp From Name","default":"İDİS Entegrasyon"},"notifications":{"items":{"$ref":"#/components/schemas/NotificationRuleUpdate"},"type":"array","title":"Notifications"}},"type":"object","title":"SystemSettingsUpdateRequest","description":"Sistem ayarlarını upsert eder.\n\nParola: ``smtp_password`` verilirse (boş değil) şifrelenip saklanır; None/boşsa mevcut\nkorunur. ``clear_smtp_password=True`` mevcut parolayı siler."},"SystemSettingsView":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"tenant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Name"},"smtp_enabled":{"type":"boolean","title":"Smtp Enabled"},"smtp_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Smtp Host"},"smtp_port":{"type":"integer","title":"Smtp Port"},"smtp_security":{"type":"string","title":"Smtp Security"},"smtp_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Smtp Username"},"has_smtp_password":{"type":"boolean","title":"Has Smtp Password"},"smtp_from_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Smtp From Email"},"smtp_from_name":{"type":"string","title":"Smtp From Name"},"notifications":{"items":{"$ref":"#/components/schemas/NotificationRuleView"},"type":"array","title":"Notifications"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["tenant_id","smtp_enabled","smtp_host","smtp_port","smtp_security","smtp_username","has_smtp_password","smtp_from_email","smtp_from_name","notifications","updated_at"],"title":"SystemSettingsView","description":"Sistem ayarları görünümü — parola plaintext DÖNDÜRMEZ."},"TagVerifyResult":{"properties":{"tag_serial_number":{"type":"string","title":"Tag Serial Number"},"success":{"type":"boolean","title":"Success","description":"True ise etiket geçerli ve sahibi çıkarıldı"},"found":{"type":"boolean","title":"Found","description":"IDIS'te etiket var mı"},"owner":{"anyOf":[{"$ref":"#/components/schemas/LabelOwner"},{"type":"null"}]},"accepted":{"type":"boolean","title":"Accepted","description":"True ise update_label_owner ile sahiplik transferi yapıldı","default":false},"acceptance":{"anyOf":[{"$ref":"#/components/schemas/AcceptedLabel"},{"type":"null"}],"description":"Kabul response verisi (accepted=true ise dolu)"},"accept_error_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Accept Error Code","description":"Kabul hatası kodu (accepted=false ve found=true ise dolu)"},"accept_error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept Error Message","description":"Kabul hatası mesajı — neden kabul edilemedi"},"error_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Error Code","description":"Sorgu hatası kodu (found=false ise dolu)"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms","description":"Bu etiket için harcanan süre (debugging)"}},"type":"object","required":["tag_serial_number","success","found"],"title":"TagVerifyResult","description":"Bir etiketin doğrulama + kabul sonucu.\n\nSAP per-tag bazında hangi bağ kabul edildi, hangisi edilemedi\ngörebilir ve retry/ignore kararını buna göre verir."},"TenantCreateRequest":{"properties":{"name":{"type":"string","maxLength":128,"minLength":2,"title":"Name"},"stakeholder_id":{"type":"string","maxLength":128,"minLength":1,"title":"Stakeholder Id","description":"IDIS portal stakeholder UUID"}},"type":"object","required":["name","stakeholder_id"],"title":"TenantCreateRequest"},"TenantUpdateRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":128,"minLength":2},{"type":"null"}],"title":"Name"},"stakeholder_id":{"anyOf":[{"type":"string","maxLength":128,"minLength":1},{"type":"null"}],"title":"Stakeholder Id"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"TenantUpdateRequest"},"TenantView":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"stakeholder_id":{"type":"string","title":"Stakeholder Id"},"is_active":{"type":"boolean","title":"Is Active"},"user_count":{"type":"integer","title":"User Count","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","stakeholder_id","is_active","created_at","updated_at"],"title":"TenantView"},"TestEmailRequest":{"properties":{"to":{"type":"string","title":"To","description":"Test e-postasının gönderileceği adres"}},"type":"object","required":["to"],"title":"TestEmailRequest"},"TestEmailResult":{"properties":{"ok":{"type":"boolean","title":"Ok"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["ok"],"title":"TestEmailResult"},"UserCreateRequest":{"properties":{"username":{"type":"string","maxLength":64,"minLength":3,"title":"Username"},"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":256,"minLength":8,"format":"password","title":"Password","writeOnly":true},"role":{"$ref":"#/components/schemas/UserRole","default":"operator"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"idis_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idis Email"},"idis_password":{"anyOf":[{"type":"string","format":"password","writeOnly":true},{"type":"null"}],"title":"Idis Password"}},"type":"object","required":["username","email","password"],"title":"UserCreateRequest"},"UserRole":{"type":"string","enum":["superadmin","admin","operator"],"title":"UserRole"},"UserUpdateRequest":{"properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"role":{"anyOf":[{"$ref":"#/components/schemas/UserRole"},{"type":"null"}]},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"password":{"anyOf":[{"type":"string","maxLength":256,"minLength":8,"format":"password","writeOnly":true},{"type":"null"}],"title":"Password"},"idis_email":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Idis Email"},"idis_password":{"anyOf":[{"type":"string","maxLength":256,"minLength":1,"format":"password","writeOnly":true},{"type":"null"}],"title":"Idis Password"}},"type":"object","title":"UserUpdateRequest","description":"Admin tarafından kullanıcı güncelleme. Her alan opsiyonel — sadece\ngönderilen alanlar değişir."},"UserView":{"properties":{"id":{"type":"string","title":"Id"},"username":{"type":"string","title":"Username"},"email":{"type":"string","format":"email","title":"Email"},"role":{"$ref":"#/components/schemas/UserRole"},"is_active":{"type":"boolean","title":"Is Active"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"tenant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Name"},"idis_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idis Email"},"has_idis_credentials":{"type":"boolean","title":"Has Idis Credentials","default":false},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_login_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Login At"}},"type":"object","required":["id","username","email","role","is_active","created_at"],"title":"UserView"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WaybillAcceptanceResult":{"properties":{"batch_id":{"type":"string","title":"Batch Id"},"summary":{"additionalProperties":true,"type":"object","title":"Summary"},"tag_results":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tag Results"},"duration_ms":{"type":"integer","title":"Duration Ms"},"all_successful":{"type":"boolean","title":"All Successful"},"all_accepted":{"type":"boolean","title":"All Accepted"},"executed_at":{"type":"string","format":"date-time","title":"Executed At"},"performed_by_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Performed By User Id"},"performed_by_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Performed By Username"}},"type":"object","required":["batch_id","summary","duration_ms","all_successful","all_accepted","executed_at"],"title":"WaybillAcceptanceResult","description":"batch_verify_tags / batch_accept_tags sonucu — waybill'e gömülür."},"WaybillAuditEntry":{"properties":{"action":{"type":"string","title":"Action","description":"upload | verify | accept | verify_dispatch | dispatch | delivery_info | delete"},"user_id":{"type":"string","title":"User Id"},"username":{"type":"string","title":"Username"},"at":{"type":"string","format":"date-time","title":"At"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["action","user_id","username","at"],"title":"WaybillAuditEntry","description":"Bir kullanıcının irsaliye üzerinde yaptığı tekil eylem kaydı."},"WaybillDeliveryInfoRequest":{"properties":{"dispatch_id":{"type":"string","title":"Dispatch Id","description":"Sevkiyat UUID'si"},"delivery_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Number","description":"Istege bagli irsaliye QR / teslimat numarasi"}},"type":"object","required":["dispatch_id"],"title":"WaybillDeliveryInfoRequest","description":"Kayitli irsaliye PDF'ini olusan sevke ekleme istegi."},"WaybillDetailOut":{"properties":{"id":{"type":"string","title":"Id"},"irsaliye_no":{"type":"string","title":"Irsaliye No"},"tedarikci":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tedarikci"},"tarih":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Tarih"},"ettn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ettn"},"plaka":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plaka"},"dorse_plaka":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dorse Plaka"},"irsaliye_tipi":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Irsaliye Tipi"},"status":{"$ref":"#/components/schemas/WaybillStatus"},"total_kg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Kg"},"total_adet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Adet"},"tag_count":{"type":"integer","title":"Tag Count"},"line_item_count":{"type":"integer","title":"Line Item Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"line_items":{"items":{"$ref":"#/components/schemas/WaybillLineItem"},"type":"array","title":"Line Items"},"all_tags":{"items":{"type":"string"},"type":"array","title":"All Tags"},"verification_result":{"anyOf":[{"$ref":"#/components/schemas/WaybillVerificationResult"},{"type":"null"}]},"acceptance_result":{"anyOf":[{"$ref":"#/components/schemas/WaybillAcceptanceResult"},{"type":"null"}]},"dispatch_verification_result":{"anyOf":[{"$ref":"#/components/schemas/WaybillVerificationResult"},{"type":"null"}]},"dispatch_result":{"anyOf":[{"$ref":"#/components/schemas/WaybillDispatchResult"},{"type":"null"}]},"original_filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original Filename"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"created_by_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By User Id"},"created_by_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Username"},"last_action_by_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Action By User Id"},"last_action_by_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Action By Username"},"audit_log":{"items":{"$ref":"#/components/schemas/WaybillAuditEntry"},"type":"array","title":"Audit Log"}},"type":"object","required":["id","irsaliye_no","status","tag_count","line_item_count","created_at","updated_at","line_items","all_tags"],"title":"WaybillDetailOut","description":"İrsaliye detayı — tüm alanlar."},"WaybillDispatchRequest":{"properties":{"plate_number":{"type":"string","maxLength":16,"minLength":2,"title":"Plate Number","description":"Araç plakası (ör. '34ABC123')"}},"type":"object","required":["plate_number"],"title":"WaybillDispatchRequest","description":"Sevk bildirimi için plaka bilgisi."},"WaybillDispatchResult":{"properties":{"batch_id":{"type":"string","title":"Batch Id"},"plate_number":{"type":"string","title":"Plate Number"},"summary":{"additionalProperties":true,"type":"object","title":"Summary"},"duration_ms":{"type":"integer","title":"Duration Ms"},"dispatch_created":{"type":"boolean","title":"Dispatch Created"},"pre_dispatch_created":{"type":"boolean","title":"Pre Dispatch Created","default":false},"dispatch_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatch Id"},"dispatch_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatch Number"},"redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Url"},"app_redirect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Redirect Url"},"status_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Label"},"item_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Item Count"},"delivery_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Number"},"delivery_document_uploaded":{"type":"boolean","title":"Delivery Document Uploaded","default":false},"executed_at":{"type":"string","format":"date-time","title":"Executed At"},"performed_by_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Performed By User Id"},"performed_by_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Performed By Username"}},"type":"object","required":["batch_id","plate_number","summary","duration_ms","dispatch_created","executed_at"],"title":"WaybillDispatchResult","description":"batch_dispatch_declare sonucu — waybill'e gömülür."},"WaybillLineItem":{"properties":{"line_number":{"type":"integer","title":"Line Number"},"malzeme_kodu":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Malzeme Kodu"},"malzeme_tanimi":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Malzeme Tanimi"},"steel_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Type"},"steel_diameter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Diameter"},"miktar_kg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Miktar Kg"},"birim_adet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Birim Adet"},"tag_serial_numbers":{"items":{"type":"string"},"type":"array","title":"Tag Serial Numbers"},"dokum_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dokum No"},"aciklama":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aciklama"}},"type":"object","required":["line_number"],"title":"WaybillLineItem","description":"İrsaliye satır kalemi — Excel/CSV'den parse edilir."},"WaybillListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/WaybillSummaryOut"},"type":"array","title":"Items"},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"type":"object","required":["items","pagination"],"title":"WaybillListResponse","description":"Paginated irsaliye listesi."},"WaybillStatus":{"type":"string","enum":["uploaded","verifying","verified","verification_partial","acceptance_started","acceptance_done","acceptance_partial","dispatch_verifying","dispatch_verified","dispatch_verification_partial","dispatch_started","dispatch_done","dispatch_failed"],"title":"WaybillStatus"},"WaybillSummaryOut":{"properties":{"id":{"type":"string","title":"Id"},"irsaliye_no":{"type":"string","title":"Irsaliye No"},"tedarikci":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tedarikci"},"tarih":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Tarih"},"ettn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ettn"},"status":{"$ref":"#/components/schemas/WaybillStatus"},"total_kg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Kg"},"total_adet":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Adet"},"tag_count":{"type":"integer","title":"Tag Count"},"line_item_count":{"type":"integer","title":"Line Item Count"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"created_by_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Username"},"last_action_by_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Action By Username"}},"type":"object","required":["id","irsaliye_no","status","tag_count","line_item_count","created_at"],"title":"WaybillSummaryOut","description":"İrsaliye listesi için özet — hafif response."},"WaybillVerificationResult":{"properties":{"batch_id":{"type":"string","title":"Batch Id"},"summary":{"additionalProperties":true,"type":"object","title":"Summary"},"tag_results":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tag Results"},"duration_ms":{"type":"integer","title":"Duration Ms"},"all_found":{"type":"boolean","title":"All Found"},"executed_at":{"type":"string","format":"date-time","title":"Executed At"},"performed_by_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Performed By User Id"},"performed_by_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Performed By Username"}},"type":"object","required":["batch_id","summary","duration_ms","all_found","executed_at"],"title":"WaybillVerificationResult","description":"Bağ kodu kontrol sonucu — per-tag detaylarla birlikte."},"idis_integration__modules__mobile_api__rebar_bundles__models__PreDispatchItem":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"pre_dispatch_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pre Dispatch Number"},"facility_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Facility Id"},"dispatch_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatch Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"plate_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plate Number"},"rebar_load_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rebar Load Date"},"tag_serial_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag Serial Number","description":"Virgülle ayrılmış etiket seri numaraları"},"steel_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Type"},"steel_diameter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Diameter"},"steel_length":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Length"},"rebar_casting_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rebar Casting Number"},"transaction_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Transaction Number"},"steel_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Steel Count"},"state":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"State"},"stakeholder_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stakeholder Id"},"transaction_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Id"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":true,"type":"object","title":"PreDispatchItem","description":"POST pre_dispatches response'undaki tek bir sevk kalemi."},"idis_integration__modules__pre_dispatches__models__PreDispatchItem":{"properties":{"pre_dispatch_id":{"type":"string","title":"Pre Dispatch Id"},"transaction_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Id"},"transaction_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transaction Number","description":"Yükleme No (GSN-...)"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"plate_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plate Number"},"loaded_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Loaded At"},"tag_serial_numbers":{"items":{"type":"string"},"type":"array","title":"Tag Serial Numbers"},"steel_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Type"},"steel_diameter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Steel Diameter"},"length_meters":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Length Meters"},"rod_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rod Count"},"casting_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Casting Number"}},"type":"object","required":["pre_dispatch_id"],"title":"PreDispatchItem"}},"securitySchemes":{"OAuth2 (username/password)":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/v1/auth/token"}}},"API Key":{"type":"apiKey","in":"header","name":"X-API-Key"}}},"tags":[{"name":"Sistem","description":"Servis sağlık ve sürüm bilgisi (auth gerektirmez)."},{"name":"Kimlik: Giriş & Token","description":"Servise login (username/password → JWT) + OAuth2 token endpoint'i. Swagger UI 🔒 Authorize butonu `/auth/token`'ı kullanır. Programatik login için JSON body destekli `/auth/login` mevcut."},{"name":"Kimlik: Kullanıcılar","description":"Kullanıcı CRUD (admin only) + kendi şifreni değiştirme."},{"name":"Kimlik: API Anahtarları","description":"Makine-makine API key yönetimi. SAP gibi servislere verilen anahtarlar burada üretilir / listelenir / revoke edilir. Anahtar üretildiği anda **bir kez** ham değer görünür, sonra sadece hash."},{"name":"Yönetim: Tenant","description":"Tenant (şirket) CRUD — superadmin only. Her tenant bir IDIS stakeholder'a eşlenir. Kullanıcılar tenant'a atanır."},{"name":"Yönetim: Tenant Kullanıcıları","description":"Tenant içi kullanıcı yönetimi — kullanıcı ekleme, IDIS credential tanımlama, rol atama. Superadmin tüm tenant'lara, admin kendi tenant'ına erişir."},{"name":"Yönetim: Sistem Ayarları","description":"Tenant bazında SMTP + bilgilendirme e-postası ayarları. Portal erişim sorunu, oturum süresi dolma ve cihaz çevrimdışı olaylarında kime/CC mail gideceği + HTML mail şablonları burada yönetilir. Superadmin tüm tenant'lara, admin kendi tenant'ına erişir."},{"name":"IDIS Bağlantı: Portal Cookie","description":"**Web scraping için** IDIS portal cookie yönetimi. Chrome'dan kopyalanan `_rails8_session` + `remember_user_token` 14 gün boyunca tüm scraping endpoint'lerinde (Veri: ...) kullanılır."},{"name":"SAP: Mal Kabul","description":"🚚 **Alış akışı — gelen ürünlerin kabulü (telefon agent'ı).**\n\n- `POST /batch-verify` — toplu (SAP'nin asıl kullandığı, e-irsaliyedeki tüm bağlar tek istekte)\n- `GET /label-owner` — tek tag (test/debug veya tek bağ)\n\nİş telefon agent'ına gider; her etiket gerçek İDİS app'inde kabul edilir. Agent yoksa `401`. Response şekli SAP açısından aynıdır."},{"name":"SAP: Sevk Bildirim","description":"📦 **Satış akışı — giden ürünlerin sevki (telefon agent'ı).**\n\n- `POST /batch-dispatch-declare` — bağ yükleme (plaka + tüm etiketler)\n- `POST /batch-dispatch-complete` — bağ yükleme + portal SE no üretimi\n\nAgent gerçek İDİS app'inde sevki sürer; sorgu-yalnız uçlar (`/my-label`, `/batch-check-dispatch`) agent modunda `409` döner."},{"name":"Veri: Kuruluş","description":"Aktif kuruluş bilgisi (`/stakeholders` — login sonrası landing)."},{"name":"Veri: Envanter","description":"Envanter listesi (filtre + pagination) + bağ detayı (etiketler)."},{"name":"Veri: Bağ Kabulleri","description":"Geçmiş tüm mal kabul kayıtları (`/rebar_bundle_acceptances`)."},{"name":"Veri: Bağ Yükleme","description":"Sevk öncesi yüklenmiş bağlar (`/pre_dispatches`)."},{"name":"Veri: Sevk İşlemleri","description":"Sevkler (list + detay). **Detay endpoint'i SE numarası, irsaliye QR, kalemler içerir** — SAP'ye geri yazılacak değerler."},{"name":"Veri: Toplu Sevk","description":"Toplu sevk başlatma adayları (max 5000 bağ)."},{"name":"Veri: Stok Beyanı","description":"Geçmiş dönem stok bildirimleri."},{"name":"İrsaliye","description":"İrsaliye yükleme, mal kabul ve sevk bildirimi operasyonları."},{"name":"Deneme: update_label_owner","description":"**Üretim için değil — admin manuel test/düzeltme.**\n\nBelirli bağ kodları için `update_label_owner`'ı **explicit stakeholder_id** veya **release value** ile çağırmaya yarar. Tenant/context bağımsız çalışır; body'de gönderilen değer doğrudan IDIS'e gider. Yetki: admin/superadmin."}]}