268 lines
13 KiB
PHP
268 lines
13 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Farmacia;
|
|
|
|
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
|
|
use App\Models\Cadastro\Estabelecimento\Unidade;
|
|
use App\Models\Cadastro\SujeitoAtencao\Paciente;
|
|
use App\Services\Service;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class RelatorioAtendimentoDiarioService extends Service
|
|
{
|
|
public static function index()
|
|
{
|
|
$dispensacoes = collect();
|
|
|
|
$totalizadores = (object) ['pacientes' => 0, 'medicamentos' => 0];
|
|
|
|
DB::table('farmacia_receita_item_entrega')
|
|
->select([
|
|
DB::raw('CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) 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_paciente.id AS paciente_id',
|
|
DB::raw("LPAD(cadastro_paciente.prontuario, 7, '0') AS paciente_prontuario"),
|
|
'cadastro_cidadao.nome AS paciente_nome',
|
|
DB::raw("CASE farmacia_receita.is_receita_sus WHEN TRUE THEN 'SUS' ELSE 'OUTRAS' END AS receita_tipo"),
|
|
DB::raw('SUM(farmacia_receita_item_entrega.quantidade) AS quantidade'),
|
|
])
|
|
->join('farmacia_receita_item', 'farmacia_receita_item.id', 'farmacia_receita_item_entrega.receita_item_id')
|
|
->join('farmacia_receita', 'farmacia_receita.id', 'farmacia_receita_item.receita_id')
|
|
->join('cadastro_paciente', 'cadastro_paciente.id', 'farmacia_receita.paciente_id')
|
|
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
|
|
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'farmacia_receita.created_centro_custo_id')
|
|
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
|
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
|
|
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) >= '" . request()->get('start_date') . "'")
|
|
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) <= '" . request()->get('end_date') . "'")
|
|
->where('farmacia_receita_item_entrega.pendente', false)
|
|
->where('farmacia_receita_item_entrega.estornado', false)
|
|
->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('receita_tipo'), function ($query) {
|
|
$query->where('farmacia_receita.is_receita_sus', request()->get('receita_tipo') === 'SUS' ? true : false);
|
|
})
|
|
->when(request()->get('paciente_id'), function ($query) {
|
|
$query->where('cadastro_paciente.id', request()->get('paciente_id'));
|
|
})
|
|
->groupBy([
|
|
DB::raw("DATE_FORMAT(farmacia_receita_item_entrega.dispensado_em, '%d/%m/%Y')"),
|
|
'cadastro_unidade.nome_fantasia',
|
|
DB::raw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)'),
|
|
'cadastro_paciente.id',
|
|
DB::raw("LPAD(cadastro_paciente.prontuario, 7, '0')"),
|
|
'cadastro_cidadao.nome',
|
|
DB::raw("CASE farmacia_receita.is_receita_sus WHEN TRUE THEN 'SUS' ELSE 'OUTRAS' END"),
|
|
])
|
|
->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 [
|
|
'additionals' => self::getAdditionals(),
|
|
'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 'receita-tipos':
|
|
return self::getReceitaTipos(request()->get('start_date'), request()->get('end_date'), request()->get('infraestrutura_id'));
|
|
break;
|
|
|
|
default:
|
|
return [];
|
|
break;
|
|
}
|
|
}
|
|
|
|
public static function autocompletePaciente()
|
|
{
|
|
return DB::table('cadastro_paciente')
|
|
->select([
|
|
'cadastro_paciente.id',
|
|
'cadastro_cidadao.nome',
|
|
])
|
|
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
|
|
->whereExists(function ($query) {
|
|
$query->select(DB::raw(1))
|
|
->from('farmacia_receita_item_entrega')
|
|
->join('farmacia_receita_item', 'farmacia_receita_item.id', 'farmacia_receita_item_entrega.receita_item_id')
|
|
->join('farmacia_receita', 'farmacia_receita.id', 'farmacia_receita_item.receita_id')
|
|
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'farmacia_receita.created_centro_custo_id')
|
|
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
|
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) >= '" . request()->get('start_date') . "'")
|
|
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) <= '" . request()->get('end_date') . "'")
|
|
->where('farmacia_receita_item_entrega.pendente', false)
|
|
->where('farmacia_receita_item_entrega.estornado', false)
|
|
->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_infraestrutura.id', request()->get('infraestrutura_id'));
|
|
})
|
|
->when(request()->get('receita_tipo'), function ($query) {
|
|
$query->where('farmacia_receita.is_receita_sus', request()->get('receita_tipo') === 'SUS' ? true : false);
|
|
})
|
|
->whereColumn('farmacia_receita.paciente_id', 'cadastro_paciente.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'));
|
|
$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',
|
|
'receita_tipo' => request()->get('receita_tipo') ?? 'Todos',
|
|
'paciente_nome' => $paciente->cidadao->nome ?? 'Todos',
|
|
'columns' => collect(request()->get('selected_columns')),
|
|
'itens' => $data,
|
|
];
|
|
}
|
|
|
|
private static function getAdditionals()
|
|
{
|
|
return [
|
|
'data_atual' => Carbon::now()->format('d/m/Y'),
|
|
];
|
|
}
|
|
|
|
private static function getForm()
|
|
{
|
|
return [
|
|
'unidades' => [],
|
|
'infraestruturas' => [],
|
|
'receita_tipos' => [],
|
|
];
|
|
}
|
|
|
|
private static function getModel()
|
|
{
|
|
return [
|
|
'periodo' => [
|
|
'start' => null,
|
|
'end' => null,
|
|
],
|
|
'unidade_id' => null,
|
|
'infraestrutura_id' => null,
|
|
'receita_tipo' => null,
|
|
'paciente' => [
|
|
'id' => null,
|
|
'nome' => 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_receita_item_entrega')
|
|
->join('farmacia_receita_item', 'farmacia_receita_item.id', 'farmacia_receita_item_entrega.receita_item_id')
|
|
->join('farmacia_receita', 'farmacia_receita.id', 'farmacia_receita_item.receita_id')
|
|
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'farmacia_receita.created_centro_custo_id')
|
|
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_centro_custo.infraestrutura_id')
|
|
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) >= '" . $startDate . "'")
|
|
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) <= '" . $endDate . "'")
|
|
->where('farmacia_receita_item_entrega.pendente', false)
|
|
->where('farmacia_receita_item_entrega.estornado', false)
|
|
->whereColumn('cadastro_infraestrutura.unidade_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_receita_item_entrega')
|
|
->join('farmacia_receita_item', 'farmacia_receita_item.id', 'farmacia_receita_item_entrega.receita_item_id')
|
|
->join('farmacia_receita', 'farmacia_receita.id', 'farmacia_receita_item.receita_id')
|
|
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'farmacia_receita.created_centro_custo_id')
|
|
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) >= '" . $startDate . "'")
|
|
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) <= '" . $endDate . "'")
|
|
->where('farmacia_receita_item_entrega.pendente', false)
|
|
->where('farmacia_receita_item_entrega.estornado', false)
|
|
->whereColumn('cadastro_centro_custo.infraestrutura_id', 'cadastro_infraestrutura.id');
|
|
})
|
|
->orderByRaw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)')
|
|
->get();
|
|
}
|
|
|
|
private static function getReceitaTipos($startDate, $endDate, $infraestruturaId)
|
|
{
|
|
return DB::table('farmacia_receita')
|
|
->select([
|
|
DB::raw("CASE farmacia_receita.is_receita_sus WHEN TRUE THEN 'SUS' ELSE 'OUTRAS' END AS valor")
|
|
])
|
|
->join('cadastro_centro_custo', 'cadastro_centro_custo.id', 'farmacia_receita.created_centro_custo_id')
|
|
->where('cadastro_centro_custo.infraestrutura_id', $infraestruturaId)
|
|
->whereExists(function ($query) use ($startDate, $endDate) {
|
|
$query->select(DB::raw(1))
|
|
->from('farmacia_receita_item_entrega')
|
|
->join('farmacia_receita_item', 'farmacia_receita_item.id', 'farmacia_receita_item_entrega.receita_item_id')
|
|
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) >= '" . $startDate . "'")
|
|
->whereRaw("CAST(farmacia_receita_item_entrega.dispensado_em AS DATE) <= '" . $endDate . "'")
|
|
->where('farmacia_receita_item_entrega.pendente', false)
|
|
->where('farmacia_receita_item_entrega.estornado', false)
|
|
->whereColumn('farmacia_receita_item.receita_id', 'farmacia_receita.id');
|
|
})
|
|
->distinct()
|
|
->get();
|
|
}
|
|
}
|