Tolong pilih kategori sesuai, jenis posting (diskusi atau bukan) dan sertakan tag/topik yang sesuai seperti komputer, java, php, mysql, dll. Promosi atau posting tidak pada tempatnya akan kami hapus!
- Bagi Anda yang ingin mendaftar, baca link berikut:
http://diskusiweb.com/discussion/50491/how-to-registrasi-diskusiweb-com-baca-ini-terlebih-dahulu
- Cara menyisipkan kode program supaya tampil rapi dan terformat dengan baik di diskusiweb.com: http://www.diskusiweb.com/discussion/50415/cara-menyisipkan-kode-program-di-diskusiweb-com
- Cara posting gambar/image di post Anda: http://www.diskusiweb.com/discussion/47345/cara-menyisipkan-menyertakan-image-pada-posting/p1

query sql untuk hitung cuti karyawan

Siang master,
Ada beberapa hal pertanyaan menyangkut perhitungan cuti di sql :
1. Cara hitung sisa cuti berdasarkan masa kerja di atas 1 tahun dapat 12 cuti - jumlah cuti bersama + sisa cuti periode tahun sebelumnya. Masa kerja di bawah 1 tahun belum dapat cuti.
Contoh 12 - 4 + 2 = 10 sisa cuti yang bisa di ambil karyawan.
2. Masa berlaku cuti adalah 2 tahun, jika tidak di ambil akan hangus otomatis & akan di munculkan di report karyawan
3. Untuk pengambilan cuti, bisa setengah hari (4 jam). Jadi nanti untuk sisa cuti, contoh 12 hari 4 jam karena sudah pernah mengambil cuti setengah hari (4 jam).

Mohon bimbingannya master.
Tagged:
«1

