init commit
All checks were successful
build-api-image / build (push) Successful in 51s

This commit is contained in:
Antonio Lopes dos Santos
2026-08-04 16:52:02 -03:00
commit afec302c3e
11594 changed files with 1636728 additions and 0 deletions

View File

@@ -0,0 +1,438 @@
<?php
namespace App\Services\ExameImagem;
use App\Enums\ExameImagem\Fechamento\Status;
use App\Enums\Parametrizacao\Exame\Tipo;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\ExameImagem\Agendamento\Agendamento;
use App\Models\ExameImagem\Fechamento\StatusFechamento;
use App\Models\ExameImagem\Jornada\StatusJornada;
use App\Models\Parametrizacao\Exame\Exame;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class RelatorioCotaProfissionalService extends Service
{
public static function index()
{
$params = request()->all();
$agendamentosBuilder = self::getAgendamentosBuilder();
if (!$agendamentosBuilder) {
return [];
}
$agendamentosBuilder = $agendamentosBuilder
->select(
'exame_imagem_jornada.id',
'exame_imagem_jornada.vagas',
'exame_imagem_jornada.status_id AS status_jornada',
'exame_imagem_jornada.unidade_id',
'exame_imagem_jornada_status.nome AS status_nome',
'exame_imagem_jornada_semana.nome AS nome_semana',
'exame_imagem_jornada.semana_id AS semana_id',
'exame_imagem_jornada.controle_jornada_id AS tipo_jornada',
'exame_imagem_jornada.usuario_id',
'cadastro_grupo.nome AS grupo',
'cadastro_grupo.id AS grupo_exame_id',
'profissional.nome AS profissional_nome',
'ocupacao.nome AS ocupacao_nome',
DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_inicial, "%H:%i") AS hora_inicial'),
DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_fim, "%H:%i") AS hora_fim'),
DB::raw("DATE_FORMAT(exame_imagem_jornada.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_jornada.created_at, '%d/%m/%Y') AS data_pedido"),
);
return $agendamentosBuilder
->orderBy('exame_imagem_jornada.data')
->get()
->map(function ($jornada) {
return [
'data' => $jornada->data,
'profissional_nome' => $jornada->profissional_nome,
'grupo' => $jornada->grupo,
'nome_semana' => $jornada->nome_semana,
'hora_inicial' => $jornada->hora_inicial,
'hora_fim' => $jornada->hora_fim,
'status_nome' => $jornada->status_nome,
'jornada_id' => $jornada->id,
'vagas' => $jornada->vagas,
'tipo_jornada' => $jornada->tipo_jornada,
'agendamentos' => Agendamento::where('jornada_id', $jornada->id)
->get()
->map(function ($query) use ($jornada) {
return [
'jornada_id' => $query->jornada_id,
'profissional_id' => $query->profissional_id,
'profissional' => $jornada->profissional_nome,
];
}),
'soma' => Agendamento::where('jornada_id', $jornada->id)
->get()
->map(function ($query) use ($jornada) {
return [
'jornada_id' => $query->jornada_id,
'profissional_id' => $query->profissional_id,
'profissional' => $jornada->profissional_nome,
];
})
->count(),
];
});
}
private static function getAgendamentosBuilder()
{
if (!request()->get('periodo')) {
return null;
}
$params = request()->all();
$agendamentos = DB::table('exame_imagem_jornada')
->join(
'exame_imagem_jornada_status',
'exame_imagem_jornada_status.id',
'exame_imagem_jornada.status_id'
)
->join(
'exame_imagem_jornada_semana',
'exame_imagem_jornada_semana.id',
'exame_imagem_jornada.semana_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'exame_imagem_jornada.exame_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_jornada.usuario_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.usuario_id',
'cadastro_usuario.id'
)
->join(
'sigtap.ocupacao AS ocupacao',
'ocupacao.id',
'cadastro_lotacao.ocupacao_id'
)
->orderBy('exame_imagem_jornada.data')
->whereBetween('exame_imagem_jornada.data', [
Carbon::createFromFormat('d/m/Y', $params['periodo']['start'])->setTime(0, 0, 0),
Carbon::createFromFormat('d/m/Y', $params['periodo']['end'])->setTime(23, 59, 59)
])
->where(function ($query) use ($params) {
if (!is_null($params['unidade_id'])) {
$query->where('exame_imagem_jornada.unidade_id', $params['unidade_id']);
}
})
->where(function ($query) use ($params) {
if (!is_null($params['grupo_exame_id'])) {
$query->where('exame_imagem_jornada.exame_id', $params['grupo_exame_id']);
}
})
->where(function ($query) use ($params) {
if (!is_null($params['profissional_id'])) {
$query->where('exame_imagem_jornada.usuario_id', $params['profissional_id']);
}
});
return $agendamentos;
}
public static function list()
{
$now = Carbon::now();
$currentDate = $now->format('d/m/Y');
$currentLotacao = self::getCurrentLotacao();
return [
'form' => self::getForm(),
'model' => [
'periodo' => [
'start' => $currentDate,
'end' => $currentDate,
],
'atendimento' => null,
'prontuario' => null,
'lancamentos' => [],
'paciente' => null,
'exame' => null,
'relatorioCotaProfissional' => self::getCotaProfissional(),
],
'additionals' => [
'periodo_min_date' => $now->copy()->subYears(130)->format('d/m/Y'),
'current_date' => $now->format('d/m/Y')
]
];
}
public static function datatable(Request $request)
{
$agendamentos = DB::table('exame_imagem_jornada')
->select(
'exame_imagem_jornada.id',
'exame_imagem_jornada.status_id AS status_jornada',
'exame_imagem_jornada.unidade_id',
'exame_imagem_jornada.vagas',
'exame_imagem_jornada_status.nome AS status_nome',
'exame_imagem_jornada_semana.nome AS nome_semana',
'exame_imagem_jornada.semana_id AS semana_id',
'exame_imagem_jornada.controle_jornada_id AS tipo_jornada',
'exame_imagem_jornada.usuario_id',
'cadastro_grupo.nome AS grupo',
'cadastro_grupo.id AS grupo_id',
'profissional.nome AS profissional_nome',
'ocupacao.nome AS ocupacao_nome',
DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_inicial, "%H:%i") AS hora_inicial'),
DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_fim, "%H:%i") AS hora_fim'),
DB::raw("DATE_FORMAT(exame_imagem_jornada.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_jornada.created_at, '%d/%m/%Y') AS data_pedido"),
)
->join(
'exame_imagem_jornada_status',
'exame_imagem_jornada_status.id',
'exame_imagem_jornada.status_id'
)
->join(
'exame_imagem_jornada_semana',
'exame_imagem_jornada_semana.id',
'exame_imagem_jornada.semana_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'exame_imagem_jornada.exame_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_jornada.usuario_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.usuario_id',
'cadastro_usuario.id'
)
->join(
'sigtap.ocupacao AS ocupacao',
'ocupacao.id',
'cadastro_lotacao.ocupacao_id'
)
->whereBetween('exame_imagem_jornada.data', [
Carbon::createFromFormat('d/m/Y', $request->periodo['start'])->setTime(0, 0, 0),
Carbon::createFromFormat('d/m/Y', $request->periodo['end'])->setTime(23, 59, 59)
])
->when($request->unidade_id, function ($query, $value) {
$query->where('exame_imagem_jornada.unidade_id', $value);
})
->when($request->grupo_exame_id, function ($query, $value) {
$query->where('exame_imagem_jornada.exame_id', $value);
})
->when($request->profissional_id, function ($query, $value) {
$query->where('exame_imagem_jornada.usuario_id', $value);
})
->when($request->status_id, function ($query, $value) {
$query->where('exame_imagem_jornada.status_id', $value);
});
$agendamentos = $agendamentos->get();
return $agendamentos
->map(function ($jornada) {
return [
'data' => $jornada->data,
'grupo' => $jornada->grupo,
'status_nome' => $jornada->status_nome,
'nome_semana' => $jornada->nome_semana,
'profissional_nome' => $jornada->profissional_nome,
'hora_inicial' => $jornada->hora_inicial,
'hora_fim' => $jornada->hora_fim,
'jornada' => $jornada->id,
'vagas' => $jornada->vagas,
'tipo_jornada' => $jornada->tipo_jornada,
'agendamentos' => Agendamento::where('jornada_id', $jornada->id)
->get()
->map(function ($query) use ($jornada){
return [
'jornada_id' => $query->jornada_id,
'profissional_id' => $query->profissional_id,
'profissional' => $jornada->profissional_nome,
];
}),
'soma' => Agendamento::where('jornada_id', $jornada->id)
->get()
->count(),
];
});
}
private static function getCotaProfissional()
{
$agendamentos = DB::table('exame_imagem_jornada')
->select(
'exame_imagem_jornada.id',
'exame_imagem_jornada.status_id AS status_jornada',
'exame_imagem_jornada.unidade_id',
'exame_imagem_jornada_status.id AS status_id',
'exame_imagem_jornada_status.nome AS status_nome',
'exame_imagem_jornada_semana.nome AS nome_semana',
'exame_imagem_jornada.semana_id AS semana_id',
'exame_imagem_jornada.controle_jornada_id AS tipo_jornada',
'exame_imagem_jornada.usuario_id AS profissional_id',
'cadastro_grupo.nome AS grupo',
'cadastro_grupo.id AS grupo_exame_id',
'profissional.nome AS profissional_nome',
'ocupacao.nome AS ocupacao_nome',
'cadastro_unidade.nome_fantasia',
DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_inicial, "%H:%i") AS hora_inicial'),
DB::raw('DATE_FORMAT(exame_imagem_jornada.hora_fim, "%H:%i") AS hora_fim'),
DB::raw("DATE_FORMAT(exame_imagem_jornada.data, '%d/%m/%Y') AS data"),
DB::raw("DATE_FORMAT(exame_imagem_jornada.created_at, '%d/%m/%Y') AS data_pedido"),
)
->join(
'exame_imagem_jornada_status',
'exame_imagem_jornada_status.id',
'exame_imagem_jornada.status_id'
)
->join(
'exame_imagem_jornada_semana',
'exame_imagem_jornada_semana.id',
'exame_imagem_jornada.semana_id'
)
->join(
'cadastro_grupo',
'cadastro_grupo.id',
'exame_imagem_jornada.exame_id'
)
->join(
'cadastro_usuario',
'cadastro_usuario.id',
'exame_imagem_jornada.usuario_id'
)
->join(
'cadastro_cidadao AS profissional',
'profissional.id',
'cadastro_usuario.cidadao_id'
)
->join(
'cadastro_lotacao',
'cadastro_lotacao.usuario_id',
'cadastro_usuario.id'
)
->join(
'sigtap.ocupacao AS ocupacao',
'ocupacao.id',
'cadastro_lotacao.ocupacao_id'
)
->join(
'cadastro_unidade',
'cadastro_unidade.id',
'exame_imagem_jornada.unidade_id'
);
$agendamentos = $agendamentos->get();
return $agendamentos;
}
private static function getForm()
{
return [
'unidades' => self::getUnidadesExecutantes(),
'grupos' => self::getGrupos(),
'status' => self::getStatus(),
'profissionais' => self::getProfissionais(),
];
}
private static function getUnidadesExecutantes()
{
return Unidade::orderBy('nome_fantasia')
->get()
->map(function ($query) {
return [
'id' => $query->id,
'nome_fantasia' => $query->nome_fantasia,
'infraestruturas' => $query->infraestruturas->sortBy('nome')->map(fn ($infraestrutura) => [
'id' => $infraestrutura->id,
'nome' => $infraestrutura->nome,
'principal' => $infraestrutura->principal,
])->values()
];
});
}
private static function getGrupos()
{
return Exame::whereNotNull('grupo_tipo_id')
->groupBy('grupo_tipo_id')
->get()
->map(function ($query) {
return [
'id' => $query->grupo->id,
'nome' => $query->grupo->nome,
];
})
->values();
}
private static function getStatus()
{
return StatusJornada::orderBy('id')
->get()
->map(fn ($statusJornadas) => [
'id' => $statusJornadas->id,
'nome' => $statusJornadas->nome
])
->values();
}
private static function getProfissionais()
{
return Usuario::orderBy('cidadao_id')
->get()
->map(function ($query) {
return [
'id' => $query->id,
'nome' => $query->cidadao->nome,
];
})
->values();
}
}