--------------------------------
Güncel cari_ekstre_pdf.php renkli çıktı ve mail adresni sistemden çekiyor ve Pdf Çıktısında ortada 45 derece fligran metin halinde
-------------------------------
<?php
require_once __DIR__ . '/../includes/config.php';
yetkili_mi(['cari_yonetimi', 'cari_goruntuleme']);
require_once __DIR__ . '/tfpdf/tfpdf.php';

// --- Veritabanı İşlemleri (değişmedi) ---
$cari_id = filter_input(INPUT_GET, 'cari_id', FILTER_VALIDATE_INT);
$filtre_baslangic = $_GET['baslangic'] ?? '';
$filtre_bitis = $_GET['bitis'] ?? '';
if (!$cari_id) die("Geçersiz Cari ID.");

if (empty($filtre_baslangic) || !preg_match("/^d{4}-d{2}-d{2}$/", $filtre_baslangic)) $filtre_baslangic = date('Y-m-01');
if (empty($filtre_bitis) || !preg_match("/^d{4}-d{2}-d{2}$/", $filtre_bitis)) $filtre_bitis = date('Y-m-d');

$aktif_sirket_id = $_SESSION['aktif_sirket_id'] ?? 0;
$secili_cari = null;
$ekstre = [];
$baslangic_bakiye = 0.0;
$donem_ici_borc = 0.0;
$donem_ici_alacak = 0.0;
$sirket_bilgileri = null;

try {
$stmt_sirket = $db->prepare("SELECT * FROM sirketler WHERE id = ?");
$stmt_sirket->execute([$aktif_sirket_id]);
$sirket_bilgileri = $stmt_sirket->fetch(PDO::FETCH_ASSOC);

$stmt_cari = $db->prepare("SELECT * FROM cariler WHERE id = ? AND sirket_id = ?");
$stmt_cari->execute([$cari_id, $aktif_sirket_id]);
$secili_cari = $stmt_cari->fetch();
if (!$secili_cari) die("Cari bulunamadı veya bu şirkete ait değil.");

$sql_devir_borc = "SELECT SUM(tutar) FROM borclar WHERE cari_id = :cari_id AND tur = 'satis' AND tarih < :baslangic AND sirket_id = :sirket_id";
$stmt = $db->prepare($sql_devir_borc);
$stmt->execute([':cari_id' => $cari_id, ':baslangic' => $filtre_baslangic, ':sirket_id' => $aktif_sirket_id]);
$devir_borc = $stmt->fetchColumn() ?: 0.0;

$sql_devir_alacak = "SELECT SUM(tutar) FROM borclar WHERE cari_id = :cari_id AND tur = 'alis' AND tarih < :baslangic AND sirket_id = :sirket_id";
$stmt = $db->prepare($sql_devir_alacak);
$stmt->execute([':cari_id' => $cari_id, ':baslangic' => $filtre_baslangic, ':sirket_id' => $aktif_sirket_id]);
$devir_alacak = $stmt->fetchColumn() ?: 0.0;

$sql_devir_tahsilat = "SELECT SUM(tutar) FROM hesap_hareketleri WHERE cari_id = :cari_id AND tur = 'giris' AND DATE(tarih) < :baslangic AND sirket_id = :sirket_id";
$stmt = $db->prepare($sql_devir_tahsilat);
$stmt->execute([':cari_id' => $cari_id, ':baslangic' => $filtre_baslangic, ':sirket_id' => $aktif_sirket_id]);
$devir_tahsilat = $stmt->fetchColumn() ?: 0.0;

$sql_devir_odeme = "SELECT SUM(tutar) FROM hesap_hareketleri WHERE cari_id = :cari_id AND tur = 'cikis' AND DATE(tarih) < :baslangic AND sirket_id = :sirket_id";
$stmt = $db->prepare($sql_devir_odeme);
$stmt->execute([':cari_id' => $cari_id, ':baslangic' => $filtre_baslangic, ':sirket_id' => $aktif_sirket_id]);
$devir_odeme = $stmt->fetchColumn() ?: 0.0;

$baslangic_bakiye = ($devir_alacak - $devir_odeme) - ($devir_borc - $devir_tahsilat);

$params = [
':cari_id' => $cari_id,
':baslangic' => $filtre_baslangic,
':bitis' => $filtre_bitis . ' 23:59:59',
':sirket_id' => $aktif_sirket_id
];
$tum_hareketler = [];
foreach ([["borclar","satis","Satış"],["borclar","alis","Alış"],["hesap_hareketleri","giris","Tahsilat"],["hesap_hareketleri","cikis","Ödeme"]] as [$tablo, $tur, $ad]) {
$stmt = $db->prepare("SELECT id,tarih,aciklama,tutar,'$ad' as islem_turu FROM $tablo WHERE cari_id=:cari_id AND tur=:tur AND sirket_id=:sirket_id AND tarih BETWEEN :baslangic AND :bitis ORDER BY tarih ASC,id ASC");
$stmt->execute([':cari_id'=>$cari_id,':tur'=>$tur,':sirket_id'=>$a ktif_sirket_id,':baslangic'=>$filtre_baslangic,':b itis'=>$filtre_bitis.' 23:59:59']);
$tum_hareketler = array_merge($tum_hareketler,$stmt->fetchAll());
}

usort($tum_hareketler, fn($a,$b)=>strtotime($a['tarih'])<=>strtotime($b['tarih']));

$bakiye=$baslangic_bakiye;
foreach($tum_hareketler as $h){
$borc=$alacak=0.0;
if($h['islem_turu']=='Satış'||$h['islem_turu']=='Ödeme'){ $borc=$h['tutar']; $donem_ici_borc+=$borc; }
else { $alacak=$h['tutar']; $donem_ici_alacak+=$alacak; }
$bakiye+=($alacak-$borc);
$ekstre[]=['tarih'=>$h['tarih'],'aciklama'=>$h['aciklama']." (".$h['islem_turu']." #".$h['id'].")",'borc'=>$borc,'alacak'=>$alacak,'bakiye'=>$ba kiye];
}
} catch (PDOException $e) { die("Veritabanı hatası: ".$e->getMessage()); }

