• 27-09-2023, 11:57:39
    #10
    QuarkChain adlı üyeden alıntı: mesajı görüntüle
    Hazır elim değmişken. @gokhanb;
    Vardiya tablosu haftalık olarak sıfırlanacağını varsayalım.
    Kayıtlı personeller'den müsait olanlar sağda listeleniyor olacak.
    Vardiyaya eklenmek isteniyorsa, sağ listeden çıkıp vardiya listesine gidecek.
    İstenirse, vardiya tablosundan geri çıkarılacak, sağ listeye tekrar gelecek.
    Mantık doğru ilerlemiş olur mu?



    Çok zahmet oldu teşekkür ederim. Kafamdaki mantık aslında şöyle.
    3 farklı yönetici türü var. Bunlar;
    1) admin=> Yönetici, personel ve departman ekleme yetkisi
    2) Personel Müdürü => Vardiyaları sorgulama, gerekirse düzenleme ve onaylama
    3) Vardiya Müdürü => Departmanında olan personellerin vardiya girişini yapma.

    Burada yaklaşık 5-6 tane vardiya müdürü ve bu müdürlere bağlı personeller bulunmaktadır. Vardiya müdürü haftalık girişi yapar ve Personel Müdürünün onayına sunar. Personel müdürü onay vermediği sürece üzerinde değişiklik yapabilir. Fakat personel müdürü onay verdiği anda tekrar değişiklik yapamaz. Değişiklik yapabilmesi için personel müdürünün onayı kaldırması gerekmektedir. Bir çok kısmını yaptım ama işte bu tablo ekleme kaydetme kısmında takıldım. Sonuçta benimde bunu öğrenmem gerekiyor. Yardımcı olduğunuz için teşekkür ederim. Kaynak kodlardan en azından izlediğiniz yolu görmem benim için çok ilerleyici olacaktır. Tekrar tekrar elinize emeğinize sağlık.
  • 27-09-2023, 12:03:59
    #11
    Rica ederim tamamdır konuyu daha iyi anladım.
    Siz söylediklerinizi geliştiriyor olacaksınız bunda sıkıntı yok
    Ben veritabanı kısmını bu haliyle yapayım, söylediğiniz gibi siz en azından mantığı ve işlevlerin nasıl olduğunu görmüş olursunuz.
    İster bu arayüz üzerinden, ister kendi çalışmanız üzerinden geliştirirsiniz.
    jQuery kullandım, CSS'de kütüphane değil.
    Veritabanı ve ajaxsı halledip paylaşıyorum.

    gokhanb adlı üyeden alıntı: mesajı görüntüle
    Çok zahmet oldu teşekkür ederim. Kafamdaki mantık aslında şöyle.
    3 farklı yönetici türü var. Bunlar;
    1) admin=> Yönetici, personel ve departman ekleme yetkisi
    2) Personel Müdürü => Vardiyaları sorgulama, gerekirse düzenleme ve onaylama
    3) Vardiya Müdürü => Departmanında olan personellerin vardiya girişini yapma.

    Burada yaklaşık 5-6 tane vardiya müdürü ve bu müdürlere bağlı personeller bulunmaktadır. Vardiya müdürü haftalık girişi yapar ve Personel Müdürünün onayına sunar. Personel müdürü onay vermediği sürece üzerinde değişiklik yapabilir. Fakat personel müdürü onay verdiği anda tekrar değişiklik yapamaz. Değişiklik yapabilmesi için personel müdürünün onayı kaldırması gerekmektedir. Bir çok kısmını yaptım ama işte bu tablo ekleme kaydetme kısmında takıldım. Sonuçta benimde bunu öğrenmem gerekiyor. Yardımcı olduğunuz için teşekkür ederim. Kaynak kodlardan en azından izlediğiniz yolu görmem benim için çok ilerleyici olacaktır. Tekrar tekrar elinize emeğinize sağlık.
  • 27-09-2023, 12:38:16
    #12
    QuarkChain adlı üyeden alıntı: mesajı görüntüle
    Rica ederim tamamdır konuyu daha iyi anladım.
    Siz söylediklerinizi geliştiriyor olacaksınız bunda sıkıntı yok
    Ben veritabanı kısmını bu haliyle yapayım, söylediğiniz gibi siz en azından mantığı ve işlevlerin nasıl olduğunu görmüş olursunuz.
    İster bu arayüz üzerinden, ister kendi çalışmanız üzerinden geliştirirsiniz.
    jQuery kullandım, CSS'de kütüphane değil.
    Veritabanı ve ajaxsı halledip paylaşıyorum.
    Teşekkür ederim o kadar makbule geçtiki
  • 27-09-2023, 14:29:11
    #13

    Proje Dizini
    Tablo Yapısı
    CREATE TABLE IF NOT EXISTS `personel` (
      `personel_id` int(11) NOT NULL AUTO_INCREMENT,
      `adi` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
      `vardiya_aktif` tinyint(1) NOT NULL DEFAULT '0',
      PRIMARY KEY (`personel_id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    REPLACE INTO `personel` (`personel_id`, `adi`, `vardiya_aktif`) VALUES
        (1, 'QuarkChain', 1),
        (2, 'gokhanb', 0),
        (3, 'Mehmet Yılmaz', 0),
        (4, 'Ali Kaya', 0),
        (5, 'Ayşe Şahin', 0),
        (6, 'Fatma Demir', 0),
        (7, 'Mustafa Arslan', 0),
        (8, 'Zeynep Çelik', 0),
        (9, 'Emre Öztürk', 0),
        (10, 'Gülşah Akgün', 0),
        (11, 'Serdar Yıldız', 1),
        (12, 'Deniz Kocaman', 0),
        (13, 'Şule Taş', 1),
        (14, 'Hasan Erdoğan', 0),
        (15, 'Nur Gürbüz', 0),
        (16, 'Oğuzhan Yavuz', 0),
        (17, 'Elif Aktaş', 0);
    
    
    CREATE TABLE IF NOT EXISTS `vardiya` (
      `vardiya_tarihi` date NOT NULL,
      `personel_id` int(11) NOT NULL,
      `vardiya_turu` enum('erken','gec') COLLATE utf8_unicode_ci NOT NULL,
      `vardiya_guncelleme_tarih` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      KEY `personel_id` (`personel_id`),
      KEY `vardiya_tarihi` (`vardiya_tarihi`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    index.php
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Rubik:400,500,600,700,800&subset=latin-ext">
        <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/all.min.css">
        <title>Vardiya</title>
        <link rel="stylesheet" type="text/css" href="https://unpkg.com/nprogress@0.2.0/nprogress.css">
        <link rel="stylesheet" type="text/css" href="style.css?time=<?php echo time(); ?>">
    </head>
    <body>
        <div class="kutu kutu-personel">
            <div class="kutu-baslik">
                <h3><i class="fa fa-users"></i> Personeller (<span data-dinamik="personel-sayisi">0</span>) <small>(Müsait)</small></h3>
            </div>
            <div class="liste">
                <ol></ol>
            </div>
            <div class="ekle">
                <input type="text" placeholder="Yeni Personel">
                <i class="fa fa-user-plus"></i>
            </div>
        </div>
        <div class="kutu kutu-tablo">
            <table>
            </table>
            <div class="kutu-eylem">
                <i class="fa fa-info-circle"></i> Vardiya tablosuna personel eklemek için isimlere tıklayın.
            </div>
            <!--
            <div class="kutu-eylem">
                <button class="btn-temel">Değişiklikleri Kaydet</button>
            </div>
        -->
        </div>
    
        <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
        <script src="https://unpkg.com/nprogress@0.2.0/nprogress.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
        <script src="yardimci_fnk.js"></script>
        <script src="script.js?time=<?php echo time(); ?>"></script>
    </body>
    </html>
    script.js
    var haftalikVeri = ['bos', 'bos', 'bos', 'bos', 'bos', 'bos', 'bos'];
    var vardiyaTurleri = {
        bos: "Boş",
        erken: "Erken",
        gec: "Geç"
    }
    
    // Haftanın günlerini alalım
    var simdikiZaman = new Date();
    var haftaNumarasi = simdikiZaman.getWeek();
    var haftaninIlkGunu = new Date(simdikiZaman);
    haftaninIlkGunu.setDate(simdikiZaman.getDate() - simdikiZaman.getDay() + 1);
    var haftaninSonGunu = new Date(haftaninIlkGunu);
    haftaninSonGunu.setDate(haftaninIlkGunu.getDate() + 6);
    
    var gunler = ["Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar"];
    
    // Vardiya tablosunu güncelleyen fonksiyon
    function vardiya_tablosu(personelListesi) {
        var table = $("<table>");
        var thead = $("<thead>");
        var tbody = $("<tbody>");
    
        // Personel listesini alfabetik olarak sırala
        personelListesi.sort(function(a, b) {
            return a.adi.localeCompare(b.adi);
        });
    
        // Tabloyu temizle
        tbody.empty();
    
        // Tablo başlıkları
        var theadRow = $("<tr>");
        theadRow.append("<th>Personel</th>");
    
        for (var i = new Date(haftaninIlkGunu), j = 0; i <= haftaninSonGunu; i.setDate(i.getDate() + 1), j++) {
            theadRow.append("<th>" + gunler[j % 7] + "</th>");
        }
    
        thead.append(theadRow);
        table.append(thead);
    
    
        // Her bir personel için satır oluştur
        for (var a = 0; a < personelListesi.length; a++) {
            var personel = personelListesi[a];
            var tbodyRow = $("<tr>").data("id", personel.personel_id);
            tbodyRow.append("<td class=\"sutun-personel\"><i class=\"fa fa-lg fa-trash\"></i>" + personel.adi + "</td>");
    
            for (var i = new Date(haftaninIlkGunu), j = 0; i <= haftaninSonGunu; i.setDate(i.getDate() + 1), j++) {
                var vardiyaTuru = "bos";
                if (typeof personel.haftalikVeri[i.formatDate("Y-m-d")] != "undefined") {
                    vardiyaTuru = personel.haftalikVeri[i.formatDate("Y-m-d")];
                }
    
                var slug = url_title(vardiyaTuru);
                var span = $("<span>").data("tur", slug).addClass("etiket " + slug).text(vardiyaTurleri[vardiyaTuru]).click(function () {
                    // Span üzerine tıklandığında vardiya turunu değiştir
                    yeniVardiyaTuru = toggleVardiyaTuru($(this).text());
                    $(this).attr("class", "etiket " + url_title(yeniVardiyaTuru)).text(yeniVardiyaTuru);
                    saveVardiyaData();
                });
                tbodyRow.append($("<td>").data("tarih", i.formatDate("Y-m-d")).append(span));
            }
    
            tbody.append(tbodyRow);
        }
    
        // Eğer vardiyadakiler dizisi boşsa mesaj göster
        if (personelListesi.length === 0) {
            tbody.append($("<tr>").append($("<td>").attr("colspan", 9).addClass("sutun-bos").text("Bu hafta vardiya boş!")));
        }
    
        thead.append(theadRow);
        table.append(thead);
        table.append(tbody);
        $(".kutu-tablo table").replaceWith(table);
        $("[data-dinamik='personel-sayisi']").text($(".liste ol li").length - personelListesi.length);
    }
    
    $(document).ready(function () {
        $(".ekle input").keyup(function(event){
            if (event.keyCode == 13) {
                var personelAdi = $(this).val();
                $(this).val("");
                $.ajax({
                    url: "json.php",
                    type: "POST",
                    dataType: "JSON",
                    data: {islem: "yeniPersonel", adi: personelAdi},
                    success: function() {
                        Swal.fire({
                            icon: "success",
                            title: "Yeni personel başarıyla eklendi.",
                            html: personelAdi,
                            confirmButtonText: "Tamam"
                        });
                        getVardiyaData();
                    }
                });
            }
        });
    
        $(document).on("click", ".liste ol li", function(){
            $li = $(this);
            $(this).fadeOut("fast", function(){
                $.ajax({
                    url: "json.php",
                    type: "POST",
                    data: {islem: "vardiya_aktif", personel_id: $li.data("personel_id"), vardiya_aktif: 1},
                    success: function() {
                        getVardiyaData();
                    }
                });
            });
        });
    
        $(document).on("click", "table tbody tr td.sutun-personel", function(){
            var $td = $(this);
            var $tr = $td.parent();
            Swal.fire({
                title: "Personeli vardiyadan kaldırmak istiyor musunuz?",
                html: $td.text(),
                showDenyButton: true,
                icon: "question",
                confirmButtonText: "Evet, Kaldır!",
                denyButtonText: "Vazgeç"
            }).then((result) => {
              if (result.isConfirmed) {
                $tr.fadeOut(function(){
                    $.ajax({
                        url: "json.php",
                        type: "POST",
                        dataType: "JSON",
                        data: {islem: "vardiya_aktif", personel_id: $tr.data("id"), vardiya_aktif: 0},
                        success: function(){
                            Swal.fire({
                                icon: "success",
                                title: $td.text() + " başarıyla kaldırıldı",
                                confirmButtonText: "Tamam"
                            });
                            getVardiyaData();
                        }
                    });
    
                    
                });
              }
            });
        });
    
        getVardiyaData();
    });
    
    function getVardiyaData() {
        NProgress.configure({ parent: ".kutu-eylem" });
        NProgress.start();
    
        $.ajax({
            url: "json.php",
            type: "GET",
            dataType: "json",
            data: {
                ilk_gun: haftaninIlkGunu.formatDate("Y-m-d 00:00:00"),
                son_gun: haftaninSonGunu.formatDate("Y-m-d 23:59:59")
            },
            success: function (json) {
                NProgress.done();
                // JSON yanıtını işleme burada
                var vardiyadakiler = [];
                $(".liste ol").empty();
                $.each(json, function(index, personel){
                    if (personel.vardiya_aktif) {
                        vardiyadakiler.push(personel);
                    } else {
                        $(".liste ol").append($("<li>").data(personel).text(personel.adi));
                    }
                });
    
                $(".liste").scrollTop($(".liste")[0].scrollHeight);
    
                vardiya_tablosu(vardiyadakiler);
            },
            error: function (xhr, status, error) {
            // Hata durumlarını burada işleyebilirsiniz
                console.error("Hata: " + error);
            }
        });
    }
    
    function saveVardiyaData() {
        NProgress.configure({ parent: ".kutu-eylem" });
        NProgress.start();
    
        // Veritabanına eklemek için kullanılacak verileri topluyoruz
        var vardiyaDizisi = [];
        var vardiyaAktif = [];
    
        // Tablodaki her bir satırı dönerek verileri topluyoruz
        $("table tbody tr").each(function () {
            var $tr = $(this);
    
            $tr.find("td").each(function(){
                $td = $(this);
                $span = $td.find("span");
    
                if (vardiyaAktif.indexOf($tr.data("id")) == -1) {
                    vardiyaAktif.push($tr.data("id"));
                }
    
                if ( $span.length && ! $span.hasClass("bos")) {
                    vardiyaDizisi.push({personel_id: $tr.data("id"), tarih: $td.data("tarih"), tur: url_title($span.text())});
                }
            });
        });
    
        $.ajax({
            url: "json.php",
            type: "POST",
            dataType: "json",
            data: {
                islem: "guncelle",
                ilk_gun: haftaninIlkGunu.formatDate("Y-m-d 00:00:00"),
                son_gun: haftaninSonGunu.formatDate("Y-m-d 23:59:59"),
                vardiyaVerileri: vardiyaDizisi,
                vardiyaAktif: vardiyaAktif
            },
            success: function (response) {
                NProgress.done();
            },
            error: function (xhr, status, error) {
                console.error("Hata: " + error);
            }
        });
    }
    
    function toggleVardiyaTuru(tur) {
        var yeniTur = null;
        if (tur === vardiyaTurleri.bos) {
            yeniTur = vardiyaTurleri.erken;
        } else if (tur === vardiyaTurleri.erken) {
            yeniTur = vardiyaTurleri.gec;
        } else if (tur === vardiyaTurleri.gec) {
            yeniTur = vardiyaTurleri.bos;
        }
        return yeniTur;
    }
    style.css
    body {
        background-color: #f0f0f0;
        font-family: Rubik;
        font-size: 13px;
    }
    
    
    *::-webkit-scrollbar-track{visibility:hidden}
    *::-webkit-scrollbar{width:6px;background:#fff}
    *::-webkit-scrollbar-thumb{border-radius:6px;background-color:#CCC}
    
    .kutu {
        box-sizing: border-box;
        box-shadow: rgba(0, 0, 0, 0.1) 0px 6px 18px;
        background-color: #fff;
        border-radius: 10px;
        overflow: hidden;
    }
    
    .kutu-baslik h3 {
        margin: 0;
        font-size: 13px;
        font-weight: 500;
        padding: 12px 16px;
    }
    
    .kutu-baslik h3 small {
        opacity: .5;
    }
    
    .kutu-baslik {
        border-bottom: 1px solid #ddd;
    }
    
    .kutu-personel {
        position: fixed;
        right: 35px;
        bottom: 35px;
        width: 260px;
    }
    
    .liste {
        padding: 16px;
        max-height: 360px;
        overflow-y: scroll;
    }
    
    .liste ol {
        margin: 0;
        padding: 0;
        list-style: none;
    }
    
    .liste ol li {
        padding: 10px 16px;
        border: 1px solid #ddd;
        border-radius: 6px;
        background-color: #f9f9f9;
        margin-bottom: 1em;
        font-weight: 500;
        cursor: pointer;
    }
    
    .liste ol li:last-child {
        margin-bottom: 0;
    }
    
    .kutu-personel .ekle {
        border-top: 1px solid #ddd;
        height: 42px;
        padding: 0 16px;
        display: flex;
        align-items: center;
    }
    
    .kutu-personel .ekle input {
        border: 0;
        font: inherit;
    }
    
    .kutu-personel .ekle input::placeholder {
        color: #CCC;
    }
    
    .kutu-personel .ekle input:focus {
        outline: none;
    }
    
    .kutu-tablo {
        position: fixed;
        left: 35px;
        top: 35px;
        width: 960px;
    }
    
    table {
        width: 100%;
        border-collapse: collapse;
        border-spacing: 0;
    }
    
    table thead tr th {
        color: #111827;
        font-weight: 500;
        text-align: left;
        padding: 12px 25px;
        background-color: #f9fafb;
        border-bottom: 1px solid #d1d5db;
        border-right: 1px solid #d1d5db;
        text-align: center;
    }
    
    table thead tr th:first-child {
        text-align: left;
    }
    
    table thead tr th:last-child {
        border-right: 0;
    }
    
    table tbody tr td {
        border-right: 1px solid #e5e7eb;
        border-bottom: 1px solid #e5e7eb;
        padding: 10px 25px;
    }
    
    table tbody tr td:last-child {
        border-right: 0;
    }
    
    table tbody tr:last-child td {
        border-bottom: 0;
    }
    
    table tbody tr td.sutun-bos {
        color: #CCC;
        text-align: center;
    }
    
    table tbody tr td.sutun-personel {
        position: relative;
    }
    
    table tbody tr td.sutun-personel i {
        position: absolute;
        left: 0;
        top: 0;
        bottom: 0;
        right: 0;
        z-index: 1;
        display: flex;
        align-items: center;
        background-color: rgba(255,255,255,1);
        visibility: hidden;
        opacity: 0;
        padding-left: 16px;
    }
    
    table tbody tr td.sutun-personel:hover i {
        opacity: 1;
        visibility: visible;
        cursor: pointer;
    }
    
    table tbody tr td.sutun-personel i:after {
        content: "Kaldır";
        display: block;
        font-family: Rubik;
        font-size: 13px;
        font-weight: 500;
        margin-left: 5px;
    }
    
    .etiket {
        display: block;
        background-color: #eee;
        border-radius: 4px;
        padding: 5px 10px;
        font-weight: 500;
        cursor: pointer;
        color: rgba(255,255,255,.9);
        text-align: center;
        user-select: none;
        cursor: button;
    }
    
    .etiket.erken {
        background-color: #27AE60;
    }
    
    .etiket.gec {
        background-color: #D35400;
    }
    
    main {
        display: flex;
        max-width: 960px;
        margin: 0 auto;
    }
    
    .fa-user-plus {
        width: 30px;
        height: 30px;
        font-size: 12px;
        display: flex;
        align-items: center;
        justify-content: center;
        border-radius: 100%;
        background-color: #f0f0f0;
        text-align: center;
        flex-shrink: 0;
        margin-left: auto;
    }
    
    button {
        font: inherit;
        font-weight: 500;
        background: none;
        border: 0;
        padding: 0 1.5rem;
        border-radius: 0.375rem;
        line-height: 38px;
        color: #31374a;
        cursor: pointer;
        transition: all .3s ease;
    }
    
    .btn-temel {
        background-color: #44b5d5;
        color: #fff;
    }
    
    .btn-temel:hover {
        background-color: #00c0e1;
    }
    
    .kutu-eylem {
        padding: 15px 25px;
        color: #2980B9;
        border-top: 1px solid #e5e7eb;
    }
    
    .swal2-title{font-size:15px!important}
    .swal2-styled.swal2-confirm{background-color:#000!important;font-size:13px!important}
    .swal2-styled.swal2-confirm:hover{background-color:#333!important}
    .swal2-styled.swal2-deny{background-color:#bdc3c7!important;font-size:13px!important}
    .swal2-styled.swal2-confirm:focus,.swal2-styled.swal2-deny:focus{box-shadow:none!important}
    .swal2-html-container{font-size:13px!important}
    .swal2-actions button{height:inherit;line-height:inherit}
    yardimci_fnk.js
    Date.prototype.getWeek = function () {
        var date = new Date(this.getTime());
        date.setHours(0, 0, 0, 0);
        date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);
        var week1 = new Date(date.getFullYear(), 0, 4);
        return 1 + Math.round(((date - week1) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7);
    };
    
    Date.prototype.formatDate = function (format) {
      var date = this;
      var year = date.getFullYear();
      var month = ('0' + (date.getMonth() + 1)).slice(-2);
      var day = ('0' + date.getDate()).slice(-2);
      var hours = ('0' + date.getHours()).slice(-2);
      var minutes = ('0' + date.getMinutes()).slice(-2);
      var seconds = ('0' + date.getSeconds()).slice(-2);
      
      format = format.replace('Y', year);
      format = format.replace('m', month);
      format = format.replace('d', day);
      format = format.replace('H', hours);
      format = format.replace('i', minutes);
      format = format.replace('s', seconds);
      
      return format;
    };
    
    function url_title(str, lowercase = true) {
        const search = ['Ü', 'ü', 'Ğ', 'ğ', 'Ş', 'ş', 'Ö', 'ö', 'Ç', 'ç', 'İ', 'ı'];
        const find = ['u', 'u', 'g', 'g', 's', 's', 'o', 'o', 'c', 'c', 'i', 'i'];
        const replace = '-';
        
        for (let i = 0; i < search.length; i++) {
            var regex = new RegExp(search[i], 'g');
            str = str.replace(regex, find[i]);
        }
    
        str = str.replace(/_/g, replace);
        str = str.replace(/&\#\d+?;/g, '');
        str = str.replace(/&\S+?;/g, '');
        str = str.replace(/\s+/g, replace);
        str = str.replace(/[^a-z0-9\-._]/ig, '');
        str = str.replace(/-+/g, replace);
        str = str.replace(/-$/g, '');
        str = str.replace(/^-/g, '');
        str = str.replace(/\.$/g, '');
        str = str.replace(/<[^>]*>?/g, '');
        
        if (lowercase) {
            str = str.toLowerCase();
        }
    
        return str;
    }
    
    let wild = function(length) {
      var text = "";
      var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    
      for (var i = 0; i < length; i++)
        text += possible.charAt(Math.floor(Math.random() * possible.length));
    
      return text;
    }
    json.php
    <?php
    // Veritabanı bağlantısı
    try {
        $db = new PDO('mysql:host=localhost;dbname=r10;charset=utf8', 'root', '');
    } catch (PDOException $e) {
        echo 'Veritabanı bağlantısı başarısız oldu: ' . $e->getMessage();
        exit;
    }
    
    if (isset($_POST["islem"])) {
        switch ($_POST['islem']) {
            case 'yeniPersonel':
                try {
                    $db->beginTransaction();
                    
                    // POST verilerini alın
                    $yeniPersonelAdi = $_POST['adi'];
                    $eklemeSorgusu = "INSERT INTO personel (adi) VALUES (:adi)";
                    $stmt = $db->prepare($eklemeSorgusu);
    
                    $stmt->bindParam(':adi', $yeniPersonelAdi, PDO::PARAM_STR);
    
                    // Sorguyu çalıştır
                    $stmt->execute();
                    $db->commit();
    
                    exit(json_encode(array("success" => true, "message" => "Yeni personel başarıyla eklendi.")));
                } catch (PDOException $e) {
                    $db->rollBack();
                    exit(json_encode(array("success" => false, "message" => "Personel ekleme hatası: " . $e->getMessage())));
                }
                break;
            case 'vardiya_aktif':
                try {
                    $db->beginTransaction();
    
                    // Güncelleme sorgusu için kullanılacak parametreler
                    $vardiyaAktif = $_POST['vardiya_aktif'];
                    $personelId = $_POST['personel_id'];
    
                    // Güncelleme sorgusu
                    $updateSorgusu = "UPDATE personel SET vardiya_aktif = :vardiyaAktif WHERE personel_id = :personelId";
    
                    // Sorguyu hazırla ve parametreleri bağla
                    $stmt = $db->prepare($updateSorgusu);
                    $stmt->bindParam(':vardiyaAktif', $vardiyaAktif, PDO::PARAM_INT);
                    $stmt->bindParam(':personelId', $personelId, PDO::PARAM_INT);
    
                    // Sorguyu çalıştır
                    $stmt->execute();
    
                    $db->commit();
                    exit(json_encode(array("success" => true, "message" => "Veriler başarıyla güncellendi.")));
                } catch (PDOException $e) {
                    $db->rollBack();
                    exit(json_encode(array("success" => false, "message" => "Veri güncelleme hatası: " . $e->getMessage())));
                }
                break;
            case 'guncelle':
                try {
                    $db->beginTransaction();
    
                    // İlk_gun ve son_gun değerlerini al
                    $ilk_gun = $_POST['ilk_gun'];
                    $son_gun = $_POST['son_gun'];
    
                    // Eğer vardiyaVerileri dizisi boşsa, o haftadaki verileri silelim
                    if ( ! isset($_POST['vardiyaVerileri']) || ! $_POST['vardiyaVerileri']) {
                        $silmeSorgusu = "DELETE FROM vardiya WHERE vardiya_tarihi BETWEEN :ilk_gun AND :son_gun AND personel_id IN (" . join(",", $_POST['vardiyaAktif']) . ")";
                        $silmeStmt = $db->prepare($silmeSorgusu);
                        $silmeStmt->bindParam(':ilk_gun', $ilk_gun);
                        $silmeStmt->bindParam(':son_gun', $son_gun);
                        $silmeStmt->execute();
                    } else {
                        $vardiyaVerileri = $_POST['vardiyaVerileri'];
    
                        // Vardiya aktif personellerin belirtilen tarihli verilerini yeniden hazırlamak için silelim
                        $silmeSorgusu = "DELETE FROM vardiya WHERE vardiya_tarihi BETWEEN :ilk_gun AND :son_gun AND personel_id IN (" . join(",", $_POST['vardiyaAktif']) . ")";
                        $silmeStmt = $db->prepare($silmeSorgusu);
                        $silmeStmt->bindParam(':ilk_gun', $ilk_gun);
                        $silmeStmt->bindParam(':son_gun', $son_gun);
                        $silmeStmt->execute();
    
                        // Yeni verileri ekle
                        $eklemeSorgusu = "INSERT INTO vardiya (personel_id, vardiya_tarihi, vardiya_turu) VALUES (:personel_id, :tarih, :tur)";
                        $eklemeStmt = $db->prepare($eklemeSorgusu);
    
                        foreach ($vardiyaVerileri as $veri) {
                            $eklemeStmt->bindParam(':personel_id', $veri['personel_id']);
                            $eklemeStmt->bindParam(':tarih', $veri['tarih']);
                            $eklemeStmt->bindParam(':tur', $veri['tur']);
                            $eklemeStmt->execute();
                        }
                    }
    
                    $db->commit();
                    exit(json_encode(array("success" => true, "message" => "Veriler başarıyla güncellendi.")));
                } catch (PDOException $e) {
                    $db->rollBack();
                    exit(json_encode(array("success" => false, "message" => "Veri güncelleme hatası: " . $e->getMessage())));
                }
                break;
        }
    }
    
    // İlk_gun ve son_gun değerlerini al
    $ilk_gun = $_GET['ilk_gun'];
    $son_gun = $_GET['son_gun'];
    
    // Kişilerin listesini al
    $query = "SELECT * FROM personel";
    $stmt = $db->prepare($query);
    $stmt->execute();
    $personelListesi = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    // Her kişi için ilgili tarihlerdeki vardiya türlerini al
    foreach ($personelListesi as &$personel) {
        $query = "SELECT vardiya_turu, vardiya_tarihi FROM vardiya WHERE personel_id = :personel_id AND vardiya_tarihi BETWEEN :ilk_gun AND :son_gun";
        $stmt = $db->prepare($query);
        $stmt->bindParam(':personel_id', $personel['personel_id'], PDO::PARAM_INT);
        $stmt->bindParam(':ilk_gun', $ilk_gun, PDO::PARAM_STR);
        $stmt->bindParam(':son_gun', $son_gun, PDO::PARAM_STR);
        $stmt->execute();
        $vardiyaTurListesi = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
        $haftalikVeri = array();
        foreach ($vardiyaTurListesi as $vardiya) {
            $haftalikVeri[$vardiya['vardiya_tarihi']] = $vardiya['vardiya_turu'];
        }
        
        $personel['haftalikVeri'] = $haftalikVeri;
    }
    
    // JSON olarak verileri döndür
    header('Content-Type: application/json');
    echo json_encode($personelListesi, JSON_NUMERIC_CHECK);
    ?>
  • 27-09-2023, 14:59:07
    #14
    Şu notları ilave edeyim;
    vardiya_aktif bence personel tablosunda olmalı.
    vardiya tablosundaki veriyi ayırt edeceğimiz koşul personel_id ve tarih kısmı.
    belki atladığım kısımlar olmuş olabilir ama en azından ufkunuzu genişletmeye yardımcı olacaktır.
    bu aradaki en üstteki haftalikVeri değişkeni kullanılmıyor.
    CSS'de last-child'lerde verdiğim first-child lerde verdiğim özelliklere dikkat edin.
    Tablo sıralamasında en alttaki satırda 2 piksel olmaması için ince ayarlar var, bu tarz hassas şeylere dikkat ederseniz geliştirirsiniz kendinizi
    Personel listesi scroll en altta kalıyor, yeni eklendiğinde vs.
    @gokhanb;
  • 27-09-2023, 15:00:38
    #15
    QuarkChain adlı üyeden alıntı: mesajı görüntüle
    Şu notları ilave edeyim;
    vardiya_aktif bence personel tablosunda olmalı.
    vardiya tablosundaki veriyi ayırt edeceğimiz koşul personel_id ve tarih kısmı.
    belki atladığım kısımlar olmuş olabilir ama en azından ufkunuzu genişletmeye yardımcı olacaktır.
    @gokhanb;
    Çok teşekkür ederim. İncelemeye başlıyorum.
  • 27-09-2023, 16:04:41
    #16
    QuarkChain adlı üyeden alıntı: mesajı görüntüle
    Şu notları ilave edeyim;
    vardiya_aktif bence personel tablosunda olmalı.
    vardiya tablosundaki veriyi ayırt edeceğimiz koşul personel_id ve tarih kısmı.
    belki atladığım kısımlar olmuş olabilir ama en azından ufkunuzu genişletmeye yardımcı olacaktır.
    bu aradaki en üstteki haftalikVeri değişkeni kullanılmıyor.
    CSS'de last-child'lerde verdiğim first-child lerde verdiğim özelliklere dikkat edin.
    Tablo sıralamasında en alttaki satırda 2 piksel olmaması için ince ayarlar var, bu tarz hassas şeylere dikkat ederseniz geliştirirsiniz kendinizi
    Personel listesi scroll en altta kalıyor, yeni eklendiğinde vs.
    @gokhanb;
    Jquery ile tablo gerçekten çok başarılı olmuş. Direk seçimden hemen kayıt yapması çok güzel. Ben onları açılır bir menüden ve databaseden alması için bakıcam. Jquery bilgim pek yok araştıracağım. Vardiya aktiflik kısmını vardiya tarafına koymamın sebebi üst yönetici onay verdiğinde değiştirilemez olmasıydı. Ellerinize sağlık çok güzel olmuş ama bayağı bir yolum var belliki.
  • 27-09-2023, 16:20:22
    #17
    Rica ederim.
    Evet basit denemeler yaparak jQuery'i geliştirebilirsiniz.
    Zaten temel javascript bilginiz vardır.

    $("select[name=vardiya_turu]").change(function(){ }); // örneğin select tetikliyor
    kendi projenizde değilde denemeleri boş html sayfalarında yaparsanız daha hızlı ilerlersiniz.
    Yani yazılım dediğimiz olay basit değil, motivasyon, zaman, akıl, fikir, güç ve kuvvet gerekiyor
    Kolay gelsin
    Takıldığını yerde konu açıp veya post atın yardımcı oluruz.

    gokhanb adlı üyeden alıntı: mesajı görüntüle
    Jquery ile tablo gerçekten çok başarılı olmuş. Direk seçimden hemen kayıt yapması çok güzel. Ben onları açılır bir menüden ve databaseden alması için bakıcam. Jquery bilgim pek yok araştıracağım. Vardiya aktiflik kısmını vardiya tarafına koymamın sebebi üst yönetici onay verdiğinde değiştirilemez olmasıydı. Ellerinize sağlık çok güzel olmuş ama bayağı bir yolum var belliki.
  • 05-10-2023, 12:20:56
    #18
    QuarkChain adlı üyeden alıntı: mesajı görüntüle
    Rica ederim.
    Evet basit denemeler yaparak jQuery'i geliştirebilirsiniz.
    Zaten temel javascript bilginiz vardır.

    $("select[name=vardiya_turu]").change(function(){ }); // örneğin select tetikliyor
    kendi projenizde değilde denemeleri boş html sayfalarında yaparsanız daha hızlı ilerlersiniz.
    Yani yazılım dediğimiz olay basit değil, motivasyon, zaman, akıl, fikir, güç ve kuvvet gerekiyor
    Kolay gelsin
    Takıldığını yerde konu açıp veya post atın yardımcı oluruz.
    Merhaba jquery kurcaladım bayağı fakat bir yerde yine takıldım. Sağ taraftaki personel kutusunu kaldırdım. Yani personeller direk geliyor. Fakat vardiya türü tablosu yaratıp oradan veri çekip dropdown list olarak sıralamaya çalıştım önce sizin koddaki array içindeki vardiya turlerini çekmeye çalıştım. Liste geliyor fakat daha önce bir kayıt varsa o gelmiyor sadece liste geliyor. Birde kayıt yapayım derken patlıyor Benim bir veritabanından vardiya türlerini seçip liste şeklinde yazdırıp kaydetmem gerekiyor.

    var haftalikVeri = ['bos', 'bos', 'bos', 'bos', 'bos', 'bos', 'bos'];
    var vardiyaTurleri = {
        bos: "Boş",
        erken: "Erken",
        gec: "Geç"
    }
     
    // Haftanın günlerini alalım
    var simdikiZaman = new Date();
    var haftaNumarasi = simdikiZaman.getWeek();
    var haftaninIlkGunu = new Date(simdikiZaman);
    haftaninIlkGunu.setDate(simdikiZaman.getDate() - simdikiZaman.getDay() + 1);
    var haftaninSonGunu = new Date(haftaninIlkGunu);
    haftaninSonGunu.setDate(haftaninIlkGunu.getDate() + 6);
     
    var gunler = ["Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi", "Pazar"];
     
    // Vardiya tablosunu güncelleyen fonksiyon
    function vardiya_tablosu(personelListesi) {
        var table = $("<table>");
        var thead = $("<thead>");
        var tbody = $("<tbody>");
     
        // Tablo başlıkları
        var theadRow = $("<tr>");
        theadRow.append("<th>Personel</th>");
     
        for (var i = new Date(haftaninIlkGunu), j = 0; i <= haftaninSonGunu; i.setDate(i.getDate() + 1), j++) {
            theadRow.append("<th>" + i.formatDate('d.m.Y') + "<br/>" + gunler[j % 7] + "</th>");
        }
     
        thead.append(theadRow);
        table.append(thead);
     
     
        // Her bir personel için satır oluştur
        for (var a = 0; a < personelListesi.length; a++) {
            var personel = personelListesi[a];
            var tbodyRow = $("<tr>").data("id", personel.personel_id);
            tbodyRow.append("<td class=\"sutun-personel\">" + personel.adi + "</td>");
     
            for (var i = new Date(haftaninIlkGunu), j = 0; i <= haftaninSonGunu; i.setDate(i.getDate() + 1), j++) {
                var vardiyaTuru = "bos";
                if (typeof personel.haftalikVeri[i.formatDate("Y-m-d")] != "undefined") {
                    vardiyaTuru = personel.haftalikVeri[i.formatDate("Y-m-d")];
                }
                var slug = url_title(vardiyaTuru);
                
                  
            
    //eklediğim kısım başlangıç
              var span = $('<select>');
             $.each(vardiyaTurleri, function(val,text){
               span.append($('<option value="'+ vardiyaTurleri[vardiyaTuru] + '">' + vardiyaTurleri[vardiyaTuru] + '</option>').val(val).html(text)).click(function () {;
             });
    // eklediğim kısım sonu
            
                
                
              
                
              
                  
        
                    
                    // Span üzerine tıklandığında vardiya turunu değiştir
                    
                    
                    //yeniVardiyaTuru = toggleVardiyaTuru($(this).text());
                   //$(this).attr("class", "etiket " + url_title(yeniVardiyaTuru)).text(yeniVardiyaTuru);
                   //saveVardiyaData();
                  
               });
                tbodyRow.append($("<td>").data("tarih", i.formatDate("Y-m-d")).append(span));
                
            }
     
            tbody.append(tbodyRow);
            
        }
     
      
     
        // --Tabloyu Oluşturuyor
        thead.append(theadRow);
        table.append(thead);
        table.append(tbody);
        $(".kutu-tablo table").replaceWith(table);
        
    }
    $(document).ready(function () {  
    
        
    
        
     
        getVardiyaData();
        });
    
    
    
    function getVardiyaData() {
        NProgress.configure({ parent: ".kutu-eylem" });
        NProgress.start();
     
        $.ajax({
            url: "json.php",
            type: "GET",
            dataType: "json",
            data: {
                ilk_gun: haftaninIlkGunu.formatDate("Y-m-d 00:00:00"),
                son_gun: haftaninSonGunu.formatDate("Y-m-d 23:59:59")
            },
            success: function (json) {
                NProgress.done();
                // JSON yanıtını işleme burada
                var vardiyadakiler = [];
                $.each(json, function(index, personel){
                    if (personel.vardiya_aktif) {
                        vardiyadakiler.push(personel);
                    }
                });
                vardiya_tablosu(vardiyadakiler);
            },
            error: function (xhr, status, error) {
            // Hata durumlarını burada işleyebilirsiniz
                console.error("Hata: " + error);
            }
        });
    }
    function toggleVardiyaTuru(tur) {
        var yeniTur = null;
        if (tur === vardiyaTurleri.bos) {
            yeniTur = vardiyaTurleri.erken;
        } else if (tur === vardiyaTurleri.erken) {
            yeniTur = vardiyaTurleri.gec;
        } else if (tur === vardiyaTurleri.gec) {
            yeniTur = vardiyaTurleri.bos;
        }
        return yeniTur;
    }