package transabsensi import ( "log" "strconv" "com.sismedika.com.absensi/graph/model" db "com.sismedika.com.absensi/pkg/database" ) // diambil dari graph/model/struct nya TransAbsensiResponse type TransAbsensiCheckDistanceResponse model.TransAbsensiCheckDistanceResponse func (transabsensi *TransAbsensiCheckDistanceResponse) CheckDistance(M_StaffID string, M_CompanyID string, CurrentLatitude string, CurrentLongitude string) (*model.TransAbsensiCheckDistanceResponse, error) { // inisialisasi var err error var ret model.TransAbsensiCheckDistanceResponse var rMaxDistance int var rCurrentDistance float64 var rMCompanyLongitude string var rMCompanyLatitude string var statusCheck string q := `SELECT M_CompanyLatitude, M_CompanyLongitude, M_CompanyMaxDistance FROM m_company WHERE M_CompanyIsActive = 'Y' AND M_CompanyID = ?` row := db.Handle.QueryRow( q, M_CompanyID) db.LogSQL(q) err = row.Scan( &rMCompanyLatitude, &rMCompanyLongitude, &rMaxDistance, ) if err != nil { log.Printf("Error m_company select max distance: %v", err) log.Printf("Executing query: %s\n", q) return nil, err } // get distance qCurrentDistance := `SELECT distance_v2(?, ?, ?, ?)` rowxCurrentDistance := db.Handle.QueryRow( qCurrentDistance, CurrentLatitude, CurrentLongitude, rMCompanyLatitude, rMCompanyLongitude, ) db.LogSQL(qCurrentDistance) err = rowxCurrentDistance.Scan( &rCurrentDistance, ) if err != nil { log.Printf("Error m_staff select: %v", err) log.Printf("Executing query: %s\n", qCurrentDistance) return nil, err } // check distance qCheckDistance := `SELECT IF(distance_v2(?, ?, ?, ?) < ?, 'range', 'not range') AS distance_status` rowx := db.Handle.QueryRow( qCheckDistance, CurrentLatitude, CurrentLongitude, rMCompanyLatitude, rMCompanyLongitude, rMaxDistance, ) db.LogSQL(qCheckDistance) err = rowx.Scan( &statusCheck, ) if err != nil { log.Printf("Error m_staff select: %v", err) log.Printf("Executing query: %s\n", qCheckDistance) return nil, err } if statusCheck == "range" { // buat di set isi nya kosong dulu ret.Status = new(string) ret.Message = new(string) ret.Selfie = new(string) ret.CurrentDistance = new(string) ret.MaxDistance = new(string) ret.Unit = new(string) // di set kan langsung dengan * atau pointer *ret.Status = "OK" *ret.Selfie = "FALSE" *ret.Unit = "m" *ret.CurrentDistance = strconv.FormatFloat(rCurrentDistance, 'f', -1, 64) *ret.MaxDistance = strconv.Itoa(rMaxDistance) *ret.Message = "Masih dalam jarak absensi" } if statusCheck != "range" { // buat di set isi nya kosong dulu ret.Status = new(string) ret.Message = new(string) ret.Selfie = new(string) ret.CurrentDistance = new(string) ret.MaxDistance = new(string) ret.Unit = new(string) // di set kan langsung dengan * atau pointer *ret.Status = "OK" *ret.Selfie = "TRUE" *ret.Unit = "m" *ret.CurrentDistance = strconv.FormatFloat(rCurrentDistance, 'f', -1, 64) *ret.MaxDistance = strconv.Itoa(rMaxDistance) *ret.Message = "Max Distance : " + strconv.Itoa(rMaxDistance) + " meter. Current Distance: " + strconv.FormatFloat(rCurrentDistance, 'f', -1, 64) + ". Jauh dari area absensi, perlu foto selfie" } // hasil return nya return &ret, err }