// --- PDF SINIFI ---
class PDF_Ekstre extends tFPDF {
public $sirket_bilgileri; public $rapor_basligi; public $rapor_tarihi; public $angle=0;


// Döndürme fonksiyonu
function Rotate($angle, $x = -1, $y = -1){
if($x == -1) $x = $this->x;
if($y == -1) $y = $this->y;
if($this->angle != 0)
$this->_out('Q');
$this->angle = $angle;
if($angle != 0){
$angle *= M_PI/180;
$c = cos($angle);
$s = sin($angle);
$cx = $x * $this->k;
$cy = ($this->h - $y) * $this->k;
$this->_out(sprintf('q %.3F %.3F %.3F %.3F %.3F %.3F cm 1 0 0 1 %.3F %.3F cm',
$c, $s, -$s, $c, $cx, $cy, -$cx, -$cy));
}
}
function _endpage() {
$this->SetFont('DejaVu','B',40);
$this->SetTextColor(102,224,236);
$this->Rotate(45, $this->w/2, $this->h/2); // Sayfa ortasında döndür
$this->Text($this->w/2 - 60, $this->h/2, 'FLIGRAN METNİ');
$this->Rotate(0);
$this->SetTextColor(0,0,0);
parent::_endpage();
}



function Header(){
// Sayfa genişliği ve yüksekliği
$sayfa_genisligi = $this->GetPageWidth();
$sayfa_yuksekligi = $this->GetPageHeight();

// Turuncu başlık şeridi
$this->SetFillColor(255,102,0);
$this->Rect(0,0,$sayfa_genisligi,15,'F');
$this->Ln(5);
$this->SetTextColor(255,255,255);
$this->SetFont('DejaVu','B',16);
$this->Cell(0,8,utf8_decode($this->rapor_basligi),0,1,'C');
$this->Ln(5);
$this->SetTextColor(0,0,0);

// Logo ekleme (dinamik konumlandırma)
if (!empty($this->sirket_bilgileri['logo_yolu'])) {
$logo_path = __DIR__.'/../'.$this->sirket_bilgileri['logo_yolu'];
if (file_exists($logo_path)) {
$logo_genislik = 25;
$logo_x = $sayfa_genisligi - $logo_genislik - 10; // sağdan 10 mm boşluk
$logo_y = 5; // üstten 5 mm boşluk
$this->Image($logo_path, $logo_x, $logo_y, $logo_genislik);
}
}
}

function Footer(){
$this->SetY(-20);
$this->SetDrawColor(180,180,180);
$this->Cell(0,5,'','T',1,'C');
$this->SetFont('DejaVu','',8);
$this->SetTextColor(100,100,100);
$adres=$this->sirket_bilgileri['adres']??''; $tel=$this->sirket_bilgileri['telefon']??''; $mail=$this->sirket_bilgileri['email']??'';
$this->Cell(0,5,trim("$adres | Tel: $tel | $mail",' |'),0,1,'C');
$this->Cell(0,5,'Sayfa '.$this->PageNo().'/{nb}',0,0,'L');
$this->Cell(0,5,date('d.m.Y H:i'),0,0,'R');
}
}

