arcadiasuite/plus/app/Http/Controllers/API/AgendamentoController.php

155 lines
5.1 KiB
PHP

<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use App\Models\DiaSemana;
use App\Models\Funcionamento;
use App\Models\Funcionario;
use App\Models\Interrupcoes;
use App\Models\Agendamento;
use App\Models\Servico;
use App\Models\User;
use Illuminate\Http\Request;
class AgendamentoController extends Controller
{
public function buscarHorarios(Request $request)
{
$servicos = json_decode($request->servicos);
$data = $request->data;
$start_time = $request->start_time;
$empresa_id = $request->empresa_id;
$funcionario_id = $request->funcionario_id;
$diaSemanaNumerico = date('w', strtotime($data));
$diaStr = DiaSemana::getDia($diaSemanaNumerico);
$totalServico = 0;
$tempoServico = 0;
foreach($servicos as $s){
$item = Servico::findOrFail($s);
$tempoServico += (float)$item->tempo_servico;
$totalServico += (float)$item->valor;
}
$funcionarios = Funcionario::where('funcionarios.empresa_id', $empresa_id)
->select('funcionarios.*')
->join('dia_semanas', 'dia_semanas.funcionario_id', '=', 'funcionarios.id')
->where(function($q) use ($diaStr) {
return $q->orWhere('dia', 'LIKE', '%'.$diaStr.'%');
})
->when(!empty($funcionario_id), function ($query) use ($funcionario_id) {
return $query->where('funcionarios.id', $funcionario_id);
})
->get();
$horarios = [];
$minutosEspaco = 5;
foreach($funcionarios as $f){
$funcionamento = Funcionamento
::where('funcionario_id', $f->id)
->where('dia_id', $diaStr)
->first(); // funcionamento do dia
$inicio = $funcionamento->inicio;
if($start_time){
$inicio = $start_time;
}
$fim = $funcionamento->fim;
if($data == date('Y-m-d')){
$inicio = strtotime("$data $inicio");
$agora = strtotime("$data " . date('H:i'));
$horaAgora = date('H:i');
if($agora > $inicio){
// $inicio = date('H:i', strtotime(date('Y-m-d H:i') . "+ $minutosEspaco minutes"));
$inicio = $this->proximoMinuto($minutosEspaco);
// return $inicio;
}
}
$dif = strtotime("$data $fim") - strtotime("$data $inicio");
$minutosDif = $dif/(60);
if($minutosDif > 0 && $tempoServico > 0){
$contador = $minutosDif/$tempoServico;
$interrupcoes = Interrupcoes::where('funcionario_id', $f->id)
->where('status', 1)
->where('dia_id', $diaStr)->get();
$inicio = strtotime("$data $inicio");
for($i=0; $i<$contador; $i++){
$fim = strtotime("+".$tempoServico." minutes", $inicio);
$temp = [
'funcionario_id' => $f->id,
'funcionario_nome' => $f->nome,
'inicio' => date('H:i', $inicio),
'fim' => date('H:i', $fim),
'data' => $data,
'total' => $totalServico,
'tempoServico' => $tempoServico
];
$add = true;
$interrupcao = Interrupcoes::where('funcionario_id', $f->id)
->where('dia_id', $diaStr)
->whereTime('inicio', '<=', date('H:i', $inicio))
->whereTime('fim', '>=', date('H:i', $inicio))
->first();
if($interrupcao != null){
$add = false;
}else{
$agendamento = Agendamento::where('funcionario_id', $f->id)
->whereDate('data', $data)
->whereTime('inicio', '<=', date('H:i', $inicio))
->whereTime('termino', '>=', date('H:i', $inicio))
->first();
if($agendamento != null){
$add = false;
}
}
if($add == true){
array_push($horarios, $temp);
}
$inicio = $fim;
}
}
}
return view('agendamento.partials.agenda_row', compact('horarios'));
}
private function proximoMinuto($minutosEspaco){
$inicio = date('H:i', strtotime(date('Y-m-d H:i') . "+ $minutosEspaco minutes"));
$minuto = date('i', strtotime($inicio));
$hora = date('H', strtotime($inicio));
$divisao = (int)($minuto/15);
if($divisao == 0){
$inicio = date('H').':15';
}else if($divisao == 1){
$inicio = date('H').':30';
}
else if($divisao == 2){
$inicio = date('H').':45';
}else{
$inicio = date('H', strtotime(date('Y-m-d H:i') . "+ 1 hour")).':00';
}
return $inicio;
}
}