• 14-10-2025, 18:42:39
    #46
    Excell de hesap tutan çok kişi var önemli bir özellik olur bence
  • 14-10-2025, 18:44:04
    #47
    koklica adlı üyeden alıntı: mesajı görüntüle
    Benim fark ettiklerim cari stok ekstre cıkartırken müşteri adresinde karakter sıkıntısı ( No:5 postane )
    birde mail adresi var ama cari eklerken mail adresi girişi yok
    Yedekleme alınabiliyor fakat alınan yedek geri yükleme varsa bile ben göremedim illa sql üzerindenmi olmalı yedek alınan yerden yedeği geri yükle de eklenebilir...
    Bir öneri olarak cıkan pdf eksterde bir fligran olabilir mesela...
    1 Öneri, 2 hata yazmışsınız. Not defterime kayıt ettim en kısa sürede güncelleyeceğim.
    Aldığınız yedekleri install.php de yedek yükleme kısmından yükleyebilirsiniz.
  • 15-10-2025, 17:19:25
    #48
    emeğinize sağlık fakat kurulumu yaptıktan sonra sayfa çalışmıyor hatası alıyorum ama nasıl düzeltebilirim?
  • 15-10-2025, 20:39:48
    #49
    70L64 adlı üyeden alıntı: mesajı görüntüle
    emeğinize sağlık fakat kurulumu yaptıktan sonra sayfa çalışmıyor hatası alıyorum ama nasıl düzeltebilirim?
    olası nedeni sistem php 8,2 ve sonrası çalışır php versiyonunu yükseltin.
    Eğer olmazsa, config.php içine şu kodu ekleyin. ardından sistemi yeniden kurun php_errors.log sayfası oluşacak ve orada ki hatayı bana atın bir bakayım.
    // Hata raporlama
    ini_set("display_errors", 0);
    ini_set("log_errors", 1);
    ini_set("error_log", __DIR__ . "/php_errors.log");
    error_reporting(E_ALL);
  • 17-10-2025, 17:09:39
    #50
    Böyle bir şey de yeni versiyonda mümkün müdür?
    Adetli işlemdlerde toplam ürün KALEM ve ADET sayısı karıştırılıyor hep.
    Ve PDF de ürün adı uzunsa, yazı ve miktar birbirine karışıyor.
  • 18-10-2025, 01:28:25
    #51
    Kaç kalem ürün olduğunu yaparım ama adetleri yazmak çok mantıklı gibi gelmiyor bana. Bu konuyu düşüneceğim hocam
  • 19-10-2025, 12:37:10
    #52
    --------------------------------
    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>
  • 19-10-2025, 15:05:58
    #53
    Katkınız için teşekkür ederim, bilgisayar başına geçince bakacağım hocam.

    koklica adlı üyeden alıntı: mesajı görüntüle
    --------------------------------
    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>
  • 19-10-2025, 15:14:24
    #54
    Evreka63 adlı üyeden alıntı: mesajı görüntüle
    Katkınız için teşekkür ederim, bilgisayar başına geçince bakacağım hocam.

    şimdi cari hesaplara alacak verecek fiş eklemeyi planlıyorum
    iş yaparsan servis raporunu yükleyebileceğin veya tahsilat fişini ekleyebileceğin bir dosya yükleme resim belge docx upload/cari_fisler