// --- PDF ÜRETİMİ ---
$pdf = new PDF_Ekstre();
$pdf->sirket_bilgileri=$sirket_bilgileri;
$pdf->rapor_basligi="CARİ EKSTRE: ".$secili_cari['ad_soyad'];
$pdf->rapor_tarihi="Dönem: ".date('d.m.Y',strtotime($filtre_baslangic))." - ".date('d.m.Y',strtotime($filtre_bitis));
$pdf->AddFont('DejaVu','', 'DejaVuSans.ttf', true);
$pdf->AddFont('DejaVu','B','DejaVuSans-Bold.ttf',true);
$pdf->AliasNbPages();
$pdf->AddPage('L');

// --- Aşağıdaki tablo kısmı tamamen senin orijinal kodun (değişmedi) ---
$pdf->SetFont('DejaVu','B',10);
$pdf->SetFillColor(245,230,255);
$pdf->Cell(40,7,'Cari Adı:',1,0,'L',true);
$pdf->SetFont('DejaVu','',10);
$pdf->Cell(150,7,$secili_cari['ad_soyad'],1,1,'L',true);

$pdf->SetFont('DejaVu','B',10);
$pdf->SetFillColor(230,255,230);
$pdf->Cell(40,7,'Adres:',1,0,'L',true);
$pdf->SetFont('DejaVu','',10);
$pdf->Cell(150,7,$secili_cari['adres']?:'-',1,1,'L',true);

$pdf->SetFont('DejaVu','B',10);
$pdf->SetFillColor(245,230,255);
$pdf->Cell(40,7,'Telefon:',1,0,'L',true);
$pdf->SetFont('DejaVu','',10);
$pdf->Cell(150,7,$secili_cari['telefon']?:'-',1,1,'L',true);

$pdf->SetFont('DejaVu','B',10);
$pdf->SetFillColor(230,255,230);
$pdf->Cell(40,7,'E-posta:',1,0,'L',true);
$pdf->SetFont('DejaVu','',10);
$pdf->Cell(150,7,$secili_cari['eposta']??'-',1,1,'L',true);
$pdf->Ln(10);

// Tablo başlıkları, hareketler ve toplamlar (tamamı aynı kaldı)
$pdf->SetFont('DejaVu','B',10);
$pdf->SetFillColor(0,123,255);
$pdf->SetTextColor(255,255,255);
$pdf->Cell(25,7,'Tarih',1,0,'C',true);
$pdf->Cell(130,7,'Açıklama',1,0,'C',true);
$pdf->Cell(35,7,'Borç (+)',1,0,'C',true);
$pdf->Cell(35,7,'Alacak (-)',1,0,'C',true);
$pdf->Cell(45,7,'Bakiye',1,1,'C',true);
$pdf->SetTextColor(0,0,0);

$pdf->SetFont('DejaVu','B',10);
$pdf->SetFillColor(255,255,200);
$pdf->Cell(155,7,'Devir Bakiye ('.date('d.m.Y',strtotime($filtre_baslangic)).' öncesi)',1,0,'R',true);
$pdf->Cell(35,7,'',1,0,'R',true);
$pdf->Cell(35,7,'',1,0,'R',true);
$pdf->Cell(45,7,number_format($baslangic_bakiye,2,',',' .').' '.getParaBirimiSembolu().' '.($baslangic_bakiye>0?'A':($baslangic_bakiye<0?'B ':'')),1,1,'R',true);

