This commit is contained in:
@@ -0,0 +1,310 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Farmacia;
|
||||
|
||||
use App\Enums\Farmacia\AltoCusto\ProcessoItemMesStatus;
|
||||
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
|
||||
use App\Models\Cadastro\Estabelecimento\Setor;
|
||||
use App\Models\Cadastro\Estabelecimento\Unidade;
|
||||
use App\Models\Cadastro\Material\Material;
|
||||
use App\Models\Cadastro\SujeitoAtencao\Paciente;
|
||||
use App\Models\Cadastro\SujeitoAtencao\Usuario;
|
||||
use App\Services\Cadastro\Material\MaterialService;
|
||||
use App\Services\Service;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class RelatorioAltoCustoDispensacaoService extends Service
|
||||
{
|
||||
public static function index()
|
||||
{
|
||||
$dispensacoes = collect();
|
||||
$totalizadores = (object) ['pacientes' => 0, 'medicamentos' => 0];
|
||||
|
||||
DB::table('farmacia_alto_custo_processo_item_mes')
|
||||
->select([
|
||||
'farmacia_alto_custo_processo_item_mes.retirado_paciente_em as data_dispensacao',
|
||||
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
|
||||
DB::raw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome'),
|
||||
'cadastro_setor.nome AS setor_nome',
|
||||
'cadastro_cidadao_usuario.nome AS usuario_nome',
|
||||
'cadastro_cidadao_paciente.id AS paciente_id',
|
||||
'cadastro_cidadao_paciente.nome AS paciente_nome',
|
||||
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'apresentacao_unidade_medida'
|
||||
) . " AS material_descricao"),
|
||||
'farmacia_alto_custo_processo_item_mes.quantidade_retirada AS quantidade',
|
||||
])
|
||||
->join('farmacia_alto_custo_processo_item', 'farmacia_alto_custo_processo_item.id', 'farmacia_alto_custo_processo_item_mes.item_id')
|
||||
->join('farmacia_alto_custo_processo', 'farmacia_alto_custo_processo.id', 'farmacia_alto_custo_processo_item.processo_id')
|
||||
->join('cadastro_material', 'cadastro_material.id', 'farmacia_alto_custo_processo_item.material_id')
|
||||
->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id')
|
||||
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'farmacia_alto_custo_processo.created_centro_custo_id')
|
||||
->join('cadastro_setor', 'cadastro_setor.id', 'cadastro_centro_custo.setor_id')
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
||||
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
|
||||
->join('cadastro_usuario', 'cadastro_usuario.id', 'farmacia_alto_custo_processo.usuario_solicitante_id')
|
||||
->join('cadastro_cidadao AS cadastro_cidadao_usuario', 'cadastro_cidadao_usuario.id', 'cadastro_usuario.cidadao_id')
|
||||
->join('cadastro_paciente', 'cadastro_paciente.id', 'farmacia_alto_custo_processo.paciente_id')
|
||||
->join('cadastro_cidadao AS cadastro_cidadao_paciente', 'cadastro_cidadao_paciente.id', 'cadastro_paciente.cidadao_id')
|
||||
->leftJoin(
|
||||
'cadastro_unidade_medida as apresentacao_unidade_medida',
|
||||
'apresentacao_unidade_medida.id',
|
||||
'cadastro_material.apresentacao_unidade_medida_id'
|
||||
)
|
||||
->whereBetween('farmacia_alto_custo_processo_item_mes.retirado_paciente_em', [request()->get('start_date'), request()->get('end_date')])
|
||||
->where('farmacia_alto_custo_processo_item_mes.status_id', ProcessoItemMesStatus::RETIRADO_PACIENTE)
|
||||
->when(request()->get('unidade_id'), function ($query) {
|
||||
$query->where('cadastro_unidade.id', request()->get('unidade_id'));
|
||||
})
|
||||
->when(request()->get('infraestrutura_id'), function ($query) {
|
||||
$query->where('cadastro_infraestrutura.id', request()->get('infraestrutura_id'));
|
||||
})
|
||||
->when(request()->get('setor_id'), function ($query) {
|
||||
$query->where('cadastro_setor.id', request()->get('setor_id'));
|
||||
})
|
||||
->when(request()->get('usuario_id'), function ($query) {
|
||||
$query->where('cadastro_usuario.id', request()->get('usuario_id'));
|
||||
})
|
||||
->when(request()->get('material_id'), function ($query) {
|
||||
$query->where('cadastro_material.id', request()->get('material_id'));
|
||||
})
|
||||
->get()
|
||||
->each(function($dispensacao) use ($dispensacoes, $totalizadores) {
|
||||
if (is_null($dispensacoes->where('paciente_id', $dispensacao->paciente_id)->first())) {
|
||||
$totalizadores->pacientes++;
|
||||
}
|
||||
|
||||
$totalizadores->medicamentos += $dispensacao->quantidade;
|
||||
|
||||
$dispensacoes->push($dispensacao);
|
||||
});
|
||||
|
||||
return compact('dispensacoes', 'totalizadores');
|
||||
}
|
||||
|
||||
public static function create()
|
||||
{
|
||||
return [
|
||||
'form' => self::getForm(),
|
||||
'model' => self::getModel(),
|
||||
];
|
||||
}
|
||||
|
||||
public static function list()
|
||||
{
|
||||
switch (request()->get('listar')) {
|
||||
case 'unidades':
|
||||
return self::getUnidades(request()->get('start_date'), request()->get('end_date'));
|
||||
break;
|
||||
|
||||
case 'infraestruturas':
|
||||
return self::getInfraestruturas(request()->get('start_date'), request()->get('end_date'), request()->get('unidade_id'));
|
||||
break;
|
||||
|
||||
case 'setores':
|
||||
return self::getSetores(request()->get('start_date'), request()->get('end_date'), request()->get('infraestrutura_id'));
|
||||
break;
|
||||
|
||||
case 'usuarios':
|
||||
return self::getUsuarios(request()->get('start_date'), request()->get('end_date'), request()->get('infraestrutura_id'), request()->get('setor_id'));
|
||||
break;
|
||||
|
||||
default:
|
||||
return [];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public static function autocompleteMaterial()
|
||||
{
|
||||
return DB::table('cadastro_material')
|
||||
->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id')
|
||||
->leftJoin(
|
||||
'cadastro_unidade_medida as apresentacao_unidade_medida',
|
||||
'apresentacao_unidade_medida.id',
|
||||
'cadastro_material.apresentacao_unidade_medida_id'
|
||||
)
|
||||
->select([
|
||||
'cadastro_material.id',
|
||||
DB::raw(MaterialService::getDescricaoCompletaRaw(
|
||||
'cadastro_material',
|
||||
'cadastro_apresentacao',
|
||||
'apresentacao_unidade_medida'
|
||||
) . " AS descricao")
|
||||
])
|
||||
->whereExists(function ($query) {
|
||||
$query->select(DB::raw(1))
|
||||
->from('farmacia_alto_custo_processo_item_mes')
|
||||
->join('farmacia_alto_custo_processo_item', 'farmacia_alto_custo_processo_item.id', 'farmacia_alto_custo_processo_item_mes.item_id')
|
||||
->join('farmacia_alto_custo_processo', 'farmacia_alto_custo_processo.id', 'farmacia_alto_custo_processo_item.processo_id')
|
||||
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'farmacia_alto_custo_processo.created_centro_custo_id')
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
||||
->whereBetween('farmacia_alto_custo_processo_item_mes.retirado_paciente_em', [request()->get('start_date'), request()->get('end_date')])
|
||||
->where('farmacia_alto_custo_processo_item_mes.status_id', ProcessoItemMesStatus::RETIRADO_PACIENTE)
|
||||
->when(request()->get('unidade_id'), function ($query) {
|
||||
$query->where('cadastro_infraestrutura.unidade_id', request()->get('unidade_id'));
|
||||
})
|
||||
->when(request()->get('infraestrutura_id'), function ($query) {
|
||||
$query->where('cadastro_centro_custo.infraestrutura_id', request()->get('infraestrutura_id'));
|
||||
})
|
||||
->when(request()->get('setor_id'), function ($query) {
|
||||
$query->where('cadastro_centro_custo.setor_id', request()->get('setor_id'));
|
||||
})
|
||||
->when(request()->get('usuario_id'), function ($query) {
|
||||
$query->where('farmacia_alto_custo_processo.usuario_solicitante_id', request()->get('usuario_id'));
|
||||
})
|
||||
->whereColumn('farmacia_alto_custo_processo_item.material_id', 'cadastro_material.id');
|
||||
});
|
||||
}
|
||||
|
||||
public static function getPrintData()
|
||||
{
|
||||
$data = self::index();
|
||||
|
||||
$data['dispensacoes']->each(function ($dispensacao) {
|
||||
|
||||
$dispensacao->data_dispensacao = (new Carbon($dispensacao->data_dispensacao))->format('d/m/Y');
|
||||
});
|
||||
|
||||
$unidade = Unidade::find(request()->get('unidade_id'));
|
||||
$infraestrutura = Infraestrutura::find(request()->get('infraestrutura_id'));
|
||||
$setor = Setor::find(request()->get('setor_id'));
|
||||
$usuario = Usuario::find(request()->get('usuario_id'));
|
||||
$material = Material::find(request()->get('material_id'));
|
||||
$paciente = Paciente::find(request()->get('paciente_id'));
|
||||
|
||||
return [
|
||||
'start_date' => Carbon::create(request()->get('start_date'))->format('d/m/Y'),
|
||||
'end_date' => Carbon::create(request()->get('end_date'))->format('d/m/Y'),
|
||||
'unidade_nome_fantasia' => $unidade->nome_fantasia ?? 'Todas',
|
||||
'infraestrutura_nome' => $infraestrutura->nome ?? 'Todos',
|
||||
'setor_nome' => $setor->nome ?? 'Todos',
|
||||
'usuario_nome' => $usuario->cidadao->nome ?? 'Todos',
|
||||
'paciente_nome' => $paciente->cidadao->nome ?? 'Todos',
|
||||
'material_descricao' => $material->descricao_completa ?? 'Todos',
|
||||
'columns' => collect(request()->get('selected_columns')),
|
||||
'itens' => $data,
|
||||
];
|
||||
}
|
||||
|
||||
private static function getForm()
|
||||
{
|
||||
return [
|
||||
'unidades' => [],
|
||||
'infraestruturas' => [],
|
||||
'setores' => [],
|
||||
'usuarios' => [],
|
||||
];
|
||||
}
|
||||
|
||||
private static function getModel()
|
||||
{
|
||||
return [
|
||||
'periodo' => [
|
||||
'start' => null,
|
||||
'end' => null,
|
||||
],
|
||||
'unidade_id' => null,
|
||||
'infraestrutura_id' => null,
|
||||
'setor_id' => null,
|
||||
'usuario_id' => null,
|
||||
'material' => [
|
||||
'id' => null,
|
||||
'descricao' => null,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
private static function getUnidades($startDate, $endDate)
|
||||
{
|
||||
return DB::table('cadastro_unidade')
|
||||
->select([
|
||||
'id',
|
||||
'nome_fantasia'
|
||||
])
|
||||
->whereExists(function ($query) use ($startDate, $endDate) {
|
||||
$query->select(DB::raw(1))
|
||||
->from('farmacia_alto_custo_processo_item_mes')
|
||||
->join('farmacia_alto_custo_processo_item', 'farmacia_alto_custo_processo_item.id', 'farmacia_alto_custo_processo_item_mes.item_id')
|
||||
->join('farmacia_alto_custo_processo', 'farmacia_alto_custo_processo.id', 'farmacia_alto_custo_processo_item.processo_id')
|
||||
->whereBetween('farmacia_alto_custo_processo_item_mes.retirado_paciente_em', [$startDate, $endDate])
|
||||
->where('farmacia_alto_custo_processo_item_mes.status_id', ProcessoItemMesStatus::RETIRADO_PACIENTE)
|
||||
->whereColumn('farmacia_alto_custo_processo.unidade_solicitante_id', 'cadastro_unidade.id');
|
||||
})
|
||||
->orderBy('cadastro_unidade.nome_fantasia')
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getInfraestruturas($startDate, $endDate, $unidadeId)
|
||||
{
|
||||
return DB::table('cadastro_infraestrutura')
|
||||
->select([
|
||||
'cadastro_infraestrutura.id',
|
||||
DB::raw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS nome'),
|
||||
])
|
||||
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
|
||||
->where('cadastro_unidade.id', $unidadeId)
|
||||
->whereExists(function ($query) use ($startDate, $endDate) {
|
||||
$query->select(DB::raw(1))
|
||||
->from('farmacia_alto_custo_processo_item_mes')
|
||||
->join('farmacia_alto_custo_processo_item', 'farmacia_alto_custo_processo_item.id', 'farmacia_alto_custo_processo_item_mes.item_id')
|
||||
->join('farmacia_alto_custo_processo', 'farmacia_alto_custo_processo.id', 'farmacia_alto_custo_processo_item.processo_id')
|
||||
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'farmacia_alto_custo_processo.created_centro_custo_id')
|
||||
->whereBetween('farmacia_alto_custo_processo_item_mes.retirado_paciente_em', [$startDate, $endDate])
|
||||
->where('farmacia_alto_custo_processo_item_mes.status_id', ProcessoItemMesStatus::RETIRADO_PACIENTE)
|
||||
->whereColumn('cadastro_centro_custo.infraestrutura_id', 'cadastro_infraestrutura.id');
|
||||
})
|
||||
->orderByRaw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)')
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getSetores($startDate, $endDate, $infraestruturaId)
|
||||
{
|
||||
return DB::table('cadastro_setor')
|
||||
->select([
|
||||
'cadastro_setor.id',
|
||||
'cadastro_setor.nome',
|
||||
])
|
||||
->whereExists(function ($query) use ($startDate, $endDate, $infraestruturaId) {
|
||||
$query->select(DB::raw(1))
|
||||
->from('farmacia_alto_custo_processo_item_mes')
|
||||
->join('farmacia_alto_custo_processo_item', 'farmacia_alto_custo_processo_item.id', 'farmacia_alto_custo_processo_item_mes.item_id')
|
||||
->join('farmacia_alto_custo_processo', 'farmacia_alto_custo_processo.id', 'farmacia_alto_custo_processo_item.processo_id')
|
||||
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'farmacia_alto_custo_processo.created_centro_custo_id')
|
||||
->whereBetween('farmacia_alto_custo_processo_item_mes.retirado_paciente_em', [$startDate, $endDate])
|
||||
->where('cadastro_centro_custo.infraestrutura_id', $infraestruturaId)
|
||||
->where('farmacia_alto_custo_processo_item_mes.status_id', ProcessoItemMesStatus::RETIRADO_PACIENTE)
|
||||
->whereColumn('cadastro_centro_custo.setor_id', 'cadastro_setor.id');
|
||||
})
|
||||
->orderBy('cadastro_setor.nome')
|
||||
->get();
|
||||
}
|
||||
|
||||
private static function getUsuarios($startDate, $endDate, $infraestruturaId, $setorId)
|
||||
{
|
||||
return DB::table('cadastro_usuario')
|
||||
->select([
|
||||
'cadastro_usuario.id',
|
||||
'cadastro_cidadao.nome',
|
||||
])
|
||||
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
|
||||
->whereExists(function ($query) use ($startDate, $endDate, $infraestruturaId, $setorId) {
|
||||
$query->select(DB::raw(1))
|
||||
->from('farmacia_alto_custo_processo_item_mes')
|
||||
->join('farmacia_alto_custo_processo_item', 'farmacia_alto_custo_processo_item.id', 'farmacia_alto_custo_processo_item_mes.item_id')
|
||||
->join('farmacia_alto_custo_processo', 'farmacia_alto_custo_processo.id', 'farmacia_alto_custo_processo_item.processo_id')
|
||||
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'farmacia_alto_custo_processo.created_centro_custo_id')
|
||||
->whereBetween('farmacia_alto_custo_processo_item_mes.retirado_paciente_em', [$startDate, $endDate])
|
||||
->where('cadastro_centro_custo.infraestrutura_id', $infraestruturaId)
|
||||
->where('cadastro_centro_custo.setor_id', $setorId)
|
||||
->where('farmacia_alto_custo_processo_item_mes.status_id', ProcessoItemMesStatus::RETIRADO_PACIENTE)
|
||||
->whereColumn('farmacia_alto_custo_processo.usuario_solicitante_id', 'cadastro_usuario.id');
|
||||
})
|
||||
->orderBy('cadastro_cidadao.nome')
|
||||
->get();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user