ikhsan3adi / absensi-sekolah-qr-code

Sistem absensi siswa dan guru berbasis QR Code menggunakan CodeIgniter 4 🔥
https://youtube.com/watch?v=E1ho6wRBIUs
GNU General Public License v3.0
210 stars 75 forks source link

Import/Export Data Siswa #109

Closed rifkihakim88 closed 1 month ago

rifkihakim88 commented 1 month ago

Salam kenal mas Ikhsan, boleh saran mas.

  1. apakah bisa ditambahkan Import data masal siswa maupun data guru dengan menggunakan Excel (jika murid lebih dari 500 siswa, akan terasa pegal jika tambah data secara manual)
  2. Menu ubah Tahun pelajaran
hex4coder commented 1 month ago

Saya telah membuat skrip python untuk import data dari data source absen disekolah kami Berikut adalah kode yang saya buat menggunakan script python: `# program untuk upload data guru

secara banyak

import openpyxl import hashlib import mysql.connector

listKelasXI = [ "kelas", 6, 7, 8, 9, 1, 11, 10, 2 ]

listKelasXII = [ "kelas XII", 12, 13, 14, 15, 18, 19, 17, 16 ]

listKelasX = [ "kelas X", 5, 20, 21, 3, 4, 22, 23, 24 ]

generate unique code

def generate_unique_code(nis, nama): hashes = "" hash_object = hashlib.sha1((nis + str(777) ).encode('utf-8') ) pbHash = hash_object.hexdigest() hash1 = pbHash hash1 = hash1[:24]

# md5 
hash_object = hashlib.md5((nis + nama).encode('utf-8'))
hash2 = hash_object.hexdigest()

# final sampling
hash_object = hashlib.md5((hash2 + nama).encode('utf-8'))
datatoencode = hash_object.hexdigest() + hash1
hashes = datatoencode

return hashes

delete all data

def deleteAllData(mydb): mycursor = mydb.cursor()

sql = "DELETE FROM tb_siswa WHERE id_siswa != 0"

mycursor.execute(sql)

mydb.commit()

print(mycursor.rowcount, "record(s) deleted")

parsing data

def parsingDataSource(filename, listKelas, startpoint=1): print("[INFO] - Starting reader")

# Define variable to load the dataframe
dataframe = openpyxl.load_workbook(filename)

# Define variable to read sheet
dataframe1 = dataframe.active

# temporary data
listdata = []

# Iterate the loop to read the cell values
id_siswa = startpoint - 1
kelasindex = 0
for row in range(1, dataframe1.max_row):
    indexcol = 0
    nama = ""
    nomorhp = ""
    jk = ""
    nis = ""
    kodeunik = ""
    id_kelas = ""
    valid = False

    # iterasi pengambilan data
    for col in dataframe1.iter_cols(0, dataframe1.max_column):
        data = (col[row].value)

        if data is not None:
            if indexcol == 0 and type(data) == int:
                # nomor
                valid = True
                if data == 1:
                    # kelas baru
                    kelasindex = kelasindex + 1

            if valid:
                if indexcol == 1:
                    # nis
                    dataar = data.split(" ")
                    if(len(dataar)) > 1:
                        nis = dataar[2]
                    else:
                        nis = dataar[0]
                elif indexcol == 2:
                    # nama
                    nama = data
                elif indexcol == 3 or indexcol == 4:
                    if str(data).upper() == "L":
                        jk = "Laki-laki"
                    else:
                        jk = "Perempuan"

        indexcol = indexcol + 1

    if nama != "" and nis != "" and jk != "":
        id_siswa = id_siswa + 1
        nama = nama.upper().strip()
        id_kelas = listKelas[kelasindex]
        kodeunik = generate_unique_code(nis, nama)
        tupdata = (id_siswa, nis, nama, id_kelas, jk, nomorhp, kodeunik )
        listdata.append(tupdata)

print("[INFO] - Membaca data sebanyak ", len(listdata), " record.")

return listdata

input data

def insertdata(mydb, listdata): mycursor = mydb.cursor()

sql = "INSERT INTO tb_siswa (id_siswa, nis, nama_siswa, id_kelas, jenis_kelamin, no_hp, unique_code) VALUES (%s, %s, %s, %s, %s, %s, %s)"
val = listdata

mycursor.executemany(sql, val)

mydb.commit()

print(mycursor.rowcount, "telah diinput.") 

pisah data berdasarkan kelas

def listDataByKelasID(listData, id_kelas): listdata = []

for data in listData:
    if data[3] == id_kelas:
        listdata.append(data)

return listdata

insert data for kelas XII

def insertDataKelasXII(start=1):

read data

listdata = parsingDataSource("XII.xlsx", listKelasXII, start)
total = 0

# parsing per list kelas
for kelas_id in listKelasXII:
    listOfData = listDataByKelasID(listdata, kelas_id)

    # kirim data ke server
    if len(listOfData) > 0:
        insertdata(mydb, listOfData)
        total = total + len(listOfData)
    else:
        print("ID Kelas ", kelas_id, " tidak valid")

print("Total data yang masuk ", total, " record.")
return total 

insert data for kelas XI

def insertDataKelasXI(start=1):

read data

listdata = parsingDataSource("XI.xlsx", listKelasXI, start)
total = 0

# parsing per list kelas
for kelas_id in listKelasXI:
    listOfData = listDataByKelasID(listdata, kelas_id)

    # kirim data ke server
    if len(listOfData) > 0:
        insertdata(mydb, listOfData)
        total = total + len(listOfData)
    else:
        print("ID Kelas ", kelas_id, " tidak valid")

print("Total data yang masuk ", total, " record.")
return total

insert data for kelas X\

def insertDataKelasX(start=1):

read data

listdata = parsingDataSource("X.xlsx", listKelasX, start)
total = 0

# parsing per list kelas
for kelas_id in listKelasX:
    listOfData = listDataByKelasID(listdata, kelas_id)

    # kirim data ke server
    if len(listOfData) > 0:
        insertdata(mydb, listOfData)
        total = total + len(listOfData)
    else:
        print("ID Kelas ", kelas_id, " tidak valid")

print("Total data yang masuk ", total, " record.")
return total

connecting to the database

mydb = mysql.connector.connect( host="smkncampalagian.sch.id", user="root", password="anu", database="db_absensi" )

print(mydb)

hapus dulu semua data

deleteAllData(mydb)

insert data kelas XI

total = insertDataKelasXI()

insert data kelas XII

totalXII = insertDataKelasXII(start=total + 1)

data kelas X

totalX = insertDataKelasX(start=total + totalXII + 1)`