$pdf->SetFont('DejaVu','',9);
$rowIndex=0;
if(empty($ekstre)){
$pdf->Cell(270,10,'Seçilen tarih aralığında hareket bulunamadı.',1,1,'C');
}else{
foreach($ekstre as $hareket){
if($rowIndex%2==0) $pdf->SetFillColor(230,255,230); else $pdf->SetFillColor(245,230,255);
$pdf->Cell(25,7,date('d.m.Y',strtotime($hareket['tarih'])),1,0,'C',true);
$pdf->Cell(130,7,$hareket['aciklama'],1,0,'L',true);
$pdf->Cell(35,7,$hareket['borc']>0?number_format($hareket['borc'],2,',','.').' '.getParaBirimiSembolu():'-',1,0,'R',true);
$pdf->Cell(35,7,$hareket['alacak']>0?number_format($hareket['alacak'],2,',','.').' '.getParaBirimiSembolu():'-',1,0,'R',true);
$pdf->Cell(45,7,number_format($hareket['bakiye'],2,',','.').' '.getParaBirimiSembolu().' '.($hareket['bakiye']>0?'A':($hareket['bakiye']<0?'B':'')),1,1,'R',true);
$rowIndex++;
}
}

$pdf->SetFont('DejaVu','B',10);
$pdf->SetFillColor(0,153,0);
$pdf->SetTextColor(255,255,255);
$pdf->Cell(155,7,'Dönem İçi Toplamlar',1,0,'R',true);
$pdf->Cell(35,7,number_format($donem_ici_borc,2,',','.' ).' '.getParaBirimiSembolu(),1,0,'R',true);
$pdf->Cell(35,7,number_format($donem_ici_alacak,2,',',' .').' '.getParaBirimiSembolu(),1,0,'R',true);
$pdf->Cell(45,7,'',1,1,'R',true);
$pdf->SetTextColor(0,0,0);

$pdf->SetFillColor(255,153,0);
$pdf->SetTextColor(255,255,255);
$pdf->Cell(225,7,'Son Bakiye ('.date('d.m.Y',strtotime($filtre_bitis)).')',1,0, 'R',true);
$pdf->Cell(45,7,number_format($bakiye,2,',','.').' '.getParaBirimiSembolu().' '.($bakiye>0?'A':($bakiye<0?'B':'')),1,1,'R',true) ;
$pdf->SetTextColor(0,0,0);

$pdf->Ln(5);
$pdf->AddFont('DejaVu','I','DejaVuSans-Oblique.ttf',true);
$pdf->SetFont('DejaVu','I',8);
$pdf->Cell(0,5,'A: Alacaklı (Biz borçluyuz) | B: Borçlu (Bize borçlu)',0,1,'L');

$pdf->Output('I','cari-ekstre-'.$cari_id.'.pdf');
?>
--------------------------------
Güncel cariler.php yeni eklenen müşterilere Dosya / Logo (Opsiyonel) ve mail adresi eklenebilir dosya logo çalışmaları devam ediyor
-------------------------------

<?php
require_once __DIR__ . '/../includes/config.php';
yetkili_mi(['cari_yonetimi', 'cari_goruntuleme']);
require_once __DIR__ . '/../functions/yardimci_fonksiyonlar.php';

$sayfa_baslik = "Cari Yönetimi";
$paraBirimi = getParaBirimiSembolu();

// Helper: sütun var mı
function sutunVarMi(PDO $db, string $tablo, string $sutun): bool {
try {
$chk = $db->prepare("SHOW COLUMNS FROM {$tablo} LIKE ?");
$chk->execute([$sutun]);
return (bool)$chk->fetch();
} catch (PDOException $e) {
return false;
}
}

