|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
|
|
|
use Log;
|
|
|
|
use Illuminate\Http\Request;
|
|
|
|
use App\Models\Presence;
|
|
|
|
use App\Models\Activity;
|
|
|
|
use GuzzleHttp\Client;
|
|
|
|
use Illuminate\Support\Facades\Http;
|
|
|
|
use Carbon\Carbon;
|
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
|
|
|
|
class PresenceController extends Controller
|
|
|
|
{
|
|
|
|
public function add(Request $request)
|
|
|
|
{
|
|
|
|
$this->validate($request, [
|
|
|
|
'user_id' => 'required'
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
|
|
// $test = $this->getLoc($request->clock_in_lat, $request->clock_in_lng)->display_name;
|
|
|
|
// // display_name
|
|
|
|
// return response()->json(["data"=>$test,'code'=>400], 400);
|
|
|
|
|
|
|
|
$checkLocation = $this->checkLocation($request);
|
|
|
|
$statusBoundary = false;
|
|
|
|
$date = date_create($request->clock_time);
|
|
|
|
// $ActivityId = null;
|
|
|
|
if(count($checkLocation) > 0){
|
|
|
|
$statusBoundary = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if($request->type=="out"){
|
|
|
|
|
|
|
|
$clock_out_loc = $this->getLoc($request->clock_out_lat, $request->clock_out_lng)->display_name;
|
|
|
|
$dataUpdate = array(
|
|
|
|
"clock_out"=>$request->clock_time,
|
|
|
|
"clock_out_lat" => $request->clock_out_lat,
|
|
|
|
"clock_out_lng" => $request->clock_out_lng,
|
|
|
|
"updated_by"=>$this->currentName,
|
|
|
|
"clock_out_loc" => $clock_out_loc,
|
|
|
|
"clock_out_boundary" => $statusBoundary
|
|
|
|
);
|
|
|
|
|
|
|
|
$resultUpdate = $this->updateFormAdd($dataUpdate, $request->user_id);
|
|
|
|
if($resultUpdate && $resultUpdate > 0){
|
|
|
|
if($statusBoundary){
|
|
|
|
for ($i=0; $i < count($checkLocation); $i++) {
|
|
|
|
# code...
|
|
|
|
DB::table('clock_in_out_boundary')->insert([
|
|
|
|
"clock_in_out_id" => $resultUpdate,
|
|
|
|
"user_id" => $request->user_id,
|
|
|
|
"activity_id" => $checkLocation[$i]['activity_id'],
|
|
|
|
"type" => $request->type,
|
|
|
|
"created_at" => $date,
|
|
|
|
"created_by" => $this->currentName
|
|
|
|
]);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
$data=array(
|
|
|
|
'id' => $resultUpdate,
|
|
|
|
'boundary' => $statusBoundary
|
|
|
|
);
|
|
|
|
|
|
|
|
return response()->json(['status'=>'success', 'data'=>$data,'message'=>'clock out success!','code'=>200], 200);
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
return response()->json(['status'=>'failed','message'=>'clock out failed please try again!','code'=>400], 400);
|
|
|
|
}
|
|
|
|
die();
|
|
|
|
}
|
|
|
|
|
|
|
|
$onlyDate = date_format($date,"Y-m-d");
|
|
|
|
$clock_in_loc = $this->getLoc($request->clock_in_lat, $request->clock_in_lng)->display_name;
|
|
|
|
|
|
|
|
$dataAdd = array(
|
|
|
|
'user_id'=> $request->user_id,
|
|
|
|
'clock_in'=> $request->clock_time,
|
|
|
|
'date_presence'=> $onlyDate,
|
|
|
|
'created_by' => $this->currentName,
|
|
|
|
'clock_in_lat' => $request->clock_in_lat,
|
|
|
|
'clock_in_lng' => $request->clock_in_lng,
|
|
|
|
'clock_in_loc' => $clock_in_loc,
|
|
|
|
'clock_in_boundary' => $statusBoundary
|
|
|
|
);
|
|
|
|
|
|
|
|
$result = Presence::create($dataAdd);
|
|
|
|
$data=array(
|
|
|
|
'id' => $result->id,
|
|
|
|
'boundary' => $statusBoundary
|
|
|
|
);
|
|
|
|
if($result){
|
|
|
|
if($statusBoundary){
|
|
|
|
for ($i=0; $i < count($checkLocation); $i++) {
|
|
|
|
# code...
|
|
|
|
DB::table('clock_in_out_boundary')->insert([
|
|
|
|
"clock_in_out_id" => $result->id,
|
|
|
|
"user_id" => $request->user_id,
|
|
|
|
"activity_id" => $checkLocation[$i]['activity_id'],
|
|
|
|
"type" => $request->type,
|
|
|
|
"created_at" => $date,
|
|
|
|
"created_by" => $this->currentName
|
|
|
|
]);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
return response()->json(['status'=>'success', 'data' => $data,'message'=>'clock in successfully!','code'=>200], 200);
|
|
|
|
}else{
|
|
|
|
return response()->json(['status'=>'failed','message'=>'clock in failed!','code'=>400], 400);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private function checkLocation($params){
|
|
|
|
// cek user tersebut apakah punya assign task yang ada bondary nya
|
|
|
|
// geom ada di table activity
|
|
|
|
$geom = DB::table("assign_hr_to_activity as ahta")->select("ma.geom", "ma.id")
|
|
|
|
->join("m_activity as ma", "ma.id", "=", "ahta.activity_id")
|
|
|
|
->where("ahta.user_id", $params->user_id)
|
|
|
|
->whereDate("ma.start_date", "<=", $params->clock_time)
|
|
|
|
->whereDate("ma.end_date", ">=", $params->clock_time)
|
|
|
|
->get();
|
|
|
|
$temp = [];
|
|
|
|
foreach($geom as $dataGeom){
|
|
|
|
$valGeom = json_decode($dataGeom->geom);
|
|
|
|
if($params->type=="out"){
|
|
|
|
$check = DB::select(DB::raw("SELECT ST_Intersects(ST_GeomFromGeoJSON('".json_encode($valGeom->geometry)."'), ST_GeomFromText('POINT(".$params->clock_out_lng." ".$params->clock_out_lat.")', 4326)) as boundary"));
|
|
|
|
}else{
|
|
|
|
$check = DB::select(DB::raw("SELECT ST_Intersects(ST_GeomFromGeoJSON('".json_encode($valGeom->geometry)."'), ST_GeomFromText('POINT(".$params->clock_in_lng." ".$params->clock_in_lat.")', 4326)) as boundary"));
|
|
|
|
}
|
|
|
|
foreach ($check as $key) {
|
|
|
|
if($key->boundary){
|
|
|
|
$temp[]=array(
|
|
|
|
"activity_id" => $dataGeom->id,
|
|
|
|
"boundary" => $key->boundary
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
return $temp;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function edit($id){
|
|
|
|
if(!$id || (int) $id < 0 || $id==""){
|
|
|
|
return response()->json(['status'=>'failed','message'=>'id is required!','code'=>400], 400);
|
|
|
|
die();
|
|
|
|
}
|
|
|
|
|
|
|
|
$result = Presence::find($id);
|
|
|
|
|
|
|
|
if($result){
|
|
|
|
return response()->json(['status'=>'success','code'=>200,'data'=>$result], 200);
|
|
|
|
}else{
|
|
|
|
return response()->json(['status'=>'failed','message'=>'failed get data project, please try again later!','code'=>400], 400);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function clockinout($id) {
|
|
|
|
$dateTimeNow = Carbon::now()->addHour(7);
|
|
|
|
$dataPresence = Presence::where('user_id', $id)->orderBy('id', 'DESC')->first();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if($dataPresence){
|
|
|
|
|
|
|
|
$dateNow = date("Y-m-d");
|
|
|
|
$dateA = strtotime($dataPresence->clock_in);
|
|
|
|
$dayClockin = date("Y-m-d", $dateA);
|
|
|
|
if($dayClockin == $dateNow){
|
|
|
|
$clock_in = $dataPresence->clock_in;
|
|
|
|
$clock_out = $dataPresence->clock_out;
|
|
|
|
}else{
|
|
|
|
$clock_in = null;
|
|
|
|
$clock_out = null;
|
|
|
|
}
|
|
|
|
$res_data = array(
|
|
|
|
"id" => $dataPresence->id,
|
|
|
|
"at" => $dateTimeNow,
|
|
|
|
"user_id"=> $id,
|
|
|
|
"clock_in"=> $clock_in,
|
|
|
|
"clock_out"=> $clock_out,
|
|
|
|
"last_clock_in"=> $dataPresence->clock_in,
|
|
|
|
"last_clock_out"=> $dataPresence->clock_out,
|
|
|
|
"in_working_time"=> true
|
|
|
|
);
|
|
|
|
return response()->json(['status'=>'success','data'=>$res_data,'code'=>200], 200);
|
|
|
|
}
|
|
|
|
$res_data = array(
|
|
|
|
"id" => null,
|
|
|
|
"at" => $dateTimeNow,
|
|
|
|
"user_id"=> $id,
|
|
|
|
"clock_in"=> null,
|
|
|
|
"clock_out"=> null,
|
|
|
|
"last_clock_in"=> null,
|
|
|
|
"last_clock_out"=> null,
|
|
|
|
"in_working_time"=> true
|
|
|
|
);
|
|
|
|
return response()->json(['status'=>'success','data'=>$res_data,'code'=>200], 200);
|
|
|
|
}
|
|
|
|
|
|
|
|
private function updateFormAdd($data, $id){
|
|
|
|
$date = date_create($data['clock_out']);
|
|
|
|
|
|
|
|
$onlyDate = date_format($date,"Y-m-d");
|
|
|
|
|
|
|
|
|
|
|
|
$dataPresence = Presence::where('user_id',$id)
|
|
|
|
->where("clock_in", "<=", $data["clock_out"])
|
|
|
|
->orderByDesc("id")
|
|
|
|
->first();
|
|
|
|
|
|
|
|
if($dataPresence){
|
|
|
|
$queryUpdate = $dataPresence->update($data);
|
|
|
|
if($queryUpdate){
|
|
|
|
$getDataUpdate = Presence::where('user_id', $id)->where("date_presence", $onlyDate)->first();
|
|
|
|
return $getDataUpdate->id;
|
|
|
|
}else{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}else{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
die();
|
|
|
|
}
|
|
|
|
|
|
|
|
public function update(Request $request, $id)
|
|
|
|
{
|
|
|
|
if(!$id || (int) $id < 0 || $id==""){
|
|
|
|
return response()->json(['status'=>'failed','message'=>'id is required!','code'=>400], 400);
|
|
|
|
}
|
|
|
|
|
|
|
|
$data = Presence::find($id);
|
|
|
|
|
|
|
|
if($data){
|
|
|
|
$result = $data->update($request->all());
|
|
|
|
}else{
|
|
|
|
return response()->json(['status'=>'failed','message'=>'data presence not found!','code'=>400], 400);
|
|
|
|
die();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if($result){
|
|
|
|
return response()->json(['status'=>'success','message'=>'data presence successfully updated!','code'=>200], 200);
|
|
|
|
}else{
|
|
|
|
return response()->json(['status'=>'failed','message'=>'data presence failed updated!','code'=>400], 400);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function delete($id)
|
|
|
|
{
|
|
|
|
$data = Presence::find($id);
|
|
|
|
|
|
|
|
if($data){
|
|
|
|
$delete = $data->delete();
|
|
|
|
}else{
|
|
|
|
return response()->json(['status'=>'failed','message'=>'data presence not found!','code'=>400], 400);
|
|
|
|
die();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if($delete){
|
|
|
|
return response()->json(['status'=>'success','message'=>'data presence successfully deleted!','code'=>200], 200);
|
|
|
|
}else{
|
|
|
|
return response()->json(['status'=>'failed','message'=>'data presence failed deleted!','code'=>400], 400);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function search(Request $request)
|
|
|
|
{
|
|
|
|
$payload = $request->all();
|
|
|
|
$dataBuilder = $this->setUpPayload($payload, 't_clock_in_out');
|
|
|
|
$builder = $dataBuilder['builder'];
|
|
|
|
$countBuilder = $dataBuilder['count'];
|
|
|
|
$dataGet = $builder->get();
|
|
|
|
$finalData = [];
|
|
|
|
|
|
|
|
foreach($dataGet as $data){
|
|
|
|
// $responseIn = $this->getLoc($clock_in_lat, $clock_in_lng);
|
|
|
|
// $responseOut = $this->getLoc($clock_in_lat, $clock_in_lng);
|
|
|
|
$data->clock_in_loc = $responseIn->json()["display_name"];
|
|
|
|
$data->clock_out_loc = $responseOut->json()["display_name"];
|
|
|
|
}
|
|
|
|
$totalRecord = $countBuilder->count();
|
|
|
|
return response()->json(['status'=>'success','code'=>200,'data'=>$dataGet, 'totalRecord'=>$totalRecord], 200);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function list()
|
|
|
|
{
|
|
|
|
$data = Presence::all();
|
|
|
|
$countData = $data->count();
|
|
|
|
|
|
|
|
if($data){
|
|
|
|
return response()->json(['status'=>'success','code'=>200,'data'=>$data, 'totalRecord'=>$countData], 200);
|
|
|
|
}else{
|
|
|
|
return response()->json(['status'=>'failed','message'=>'failed get list presence, please try again later!','code'=>400], 400);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function bulkUpdateLocation()
|
|
|
|
{
|
|
|
|
$data = Presence::all();
|
|
|
|
$finalData = [];
|
|
|
|
foreach($data as $objRow) {
|
|
|
|
$presence = Presence::find($objRow->id);
|
|
|
|
|
|
|
|
$clock_in_lat = $objRow->clock_in_lat;
|
|
|
|
$clock_in_lng = $objRow->clock_in_lng;
|
|
|
|
$objRow->clock_in_loc = "";
|
|
|
|
if (isset($clock_in_lat) && isset($clock_in_lng)) {
|
|
|
|
$response = Http::get(config('api.nominatim') . "/reverse?lat=".$clock_in_lat."&lon=".$clock_in_lng."&format=json");
|
|
|
|
$objRow->clock_in_loc = $response->json()["display_name"];
|
|
|
|
}
|
|
|
|
|
|
|
|
$clock_out_lat = $objRow->clock_out_lat;
|
|
|
|
$clock_out_lng = $objRow->clock_out_lng;
|
|
|
|
$objRow->clock_out_loc = "";
|
|
|
|
if (isset($clock_out_lat) && isset($clock_out_lng)) {
|
|
|
|
$response = Http::get(config('api.nominatim') . "/reverse?lat=".$clock_out_lat."&lon=".$clock_out_lng."&format=json");
|
|
|
|
$objRow->clock_out_loc = $response->json()["display_name"];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$presence->clock_in_loc = $objRow->clock_in_loc;
|
|
|
|
$presence->clock_out_loc = $objRow->clock_out_loc;
|
|
|
|
$presence->save();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|