Comments

  • edited January 2017
    CREATE TABLE 'kalender_kerja' (
    `id_kalender_kerja` INT(11) NOT NULL AUTO_INCREMENT,
    `keterangan_kalender_kerja` VARCHAR(200) NOT NULL,
    `tgl_kalender_kerja` DATE NOT NULL,
    `last_update` datetime NOT NULL,
    `updated_by` VARCHAR(200) NOT NULL,
    PRIMARY KEY (`id_kalender_kerja`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=20 ;
    INSERT INTO `kalender_kerja` (`id_kalender_kerja`, `keterangan_kalender_kerja`, `tgl_kalender_kerja`, `last_update`, `updated_by`) VALUES
    (1, 'Tahun Baru Masehi', '2016-01-01', '2016-06-02 07:59:39', 'Administrator'),
    (2, 'Tahun Baru Imlek 2567', '2016-02-08', '2016-06-02 08:00:34', 'Administrator'),
    (3, 'Hari Raya Nyepi Saka 1938', '2016-03-09', '2016-06-02 08:01:39', 'Administrator'),
    (4, 'Wafat Isa Almasih', '2016-03-25', '2016-06-02 08:02:31', 'Administrator'),
    (5, 'Hari Buruh Internasional', '2016-05-01', '2016-06-02 08:02:52', 'Administrator'),
    (6, 'Kenaikan Isa Almasih', '2016-05-05', '2016-06-02 08:03:14', 'Administrator'),
    (7, 'Isa Mi''raj Nabi Muhammad SAW', '2016-05-06', '2016-06-02 08:03:40', 'Administrator'),
    (8, 'Hari Raya Waisak 2550', '2016-05-22', '2016-06-02 08:05:58', 'Administrator'),
    (9, 'Hari Raya Idul Fitri 1 Syawal 1437 H', '2016-07-06', '2016-06-02 08:06:48', 'Administrator'),
    (10, 'Hari Raya Idul Fitri 2 Syawal 1437 H', '2016-07-07', '2016-06-02 08:07:04', 'Administrator'),
    (11, 'Hari Raya Kemerdekaan RI', '2016-08-17', '2016-06-02 08:07:22', 'Administrator'),
    (12, 'Hari Raya Idul Adha 1437 H', '2016-09-12', '2016-06-02 08:07:43', 'Administrator'),
    (13, 'Tahun Baru Hijriyah 1438 H', '2016-10-02', '2016-06-02 08:08:13', 'Administrator'),
    (14, 'Maulid Nabi Muhammad SAW', '2016-12-12', '2016-06-02 08:08:38', 'Administrator'),
    (15, 'Hari Raya Natal', '2016-12-25', '2016-06-02 08:08:50', 'Administrator'),
    (16, 'Cuti Bersama', '2016-07-04', '2016-06-02 08:12:58', 'Administrator'),
    (17, 'Cuti Bersama', '2016-07-05', '2016-06-02 08:13:07', 'Administrator'),
    (18, 'Cuti Bersama', '2016-07-08', '2016-06-02 08:13:15', 'Administrator'),
    (19, 'Cuti Bersama', '2016-12-26', '2016-06-02 08:13:26', 'Administrator');
     
    CREATE TABLE IF NOT EXISTS `karyawan` (
    `id_karyawan` INT(100) NOT NULL AUTO_INCREMENT,
    `nik` VARCHAR(1000) NOT NULL,
    `nama_lengkap` CHAR(100) NOT NULL,
    `nama_panggilan` CHAR(100) NOT NULL,
    `jenis_kelamin` enum('L','P') NOT NULL,
    `alamat` VARCHAR(1000) NOT NULL,
    `kota` CHAR(100) NOT NULL,
    `kode_pos` CHAR(100) NOT NULL,
    `telepon` CHAR(100) NOT NULL,
    `handphone` CHAR(100) NOT NULL,
    `tempat_lahir` CHAR(100) NOT NULL,
    `tgl_lahir` DATE NOT NULL,
    `alamat_asal` VARCHAR(1000) NOT NULL,
    `kota_asal` CHAR(100) NOT NULL,
    `kode_pos_asal` CHAR(100) NOT NULL,
    `id_agama` CHAR(100) NOT NULL,
    `ktp` CHAR(100) NOT NULL,
    `npwp` CHAR(100) NOT NULL,
    `bpjs_ketenagakerjaan` CHAR(100) NOT NULL,
    `bpjs_kesehatan` CHAR(100) NOT NULL,
    `tgl_masuk` DATE NOT NULL,
    `id_golongan` CHAR(100) NOT NULL,
    `id_lulusan` CHAR(100) NOT NULL,
    `id_dept` CHAR(100) NOT NULL,
    `pendidikan` VARCHAR(200) NOT NULL,
    `id_jabatan` CHAR(100) NOT NULL,
    `id_seksi` CHAR(100) NOT NULL,
    `id_status_kerja` CHAR(100) NOT NULL,
    `kontrak_awal` DATE NOT NULL,
    `kontrak_akhir` DATE NOT NULL,
    `id_status_pernikahan` CHAR(100) NOT NULL,
    `nama_istri` CHAR(100) NOT NULL,
    `tgl_menikah` DATE NOT NULL,
    `tgl_lahir_istri` DATE NOT NULL,
    `tgl_keluar` DATE NOT NULL,
    `alasan_keluar` VARCHAR(100) NOT NULL,
    `is_shift` INT(11) NOT NULL,
    `is_active` enum('0','1') NOT NULL,
    `pic1` text NOT NULL,
    `last_update` datetime NOT NULL,
    `updated_by` VARCHAR(200) NOT NULL,
    PRIMARY KEY (`id_karyawan`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
     
    INSERT INTO `karyawan` (`id_karyawan`, `nik`, `nama_lengkap`, `nama_panggilan`, `jenis_kelamin`, `alamat`, `kota`, `kode_pos`, `telepon`, `handphone`, `tempat_lahir`, `tgl_lahir`, `alamat_asal`, `kota_asal`, `kode_pos_asal`, `id_agama`, `ktp`, `npwp`, `bpjs_ketenagakerjaan`, `bpjs_kesehatan`, `tgl_masuk`, `id_golongan`, `id_lulusan`, `id_dept`, `pendidikan`, `id_jabatan`, `id_seksi`, `id_status_kerja`, `kontrak_awal`, `kontrak_akhir`, `id_status_pernikahan`, `nama_istri`, `tgl_menikah`, `tgl_lahir_istri`, `tgl_keluar`, `alasan_keluar`, `is_shift`, `is_active`, `pic1`, `last_update`, `updated_by`) VALUES
    ();
     
    CREATE TABLE IF NOT EXISTS `cuti_karyawan` (
    `id_cuti_karyawan` INT(11) NOT NULL AUTO_INCREMENT,
    `tgl_input` DATE NOT NULL,
    `keterangan` VARCHAR(200) NOT NULL,
    `alamat_cuti` VARCHAR(200) NOT NULL,
    `id_karyawan` INT(100) NOT NULL,
    `last_update` datetime NOT NULL,
    `updated_by` CHAR(100) NOT NULL,
    PRIMARY KEY (`id_cuti_karyawan`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;
    INSERT INTO `cuti_karyawan` (`id_cuti_karyawan`, `tgl_input`, `keterangan`, `alamat_cuti`, `id_karyawan`, `last_update`, `updated_by`) VALUES
    (6, '2016-06-02', 'Keperluan Keluarga', 'Aceh', 3, '2016-06-08 03:15:39', 'Administrator'),
    (7, '2016-07-01', 'Coba input Cuti', 'Bekasi', 2, '2016-06-07 05:58:28', 'Administrator');
     
     
    CREATE TABLE IF NOT EXISTS `cuti_karyawan_mutasi` (
    `id_cuti_karyawan_mutasi` INT(11) NOT NULL AUTO_INCREMENT,
    `tgl_cuti` DATE NOT NULL,
    `jml_jam` enum('8','4') NOT NULL,
    `id_cuti_karyawan` INT(11) NOT NULL,
    PRIMARY KEY (`id_cuti_karyawan_mutasi`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=18 ;
     
    INSERT INTO `cuti_karyawan_mutasi` (`id_cuti_karyawan_mutasi`, `tgl_cuti`, `jml_jam`, `id_cuti_karyawan`) VALUES
    (11, '2016-08-01', '4', 7),
    (16, '2016-06-05', '4', 6),
    (17, '2016-06-07', '8', 6);
  • edited June 2016
    lalu yg ingin diketahui apa nya ?


    ya ...
    elo pahami sendiri aja dah query di bawah ...
    ribet juga jelasin kalo sudah kompleks
    jangan lupa buka mysql manual, dan baca

    btw, tuh enum, mending type nya integer
    enum bakal ribet kalo mau dijumlahkan, lihat sendiri di query di bawah



    SELECT
      k.id_karyawan,

      IF(
        ABS(TIMESTAMPDIFF(YEAR,NOW(),k.tgl_masuk))>2,
        2,
        ABS(TIMESTAMPDIFF(YEAR,NOW(),k.tgl_masuk))
      )*12 AS jml_cuti,

      IF(
        ABS(TIMESTAMPDIFF(YEAR,NOW(),k.tgl_masuk))>0,
        cb.lalu,
        0
      ) AS jml_cuti_bersama_thn_lalu,

      IF(
        ABS(TIMESTAMPDIFF(YEAR,NOW(),k.tgl_masuk))>0,
        cb.ini,
        0
      ) AS jml_cuti_bersama_thn_ini,

      SUM(IF(YEAR(cm.tgl_cuti)=YEAR(NOW())-1,ELT(cm.jml_jam+0,1,0.5),0)) AS jml_cuti_diambil_thn_lalu,

      SUM(IF(YEAR(cm.tgl_cuti)=YEAR(NOW()),ELT(cm.jml_jam+0,1,0.5),0)) AS jml_cuti_diambil_thn_ini,

      (
        IF(
          ABS(TIMESTAMPDIFF(YEAR,NOW(),k.tgl_masuk))>2,
          2,
          ABS(TIMESTAMPDIFF(YEAR,NOW(),k.tgl_masuk)))*12
        )
        -(
          IF(ABS(TIMESTAMPDIFF(YEAR,NOW(),k.tgl_masuk))>0,cb.lalu,0)
          +IF(ABS(TIMESTAMPDIFF(YEAR,NOW(),k.tgl_masuk))>0,cb.ini,0)
        )
        -(
          SUM(IF(YEAR(cm.tgl_cuti)=YEAR(NOW())-1,ELT(cm.jml_jam+0,1,0.5),0))
          +SUM(IF(YEAR(cm.tgl_cuti)=YEAR(NOW()),ELT(cm.jml_jam+0,1,0.5),0))
      ) AS sisa_hari_cuti

    FROM
      karyawan k

    LEFT JOIN
      cuti_karyawan ck
    ON
      ck.id_karyawan=k.id_karyawan

    LEFT JOIN
      cuti_karyawan_mutasi cm
    ON
      cm.id_cuti_karyawan=ck.id_cuti_karyawan
      AND YEAR(cm.tgl_cuti) IN (YEAR(NOW()),YEAR(NOW())-1),

    (
      SELECT
        SUM(IF(YEAR(tgl_kalender_kerja)=YEAR(NOW()),1,0)) AS ini,
        SUM(IF(YEAR(tgl_kalender_kerja)=YEAR(NOW())-1,1,0)) AS lalu
      FROM
        kalender_kerja kk
      WHERE
        YEAR(tgl_kalender_kerja) IN (YEAR(NOW()),YEAR(NOW())-1)
        AND REPLACE(LOWER(keterangan_kalender_kerja)," ","")="cutibersama"
    ) cb

    GROUP BY k.id_karyawan
  • edited June 2016
    satu lagi catatan buat elo ...

    query di atas belum sempurna
    masalahnya sample elo juga sedikit

    ini gambaran masalahnya

    si A, id 1, masuk 2011, masa kerja sudah 5 tahun
    dan anggap cuti bersama sama 4 hari tiap tahun, biar gampang ngasih contohnya

    tiap tahun dapat cuti 12 hari, karena cuti bersama sama terus jumlahnya,
    anggap pertahun dapat jatah cuti efektif 8 hari

    tahun 1 ndak ada cuti kecuali cuti bersama, oke, ndak masalah
    tahun 2, dapat cuti 8 hari, tidak diambil, utuh

    tahun 3, dapat cuti 8 hari, jadi 8(2) + 8(3), diambil 4 hari ...
    4 hari ini harusnya ambil jatah dari 8(2), yg 8(3) utuh
    sisanya 4(2) + 8(3)

    tahun 4, dapat cuti 8 hari, jadi 8(3) + 8(4) ... ini bisa utuh diambil 16 hari

    kalo pake query di atas, pasti ndak ketemu

    satu-satunya cara yg paling baik yg bisa elo pakai :
    bikin satu table lagi, tabel sisa cuti
    ini yg merekam sisa cuti tahun berjalan

    fieldnya cukup :
    id_karyawan | tahun | sisa_cuti

    kalo dari contoh di atas, isinya bakal jadi
    1 | 2011 | 0
    1 | 2012 | 4
    1 | 2013 | 8
    1 | 2014 | 8

    ngitungnya lebih gampang
    elo ndak perlu nge-trace dari awal tahun masuk
  • Wah... makasih banyak penjelasannya mas. Ia bener mas kaya begitu alur cutinya. Kayanya emang harus bikin 1 tabel lagi yang kaya mas kasih buat record sisa cuti tahun sebelumnya. Ada 2 hal lagi mas,

    1. Cuti 2 tahun sebelumnya akan hangus jika ada sisa. maksimal cuti tahun berjalan & tahun lalu maksimal 18. Jika tahun lalu sisa 10 + tahun ini dapat jatah cuti 9. Cuti yang bisa di ambil hanya 18 & yang cuti 1 harinya hangus.
    2. Di kantor juga untuk pengambilan cuti ada 2 cara, bisa 1 hari (8 jam) bisa setengah hari (4 jam). Makanya saya juga menggunakan enum supaya bisa pilih 4 atau 8 saat mengajukan cutinya & akan saya ganti jadi int seperti mas bilang. Jadi nanti di laporan sisa cutinya ada jumlah hari dan jam. Contoh : Sisa cuti 10 Hari 4 Jam.
    Begitu mas.

  • edited June 2016
    lha elo kan sudah ta tunjukin query nya ...

    dipahami dulu
    ubah dari situ

    ndak berubah banyak
    logika nya masih bisa dipake

    emang kalo int kenapa ?
    kan sama aja bisa elo isi angka 4 atau 8

    malah kalo mau pake desimal, bukan integer
    elo simpan 1 dan 0.5
    1 hari atau 0.5 hari
    semisal sisa cuti 7.5
    elo floor() dapet 7 hari
    kalo elo bandingkan sisa cuti dan hasil floor lebih besar sisa cuti ...
    7 < 7.5
    berarti pasti ada tambahan 4 jam, ndak mungkin lain

    kalo int, hasil SUM() mesti di /8 dan floor() dulu
    baru ketemu jumlah hari
    dan di %8 ketemu sisa jam

    mau int atau dec, nambahnya gampang, tinggal SUM()
    drpd pake enum mesti pake ELT() baru bisa di SUM()
  • ok.. ok.. sy coba dulu mas..
  • edited June 2016
    mas saya balik lagi, saya uda bikin 1 tabel lagi.

    sisa_cuti
    id | tahun | sisa_cuti | id_karyawan
    1 | 2014 | 3 | 5
    2 | 2015 | 2.5 | 5
    3 | 2016 | 5 | 5

    Jadi user input cuti. Data yang di post jumlah_cuti (4) dan id_karyawan(5). Masalahnya, saat tabel di update buat update sisa_cuti, gimana caranya buat kenalin dia mau update tahun yang keberapa mas.

    Ketentuannya, total cuti di dapat dari tahun berjalan & tahun kemarin (2.5 + 5 = 7.5). Tahun 2014 statusnya ga bisa di ambil lagi cutinya (Expired). Jadi saat user input cuti 4 hari, maka yang di update tahun 2015(0) dan 2016(3.5) ?

    Minta bantuannya lagi mas...
    :-S ^:)^
  • kalo data kaya gitu ...
    sisa libur yg masih bisa dipake 2015 & 2016, bener to ?

    elo ambil aja dulu 2 data 2 tahun terakhir ...

    SELECT * FROM sisa_cuti WHERE id_karyawan="xxx" ORDER BY tahun DESC LIMIT 2

    itu bakal dapat data 2 tahun terakhir
    ambil semua tampung di array
    misal jadi
    $sisa_cuti = array( 2016 => 5 , 2015 => 2.5 );

    misal
    $ambil_cuti = 4;
    $tahun_ini = date('Y'); // 2016
    $tahun_lalu = $tahun_ini - 1;

    if($sisa_cuti[$tahun_lalu]<$ambil_cuti) {
      $sisa_cuti[$tahun_lalu] = 0;
      $ambil_cuti = $ambil_cuti - $sisa_cuti[$tahun_lalu];
    }
    else {
      $sisa_cuti[$tahun_lalu] = $sisa_cuti[$tahun_lalu] - $ambil_cuti;
      $ambil_cuti = 0;
    }

    if($sisa_cuti[$tahun_ini]<$ambil_cuti) {
      $sisa_cuti[$tahun_ini] = 0;
      $ambil_cuti = $ambil_cuti - $sisa_cuti[$tahun_ini];
    }
    else {
      $sisa_cuti[$tahun_ini] = $sisa_cuti[$tahun_ini] - $ambil_cuti;
      $ambil_cuti = 0;
    }

    itu proses nya, tinggal UPDATE 2x

    UPDATE sisa_cuti SET sisa_cuti=$sisa_cuti[$tahun_lalu] WHERE id_karyawan="xxx" AND tahun=$tahun_lalu

    UPDATE sisa_cuti SET sisa_cuti=$sisa_cuti[$tahun_ini] WHERE id_karyawan="xxx" AND tahun=$tahun_ini

    selesai
  • Maap mas saya mau tanya

    ini dapat dari data yang di post ya mas ?

    misal
    $ambil_cuti = 4;
    $tahun_ini = date('Y'); // 2016
    $tahun_lalu = $tahun_ini - 1;

  • $ambil_cuti
    itu nama variabelnya sudah menunjukkan itu data apa ...
    ya value data itu di koding elo ada di mana ?

    kalo masalah tahun kan otomatis by system
    baca tanggal system langsung
  • edited June 2016
    ia mas uda ketemu dapatnya dari mana,
    sekarang saya ada masalah dikit di query buat ngambil sisa cutinya mas.
    Kalau saya pake ini,

    SELECT
    k.id_karyawan,nama_lengkap,nik,is_active,
    IFNULL(SUM(cuti_sisa),0) AS total_cuti,
    b.nama_dept,f.jabatan
    FROM karyawan k
    LEFT JOIN dept b ON k.id_dept = b.id
    LEFT JOIN jabatan_user f ON k.id_jabatan = f.id
    LEFT JOIN cuti_sisa c ON c.id_karyawan = k.id_karyawan
    GROUP BY k.id_karyawan

    itu ngejumlah semua tahun mas, saya maunya cuma 2 tahun terakhir aja yang di sum.
    Gimana ya mas querynya ?
  • kan sudah ...

    WHERE
      YEAR(tgl_kalender_kerja) IN (YEAR(NOW()),YEAR(NOW())-1)
  • saya coba ini mas

    SELECT * FROM (
    SELECT
    k.id_karyawan,nama_lengkap,nik,is_active, 
    IFNULL(SUM(cuti_sisa),0) AS total_cuti, c.tahun,
    b.nama_dept,f.jabatan
    FROM karyawan k 
    LEFT JOIN dept b ON k.id_dept = b.id
    LEFT JOIN jabatan_user f ON k.id_jabatan = f.id
    LEFT JOIN cuti_sisa c ON c.id_karyawan = k.id_karyawan 
    GROUP BY k.id_karyawan) AS jml
    WHERE
    jml.is_active='0' AND jml.id_karyawan= 8
    AND YEAR(jml.tahun) IN (YEAR(NOW()),YEAR(NOW())-1)

    Ga ada hasil (Tampilan kosong).
  • napa jadi sub query ?
    emang gak bisa kalo ndak pake sub query ?
  • ia mas bisa ternyata, saya jadi gini
    SELECT
    k.id_karyawan,nama_lengkap,nik,is_active, 
    IFNULL(SUM(cuti_sisa),0) AS total_cuti,
    b.nama_dept,f.jabatan
    FROM karyawan k 
    LEFT JOIN dept b ON k.id_dept = b.id
    LEFT JOIN jabatan_user f ON k.id_jabatan = f.id
    LEFT JOIN cuti_sisa c ON c.id_karyawan = k.id_karyawan 
    WHERE is_active='0' AND k.id_karyawan= 8
    AND YEAR(tahun) IN (YEAR(NOW()),YEAR(NOW())-1)
    GROUP BY k.id_karyawan

    ga keluar datanya mas.
    Itu bener ga mas naro YEAR(tahun) IN (YEAR(NOW()),YEAR(NOW())-1) nya ?

  • edited June 2016
    SELECT
      k.id_karyawan,nama_lengkap,nik,is_active,
      IFNULL(SUM(cuti_sisa),0) AS total_cuti,
      b.nama_dept,f.jabatan
    FROM karyawan k
    LEFT JOIN dept b ON k.id_dept = b.id
    LEFT JOIN jabatan_user f ON k.id_jabatan = f.id
    LEFT JOIN cuti_sisa c ON c.id_karyawan = k.id_karyawan
    WHERE is_active='0' AND k.id_karyawan= 8    
      AND YEAR(tahun) IN (YEAR(NOW()),YEAR(NOW())-1)
    GROUP BY k.id_karyawan

    yg gw tandai merah ...
    kalo elo mainan query multi table
    pake nama table nya atau alias nya buat nunjukin itu field table yg mana

    padahal yg biru sudah bener lho,
    pake alias buat nunjuk itu ada di table yg mana

    kok bisa belang ?
  • edited June 2016
    ada sedikit revisi mas

    SELECT
    k.id_karyawan,nama_lengkap,nik,is_active,
    IFNULL(SUM(c.cuti_sisa),0) AS total_cuti,
    b.nama_dept,f.jabatan
    FROM karyawan k
    LEFT JOIN dept b ON k.id_dept = b.id
    LEFT JOIN jabatan_user f ON k.id_jabatan = f.id
    LEFT JOIN cuti_sisa c ON c.id_karyawan = k.id_karyawan
    WHERE k.is_active='0' AND k.id_karyawan= 8
    AND YEAR(c.tahun) IN (YEAR(NOW()),YEAR(NOW())-1)
    GROUP BY k.id_karyawan

    yang mas tandain warna merah itu field dari tabelnya masing2, dimana nama tabel pake alias mas.
  • nama_lengkap,nik,is_active

    itu dari table apa ?

    iya gw tau mas'e ... gw kan juga bilang :
    "pake nama table nya atau alias nya buat nunjukin itu field table yg mana"

    itu pun masih ada field yg belum elo tulis table atau alias nya

    lalu ?
    hasilnya masih kosong ?

    di table karyawan , data dgn id_karyawan = 8 dan is_active = 0 ... ada atau tidak ?
  • kalau pake ini mas bisa jalan.

    SELECT
    k.id_karyawan,nama_lengkap,nik,is_active, 
    IFNULL(SUM(c.cuti_sisa),0) AS total_cuti,
    b.nama_dept,f.jabatan
    FROM karyawan k 
    LEFT JOIN dept b ON k.id_dept = b.id
    LEFT JOIN jabatan_user f ON k.id_jabatan = f.id
    LEFT JOIN cuti_sisa c ON c.id_karyawan = k.id_karyawan 
    WHERE is_active='0' AND k.id_karyawan= 8

    image

    seharusnya total cutinya 7 mas
    image
  • coba jalankan query ini :

    SELECT YEAR(NOW()),YEAR(NOW())-1 FROM DUAL;

    apa hasilnya ?
  • hasilnya :

    YEAR (NOW ()) | YEAR (NOW())-1
    2016                  | 2015
  • SELECT
      k.id_karyawan,nama_lengkap,nik,is_active,
      IFNULL(SUM(c.cuti_sisa),0) AS total_cuti,
      b.nama_dept,f.jabatan
    FROM karyawan k
      LEFT JOIN dept b ON k.id_dept = b.id
      LEFT JOIN jabatan_user f ON k.id_jabatan = f.id
      LEFT JOIN cuti_sisa c ON c.id_karyawan = k.id_karyawan
    WHERE
      is_active='0' AND k.id_karyawan=8
      AND YEAR(c.tahun) IN (YEAR(NOW()),YEAR(NOW())-1)

    apa hasilnya ?
  • ini mas hasilnya
    image
  • oh, maksud elo itu "0" utk total_cuti nya ...

    SUM(IFNULL(c.cuti_sisa,0))
  • Bukan mas, jadi kan ada tabel cuti_sisa
    image

    di situ untuk id karyawan 8 ada cuti tahun 2014,2015,2016. Saya mau ambil total cuti berdasarkan cuti tahun berjalan + tahun lalu (5 + 2 = 7). Saya pake script ini

    SELECT
    k.id_karyawan,nama_lengkap,nik,is_active,
    IFNULL(SUM(c.cuti_sisa),0) AS total_cuti,
    b.nama_dept,f.jabatan
    FROM karyawan k
    LEFT JOIN dept b ON k.id_dept = b.id
    LEFT JOIN jabatan_user f ON k.id_jabatan = f.id
    LEFT JOIN cuti_sisa c ON c.id_karyawan = k.id_karyawan
    WHERE is_active='0' AND k.id_karyawan= 8

    tapi total cutinya jadi '9' mas, seharusnya 7. Itu gimana ya mas ?

  • ini

    AND YEAR(c.tahun) IN (YEAR(NOW()),YEAR(NOW())-1)

    kok ndak ikut masuk ... gimana tooooooo ...
    itu kan kunci buat milih hanya tahun 2015 & 2016 -nya
    tanpa itu ya 2014 ikut masuk
  • edited June 2016
    ia mas hasilnya '0'
    image

    kalau saya ganti jadi 
    SELECT
    k.id_karyawan,nama_lengkap,nik,is_active,
    SUM(IFNULL(c.cuti_sisa,0)) AS total_cuti,
    b.nama_dept,f.jabatan
    FROM karyawan k
    LEFT JOIN dept b ON k.id_dept = b.id
    LEFT JOIN jabatan_user f ON k.id_jabatan = f.id
    LEFT JOIN cuti_sisa c ON c.id_karyawan = k.id_karyawan
    WHERE
    is_active='0' AND k.id_karyawan=8
    AND YEAR(c.tahun) IN (YEAR(NOW()),YEAR(NOW())-1)



    hasilnya "Null" mas..
  • edited June 2016
    DDL table elo, sertakan sample seperlunya
    posting kemari
  • edited June 2016
    tabel dep
    CREATE TABLE `dept` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `id_dept` CHAR(100) NOT NULL,
    `nama_dept` CHAR(100) NOT NULL,
    `last_update` datetime NOT NULL,
    `updated_by` VARCHAR(200) NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
     
    --
    -- Dumping data untuk tabel `dept`
    --
     
    INSERT INTO `dept` (`id`, `id_dept`, `nama_dept`, `last_update`, `updated_by`) VALUES
    (1, '1.4', 'HRD &amp; GA', '2016-05-19 09:58:50', 'Administrator'),
    (2, '1.1', 'PRODUCTION', '2016-05-19 09:58:53', 'Administrator'),
    (3, '1.6', 'QA', '2016-05-19 09:58:56', 'Administrator'),
    (4, '1.2', 'PPC', '2016-05-19 09:58:58', 'Administrator'),
    (5, '1.5', 'ACC &amp; FINANCE', '2016-05-19 09:59:02', 'Administrator'),
    (6, '1.3', 'Tools &amp; Dies Engineer', '2016-05-19 10:01:43', 'Administrator');

    tabel cuti_sisa
    CREATE TABLE `cuti_sisa` (
    `id_cuti_sisa` INT(11) NOT NULL AUTO_INCREMENT,
    `tahun` YEAR(4) NOT NULL,
    `cuti_sisa` DECIMAL(11,0) NOT NULL,
    `id_karyawan` INT(11) NOT NULL,
    `last_update` datetime NOT NULL,
    `updated_by` VARCHAR(200) NOT NULL,
    PRIMARY KEY (`id_cuti_sisa`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
     
    --
    -- Dumping data untuk tabel `cuti_sisa`
    --
     
    INSERT INTO `cuti_sisa` (`id_cuti_sisa`, `tahun`, `cuti_sisa`, `id_karyawan`, `last_update`, `updated_by`) VALUES
    (2, 2015, 2, 4, '2016-06-14 04:18:01', 'Administrator'),
    (3, 2016, 7, 2, '2016-06-16 10:10:01', 'Administrator'),
    (4, 2015, 2, 8, '2016-06-17 08:13:36', 'Administrator'),
    (5, 2016, 5, 8, '2016-06-16 10:18:40', 'Administrator'),
    (6, 2014, 2, 8, '2016-06-27 04:45:39', 'Administrator');


  • edited June 2016
    tabel karyawan
    &gt;CREATE TABLE `karyawan` (
    `id_karyawan` INT(100) NOT NULL AUTO_INCREMENT,
    `nik` VARCHAR(1000) NOT NULL,
    `nama_lengkap` CHAR(100) NOT NULL,
    `nama_panggilan` CHAR(100) NOT NULL,
    `jenis_kelamin` enum('L','P') NOT NULL,
    `alamat` VARCHAR(1000) NOT NULL,
    `kota` CHAR(100) NOT NULL,
    `kode_pos` CHAR(100) NOT NULL,
    `telepon` CHAR(100) NOT NULL,
    `handphone` CHAR(100) NOT NULL,
    `tempat_lahir` CHAR(100) NOT NULL,
    `tgl_lahir` DATE NOT NULL,
    `alamat_asal` VARCHAR(1000) NOT NULL,
    `kota_asal` CHAR(100) NOT NULL,
    `kode_pos_asal` CHAR(100) NOT NULL,
    `id_agama` CHAR(100) NOT NULL,
    `ktp` CHAR(100) NOT NULL,
    `npwp` CHAR(100) NOT NULL,
    `sim` CHAR(100) NOT NULL,
    `passport` CHAR(100) NOT NULL,
    `tgl_masuk` DATE NOT NULL,
    `id_golongan` CHAR(100) NOT NULL,
    `id_lulusan` CHAR(100) NOT NULL,
    `id_dept` CHAR(100) NOT NULL,
    `pendidikan` VARCHAR(200) NOT NULL,
    `id_jabatan` CHAR(100) NOT NULL,
    `id_seksi` CHAR(100) NOT NULL,
    `id_status_kerja` CHAR(100) NOT NULL,
    `kontrak_awal` DATE NOT NULL,
    `kontrak_akhir` DATE NOT NULL,
    `id_status_pernikahan` CHAR(100) NOT NULL,
    `nama_istri` CHAR(100) NOT NULL,
    `tgl_menikah` DATE NOT NULL,
    `tgl_lahir_istri` DATE NOT NULL,
    `id_jenis_phk` INT(11) NOT NULL,
    `tgl_keluar` DATE NOT NULL,
    `id_alasan_keluar` INT(11) NOT NULL,
    `is_shift` INT(11) NOT NULL,
    `is_active` enum('0','1') NOT NULL,
    `pic1` text NOT NULL,
    `last_update` datetime NOT NULL,
    `updated_by` VARCHAR(200) NOT NULL,
    PRIMARY KEY (`id_karyawan`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=20 ;
     
    --
    -- Dumping data untuk tabel `karyawan`
    --
     
    INSERT INTO `karyawan` (`id_karyawan`, `nik`, `nama_lengkap`, `nama_panggilan`, `jenis_kelamin`, `alamat`, `kota`, `kode_pos`, `telepon`, `handphone`, `tempat_lahir`, `tgl_lahir`, `alamat_asal`, `kota_asal`, `kode_pos_asal`, `id_agama`, `ktp`, `npwp`, `sim`, `passport`, `tgl_masuk`, `id_golongan`, `id_lulusan`, `id_dept`, `pendidikan`, `id_jabatan`, `id_seksi`, `id_status_kerja`, `kontrak_awal`, `kontrak_akhir`, `id_status_pernikahan`, `nama_istri`, `tgl_menikah`, `tgl_lahir_istri`, `id_jenis_phk`, `tgl_keluar`, `id_alasan_keluar`, `is_shift`, `is_active`, `pic1`, `last_update`, `updated_by`) VALUES
    (1, '8', 'Herry Zulkarnain', 'Herry', 'L', 'Singa Raya', 'Bekasi', '17730', '', '08161', 'Jakarta', '1968-04-13', '', '', '', '1', '', '', '', '', '1995-03-19', '1', '5', '3', 'Univ. Andalas Fak.MIPA (Kimia)', '43', '3', '1', '1970-01-01', '1970-01-01', '1', 'Rita Mardiyanti', '2013-05-28', '1973-05-28', 0, '0000-00-00', 0, 0, '0', '', '2016-06-10 06:01:44', 'Administrator'),
    (2, '611', 'Herny Riani', 'Herny', 'P', 'Jl. Zamrud Utara', 'Bekasi Kota', '', '021-826', '', 'Bekasi', '1969-07-19', '', '', '', '1', '', '', '', '', '2015-04-20', '1', '5', '5', 'Universitas Nercubuana Jakarta - Akuntasi', '38', '', '1', '2015-04-20', '2015-07-19', '1', 'Hanggoro Kosasih', '1999-11-14', '1970-04-07', 0, '0000-00-00', 0, 0, '0', 'pic1_Herny_Riani-Acc.jpg', '2016-06-07 06:20:47', 'Administrator'),
    (3, '660', 'Abdul Rauf', '', 'L', 'Jl. Pahlawan', 'Bekasi', '17111', '', '08522', 'Kutacane', '1992-03-28', 'Desa', '', '', '1', '', '', '', '', '2016-02-24', '3', '4', '6', 'Politeknik Negeri Lhokseumawe', '26', '', '3', '2016-02-24', '2016-08-23', '1', 'Haida Syahri', '2015-07-27', '1992-07-25', 2, '2016-06-05', 2, 0, '0', 'pic1_Abdul_Raul-TDE.JPG', '2016-06-20 03:33:19', 'Administrator'),
    (4, '0097', 'Achmad Ardiantoro', 'Ardi', 'L', 'Perum Graha', 'Bekasi', '', '234', '08161', 'Madiun', '1972-02-14', 'Komplek', 'Jakarta', '', '1', '', '', '', '', '1999-09-27', '2', '5', '3', 'Sekolah Tinggi Manajemen Industri Jakarta', '44', '1', '1', '0000-00-00', '0000-00-00', '1', 'Sri Heli', '2004-09-12', '1976-01-21', 3, '2016-06-01', 3, 0, '0', 'pic1_A_Ardiantoro.JPG', '2016-06-20 03:35:51', 'Administrator'),
    (5, '0676', 'Achmad Kurniawan', '', 'L', 'Kp. Rawa', 'Bekasi', '17530', '', '08569', 'Magetan', '1992-05-28', 'Dusu', 'Malang', '56414', '1', '', '', '', '', '2016-05-09', '4', '3', '2', 'SMK Muhammadiyah 1 Salam', '9', '11', '3', '2016-05-08', '2016-11-08', '2', '', '0000-00-00', '0000-00-00', 0, '0000-00-00', 0, 0, '0', 'pic1_Achmad_Kurniawan-OPR-PRD.JPG', '2016-06-07 06:16:31', 'Administrator'),
    (7, '160', 'Adi Gunawan', 'Adi G', 'L', 'Jl. Kasuari', 'Bekasi', '', '', '08155', 'Balikpapan', '1979-12-22', 'Jl Raya', 'Malang', '', '1', '', '', '', '', '2002-06-03', '3', '4', '6', 'Politeknik Brawijaya Malang', '26', '', '1', '0000-00-00', '0000-00-00', '1', 'Hetty Prabandari', '2005-05-25', '1982-10-15', 0, '0000-00-00', 0, 0, '0', 'pic1_Adi_G-TDE.JPG', '2016-06-10 08:14:47', 'Administrator'),
    (8, '0020', 'Bernardus Maruhum', 'Maruhum', 'L', 'Perumahan Taman', 'Bekasi', '', '89906', '08189', 'Palembang', '1968-04-18', '', '', '', '3', '', '', '', '', '1996-03-01', '1', '5', '4', 'Institut Pertanian Bogor', '57', '', '1', '0000-00-00', '0000-00-00', '1', 'Lucia Adiningrum', '1996-09-29', '1969-08-28', 0, '0000-00-00', 0, 0, '0', 'pic1_Maruhum-PPC.JPG', '2016-06-16 10:16:52', 'Administrator'),
    (9, '266', 'Aan Taufik Kurrahman', 'Aan', 'L', 'Perumahan Vila', 'Bekasi', '', '', '', 'Boyolali', '1985-09-24', '', '', '', '1', '', '', '', '', '2005-12-12', '4', '3', '2', 'SMKN 2 Surakarta', '9', '', '3', '0000-00-00', '0000-00-00', '', '', '0000-00-00', '0000-00-00', 0, '2006-02-02', 4, 0, '1', '', '2016-06-27 04:35:32', 'Administrator'),
    (11, '418', 'Abdul Haris', 'Abdul', 'L', 'Kp. Cijati', 'Bekasi', '', '', '', 'Bekasi', '1990-08-03', '', '', '', '1', '', '', '', '', '2011-11-22', '4', '3', '2', 'Tekinik Mesin Otomotif SMK AL Hadiid 1 Cileungsi', '9', '', '3', '2011-11-22', '2012-05-21', '', '', '0000-00-00', '0000-00-00', 0, '2012-05-22', 3, 0, '1', '', '2016-06-27 04:27:14', 'Administrator'),
    (12, '342', 'Abid Sibghotulloh', 'Abid', 'L', 'Kp. Kukun', 'Bekasi', '17550', '', '08561', 'Boyolali', '1989-11-27', 'Sengirjo', 'Boyolali', '', '1', '', '', '', '', '2009-12-16', '4', '3', '2', 'SMK Harapan Kartasura', '9', '', '3', '2010-04-16', '2011-06-15', '', '', '0000-00-00', '0000-00-00', 0, '2011-05-16', 3, 0, '1', '', '2016-06-27 04:27:37', 'Administrator'),
    (19, '282', 'Agustina Puspitasari', 'Tina', 'P', 'Perum Graha', 'Bekasi', '', '', '08131', 'Banjarnegara', '1984-08-11', 'Mandiraja', 'Jawa Tengah', '', '1', '', '', '', '', '2006-02-08', '4', '3', '3', 'SMK Negeri 1 Bawang', '61', '', '1', '0000-00-00', '0000-00-00', '', '', '0000-00-00', '0000-00-00', 0, '2011-06-01', 2, 0, '1', '', '2016-06-28 03:30:44', 'Administrator');
  • oalah ...

    AND YEAR(c.tahun) IN (YEAR(NOW()),YEAR(NOW())-1)
    jelas salah ...

    YEAR(c.tahun)

    lha wong c.tahun elo isinya bukan type DATE
    cuma :
    2014
    2015
    2016

    ya cukup begini :
    AND c.tahun IN (YEAR(NOW()),YEAR(NOW())-1)
  • ia mas tipe datanya YEAR. Sempet curiga si mas di tipe datanya  :D

    Ok uda fix mas dapet 7 total cutinya. Sekarang tinggal update ke db nya aja. Saya coba sendiri dulu ya mas klo ga bisa balik nanya ke mas lagi 
    :D Makasih mas  :-bd
  • mas, saya uda ikutin yang mas bilang,
    saya coba liat di browser hasil if nya mas. Saya pake
    print_r($sisa_cuti[$tahun_lalu]);exit;

    hasilnya 

    A PHP Error was encountered

    Severity: Notice

    Message: Undefined offset: 2015

    Filename: models/data_cuti_karyawan_model.php

    Line Number: 72

    A PHP Error was encountered

    Severity: Notice

    Message: Undefined offset: 2016

    Filename: models/data_cuti_karyawan_model.php

    Line Number: 81

  • print_r($sisa_cuti[$tahun_lalu]);exit;

    lengkapnya kaya apa ?
  • edited June 2016
    saya ada rubah dikit ya mas codenya

    <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    public function save($data,$c){
    $id_karyawan = $data['id_karyawan'];
    $sql = $this->db-&gt;query( "SELECT * FROM cuti_sisa WHERE id_karyawan={$id_karyawan} ORDER BY tahun
    DESC LIMIT 2
    ");
     
    foreach ($sql->result_array() as $row)
    {
    $tmp2 = array(
    'tahun' => $row['tahun'],
    'cuti_sisa' => $row['cuti_sisa']
    );
    $total_cuti_db[] = $tmp2;
    }
     
    $cuti_sisa = array(
     
    'cuti_sisa' =>$c,
    'last_update' =>date('Y-m-d H:i:s'),
    'updated_by' => $this->session->userdata('nama')
    );
    $tahun_ini = date('Y');
    $tahun_lalu = $tahun_ini - 1;
     
    if($total_cuti_db[$tahun_lalu]<$cuti_sisa['cuti_sisa']) {
    $total_cuti_db[$tahun_lalu] = 0;
    $cuti_sisa['cuti_sisa'] = $cuti_sisa['cuti_sisa'] - $total_cuti_db[$tahun_lalu];
    }
    else {
    $total_cuti_db[$tahun_lalu] = $total_cuti_db[$tahun_lalu] - $cuti_sisa['cuti_sisa'];
    $cuti_sisa['cuti_sisa'] = 0;
    }
     
    if($total_cuti_db[$tahun_ini]<$cuti_sisa['cuti_sisa']) {
    $total_cuti_db[$tahun_ini] = 0;
    $cuti_sisa['cuti_sisa'] = $cuti_sisa['cuti_sisa'] - $total_cuti_db[$tahun_ini];
    }
    else {
    $total_cuti_db[$tahun_ini] = $total_cuti_db[$tahun_ini] - $cuti_sisa['cuti_sisa'];
    $cuti_sisa['cuti_sisa'] = 0;
    }
     
    print_r($cuti_sisa[$tahun_lalu]);exit;
    }
  • yg error baris mana ?
  • baris yang ini mas. ada 3.

    if($total_cuti_db[$tahun_lalu]<$cuti_sisa['cuti_sisa']) {

    if($total_cuti_db[$tahun_ini]<$cuti_sisa['cuti_sisa']) {

    print_r($cuti_sisa[$tahun_lalu]);exit;
  • $total_cuti_db[$tahun_lalu] ... jelas salah
    itu artinya elo mau coba ambil :
    $total_cuti_db[2015]

    lha wong elo adanya cuma ini :
    $total_cuti_db[] = $tmp2;

    coba elo liat hasilnya ini :
    <?php
    $a=array();
    $a[]=1;
    $a[]=2;
    $a[]=3;
    print_r($a);
    ?>
    index nya bagaimana ? ada 2015 ?



    $cuti_sisa[$tahun_lalu] ... sama saja
    $cuti_sisa[2015]

    adanya cuma ini :
    $cuti_sisa = array(
      'cuti_sisa'    =>$c,
      'last_update' =>date('Y-m-d H:i:s'),
      'updated_by'  => $this->session->userdata('nama')
    );

    coba elo : print_r($cuti_sisa);
    ada yg index nya 2015 ?
  • "...
    SELECT * FROM sisa_cuti WHERE id_karyawan="xxx" ORDER BY tahun DESC LIMIT 2

    itu bakal dapat data 2 tahun terakhir
    ambil semua tampung di array
    misal jadi
    $sisa_cuti = array( 2016 => 5 , 2015 => 2.5 );
    ..."

    elo itu mau bikin itu ?

    ya gini to mas ...

    $total_cuti_db = array();
    foreach ($sql->result_array() as $row) {
      $total_cuti_db[$row['tahun']] = $row['cuti_sisa'];
    }
  • Aduh bingung ni mas, saya print aja dulu ya.

    kalau saya print_r($total_cuti_db);exit; ,(data dari SELECT * FROM sisa_cuti WHERE id_karyawan="xxx" ORDER BY tahun DESC LIMIT 2) hasilnya 
    Array ( [0] => Array ( [tahun] => 2016 [cuti_sisa] => 5 ) [1] => Array ( [tahun] => 2015 [cuti_sisa] => 2 ) )

    kalau saya print_r($cuti_sisa);exit; hasilnya (Dari form input kebetulan 3 row tanggal yang di input)
    Array ( [cuti_sisa] => 3 [last_update] => 2016-06-29 08:32:02 [updated_by] => Administrator )

    index 2015 ada di total_cuti_db mas.
  • edited June 2016
    ia mas saya salah code di arraynya. Saya uda ganti jadi kaya punya mas & errornya sekarang cuma di baris
    print_r($cuti_sisa[$tahun_lalu]);exit;

    errornya ini mas

    A PHP Error was encountered

    Severity: Notice

    Message: Undefined offset: 2015

    Filename: models/data_cuti_karyawan_model.php

    Line Number: 96

  • print_r($cuti_sisa[$tahun_lalu]);exit;

    ya jelas $cuti_sisa[$tahun_lalu] ndak mungkin ada to maaasssssss ...

    $cuti_sisa[$tahun_lalu]
    $cuti_sisa[2015]

    lha wong $cuti_sisa elo itu isinya ini :
    Array (
    [cuti_sisa] => 3
    [last_update] => 2016-06-29 08:32:02
    [updated_by] => Administrator
    )

    nama ada [2015] di situ ?

    elo nyari apa sih ?
    sisa cuti yg bisa diambil terakhir ?

    kan ada di : $total_cuti_db

    coba dah elo bandingin isinya ...

    $total_cuti_db = array();
    foreach ($sql->result_array() as $row) {
      $total_cuti_db[$row['tahun']] = $row['cuti_sisa'];
    }
    print_r($total_cuti_db);

    ...
    ...
    ...

    if($total_cuti_db[$tahun_lalu]<$cuti_sisa['cuti_sisa']) {
      $total_cuti_db[$tahun_lalu] = 0;
      $cuti_sisa['cuti_sisa'] = $cuti_sisa['cuti_sisa'] - $total_cuti_db[$tahun_lalu];
    }
    else {
      $total_cuti_db[$tahun_lalu] = $total_cuti_db[$tahun_lalu] - $cuti_sisa['cuti_sisa'];
      $cuti_sisa['cuti_sisa'] = 0;
    }
     
    if($total_cuti_db[$tahun_ini]<$cuti_sisa['cuti_sisa']) {
      $total_cuti_db[$tahun_ini] = 0;
      $cuti_sisa['cuti_sisa'] = $cuti_sisa['cuti_sisa'] - $total_cuti_db[$tahun_ini];
    }
    else {
      $total_cuti_db[$tahun_ini] = $total_cuti_db[$tahun_ini] - $cuti_sisa['cuti_sisa'];
      $cuti_sisa['cuti_sisa'] = 0;
    }
    print_r($total_cuti_db);
  • edited June 2016
    btw, ini kebalik ...

    if($total_cuti_db[$tahun_lalu]<$cuti_sisa['cuti_sisa']) {
      $total_cuti_db[$tahun_lalu] = 0;
      $cuti_sisa['cuti_sisa'] = $cuti_sisa['cuti_sisa'] - $total_cuti_db[$tahun_lalu];
    }

    harusnya ...

    if($total_cuti_db[$tahun_lalu]<$cuti_sisa['cuti_sisa']) {
      $cuti_sisa['cuti_sisa'] = $cuti_sisa['cuti_sisa'] - $total_cuti_db[$tahun_lalu];
      $total_cuti_db[$tahun_lalu] = 0;
    }

    ini juga kebalik ...

    if($total_cuti_db[$tahun_ini]<$cuti_sisa['cuti_sisa']) {
      $total_cuti_db[$tahun_ini] = 0;
      $cuti_sisa['cuti_sisa'] = $cuti_sisa['cuti_sisa'] - $total_cuti_db[$tahun_ini];
    }

    harusnya ...

    if($total_cuti_db[$tahun_ini]<$cuti_sisa['cuti_sisa']) {
      $cuti_sisa['cuti_sisa'] = $cuti_sisa['cuti_sisa'] - $total_cuti_db[$tahun_ini];
      $total_cuti_db[$tahun_ini] = 0;
    }
  • itu juga elo mesti merhatiin isi :
    $cuti_sisa['cuti_sisa']

    terakhir harus 0

    kalo lebih dari 0 berarti harus mengeluarkan pesan error :
    jumlah cuti yg mau diambil melebihi jatah
  • :-)) :-)) bener.. bener... dah gw....  :-))

    Ok mas uda fix. Cuman, klo nilai yang di input desimal, contoh 0.5 yang ke simpen di db jadi 1 mas.
    Saya print ke browser hasilnya ini 

    Array ( [2016] => 5 [2015] => 0.5 )

    cuman di db jadinya "1" mas, bukan "0.5". Ini tipe nya mas.
    image


  • itu juga elo mesti merhatiin isi :
    $cuti_sisa['cuti_sisa']

    terakhir harus 0

    kalo lebih dari 0 berarti harus mengeluarkan pesan error :
    jumlah cuti yg mau diambil melebihi jatah
    ia mas untuk itu uda di validasi di form inputnya pake javascript (Mas juga yang sudah bantu 
    :-bd)
  • edited June 2016
    di db jadinya "1" gimana ?
    lha tipe elo kan emang decimal, pasti bisa tampung nilai 0.5



    yg validasi ...
    jangan cuma mengandalkan validasi js mas'e
    kan gw sudah nulis ...

    ini elo pegang :
    jangan percaya apa pun yg di input user
    kalo memungkinkan di hitung ulang : hitung ulang
    kalo bisa ambil ulang dari db : ambil dari db
  • jadi gini mas, di db kan begini mas

    2016 | 5
    2015 | 1

    user input cuti pilih radio "4" berarti dia 0.5 hari. Pas saya liat di browser (Sebelum update ke db),
    Array ( [2016] => 5 [2015] => 0.5 )

    berarti kan seharusnya yang ke update 2015 jadi 0.5 ya mas. Pas setelah simpan, kok tetep jadi 1 sisa cuti di 2015 nya mas ? untuk 2016 ga berubah tetep 5 mas. Jadi menurut saya itu pembulatan ke atas ya mas ?
  • edited June 2016
    perintah simpannya mana ?

    ealah, elo type decimal, tapi length nya 11,0 ???

    11 digit bilangan bulat
    0 angka di belakang koma

    gitu ?

    mau simpan 0.5 gimana caranya mas'e ?
    elo definisikan 0 angka di belakang koma
  • edited June 2016
    ia mas length di tipe datanya yang salah, saya uda ubah jadi 11,1  :D

    Cuman ada masalah lagi mas, contoh di db kaya gini mas

    2014 | 2
    2015 | 1
    2016 | 5

    1. Si user input 0.5 hari, hasil di db jadi  => Benar
    2014 | 2
    2015 | 0.5
    2016 | 5

    2. User input 2 hari, hasil di db jadi   => Salah, seharusnya 2016 jadi 4.
    2014 | 2
    2015 | 0
    2016 | 3

    3. User input 1,5 hari, hasil di db jadi => Salah, seharusnya 2016 jadi 4,5.
    2014 | 2
    2015 | 0
    2016 | 3.5

    code lengkapnya gini mas

    <?php
    $sql = $this->db->query( "SELECT * FROM cuti_sisa WHERE id_karyawan={$id_karyawan} ORDER BY tahun
    DESC LIMIT 2");
    $total_cuti_db = array();
    foreach ($sql->result_array() as $row){
    $total_cuti_db[$row['tahun']] = $row['cuti_sisa'];
    }
    $cuti_sisa = array(
    'cuti_sisa' =>$c,
    'last_update' =>date('Y-m-d H:i:s'),
    'updated_by' => $this->session->userdata('nama')
    );
    $tahun_ini = date('Y'); // 2016
    $tahun_lalu = $tahun_ini - 1;
     
    if($total_cuti_db[$tahun_lalu]<$cuti_sisa['cuti_sisa']) {
    $total_cuti_db[$tahun_lalu] = 0;
    $cuti_sisa['cuti_sisa'] = $cuti_sisa['cuti_sisa'] - $total_cuti_db[$tahun_lalu];
    }
    else {
    $total_cuti_db[$tahun_lalu] = $total_cuti_db[$tahun_lalu] - $cuti_sisa['cuti_sisa'];
    $cuti_sisa['cuti_sisa'] = 0;
    }
     
    if($total_cuti_db[$tahun_ini]<$cuti_sisa['cuti_sisa']) {
    $total_cuti_db[$tahun_ini] = 0;
    $cuti_sisa['cuti_sisa'] = $cuti_sisa['cuti_sisa'] - $total_cuti_db[$tahun_ini];
    }
    else {
    $total_cuti_db[$tahun_ini] = $total_cuti_db[$tahun_ini] - $cuti_sisa['cuti_sisa'];
    $cuti_sisa['cuti_sisa'] = 0;
    }
     
    $sql = $this->db->query ("UPDATE cuti_sisa SET cuti_sisa=$total_cuti_db[$tahun_lalu] WHERE id_karyawan={$id_karyawan} AND tahun=$tahun_lalu");
    $sql = $this->db->query ("UPDATE cuti_sisa SET cuti_sisa=$total_cuti_db[$tahun_ini] WHERE id_karyawan={$id_karyawan} AND tahun=$tahun_ini");
    ?>
Sign In or Register to comment.