// Cari ekleme
if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['cari_ekle'])) {
if(!csrf_token_dogrula($_POST['csrf_token'] ?? '')) {
$_SESSION['hata'] = "Geçersiz form gönderimi!";
header("Location: cariler.php");
exit();
}

$ad_soyad = temizle($_POST['ad_soyad'] ?? '');
$telefon = temizle($_POST['telefon'] ?? '');
$eposta = temizle($_POST['eposta'] ?? '');
$adres = temizle($_POST['adres'] ?? '');
$grup_id = filter_input(INPUT_POST, 'grup_id', FILTER_VALIDATE_INT);

// Dosya yükleme
$dosya_yolu = null;
if (!empty($_FILES['dosya']['name']) && is_uploaded_file($_FILES['dosya']['tmp_name'])) {
$hedef_klasor = __DIR__ . '/../uploads/cari_dosyalar/';
if (!is_dir($hedef_klasor)) mkdir($hedef_klasor, 0777, true);
$ext = pathinfo($_FILES['dosya']['name'], PATHINFO_EXTENSION);
$yeni_ad = time() . '_' . bin2hex(random_bytes(6)) . '.' . $ext;
$hedef_yol = $hedef_klasor . $yeni_ad;
if (move_uploaded_file($_FILES['dosya']['tmp_name'], $hedef_yol)) {
$dosya_yolu = 'uploads/cari_dosyalar/' . $yeni_ad;
}
}

// Basit doğrulama
$hatalar = [];
if (empty($ad_soyad)) $hatalar[] = "Ad Soyad boş bırakılamaz.";
if (empty($grup_id)) $hatalar[] = "Cari grubu seçilmelidir.";

if (empty($hatalar)) {
try {
$aktif_sirket_id = $_SESSION['aktif_sirket_id'];

// hangi sütunlar var kontrol et
$sutun_eposta = sutunVarMi($db, 'cariler', 'eposta');
$sutun_dosya = sutunVarMi($db, 'cariler', 'dosya_yolu');

// Dinamik INSERT
$columns = ['sirket_id','ad_soyad','telefon','adres','grup_id' ,'toplam_borc','toplam_alacak','bakiye','olusturul ma_tarihi'];
$placeholders = ['?','?','?','?','?','0.00','0.00','0.00','NOW()'];
$params = [$aktif_sirket_id, $ad_soyad, $telefon, $adres, $grup_id];

if ($sutun_eposta) {
// eposta'yi adres alanından sonra mantıklı konumlandırmak için insert listesine ekle
// buradaki pozisyon SQL içinde herhangi bir öneme sahip değil, sadece parametre dizisini tutarlı yapıyoruz
array_splice($columns, 3, 0, 'eposta'); // adres'ten önce ekleme (opsiyonel)
array_splice($placeholders, 3, 0, '?');
array_splice($params, 3, 0, $eposta);
}

if ($sutun_dosya) {
array_splice($columns, 4, 0, 'dosya_yolu'); // grup_id'den önce ekle (opsiyonel)
array_splice($placeholders, 4, 0, '?');
array_splice($params, 4, 0, $dosya_yolu);
}

// Oluştur SQL
$cols_sql = implode(', ', $columns);
$vals_sql = implode(', ', $placeholders);

// Eğer "NOW()" placeholder'ı varsa onu parametre olarak değil doğrudan bırakıyoruz.
// Parametre sayısını doğru tutmak için placeholders içinde 'NOW()' varsa parametre dizisine ekleme yapılmamıştır.
$insert_sql = "INSERT INTO cariler ({$cols_sql}) VALUES ({$vals_sql})";
$stmt = $db->prepare($insert_sql);
$stmt->execute($params);

$_SESSION['mesaj'] = "Cari başarıyla eklendi.";
header("Location: cariler.php");
exit();
} catch(PDOException $e) {
error_log("Cari ekleme hatası: " . $e->getMessage());
$_SESSION['hata'] = "Cari eklenirken bir veritabanı hatası oluştu.";
// Form verilerini sakla
$_SESSION['form_verileri_cari_ekle'] = $_POST;
header("Location: cariler.php");
exit();
} catch (Exception $e) {
// random_bytes hata vs
error_log("Cari ekleme genel hata: " . $e->getMessage());
$_SESSION['hata'] = "Cari eklenirken bir hata oluştu.";
$_SESSION['form_verileri_cari_ekle'] = $_POST;
header("Location: cariler.php");
exit();
}
} else {
$_SESSION['form_hatalari_cari_ekle'] = $hatalar;
$_SESSION['form_verileri_cari_ekle'] = $_POST;
header("Location: cariler.php");
exit();
}
}

