step 7 : clock in selfie or not
This commit is contained in:
@@ -1,16 +1,26 @@
|
||||
package transabsensi
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"errors"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"com.sismedika.com.absensi/graph/model"
|
||||
"com.sismedika.com.absensi/pkg/config"
|
||||
db "com.sismedika.com.absensi/pkg/database"
|
||||
)
|
||||
|
||||
// diambil dari graph/model/struct nya TransAbsensiResponse
|
||||
type TransAbsensiCheckDistanceResponse model.TransAbsensiCheckDistanceResponse
|
||||
|
||||
type TransAbsensiResponse model.TransAbsensiResponse
|
||||
|
||||
// fungsi untuk Check Distance antara kantor dengan current user location
|
||||
func (transabsensi *TransAbsensiCheckDistanceResponse) CheckDistance(M_StaffID string, M_CompanyID string, CurrentLatitude string, CurrentLongitude string) (*model.TransAbsensiCheckDistanceResponse, error) {
|
||||
// inisialisasi
|
||||
var err error
|
||||
@@ -127,3 +137,190 @@ func (transabsensi *TransAbsensiCheckDistanceResponse) CheckDistance(M_StaffID s
|
||||
// hasil return nya
|
||||
return &ret, err
|
||||
}
|
||||
|
||||
// fungsi untuk absen masuk clock in
|
||||
func (transabsensi *TransAbsensiResponse) ClockInAbsensi(T_TransactionM_StaffID string, T_TransactionM_CompanyID string, T_TransactionCurrentLatitude string, T_TransactionCurrentLongitude string, T_TransactionCurrentDistance string, T_TransactionSelfiePhoto string, token string, isSelfie string) (*model.TransAbsensiResponse, error) {
|
||||
// inisialisasi
|
||||
var err error
|
||||
var ret model.TransAbsensiResponse
|
||||
var varGetToken string
|
||||
var varGetM_StaffNIP string
|
||||
var varProsesFotoSelfie string
|
||||
var jamClockIn string
|
||||
|
||||
// check user token
|
||||
qCheckTokenStaff := `SELECT
|
||||
M_StaffToken,
|
||||
M_StaffNIP
|
||||
FROM m_staff
|
||||
WHERE M_StaffIsActive = 'Y'
|
||||
AND M_StaffToken = ?
|
||||
`
|
||||
|
||||
rowCheckTokenStaff := db.Handle.QueryRow(
|
||||
qCheckTokenStaff,
|
||||
token,
|
||||
)
|
||||
db.LogSQL(qCheckTokenStaff)
|
||||
err = rowCheckTokenStaff.Scan(
|
||||
&varGetToken,
|
||||
&varGetM_StaffNIP,
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
log.Printf("Error m_staff select token: %v", err)
|
||||
log.Printf("Executing query: %s\n", qCheckTokenStaff)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// check varGetToken jk M_StaffToken kosong
|
||||
if varGetToken == "" {
|
||||
log.Printf("Error Token Kosong, Silahkan Login Dulu: %v", err)
|
||||
log.Printf("Executing query: %s\n", qCheckTokenStaff)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ret.Status = new(string)
|
||||
ret.Message = new(string)
|
||||
|
||||
// lanjut proses absen
|
||||
if varGetToken != "" {
|
||||
|
||||
// tanpa selfie T_TransactionSelfiePhoto di set kosong
|
||||
if isSelfie != "TRUE" {
|
||||
T_TransactionSelfiePhoto = ""
|
||||
varProsesFotoSelfie = ""
|
||||
}
|
||||
|
||||
// selfie true
|
||||
if isSelfie == "TRUE" {
|
||||
|
||||
// pecah string
|
||||
strToArrayFoto := strings.Split(T_TransactionSelfiePhoto, ",")
|
||||
|
||||
// check apakah sudah sesuai apa belum
|
||||
if len(strToArrayFoto) == 0 {
|
||||
log.Printf("Eror Tidak Sesuai Format %v", err)
|
||||
return &ret, err
|
||||
}
|
||||
|
||||
// jika sesuai ambil strToArrayFoto ke 1 atau index ke 1
|
||||
if len(strToArrayFoto) > 0 {
|
||||
base64DataFoto := strToArrayFoto[1]
|
||||
T_TransactionSelfiePhoto = base64DataFoto
|
||||
}
|
||||
|
||||
currentTime := time.Now()
|
||||
|
||||
// setting jam absen
|
||||
jam := currentTime.Hour()
|
||||
menit := currentTime.Minute()
|
||||
detik := currentTime.Second()
|
||||
|
||||
jamClockIn = fmt.Sprintf("%02d:%02d:%02d", jam, menit, detik)
|
||||
|
||||
formattedTime := currentTime.Format("2006-01-02_15_04_05")
|
||||
// buat nama file
|
||||
varProsesFotoSelfie = "clockin_" + varGetM_StaffNIP + "_" + formattedTime
|
||||
strPhoto := varProsesFotoSelfie + ".jpg"
|
||||
|
||||
// folder upload file nya selfie_attachment akan otomatis sesuai bulan dan tahun
|
||||
folderName := currentTime.Format("200601")
|
||||
folder := "selfie_attachment/" + folderName + "/"
|
||||
photoPath := config.Data.Get("document") + folder
|
||||
|
||||
log.Printf("documentPath: %s", photoPath)
|
||||
|
||||
// create folder selfie_attachment jika belum ada
|
||||
|
||||
// if _, err := os.Stat(photoPath); errors.Is(err, os.ErrNotExist) {
|
||||
// err = os.MkdirAll(photoPath, os.ModePerm)
|
||||
// if err != nil {
|
||||
// log.Printf("here %v", err)
|
||||
// return &ret, err
|
||||
// }
|
||||
// }
|
||||
|
||||
if _, err := os.Stat(photoPath); errors.Is(err, os.ErrNotExist) {
|
||||
err = os.MkdirAll(photoPath, os.ModePerm.Perm())
|
||||
if err != nil {
|
||||
log.Printf("here %v", err)
|
||||
return &ret, err
|
||||
}
|
||||
}
|
||||
|
||||
photoPath = photoPath + strPhoto
|
||||
|
||||
// proses decode
|
||||
decodedByte, err := base64.StdEncoding.DecodeString(T_TransactionSelfiePhoto)
|
||||
|
||||
if err != nil {
|
||||
log.Printf("here %v", err)
|
||||
return &ret, err
|
||||
}
|
||||
|
||||
fs, err := os.Create(photoPath)
|
||||
if err != nil {
|
||||
log.Printf("here %v", err)
|
||||
return &ret, err
|
||||
}
|
||||
defer fs.Close()
|
||||
fs.Write(decodedByte)
|
||||
fs.Sync()
|
||||
|
||||
varProsesFotoSelfie = strPhoto
|
||||
}
|
||||
|
||||
qInsertClockIn := `INSERT INTO t_transaction (
|
||||
T_TransactionM_AbsensiTypeID,
|
||||
T_TransactionM_StaffID,
|
||||
T_TransactionM_CompanyID,
|
||||
T_TransactionClockAbsensi,
|
||||
T_TransactionDate,
|
||||
T_TransactionCurrentLatitude,
|
||||
T_TransactionCurrentLongitude,
|
||||
T_TransactionCurrentDistance,
|
||||
T_TransactionSelfiePhoto,
|
||||
T_TransactionIsActive,
|
||||
T_TransactionCreated
|
||||
) VALUES (
|
||||
?,
|
||||
?,
|
||||
?,
|
||||
?,
|
||||
NOW(),
|
||||
?,
|
||||
?,
|
||||
?,
|
||||
?,
|
||||
?,
|
||||
NOW()
|
||||
)`
|
||||
|
||||
_, err = db.Handle.Exec(qInsertClockIn,
|
||||
"1",
|
||||
T_TransactionM_StaffID,
|
||||
T_TransactionM_CompanyID,
|
||||
&jamClockIn,
|
||||
T_TransactionCurrentLatitude,
|
||||
T_TransactionCurrentLongitude,
|
||||
T_TransactionCurrentDistance,
|
||||
&varProsesFotoSelfie,
|
||||
"Y",
|
||||
)
|
||||
|
||||
// set status jika tidak error
|
||||
if err == nil {
|
||||
*ret.Status = "OK"
|
||||
*ret.Message = "Proses Absensi Masuk Berhasil"
|
||||
}
|
||||
|
||||
// set status jika error
|
||||
if err != nil {
|
||||
*ret.Status = "ERR"
|
||||
*ret.Message = "ERROR : " + err.Error()
|
||||
}
|
||||
}
|
||||
|
||||
return &ret, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user