# Müşteri cari hesabı

Müşteriler ekranındaki **Cari hesap** düğmesi bakiye, açık faturalar ve ekstreyi açar. Pozitif bakiye müşterinin işletmeye borcunu, negatif bakiye işletmenin müşteriye borcunu ifade eder. TRY, USD ve EUR ayrı hesaplanır; kur dönüşümü yapılmaz.

## İşlemler

- Açılış bakiyesi para birimi başına bir kez kaydedilir. Düzeltmek için iptal edilip yeniden girilir; kasa hareketi oluşturmaz.
- Tahsilat kasaya giriş, ödeme kasadan çıkış oluşturur. Kasa eksiye düşebilir.
- Tahsilat/ödeme açık bir faturaya bağlanabilir veya faturasız kaydedilebilir. Faturaya bağlanan tutar kalan borcu aşamaz; satışa tahsilat, alışa ödeme bağlanır. Mevcut faturalar TRY cinsindedir.
- Fatura tamamen ödendiğinde kapanır. Satış ekranından kapatılırsa yalnızca kalan tutar kasaya işlenir.
- Cari hareket iptalinde ilgili kasa hareketi geri alınır. Faturaya bağlı kısmi hareket iptalinde fatura yeniden açılır ve varsa kapanış tahsilatı da geri alınır.
- Satış iptalinde bağlı cari ödemeler ve kasa hareketleri aynı veritabanı işlemi içinde geri alınır. Kısmi ödeme bulunan faturanın müşterisi ve işlem türü değiştirilemez; tutarı ödenmiş tutarın altına indirilemez.
- Faturasız hareket bakiyeye yansır; belirli bir faturanın kalan tutarını azaltmaz.

## API

JWT ile giriş yapmış ADMIN kullanıcılar için `/customer/:customerId/account` altında:

- `GET summary`: para birimi bazında bakiye.
- `GET statement`: currency, dateFrom, dateTo, page ve limit ile ilerleyen bakiyeli ekstre; dönem devir ve kapanış toplamları.
- `GET invoices`: açık faturaların toplam, ödenen ve kalan tutarları.
- `POST entries`: requestId, kind, currency, amount, transactionDate ve isteğe bağlı description/saleId; açılış için balanceDirection, ödeme/tahsilat için accountId.
- `POST entries/:entryId/cancel`: hareketi iptal eder.

requestId aynı içerikle tekrar gönderilirse ikinci kayıt oluşmaz. Tutarlar kuruş hassasiyetinde hesaplanır. Oluşturan ve iptal eden kullanıcı JWT üzerinden kaydedilir. Ekstre CSV olarak dışa aktarılabilir veya yazdırılarak PDF kaydedilebilir.

## Veritabanı ve geçmiş kayıtlar

`1791201600000-CreateCustomerAccounts` migration'ı `customer_account_entries` tablosunu, kullanıcı/müşteri/fatura/kasa ilişkilerini ve indeksleri oluşturur. Hareketler soft delete kullanır. Satışlar ve kasa hareketleri ekstreye doğrudan kaynak olur; ikinci bir fatura borcu kaydı tutulmaz.

Geçmişte kapatılmış ve kasa hareketi olmayan faturalar ekstrede tarihsel ödeme ile dengelenir; yeniden borç çıkarılmaz ve geçmiş kasa bakiyesi değiştirilmez.

## Doğrulama

`npm run test:customer-account` gerçek veritabanında rollback edilen test kayıtlarıyla açılış, kısmi ödeme, kalan tutarla kapanış, iptal, tekrarlı istekler, döviz/tarih/sayfalama, işlem hatasında rollback ve JWT/ADMIN HTTP kontrollerini doğrular.