// Carileri listeleme
try {
$aktif_sirket_id = $_SESSION['aktif_sirket_id'];

// Carileri listeleme
$stmt_cariler = $db->prepare("
SELECT c.*, g.grup_adi
FROM cariler c
LEFT JOIN cari_gruplari g ON c.grup_id = g.id
WHERE c.sirket_id = ?
ORDER BY c.ad_soyad
");
$stmt_cariler->execute([$aktif_sirket_id]);
$cariler = $stmt_cariler->fetchAll(PDO::FETCH_ASSOC);

// Cari gruplarını listeleme
$stmt_gruplar = $db->prepare("SELECT * FROM cari_gruplari WHERE sirket_id = ? ORDER BY grup_adi");
$stmt_gruplar->execute([$aktif_sirket_id]);
$cari_gruplari = $stmt_gruplar->fetchAll(PDO::FETCH_ASSOC);
} catch(PDOException $e) {
error_log("Cari listeleme hatası: " . $e->getMessage());
$_SESSION['hata'] = "Cari listesi alınırken bir hata oluştu.";
$cariler = [];
$cari_gruplari = [];
}

$csrf_token = csrf_token_olustur();
// Hataları ve form verilerini al (varsa)
$form_hatalari = $_SESSION['form_hatalari_cari_ekle'] ?? [];
$form_verileri = $_SESSION['form_verileri_cari_ekle'] ?? [];
unset($_SESSION['form_hatalari_cari_ekle'], $_SESSION['form_verileri_cari_ekle']);

// Özet istatistikler
$cari_sayisi = count($cariler);
$toplam_musteri_borcu = 0.0;
$toplam_bizim_borcumuz = 0.0;
$toplam_net_bakiye = 0.0;

foreach ($cariler as $cari_row) {
$musteri_borcu = (float)($cari_row['toplam_borc'] ?? 0);
$bizim_borcumuz = (float)($cari_row['toplam_alacak'] ?? 0);
$net_bakiye = $musteri_borcu - $bizim_borcumuz;

if ($musteri_borcu > 0) $toplam_musteri_borcu += $musteri_borcu;
if ($musteri_borcu < 0) $toplam_bizim_borcumuz += abs($musteri_borcu);
if ($bizim_borcumuz > 0) $toplam_bizim_borcumuz += $bizim_borcumuz;

$toplam_net_bakiye += $net_bakiye;
}
?>
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Osmar Yönetim - <?= temizle($sayfa_baslik) ?></title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.0/font/bootstrap-icons.css">
<style>
/* Küçük stil desteği, tablo hücrelerinin taşmaması için */
#cariTable td { vertical-align: middle; }
.file-input-small { height: calc(1.5em + .75rem + 2px); padding: .25rem .5rem; }
</style>
</head>
<body>
<?php include __DIR__ . '/../includes/navbar.php'; ?>

<div class="container mt-4">
<div class="d-flex flex-column flex-lg-row justify-content-between align-items-lg-center mb-3 gap-3">
<div>
<h2 class="mb-0"><i class="bi bi-people me-2"></i> <?= temizle($sayfa_baslik) ?></h2>
<small class="text-muted">Şirkete kayıtlı cari hesapların yönetimi</small>
</div>
<div class="d-flex gap-2">
<button class="btn btn-primary" type="button" data-bs-toggle="collapse" data-bs-target="#collapseCariEkle" aria-expanded="false" aria-controls="collapseCariEkle">
<i class="bi bi-plus-circle me-1"></i> Yeni Cari Ekle
</button>
</div>
</div>

<!-- Özet kartları -->
<div class="row g-3 mb-3">
<div class="col-12 col-md-3">
<div class="card text-white bg-primary shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-center justify-content-between">
<div>
<div class="opacity-75">Cari Sayısı</div>
<div class="fs-4 fw-bold"><?= number_format($cari_sayisi) ?></div>
</div>
<i class="bi bi-person-lines-fill fs-1"></i>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-3">
<div class="card text-white bg-danger shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-center justify-content-between">
<div>
<div class="opacity-75">Toplam Müşteri Borcu (Bize)</div>
<div class="fs-4 fw-bold"><?= number_format($toplam_musteri_borcu, 2, ',', '.') ?> <?= $paraBirimi ?></div>
<div class="small text-white-50">Sadece pozitif borçlar</div>
</div>
<i class="bi bi-arrow-down-right fs-1"></i>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-3">
<div class="card text-white bg-success shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-center justify-content-between">
<div>
<div class="opacity-75">Toplam Tedarikçi Borcumuz</div>
<div class="fs-4 fw-bold"><?= number_format($toplam_bizim_borcumuz, 2, ',', '.') ?> <?= $paraBirimi ?></div>
<div class="small text-white-50">Sadece pozitif borçlar</div>
</div>
<i class="bi bi-arrow-up-right fs-1"></i>
</div>
</div>
</div>
</div>
<div class="col-12 col-md-3">
<div class="card text-white bg-info shadow-sm h-100">
<div class="card-body">
<div class="d-flex align-items-center justify-content-between">
<div>
<div class="opacity-75">Genel Net Bakiye</div>
<div class="fs-4 fw-bold"><?= number_format($toplam_net_bakiye, 2, ',', '.') ?> <?= $paraBirimi ?></div>
<div class="small text-white-50">Tüm carilerin toplamı</div>
</div>
<i class="bi bi-calculator fs-1"></i>
</div>
</div>
</div>
</div>
</div>
<hr>

<!-- Bakiye Açıklaması -->
<div class="alert alert-info mb-3">
<h6 class="alert-heading"><i class="bi bi-info-circle me-2"></i>Bakiye Açıklaması</h6>
<hr class="my-2">
<div class="row">
<div class="col-md-12">
<strong>İşaretler:</strong>
<span class="badge bg-danger">B</span> = Borçlu (Müşteri bize borçlu),
<span class="badge bg-success">A</span> = Alacaklı (Biz müşteriye borçluyuz)<br>
</div>
</div>
</div>

<?php if (!empty($form_hatalari)): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<strong><i class="bi bi-exclamation-triangle-fill me-2"></i> Lütfen hataları düzeltin:</strong>
<ul>
<?php foreach ($form_hatalari as $hata): ?>
<li><?= htmlspecialchars($hata) ?></li>
<?php endforeach; ?>
</ul>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php endif; ?>

<div class="collapse mb-4" id="collapseCariEkle">
<div class="card card-body shadow-sm border-0">
<h5 class="card-title mb-3"><i class="bi bi-person-plus me-2"></i>Yeni Cari Bilgileri</h5>
<form method="post" enctype="multipart/form-data">
<input type="hidden" name="csrf_token" value="<?= $csrf_token ?>">
<div class="row g-3">
<div class="col-md-6">
<label for="ad_soyad" class="form-label">Ad Soyad / Firma Adı <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="ad_soyad" name="ad_soyad" required
value="<?= htmlspecialchars($form_verileri['ad_soyad'] ?? '', ENT_QUOTES) ?>">
</div>

<div class="col-md-6">
<label for="telefon" class="form-label">Telefon</label>
<input type="tel" class="form-control" id="telefon" name="telefon"
value="<?= htmlspecialchars($form_verileri['telefon'] ?? '', ENT_QUOTES) ?>">
</div>

<div class="col-md-6">
<label for="eposta" class="form-label">E-posta</label>
<input type="email" class="form-control" id="eposta" name="eposta"
value="<?= htmlspecialchars($form_verileri['eposta'] ?? '', ENT_QUOTES) ?>">
</div>

<div class="col-md-6">
<label for="dosya" class="form-label">Dosya / Logo (Opsiyonel)</label>
<input type="file" class="form-control file-input-small" id="dosya" name="dosya" accept=".jpg,.jpeg,.png,.pdf,.docx">
</div>

<div class="col-md-6">
<label for="grup_id" class="form-label">Cari Grubu <span class="text-danger">*</span></label>
<select class="form-select" id="grup_id" name="grup_id" required>
<option value="">-- Grup Seçin --</option>
<?php foreach($cari_gruplari as $grup): ?>
<option value="<?= $grup['id'] ?>" <?= (isset($form_verileri['grup_id']) && $form_verileri['grup_id'] == $grup['id']) ? 'selected' : '' ?>>
<?= temizle($grup['grup_adi']) ?>
</option>
<?php endforeach; ?>
</select>
</div>

<div class="col-md-6">
<label for="adres" class="form-label">Adres</label>
<textarea class="form-control" id="adres" name="adres" rows="1"><?= htmlspecialchars($form_verileri['adres'] ?? '', ENT_QUOTES) ?></textarea>
</div>

<div class="col-12 d-flex gap-2">
<button type="submit" name="cari_ekle" class="btn btn-success">
<i class="bi bi-save me-1"></i> Cariyi Kaydet
</button>
<button type="button" class="btn btn-outline-secondary" data-bs-toggle="collapse" data-bs-target="#collapseCariEkle">İptal</button>
</div>
</div>
</form>
</div>
</div>

<div class="card shadow-sm">
<div class="card-header">
<div class="d-flex flex-column flex-md-row align-items-md-center justify-content-between gap-2">
<h5 class="mb-0"><i class="bi bi-list-ul me-2"></i> Cari Listesi</h5>
<div class="input-group" style="max-width: 360px;">
<span class="input-group-text bg-white"><i class="bi bi-search"></i></span>
<input type="text" id="cariSearch" class="form-control" placeholder="İsim, telefon veya grup ara...">
</div>
</div>
</div>
<div class="card-body p-0">
<div class="table-responsive">
<table class="table table-hover table-striped mb-0" id="cariTable">
<thead class="table-light">
<tr>
<th>Ad Soyad / Firma</th>
<th>Telefon</th>
<th>Grup</th>
<th class="text-end">Müşterinin Borcu (Bize)</th>
<th class="text-end">Bizim Borcumuz (Tedarikçiye)</th>
<th class="text-end">Net Bakiye</th>
<th class="text-center">İşlemler</th>
</tr>
</thead>
<tbody>
<?php if (empty($cariler)): ?>
<tr>
<td colspan="7" class="text-center text-muted py-3">Henüz kayıtlı cari bulunmamaktadır.</td>
</tr>
<?php else: ?>
<?php foreach($cariler as $cari):
$musteri_borcu = $cari['toplam_borc'] ?? 0.0;
$bizim_borcumuz = $cari['toplam_alacak'] ?? 0.0;
$net_bakiye = $musteri_borcu - $bizim_borcumuz;

$bakiye_durumu = '';
$bakiye_renk = '';
if ($net_bakiye > 0) {
$bakiye_durumu = 'B';
$bakiye_renk = 'text-danger';
} elseif ($net_bakiye < 0) {
$bakiye_durumu = 'A';
$bakiye_renk = 'text-success';
} else {
$bakiye_durumu = '-';
$bakiye_renk = 'text-muted';
}
?>
<tr>
<td><?= temizle($cari['ad_soyad']) ?></td>
<td><?= temizle($cari['telefon']) ?: '-' ?></td>
<td><span class="badge bg-secondary"><?= temizle($cari['grup_adi']) ?></span></td>
<td class="text-end text-danger"><?= number_format($musteri_borcu, 2, ',', '.') ?> <?= $paraBirimi ?></td>
<td class="text-end text-success"><?= number_format($bizim_borcumuz, 2, ',', '.') ?> <?= $paraBirimi ?></td>
<td class="text-end fw-bold <?= $bakiye_renk ?>">
<?= number_format(abs($net_bakiye), 2, ',', '.') ?> <?= $paraBirimi ?>
<span class="badge <?= $bakiye_durumu === 'B' ? 'bg-danger' : ($bakiye_durumu === 'A' ? 'bg-success' : 'bg-secondary') ?> ms-2">
<?= $bakiye_durumu ?>
</span>
</td>
<td class="text-center">
<a href="cari_detay.php?id=<?= $cari['id'] ?>" class="btn btn-sm btn-outline-primary" title="Detay/Ekstre"><i class="bi bi-eye"></i></a>
<a href="cari_duzenle.php?id=<?= $cari['id'] ?>" class="btn btn-sm btn-outline-warning" title="Düzenle"><i class="bi bi-pencil"></i></a>
<a href="cari_sil.php?id=<?= $cari['id'] ?>&csrf_token=<?= $csrf_token ?>"
class="btn btn-sm btn-outline-danger" title="Sil"
onclick="return confirm('Bu cariyi silmek istediğinize emin misiniz? Bu cariye ait TÜM işlemler (satış, alış, ödeme vb.) SİLİNMEZ ancak cari bilgisi kaybolur. Bu işlem önerilmez, bunun yerine cariyi pasif yapmayı düşünebilirsiniz. Yine de silmek istiyor musunuz?')">
<i class="bi bi-trash"></i>
</a>
</td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>

<?php include __DIR__ . '/../includes/footer.php'; ?>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script>
// Basit tablo arama filtresi
document.getElementById('cariSearch')?.addEventLis tener('input', function() {
const term = this.value.toLowerCase();
const rows = document.querySelectorAll('#cariTable tbody tr');
rows.forEach(row => {
const text = row.innerText.toLowerCase();
row.style.display = text.includes(term) ? '' : 'none';
});
});
</script>
</body>
</html>