Files
Antonio Lopes dos Santos afec302c3e
All checks were successful
build-api-image / build (push) Successful in 51s
init commit
2026-08-04 16:52:02 -03:00

188 lines
6.9 KiB
PHP

<?php
namespace App\Http\Controllers\ProntoAtendimento\ReaberturaAtendimento;
use App\Enums\Cadastro\Estabelecimento\SetorTipo;
use App\Http\Controllers\Controller;
use App\Models\Cadastro\Estabelecimento\CentroCusto;
use App\Models\Cadastro\SujeitoAtencao\Lotacao;
use App\Models\ProntoAtendimento\Atendimento\FaaReabertura;
use App\Models\ProntoAtendimento\ReaberturaAtendimento\ReaberturaAtendimento;
use App\Services\ProntoAtendimento\Fila\FilaService;
use Carbon\Carbon;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
class ReaberturaAtendimentoController extends Controller
{
protected $modulo = 'pronto-atendimento';
protected $funcionalidade = 'reabertura-atendimento';
public function datatable()
{
$atendimentos = DB::table('pronto_atendimento_atendimento')
->select([
'cadastro_cidadao.caracteristicas_fisicas',
'cadastro_cidadao.nome AS paciente_nome',
'cadastro_sexo.descricao AS sexo',
'cadastro_paciente.prontuario',
'cadastro_paciente.sequencial_desconhecido',
'pronto_atendimento_faa.id as faa_id',
'pronto_atendimento_faa.numero as faa_numero',
DB::raw('DATE_FORMAT(pronto_atendimento_atendimento_recepcao.atendido_em, "%d/%m/%Y") AS data'),
DB::raw('
(
CASE WHEN cadastro_cidadao.nome_mae IS NULL THEN
"Não informado"
ELSE
cadastro_cidadao.nome_mae
END
) as nome_mae'
),
DB::raw('
(
CASE WHEN DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y") IS NULL THEN
"Não informada"
ELSE
DATE_FORMAT(cadastro_cidadao.data_nascimento, "%d/%m/%Y")
END
) as data_nascimento
'),
])
->join(
'pronto_atendimento_faa',
'pronto_atendimento_faa.id',
'pronto_atendimento_atendimento.faa_id'
)
->join(
'pronto_atendimento_atendimento_recepcao',
'pronto_atendimento_atendimento_recepcao.atendimento_id',
'pronto_atendimento_atendimento.id'
)
->join(
'cadastro_paciente',
'cadastro_paciente.id',
'pronto_atendimento_faa.paciente_id'
)
->join(
'cadastro_cidadao',
'cadastro_cidadao.id',
'cadastro_paciente.cidadao_id'
)
->join(
'cadastro_sexo',
'cadastro_sexo.id',
'cadastro_cidadao.sexo_id'
)
->join(
'cadastro_centro_custo',
'cadastro_centro_custo.id',
'pronto_atendimento_atendimento.created_centro_custo_id'
)
->where('pronto_atendimento_faa.finalizado', true)
->whereNull('pronto_atendimento_faa.deleted_at')
->where('cadastro_centro_custo.infraestrutura_id', $this->getCentroCustoLogado()->infraestrutura_id);
if (!request()->get('order')) {
$atendimentos->orderByDesc('pronto_atendimento_atendimento_recepcao.atendido_em');
}
return datatables()
->of($atendimentos)
->filterColumn('data', function ($query, $keyword) {
$query->whereRaw("DATE_FORMAT(pronto_atendimento_atendimento_recepcao.atendido_em, '%d/%m/%Y') like ?", ["%{$keyword}%"])
->orWhereRaw(
"CONCAT(
SUBSTR(pronto_atendimento_atendimento_recepcao.atendido_em,9,2),
SUBSTR(pronto_atendimento_atendimento_recepcao.atendido_em,6,2),
SUBSTR(pronto_atendimento_atendimento_recepcao.atendido_em,1,4)
) like ?",
["%{$keyword}%"]
);
})
->orderColumn('data', function ($query, $order) {
$query->orderBy('pronto_atendimento_atendimento_recepcao.atendido_em', $order);
})
->skipTotalRecords()
->make(true);
}
public function create()
{
return response()->json([
'form' => [
'centros_custo_encaminhamento' => self::getCentroCustoLogado()->infraestrutura->centrosCusto()
->whereHas('setor', function ($query) {
$query->whereNotIn('tipo_id', [
SetorTipo::RECEPCAO,
SetorTipo::TRIAGEM,
]);
})
->get()
->map(fn ($cc) => [
'id' => $cc->id,
'setor_nome' => $cc->setor->nome
])
->sortBy('setor_nome')
->values(),
]
], Response::HTTP_OK);
}
public function update($id)
{
$this->auth(__FUNCTION__);
$faa = ReaberturaAtendimento::findOrFail($id);
$reabertura = new FaaReabertura;
$reabertura->faa_id = $id;
$reabertura->save();
DB::transaction(function () use ($faa) {
if (is_null(request()->centro_custo_id)) {
$faa->update([
'finalizado' => false,
'reaberto_em' => Carbon::Now(),
'reabertura_usuario_id' => Lotacao::find(auth()->payload()->get('lotacao_id'))->usuario_id,
]);
}
else {
$faa->update([
'desfecho_id' => null,
'finalizado' => false,
'reaberto_em' => Carbon::Now(),
'reabertura_usuario_id' => Lotacao::find(auth()->payload()->get('lotacao_id'))->usuario_id,
]);
$fila = $faa->atendimentos()->first()->fila;
if ($fila !== null) {
$fila->update([
'finalizado' => false,
'evadido' => false,
'reaberto_em' => Carbon::now(),
'reabertura_lotacao_id' => auth()->payload()->get('lotacao_id'),
]);
FilaService::forward([
'centro_custo_id_para' => request()->centro_custo_id,
], $fila->id);
}
}
});
return response()->json($faa->fresh(), Response::HTTP_OK);
}
private function getCentroCustoLogado()
{
return CentroCusto::findOrFail(auth()->payload()->get('centro_custo_id'));
}
}