530 lines
19 KiB
PHP
530 lines
19 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Farmacia;
|
|
|
|
use App\Models\Cadastro\Estabelecimento\CentroCusto;
|
|
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
|
|
use App\Models\Cadastro\Estabelecimento\Unidade;
|
|
use App\Models\Cadastro\Grupo\Grupo;
|
|
use App\Models\Cadastro\Material\Material;
|
|
use App\Models\Cadastro\Subgrupo\Subgrupo;
|
|
use App\Models\Cadastro\SujeitoAtencao\Usuario;
|
|
use App\Models\Farmacia\Receita;
|
|
use App\Services\Cadastro\Material\MaterialService;
|
|
use App\Services\Service;
|
|
use App\Utils\DataUtil;
|
|
use Carbon\Carbon;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Str;
|
|
|
|
class RelatorioDispensacaoService extends Service
|
|
{
|
|
public static function index()
|
|
{
|
|
$totalizadores = (object) [
|
|
'quantidade' => 0,
|
|
];
|
|
|
|
$periodo = [
|
|
'start' => Carbon::createFromFormat('d/m/Y', request()->periodo['start'])->setTime(0, 0, 0),
|
|
'end' => Carbon::createFromFormat('d/m/Y', request()->periodo['end'])->setTime(23, 59, 59)
|
|
];
|
|
|
|
$dispensacoes = DB::table('farmacia_receita_item_entrega as entrega')
|
|
->join(
|
|
'cadastro_centro_custo as centro_custo',
|
|
'centro_custo.id',
|
|
'entrega.created_centro_custo_id'
|
|
)
|
|
->join(
|
|
'cadastro_setor as setor',
|
|
'setor.id',
|
|
'centro_custo.setor_id'
|
|
)
|
|
->join(
|
|
'cadastro_infraestrutura as infraestrutura',
|
|
'infraestrutura.id',
|
|
'centro_custo.infraestrutura_id'
|
|
)
|
|
->join(
|
|
'cadastro_unidade as unidade',
|
|
'unidade.id',
|
|
'infraestrutura.unidade_id'
|
|
)
|
|
->join(
|
|
'farmacia_receita_item as item',
|
|
'item.id',
|
|
'entrega.receita_item_id'
|
|
)
|
|
->join(
|
|
'cadastro_material as material',
|
|
'material.id',
|
|
'item.material_id'
|
|
)
|
|
->join(
|
|
'cadastro_apresentacao as apresentacao',
|
|
'apresentacao.id',
|
|
'material.apresentacao_id'
|
|
)
|
|
->join(
|
|
'cadastro_grupo as grupo',
|
|
'grupo.id',
|
|
'material.grupo_id'
|
|
)
|
|
->join(
|
|
'farmacia_receita as receita',
|
|
'receita.id',
|
|
'item.receita_id'
|
|
)
|
|
->join(
|
|
'cadastro_usuario as usuario_solicitante',
|
|
'usuario_solicitante.id',
|
|
'receita.usuario_id'
|
|
)
|
|
->join(
|
|
'cadastro_cidadao as cidadao_solicitante',
|
|
'cidadao_solicitante.id',
|
|
'usuario_solicitante.cidadao_id'
|
|
)
|
|
->leftJoin(
|
|
'cadastro_unidade_medida as apresentacao_unidade_medida',
|
|
'apresentacao_unidade_medida.id',
|
|
'material.apresentacao_unidade_medida_id'
|
|
)
|
|
->leftJoin(
|
|
'cadastro_subgrupo as subgrupo',
|
|
'subgrupo.id',
|
|
'material.subgrupo_id'
|
|
)
|
|
->where('entrega.pendente', false)
|
|
->where('entrega.estornado', false)
|
|
->whereBetween('entrega.created_at', $periodo)
|
|
->when(request()->is_receita_sus, fn ($q, $value) =>
|
|
$q->where('receita.is_receita_sus', DataUtil::getBooleanValueFromStringBoolean($value))
|
|
)
|
|
->when(request()->unidade_id, fn ($q, $id) => $q->where('unidade.id', $id))
|
|
->when(request()->infraestrutura_id, fn ($q, $id) => $q->where('infraestrutura.id', $id))
|
|
->when(request()->centro_custo_id, fn ($q, $id) => $q->where('centro_custo.id', $id))
|
|
->when(request()->usuario_solicitante_id, fn ($q, $id) => $q->where('usuario_solicitante.id', $id))
|
|
->when(request()->grupo_id, fn ($q, $id) => $q->where('grupo.id', $id))
|
|
->when(request()->subgrupo_id, fn ($q, $id) => $q->where('subgrupo.id', $id))
|
|
->when(request()->material_id, fn ($q, $id) => $q->where('material.id', $id))
|
|
->select(DB::raw("
|
|
IF (receita.is_receita_sus = 1, 'SUS', 'OUTRAS') as tipo_receita,
|
|
unidade.nome_fantasia as unidade,
|
|
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura,
|
|
setor.nome as setor,
|
|
cidadao_solicitante.nome as usuario_solicitante,
|
|
grupo.nome as grupo,
|
|
subgrupo.nome as subgrupo,
|
|
" . MaterialService::getDescricaoCompletaRaw(
|
|
'material',
|
|
'apresentacao',
|
|
'apresentacao_unidade_medida'
|
|
) . " as material,
|
|
entrega.quantidade
|
|
"))
|
|
->get();
|
|
|
|
$dispensacoes->each(function ($dispensacao) use ($totalizadores) {
|
|
|
|
$totalizadores->quantidade += $dispensacao->quantidade;
|
|
});
|
|
|
|
return compact('dispensacoes', 'totalizadores');
|
|
}
|
|
|
|
public static function list()
|
|
{
|
|
$data = (object) [
|
|
'additionals' => [],
|
|
'form' => [],
|
|
'model' => [],
|
|
];
|
|
|
|
$params = self::getParams();
|
|
|
|
$sets = [
|
|
'periodo' => function () use ($data) {
|
|
|
|
$data->model['periodo'] = ['start' => null, 'end' => null];
|
|
},
|
|
'unidade' => function () use ($data, $params) {
|
|
|
|
$unidadesData = self::getUnidadesData($params);
|
|
|
|
$data->form['unidades'] = $unidadesData['form'];
|
|
$data->model['unidade_id'] = $unidadesData['model'];
|
|
},
|
|
'infraestrutura' => function () use ($data, $params) {
|
|
|
|
$infraestruturasData = self::getInfraestruturasData($params);
|
|
|
|
$data->form['infraestruturas'] = $infraestruturasData['form'];
|
|
$data->model['infraestrutura_id'] = $infraestruturasData['model'];
|
|
},
|
|
'centro_custo' => function () use ($data, $params) {
|
|
|
|
$centrosDeCustoData = self::getCentrosDeCustoData($params);
|
|
|
|
$data->form['centros_custo'] = $centrosDeCustoData['form'];
|
|
$data->model['centro_custo_id'] = $centrosDeCustoData['model'];
|
|
},
|
|
'usuario_solicitante' => function () use ($data, $params) {
|
|
|
|
$usuariosData = self::getUsuariosSolicitantesData($params);
|
|
|
|
$data->form['usuarios_solicitantes'] = $usuariosData['form'];
|
|
$data->model['usuario_solicitante_id'] = $usuariosData['model'];
|
|
},
|
|
'tipo_receita' => function () use ($data, $params) {
|
|
|
|
$tiposReceitaData = self::getTiposReceitaData($params);
|
|
|
|
$data->form['tipos_receita'] = $tiposReceitaData['form'];
|
|
$data->model['is_receita_sus'] = $tiposReceitaData['model'];
|
|
},
|
|
'grupo' => function () use ($data, $params) {
|
|
|
|
$gruposData = self::getGruposData($params);
|
|
|
|
$data->form['grupos'] = $gruposData['form'];
|
|
$data->model['grupo_id'] = $gruposData['model'];
|
|
},
|
|
'subgrupo' => function () use ($data, $params) {
|
|
|
|
$subgruposData = self::getSubgruposData($params);
|
|
|
|
$data->form['subgrupos'] = $subgruposData['form'];
|
|
$data->model['subgrupo_id'] = $subgruposData['model'];
|
|
},
|
|
'material' => function () use ($data) {
|
|
|
|
$data->model['material'] = null;
|
|
}
|
|
];
|
|
|
|
$load = is_null(request()->load_from);
|
|
|
|
if ($load) {
|
|
|
|
$data->additionals = [
|
|
'data_atual' => Carbon::now()->format('d/m/Y'),
|
|
];
|
|
}
|
|
|
|
foreach ($sets as $field => $set) {
|
|
|
|
if ($load) {
|
|
|
|
$set();
|
|
}
|
|
else if ($field === request()->load_from) {
|
|
|
|
$load = true;
|
|
}
|
|
}
|
|
|
|
foreach ($data as $property => $itens) {
|
|
|
|
if (empty($itens)) {
|
|
|
|
unset($data->{$property});
|
|
}
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
private static function getParams()
|
|
{
|
|
$params = request()->only([
|
|
'periodo',
|
|
'unidade_id',
|
|
'infraestrutura_id',
|
|
'centro_custo_id',
|
|
'usuario_solicitante_id',
|
|
'is_receita_sus',
|
|
'grupo_id',
|
|
'subgrupo_id',
|
|
]);
|
|
|
|
if (isset($params['periodo'])
|
|
&& !is_null($params['periodo']['start'])
|
|
&& !is_null($params['periodo']['end'])
|
|
) {
|
|
|
|
$start = Carbon::createFromFormat('d/m/Y', $params['periodo']['start'])->setTime(0, 0, 0);
|
|
$end = Carbon::createFromFormat('d/m/Y', $params['periodo']['end'])->setTime(23, 59, 59);
|
|
|
|
$params['periodo']['start'] = $start;
|
|
$params['periodo']['end'] = $end;
|
|
}
|
|
else {
|
|
|
|
$params['periodo'] = null;
|
|
}
|
|
|
|
if (isset($params['is_receita_sus'])) {
|
|
|
|
$params['is_receita_sus'] = DataUtil::getBooleanValueFromStringBoolean($params['is_receita_sus']);
|
|
}
|
|
|
|
return $params;
|
|
}
|
|
|
|
private static function getUnidadesData($params)
|
|
{
|
|
$unidades = collect();
|
|
$id = null;
|
|
|
|
if (!is_null($params['periodo'])) {
|
|
|
|
$unidades = Unidade::whereHas('infraestruturas', fn ($q) => $q
|
|
->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCusto($q, $params))
|
|
)
|
|
->orderBy('nome_fantasia')
|
|
->get(['id', 'nome_fantasia']);
|
|
}
|
|
|
|
return ['form' => $unidades, 'model' => $id];
|
|
}
|
|
|
|
private static function getInfraestruturasData($params)
|
|
{
|
|
$infraestruturas = collect();
|
|
$id = null;
|
|
|
|
if (!is_null($params['periodo']) && !is_null($params['unidade_id'])) {
|
|
|
|
$infraestruturas = Infraestrutura::where('unidade_id', $params['unidade_id'])
|
|
->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCusto($q, $params))
|
|
->get(['id', 'nome', 'principal', 'unidade_id'])
|
|
->map(fn ($i) => ['id' => $i->id, 'nome' => $i->nome])
|
|
->sortBy('nome')
|
|
->values();
|
|
}
|
|
|
|
return ['form' => $infraestruturas, 'model' => $id];
|
|
}
|
|
|
|
private static function getCentrosDeCustoData($params)
|
|
{
|
|
$centrosCusto = collect();
|
|
$id = null;
|
|
|
|
if (!is_null($params['periodo']) && !is_null($params['infraestrutura_id'])) {
|
|
|
|
$centrosCusto = CentroCusto::where('infraestrutura_id', $params['infraestrutura_id'])
|
|
->where(fn ($q) => self::setWhereForFilterCentroCusto($q, $params))
|
|
->get(['id', 'setor_id'])
|
|
->map(fn ($cc) => ['id' => $cc->id, 'setor_nome' => $cc->setor->nome])
|
|
->sortBy('setor_nome')
|
|
->values();
|
|
}
|
|
|
|
return ['form' => $centrosCusto, 'model' => $id];
|
|
}
|
|
|
|
private static function setWhereForFilterCentroCusto($query, $params)
|
|
{
|
|
return $query->whereHas('farmaciaReceitaEntregas', fn ($q) => $q
|
|
->where('pendente', false)
|
|
->where('estornado', false)
|
|
->whereBetween('dispensado_em', $params['periodo'])
|
|
);
|
|
}
|
|
|
|
private static function getUsuariosSolicitantesData($params)
|
|
{
|
|
$usuarios = collect();
|
|
$id = null;
|
|
|
|
if (!is_null($params['periodo'])) {
|
|
|
|
$usuarios = Usuario::whereHas('farmaciaReceitas', fn ($q) => $q
|
|
->whereHas('itens', fn ($q) => $q
|
|
->whereHas('entregas', fn ($q) =>
|
|
self::setWhereForSelectedCentroCusto($q, $params)
|
|
->where('pendente', false)
|
|
->where('estornado', false)
|
|
->whereBetween('dispensado_em', $params['periodo'])
|
|
)
|
|
)
|
|
)
|
|
->get(['id', 'cidadao_id'])
|
|
->map(fn ($u) => ['id' => $u->id, 'nome' => $u->cidadao->nome])
|
|
->sortBy('nome')
|
|
->values();
|
|
}
|
|
|
|
return ['form' => $usuarios, 'model' => $id];
|
|
}
|
|
|
|
private static function getTiposReceitaData($params)
|
|
{
|
|
$tipos = collect();
|
|
$isReceitaSus = null;
|
|
|
|
if (!is_null($params['periodo'])) {
|
|
|
|
$hasDispensacoes = function ($isReceitaSus) use ($params) {
|
|
|
|
return Receita::where('is_receita_sus', $isReceitaSus)
|
|
->whereHas('itens', fn ($q) => $q
|
|
->whereHas('entregas', fn ($q) =>
|
|
self::setWhereForSelectedCentroCusto($q, $params)
|
|
->where('pendente', false)
|
|
->where('estornado', false)
|
|
->whereBetween('dispensado_em', $params['periodo'])
|
|
)
|
|
)
|
|
->when($params['usuario_solicitante_id'], fn ($q) => $q
|
|
->where('usuario_id', $params['usuario_solicitante_id'])
|
|
)
|
|
->exists();
|
|
};
|
|
|
|
if ($hasDispensacoes(true)) {
|
|
|
|
$tipos->push(['value' => true, 'text' => 'SUS']);
|
|
}
|
|
|
|
if ($hasDispensacoes(false)) {
|
|
|
|
$tipos->push(['value' => false, 'text' => 'OUTRAS']);
|
|
}
|
|
}
|
|
|
|
return ['form' => $tipos, 'model' => $isReceitaSus];
|
|
}
|
|
|
|
private static function getGruposData($params)
|
|
{
|
|
$grupos = collect();
|
|
$id = null;
|
|
|
|
if (!is_null($params['periodo'])) {
|
|
|
|
$grupos = Grupo::whereHas('materiais', fn ($q) => self::setWhereForFilterMaterial($q, $params))
|
|
->orderBy('nome')
|
|
->get(['id', 'nome']);
|
|
}
|
|
|
|
return ['form' => $grupos, 'model' => $id];
|
|
}
|
|
|
|
private static function getSubgruposData($params)
|
|
{
|
|
$subgrupos = collect();
|
|
$id = null;
|
|
|
|
if (!is_null($params['periodo']) && !is_null($params['grupo_id'])) {
|
|
|
|
$subgrupos = Subgrupo::where('grupo_id', $params['grupo_id'])
|
|
->whereHas('materiais', fn ($q) => self::setWhereForFilterMaterial($q, $params))
|
|
->orderBy('nome')
|
|
->get(['id', 'nome']);
|
|
}
|
|
|
|
return ['form' => $subgrupos, 'model' => $id];
|
|
}
|
|
|
|
public static function setWhereForFilterMaterial($query, $params)
|
|
{
|
|
$query->whereHas('farmaciaReceitaItens', fn ($q) => $q
|
|
->whereHas('entregas', fn ($q) =>
|
|
self::setWhereForSelectedCentroCusto($q, $params)
|
|
->where('pendente', false)
|
|
->where('estornado', false)
|
|
->whereBetween('dispensado_em', $params['periodo'])
|
|
)
|
|
->whereHas('receita', fn ($q) => $q
|
|
->when($params['usuario_solicitante_id'], fn ($q) => $q
|
|
->where('usuario_id', $params['usuario_solicitante_id'])
|
|
)
|
|
->when(!is_null($params['is_receita_sus']), fn ($q) => $q
|
|
->where('is_receita_sus', $params['is_receita_sus'])
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
private static function setWhereForSelectedCentroCusto($query, $params)
|
|
{
|
|
return $query->when($params['centro_custo_id'],
|
|
fn ($q, $centroCustoId) => $q->where('created_centro_custo_id', $centroCustoId),
|
|
fn ($q) => $q->when(!is_null($params['infraestrutura_id']) || !is_null($params['unidade_id']),
|
|
fn ($q) => $q->whereHas('createdCentroCusto', fn ($q) => $q
|
|
->when($params['infraestrutura_id'],
|
|
fn ($q, $infraestruturaId) => $q->where('infraestrutura_id', $infraestruturaId),
|
|
fn ($q) => $q->whereHas('infraestrutura', fn ($q) => $q
|
|
->where('unidade_id', $params['unidade_id']))
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
public static function autocompleteMaterial()
|
|
{
|
|
$params = self::getParams();
|
|
|
|
$materiais = Material::when($params['grupo_id'], fn ($q, $grupoId) => $q->where('grupo_id', $grupoId))
|
|
->when($params['subgrupo_id'], fn ($q, $subgrupoId) => $q->where('subgrupo_id', $subgrupoId))
|
|
->where(fn ($q) => self::setWhereForFilterMaterial($q, $params))
|
|
->getQuery()
|
|
->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"),
|
|
);
|
|
|
|
return $materiais;
|
|
}
|
|
|
|
public static function getPrintExportData()
|
|
{
|
|
$resultado = self::index();
|
|
$itens = $resultado['dispensacoes'];
|
|
|
|
$unidade = Unidade::find(request()->unidade_id);
|
|
$infraestrutura = Infraestrutura::find(request()->infraestrutura_id);
|
|
$centroCusto = CentroCusto::find(request()->centro_custo_id);
|
|
$usuarioSolicitante = Usuario::find(request()->usuario_solicitante_id);
|
|
$grupo = Grupo::find(request()->grupo_id);
|
|
$subgrupo = Subgrupo::find(request()->subgrupo_id);
|
|
$material = Material::find(request()->material_id);
|
|
|
|
return [
|
|
'inicio' => request()->periodo['start'],
|
|
'fim' => request()->periodo['end'],
|
|
'unidade' => $unidade->nome_fantasia ?? 'Todas',
|
|
'infraestrutura' => $infraestrutura->nome ?? 'Todos',
|
|
'setor' => $centroCusto->setor->nome ?? 'Todos',
|
|
'usuarioSolicitante' => $usuarioSolicitante->cidadao->nome ?? 'Todos',
|
|
'tipoReceita' => is_null(request()->is_receita_sus) ? 'Todos'
|
|
: (DataUtil::getBooleanValueFromStringBoolean(request()->is_receita_sus) ? 'SUS' : 'OUTRAS'),
|
|
'grupo' => $grupo->nome ?? 'Todos',
|
|
'subgrupo' => $subgrupo->nome ?? 'Todos',
|
|
'material' => $material->descricao_completa ?? 'Todos',
|
|
'colunas' => collect(request()->selectedColumns),
|
|
'itens' => $itens,
|
|
'totalizadores' => $resultado['totalizadores'],
|
|
];
|
|
}
|
|
}
|