rifkihakim88 commented 1 month ago

apakah ada tutorialnya di YT?

rifkihakim88 commented 1 month ago

Mas Ikhsan, apakah bisa script phyton di atas di kombinasikan/di ekseskusi dengan script PHP. karena saya masih awam untuk Phytonnya

ikhsan3adi commented 1 month ago

Saya tidak tahu caranya eksekusi script python di php, saya juga bukan pengguna python 😄

rifkihakim88 commented 1 month ago

Siap mas Ikhsan. mudah-mudahan segera terealisasi fitur import/export excel data Guru dan Siswa. terima kasih mas Ikhsan

reactmore commented 1 month ago

saya lagi buat Importnya tapi csv, untuk tahun ajaran sudah ada menu pengaturan #125

Screen: Screenshot 2024-08-01 163544 Screenshot 2024-08-01 163146 Screenshot 2024-08-01 163155 Screenshot 2024-08-01 163212

rifkihakim88 commented 1 month ago

Screenshot 2024-08-02 094920 jikalau seperti ini kenapa yaa mas? tidak muncul complete

reactmore commented 1 month ago

Screenshot 2024-08-02 094920 jikalau seperti ini kenapa yaa mas? tidak muncul complete

Ada error mas, ada log nya gk ? Atau kirim csv nya

rifkihakim88 commented 1 month ago

Screenshot 2024-08-02 094920 jikalau seperti ini kenapa yaa mas? tidak muncul complete

Ada error mas, ada log nya gk ? Atau kirim csv nya

Sudah solved mas, CSV saya pakai (;) yang harusnya (,). setelah saya replace alhamdulillah sudah berhasil. terima kasih banyak

rifkihakim88 commented 1 month ago

image Jika waktu download QR Code bermasalah seperti kenapa ya mas? waktu di generate juga ndak ada proses

reactmore commented 1 month ago

Fix SQL Siswa QR Download: https://github.com/ikhsan3adi/absensi-sekolah-qr-code/pull/131/commits/141ef728f01b14b89b43aee2c0c38680b0b60528

reactmore commented 1 month ago

image Jika waktu download QR Code bermasalah seperti kenapa ya mas? waktu di generate juga ndak ada proses

masalah path yaa

reactmore commented 1 month ago

image

rifkihakim88 commented 1 month ago

Fix SQL Siswa QR Download: 141ef72

image

sudah Saya coba untuk memperbaiki QRGenerator dan KelasModel, tapi masih tetap errornya ya mas. kira-kira apa lagi yang perlu saya perbaiki?