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,505 @@
<?php
namespace App\Services\Farmacia;
use App\Enums\Cadastro\SujeitoAtencao\PreferenciaNome;
use App\Enums\Cadastro\UnidadeMedida as CadastroUnidadeMedida;
use App\Enums\Cadastro\UnidadeMedida as UnidadeMedidaEnum;
use App\Enums\Farmacia\AltoCusto\ProcessoItemMesStatus as AltoCustoProcessoItemMesStatus;
use App\Http\Controllers\Cadastro\SujeitoAtencao\PacienteController;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\Cadastro\UnidadeMedida;
use App\Models\Farmacia\AltoCusto\Processo;
use App\Models\Farmacia\AltoCusto\ProcessoItemMesStatus;
use App\Models\Farmacia\AltoCusto\ProcessoNumeroRecebimento;
use App\Models\Farmacia\AltoCusto\ProcessoSubtipo;
use App\Models\Farmacia\AltoCusto\ProcessoTipo;
use App\Services\Service;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class AltoCustoGerenciamentoProcessoService extends Service
{
public static function index($pacienteId)
{
return Processo::where('paciente_id', $pacienteId)
->get()
->map(fn ($processo) => [
'id' => $processo->id,
'solicitado_em' => $processo->solicitado_em,
'tipo' => $processo->tipo->nome,
'materiais' => $processo->itens->map(fn ($item) => $item->material->descricao_completa),
'created_centro_custo_id' => $processo->created_centro_custo_id,
]);
}
public static function create($pacienteId)
{
return [
'additionals' => self::getAdditionalsData(),
'form' => self::getFormData($pacienteId),
'model' => [
'prontuario_unidade' => Paciente::findOrFail($pacienteId)->prontuariosUnidade()
->where('unidade_id', self::getCurrentCentroCusto()->infraestrutura->unidade_id)
->first()->prontuario ?? null,
'peso' => null,
'peso_unidade_medida_id' => CadastroUnidadeMedida::QUILOGRAMAS,
'altura' => null,
'altura_unidade_medida_id' => CadastroUnidadeMedida::METROS,
'tipo_id' => null,
'subtipo_id' => null,
'solicitado_em' => null,
'unidade_solicitante_id' => null,
'usuario_solicitante' => null,
'cid' => null,
'observacoes' => null,
'observacoes_drs' => null,
'processo_devolvido_em' => null,
'motivo_processo_devolvido' => null,
'medicamento_devolvido_em' => null,
'motivo_medicamento_devolvido' => null,
'numero_recebimento' => 0,
'itens' => []
],
];
}
public static function edit($id)
{
$processo = Processo::findOrFail($id);
return [
'additionals' => self::getAdditionalsData($processo->created_centro_custo_id),
'form' => self::getFormData($processo->paciente_id),
'model' => [
'prontuario_unidade' => $processo->paciente->prontuariosUnidade()
->where('unidade_id', self::getCurrentCentroCusto()->infraestrutura->unidade_id)
->first()->prontuario ?? null,
'peso' => $processo->peso_unidade_medida_id == CadastroUnidadeMedida::GRAMAS
? (int) $processo->peso
: $processo->peso,
'peso_unidade_medida_id' => $processo->peso_unidade_medida_id ?? CadastroUnidadeMedida::QUILOGRAMAS,
'altura' => $processo->altura_unidade_medida_id == CadastroUnidadeMedida::CENTIMETROS
? (int) $processo->altura
: $processo->altura,
'altura_unidade_medida_id' => $processo->altura_unidade_medida_id ?? CadastroUnidadeMedida::METROS,
'tipo_id' => $processo->tipo_id,
'subtipo_id' => $processo->subtipo_id,
'solicitado_em' => (new Carbon($processo->solicitado_em))->format('d/m/Y'),
'unidade_solicitante_id' => $processo->unidade_solicitante_id,
'usuario_solicitante' => [
'id' => $processo->usuarioSolicitante->id,
'cidadaoNome' => $processo->usuarioSolicitante->cidadao->nome,
],
'cid' => $processo->cid ? [
'id' => $processo->cid->id,
'codigo' => $processo->cid->codigo,
'nome' => $processo->cid->nome,
] : null,
'observacoes' => $processo->observacoes,
'observacoes_drs' => $processo->observacoes_drs,
'processo_devolvido_em' => $processo->processo_devolvido_em,
'motivo_processo_devolvido' => $processo->motivo_processo_devolvido,
'medicamento_devolvido_em' => $processo->medicamento_devolvido_em,
'motivo_medicamento_devolvido' => $processo->motivo_medicamento_devolvido,
'numero_recebimento' => $processo->numero_recebimento,
'itens' => $processo->itens->map(function ($item) {
return [
'id' => $item->id,
'material' => [
'id' => $item->material->id,
'descricao_completa' => $item->material->descricao_completa,
],
'meses' => $item->meses()->orderBy('mes')->get()->map(fn ($mes) => [
'id' => $mes->id,
'mes' => $mes->mes,
'quantidade_solicitada' => fmod((float) $mes->quantidade_solicitada, 1) == 0
? (int) $mes->quantidade_solicitada
: (float) $mes->quantidade_solicitada,
'enviado_drs_em' => $mes->enviado_drs_em
? (new Carbon($mes->enviado_drs_em))->format('d/m/Y')
: null,
'retirado_drs_em' => $mes->retirado_drs_em
? (new Carbon($mes->retirado_drs_em))->format('d/m/Y')
: null,
'quantidade_retirada' => fmod((float) $mes->quantidade_retirada, 1) == 0
? (int) $mes->quantidade_retirada
: (float) $mes->quantidade_retirada,
'retirado_paciente_em' => $mes->retirado_paciente_em
? (new Carbon($mes->retirado_paciente_em))->format('d/m/Y')
: null,
'usuario_atendente' => [
'id' => $mes->usuarioAtendente->id ?? null,
'cidadao_nome' => $mes->usuarioAtendente->cidadao->nome ?? null,
],
'status' => [
'id' => $mes->status->id,
'nome' => $mes->status->nome,
],
])
];
})
],
];
}
private static function getAdditionalsData($createdCentroCustoId = null)
{
$usuarioLogado = self::getCurrentLotacao()->usuario;
return [
'data_atual' => Carbon::now()->format('d/m/Y'),
'permite_edicao' => is_null($createdCentroCustoId)
|| $createdCentroCustoId === self::getCurrentCentroCusto()->id,
'usuario_logado' => [
'id' => $usuarioLogado->id,
'cidadao_nome' => $usuarioLogado->cidadao->nome,
],
];
}
private static function getFormData($pacienteId)
{
$paciente = Paciente::findOrFail($pacienteId);
return [
'paciente' => [
'nome' => $paciente->cidadao->nome,
'nome_social' => $paciente->cidadao->preferencia_nome_id == PreferenciaNome::NOME_SOCIAL
? $paciente->cidadao->nome_social
: null,
'prontuario' => $paciente->prontuario,
'telefone' => MaskUtil::getPhoneMasked($paciente->cidadao->telefone_principal->numero ?? null),
'sexo' => $paciente->cidadao->sexo->descricao,
'cpf' => MaskUtil::getCpfMasked($paciente->cidadao->cpf),
'data_nascimento' => is_null($paciente->cidadao->data_nascimento)
? null : (new Carbon($paciente->cidadao->data_nascimento))->format('d/m/Y'),
'nome_mae' => $paciente->cidadao->nome_mae,
'cns' => MaskUtil::getCnsMasked($paciente->cidadao->cns),
'idade' => $paciente->cidadao->idade_formatada,
'unidade_referencia' => $paciente->unidade->nome_fantasia ?? null,
'rg' => $paciente->cidadao->carteiraIdentidade->numero ?? null,
],
'unidades_medida' => UnidadeMedida::all(['id', 'sigla']),
'unidades' => Unidade::orderBy('nome_fantasia')->get(['id', 'nome_fantasia']),
'tipos' => ProcessoTipo::orderBy('nome')->get(['id', 'nome']),
'subtipos' => ProcessoSubtipo::orderBy('nome')->get(['id', 'tipo_id', 'nome']),
'status' => ProcessoItemMesStatus::all(['id', 'nome']),
'meses' => self:: getMeses(),
];
}
private static function getMeses()
{
$meses = collect();
for ($i = 1; $i <= 12; $i++) {
$meses->push(['value' => $i, 'text' => $i]);
}
return $meses;
}
public static function store()
{
self::validate();
$processo = new Processo();
DB::transaction(function () use ($processo) {
self::save($processo);
});
return $processo;
}
public static function update($id)
{
$processo = Processo::findOrFail($id);
self::validate();
DB::transaction(function () use ($processo) {
self::save($processo);
});
return $processo;
}
private static function save($processo)
{
$processo->fill(request()->except('itens'));
$processo->save();
$itens = collect(request()->itens);
$processo->itens()
->whereNotIn('id', $itens->filter(fn ($i) => !is_null($i['id']))->pluck('id'))
->get()
->each(function ($item) {
$item->meses()->delete();
$item->delete();
});
PacienteController::saveProntuarioUnidade(
$processo->paciente_id,
self::getCurrentCentroCusto()->infraestrutura->unidade_id,
request()->prontuario_unidade
);
$itens->each(function ($itemData) use ($processo) {
$item = $processo->itens()->firstOrCreate(
['id' => $itemData['id']],
$itemData
);
$meses = collect($itemData['meses']);
$item->meses()
->whereNotIn('id', $meses->filter(fn ($m) => !is_null($m['id']))->pluck('id'))
->delete();
$meses->each(function ($mesData) use ($item) {
$item->meses()->updateOrCreate(
['id' => $mesData['id']],
$mesData
);
});
});
$processo->refresh();
$processo->numero_recebimento = self::getNumeroRecebimento($processo);
$processo->save();
return $processo;
}
private static function getNumeroRecebimento($processo)
{
$hasPendenteRetiradaPaciente = $processo->itens()
->whereHas('meses', function ($query) {
$query->where('status_id', AltoCustoProcessoItemMesStatus::PENDENTE_RETIRADA_PACIENTE);
})
->exists();
if ($hasPendenteRetiradaPaciente) {
if ($processo->numero_recebimento > 0) {
return $processo->numero_recebimento;
}
else {
$outroProcesso = Processo::where('id', '<>', $processo->id)
->where('created_centro_custo_id', self::getCurrentCentroCusto()->id)
->where('paciente_id', $processo->paciente_id)
->whereHas('itens', function ($query) {
$query->whereHas('meses', function ($query) {
$query->where('status_id', AltoCustoProcessoItemMesStatus::PENDENTE_RETIRADA_PACIENTE);
});
})
->first();
if (is_null($outroProcesso)) {
$numeroRecebimento = (ProcessoNumeroRecebimento::where(
'centro_custo_id',
self::getCurrentCentroCusto()->id
)
->first()->numero ?? 0) + 1;
ProcessoNumeroRecebimento::updateOrCreate(
['centro_custo_id' => self::getCurrentCentroCusto()->id],
['numero' => $numeroRecebimento]
);
return $numeroRecebimento;
}
else {
return $outroProcesso->numero_recebimento;
}
}
}
else {
return 0;
}
}
public static function destroy($id)
{
$processo = Processo::findOrFail($id);
DB::transaction(function () use ($processo) {
$processo->delete();
});
}
private static function validate()
{
$rules = [
'paciente_id' => [
'required',
'integer',
],
'prontuario_unidade' => [
'nullable',
'string',
'max:10',
],
'peso' => [
'nullable',
'numeric',
'max:999999.99',
],
'peso_unidade_medida_id' => [
'nullable',
'required_with:peso',
'integer',
Rule::in([UnidadeMedidaEnum::GRAMAS, UnidadeMedidaEnum::QUILOGRAMAS]),
],
'altura' => [
'nullable',
'numeric',
'max:999.99',
],
'altura_unidade_medida_id' => [
'nullable',
'required_with:altura',
'integer',
Rule::in([UnidadeMedidaEnum::CENTIMETROS, UnidadeMedidaEnum::METROS]),
],
'tipo_id' => [
'required',
'integer',
],
'subtipo_id' => [
'nullable',
'integer',
],
'solicitado_em' => [
'required',
'date_format:Y-m-d'
],
'unidade_solicitante_id' => [
'required',
'integer',
],
'usuario_solicitante_id' => [
'required',
'integer',
],
'cid_id' => [
'nullable',
'integer',
],
'observacoes' => [
'nullable',
'string',
'max:5000'
],
'observacoes_drs' => [
'nullable',
'string',
'max:5000'
],
'processo_devolvido_em' => [
'nullable',
'date_format:Y-m-d'
],
'motivo_processo_devolvido' => [
'nullable',
'string',
'max:5000'
],
'medicamento_devolvido_em' => [
'nullable',
'date_format:Y-m-d'
],
'motivo_medicamento_devolvido' => [
'nullable',
'string',
'max:5000'
],
'itens.*.id' => [
'nullable',
'integer',
],
'itens.*.material_id' => [
'required',
'integer',
],
'itens.*.meses' => [
'array',
'required',
],
'itens.*.meses.*.id' => [
'nullable',
'integer',
],
'itens.*.meses.*.mes' => [
'required',
'integer',
'between:1,12',
],
'itens.*.meses.*.quantidade_solicitada' => [
'required',
'numeric',
'min:0.001',
'max:999.999',
],
'itens.*.meses.*.enviado_drs_em' => [
'nullable',
'required_with:itens.*.meses.*.retirado_drs_em',
'date_format:Y-m-d',
],
'itens.*.meses.*.retirado_drs_em' => [
'nullable',
'required_with:itens.*.meses.*.retirado_paciente_em',
'date_format:Y-m-d',
'after_or_equal:itens.*.meses.*.enviado_drs_em',
],
'itens.*.meses.*.quantidade_retirada' => [
'required',
'numeric',
'min:0.001',
'max:999.999',
// 'max:itens.*.meses.*.quantidade_solicitada',
],
'itens.*.meses.*.retirado_paciente_em' => [
'nullable',
'date_format:Y-m-d',
'after_or_equal:itens.*.meses.*.retirado_drs_em',
],
'itens.*.meses.*.usuario_atendente_id' => [
'nullable',
'integer',
],
'itens.*.meses.*.status_id' => [
'required',
'integer',
],
];
$messages = [];
request()->validate($rules, $messages);
}
}

View File

@@ -0,0 +1,113 @@
<?php
namespace App\Services\Farmacia;
use App\Events\PainelSenha\ChamadaEvent;
use App\Models\Cadastro\Estabelecimento\Sala;
use App\Models\PainelSenha\Chamada;
use App\Models\PainelSenha\Fila;
use App\Models\PainelSenha\ParametrizacaoInfraestrutura;
use App\Models\PainelSenha\Tela;
use App\Services\Service;
use Exception;
use Illuminate\Validation\Rule;
class ChamadaService extends Service
{
public static function index($params)
{
return Chamada::where('tela_id', $params['tela_id'])
->when($params['modulo_ids'] ?? null, fn ($q, $moduloIds) => $q
->whereHas('fila', fn ($q) => $q
->whereHas('opcaoEntrada', fn ($q) => $q
->whereIn('modulo_id', $moduloIds)
)
)
)
->orderByDesc('created_at')
->take(4)
->get()
->map(fn ($chamada) => [
'id' => $chamada->id,
'paciente' => [
'cidadao' => [
'preferencia_nome_id' => $chamada->paciente->cidadao->preferencia_nome_id ?? null,
'nome' => $chamada->paciente->cidadao->nome ?? null,
'nome_social' => $chamada->paciente->cidadao->nome_social ?? null,
],
],
'sala' => [
'nome' => $chamada->sala->nome ?? null,
],
'senha' => $chamada->fila->senha ?? null,
]);
}
public static function store()
{
self::validate();
$fila = Fila::findOrFail(request()->fila_id);
$chamada = Chamada::create([
'fila_id' => $fila->id,
'status_id' => $fila->status_id,
'tela_id' => request()->tela_id,
'sala_id' => request()->sala_id,
'paciente_id' => $fila->paciente_id ?? null,
]);
FilaAtendimentoService::dispatch($fila->opcaoEntradaAtual->id, $fila->centro_custo_id);
$parametrizacaoInfraestrutura = ParametrizacaoInfraestrutura::where(
'infraestrutura_id',
$fila->centroCusto->infraestrutura_id
)->first();
$moduloIds = is_null($parametrizacaoInfraestrutura)
? collect()
: $parametrizacaoInfraestrutura->modulos->pluck('id');
try {
$paramsChamada = [
'tela_id' => $chamada->tela_id,
'modulo_ids' => null,
];
$moduloIds->each(function ($moduloId) use ($paramsChamada) {
$paramsChamada['modulo_ids'] = [$moduloId];
ChamadaEvent::dispatch(
$paramsChamada['tela_id'],
$moduloId,
self::index($paramsChamada)
);
});
} catch (Exception $error) {
// TODO: Gravar exception em um arquivo.
}
return $chamada;
}
private static function validate()
{
request()->validate([
'fila_id' => [
'required',
'integer',
Rule::exists(Fila::class, 'id'),
],
'tela_id' => [
'required',
'integer',
Rule::exists(Tela::class, 'id'),
],
'sala_id' => [
'nullable',
'integer',
Rule::exists(Sala::class, 'id'),
],
]);
}
}

View File

@@ -0,0 +1,116 @@
<?php
namespace App\Services\Farmacia;
use App\Models\Farmacia\ReceitaItemEntrega;
use App\Services\Almoxarifado\AlmoxarifadoService;
use App\Services\Cadastro\Material\MaterialService;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class EstornoDispensacaoService extends Service
{
public static function edit($pacienteId)
{
return DB::table('farmacia_receita_item_entrega as entrega')
->join('almoxarifado_saida_item as saida_item', 'saida_item.id', 'entrega.saida_item_id')
->join('almoxarifado_saida as saida', 'saida.id', 'saida_item.saida_id')
->join('farmacia_receita_item as item', 'item.id', 'entrega.receita_item_id')
->join('farmacia_receita as receita', 'receita.id', 'item.receita_id')
->join('cadastro_material as material', 'material.id', 'item.material_id')
->join('cadastro_apresentacao as apresentacao', 'apresentacao.id', 'material.apresentacao_id')
->join('cadastro_usuario as usuario', 'usuario.id', 'receita.usuario_id')
->join('cadastro_cidadao as cidadao', 'cidadao.id', 'usuario.cidadao_id')
->join('cadastro_lotacao as lotacao_dispensacao', 'lotacao_dispensacao.id', 'entrega.created_lotacao_id')
->join('cadastro_usuario as usuario_dispensacao', 'usuario_dispensacao.id', 'lotacao_dispensacao.usuario_id')
->join('cadastro_cidadao as cidadao_dispensacao', 'cidadao_dispensacao.id', 'usuario_dispensacao.cidadao_id')
->leftJoin(
'cadastro_unidade_medida as apresentacao_unidade_medida',
'apresentacao_unidade_medida.id',
'material.apresentacao_unidade_medida_id'
)
->whereNotNull('entrega.dispensado_em')
->where('paciente_id', $pacienteId)
->select(DB::raw("
entrega.id,
entrega.dispensado_em,
CAST(saida.created_at AS DATE) as data_saida,
" . MaterialService::getDescricaoCompletaRaw(
'material',
'apresentacao',
'apresentacao_unidade_medida'
) . " as material,
cidadao.nome as medico,
cidadao_dispensacao.nome as usuario_dispensacao,
entrega.quantidade,
IF(saida_item.estornado_em IS NULL, 0, 1) as estornado
"))
->get();
}
public static function update($entregaId)
{
$entrega = ReceitaItemEntrega::findOrFail($entregaId);
DB::transaction(function () use ($entrega) {
self::estornar($entrega);
});
return $entrega->fresh();
}
public static function estornar($entrega)
{
$item = $entrega->receitaItem;
AlmoxarifadoService::estornarSaidaItens(collect([
['id' => $entrega->saida_item_id]
]));
$entrega->update(['estornado' => true]);
$entregaPendente = ReceitaItemEntrega::where('receita_item_id', $item->id)
->where('pendente', true)
->first();
if (is_null($entregaPendente)) {
ReceitaItemEntrega::create([
'receita_item_id' => $item->id,
'quantidade' => $entrega->quantidade,
'pendente' => true
]);
}
else {
$entregaPendente->update([
'quantidade' => $entregaPendente->quantidade + $entrega->quantidade
]);
}
$ultimaEntrega = ReceitaItemEntrega::where('receita_item_id', $item->id)
->where('pendente', false)
->where('estornado', false)
->orderByDesc('dispensado_em')
->first();
$proximaRetirada = is_null($ultimaEntrega)
? null
: ReceitaService::getDataProximaRetirada(new Carbon($ultimaEntrega->dispensado_em), [
'material' => [
'quantidade' => $item->material->quantidade,
],
'quantidade' => $item->quantidade,
'intervalo_tempo' => $item->intervalo_tempo,
'intervalo_medida_tempo_id' => $item->intervalo_medida_tempo_id,
'durante_tempo' => $item->durante_tempo,
'continuo' => false,
'prescrito' => $item->prescrito,
'entregue' => $ultimaEntrega->quantidade,
]);
$item->update(['proxima_retirada' => $proximaRetirada]);
}
}

View File

@@ -0,0 +1,669 @@
<?php
namespace App\Services\Farmacia;
use App\Enums\Administracao\Modulo;
use App\Enums\PainelSenha\Status;
use App\Events\PainelSenha\FilaEvent;
use App\Models\Cadastro\Estabelecimento\CentroCusto;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Models\PainelSenha\CentroCustoCompartilhado;
use App\Models\PainelSenha\Fila;
use App\Models\PainelSenha\OpcaoEntrada;
use App\Models\PainelSenha\Prioridade;
use App\Services\Administracao\ModuloService;
use App\Services\Geral\AgeService;
use App\Services\Imunizacao\FilaAtendimentoService AS ImunizacaoFilaAtendimentoService;
use App\Services\PainelSenha\FilaAtendimentoService AS PainelSenhaFilaAtendimentoService;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class FilaAtendimentoService extends Service
{
public static function index($centroCusto = null)
{
$centroCusto = $centroCusto ?? self::getCurrentCentroCusto();
return DB::table('painel_senha_fila')
->select([
'painel_senha_fila.id',
'painel_senha_opcao_entrada.id AS opcao_entrada_id',
'painel_senha_opcao_entrada.nome AS opcao_entrada_nome',
'painel_senha_opcao_entrada_destino.id AS opcao_entrada_destino_id',
'painel_senha_status.id AS status_id',
'painel_senha_status.nome AS status_nome',
'painel_senha_prioridade.id AS prioridade_id',
'painel_senha_prioridade.nome AS prioridade_nome',
'cadastro_paciente.id AS paciente_id',
'cadastro_cidadao.nome AS paciente_nome',
DB::raw("DATE_FORMAT(cadastro_cidadao.data_nascimento, '%d/%m/%Y') AS paciente_data_nascimento"),
DB::raw("LPAD(cadastro_paciente.prontuario, 6, '0') AS paciente_prontuario"),
DB::raw("CONCAT(painel_senha_opcao_entrada.sigla, painel_senha_fila.senha) AS senha"),
DB::raw("DATE_FORMAT(painel_senha_fila.created_at, '%H:%i') AS horario_chegada"),
'painel_senha_fila.emitido_em',
])
->addSelect([
'chamadas' => function ($query) {
$query->select(DB::raw("COALESCE(COUNT(painel_senha_chamada.id), 0)"))
->from('painel_senha_chamada')
->whereColumn('painel_senha_chamada.fila_id', 'painel_senha_fila.id')
->whereColumn('painel_senha_chamada.status_id', 'painel_senha_fila.status_id');
},
])
->join('painel_senha_opcao_entrada', 'painel_senha_opcao_entrada.id', 'painel_senha_fila.opcao_entrada_id')
->join('painel_senha_status', 'painel_senha_status.id', 'painel_senha_fila.status_id')
->leftJoin('painel_senha_prioridade', 'painel_senha_prioridade.id', 'painel_senha_fila.prioridade_id')
->leftJoin('cadastro_paciente', 'cadastro_paciente.id', 'painel_senha_fila.paciente_id')
->leftJoin('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->leftJoin('painel_senha_opcao_entrada AS painel_senha_opcao_entrada_destino', 'painel_senha_opcao_entrada_destino.id', 'painel_senha_fila.opcao_entrada_destino_id')
->whereNull('painel_senha_fila.deleted_at')
->where('painel_senha_fila.evadido', false)
->where('painel_senha_fila.finalizado', false)
->where(fn ($q) => $q
->where(fn ($q) => $q
->whereNull('painel_senha_fila.opcao_entrada_destino_id')
->where('painel_senha_opcao_entrada.modulo_id', ModuloService::getId(Modulo::FARMACIA))
->where(fn ($q) => $q
->where('painel_senha_opcao_entrada.centro_custo_id', $centroCusto->id)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('painel_senha_centro_custo_compartilhado')
->where('painel_senha_centro_custo_compartilhado.centro_custo_id', $centroCusto->id)
->whereColumn('painel_senha_centro_custo_compartilhado.opcao_entrada_id', 'painel_senha_opcao_entrada.id')
)
)
)
->orWhere(fn ($q) => $q
->whereNotNull('painel_senha_fila.opcao_entrada_destino_id')
->where('painel_senha_opcao_entrada_destino.modulo_id', ModuloService::getId(Modulo::FARMACIA))
->where(fn ($q) => $q
->where('painel_senha_opcao_entrada_destino.centro_custo_id', $centroCusto->id)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('painel_senha_centro_custo_compartilhado')
->where('painel_senha_centro_custo_compartilhado.centro_custo_id', $centroCusto->id)
->whereColumn('painel_senha_centro_custo_compartilhado.opcao_entrada_id', 'painel_senha_opcao_entrada_destino.id')
)
)
)
)
->orderByDesc('painel_senha_prioridade.grau')
->orderBy('painel_senha_fila.atualizado_em')
->get()
->map(function($query) {
$query->tempo_espera = self::getTempoEspera($query->id);
$query->paciente_idade = isset($query->paciente_data_nascimento) ? AgeService::getFormattedAge(Carbon::createFromFormat('d/m/Y', $query->paciente_data_nascimento)) : null;
return $query;
});
}
public static function create()
{
return [
'form' => [
'opcoes_entrada' => self::getOpcoesEntrada(),
'prioridades' => self::getPrioridades(),
],
'model' => [
'paciente_id' => null,
'opcao_entrada_id' => null,
'prioridade_id' => null,
],
];
}
public static function createEncaminhamento($filaId)
{
$fila = Fila::findOrFail($filaId);
return [
'form' => [
'modulos_encaminhamento' => self::getModulosEncaminhamento($fila),
'centros_custo_encaminhamento' => [],
'opcoes_entrada_encaminhamento' => [],
'prioridades' => Prioridade::orderBy('nome')->get(['id', 'nome']),
],
'model' => [
'modulo_encaminhamento_id' => null,
'centro_custo_encaminhamento_id' => null,
'opcao_entrada_encaminhamento_id' => null,
'prioridade_id' => $fila->prioridade_id ?? null,
],
];
}
public static function listEncaminhamento()
{
$params = (object) request()->all();
switch (request()->listar) {
case 'centros-custo-encaminhamento': {
return [
'centros_custo_encaminhamento' => self::getCentrosCustoEncaminhamento($params),
'opcoes_entrada_encaminhamento' => [],
];
}
case 'opcoes-entrada-encaminhamento': {
return [
'opcoes_entrada_encaminhamento' => self::getOpcoesEntradaEncaminhamento($params),
];
}
}
}
private static function getModulosEncaminhamento($fila)
{
return DB::table('administracao_modulo AS modulo')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('painel_senha_opcao_entrada AS opcao_entrada')
->join(
'painel_senha_opcao_entrada_destino AS opcao_entrada_destino',
'opcao_entrada_destino.opcao_entrada_destino_id',
'opcao_entrada.id'
)
->whereColumn('opcao_entrada.modulo_id', 'modulo.id')
->where('opcao_entrada_destino.opcao_entrada_origem_id', $fila->opcaoEntradaAtual->id)
)
->select(
'modulo.id',
'modulo.nome'
)
->orderBy('modulo.nome')
->get();
}
private static function getCentrosCustoEncaminhamento($params)
{
return DB::table('cadastro_centro_custo AS centro_custo')
->join('cadastro_setor AS setor', 'setor.id', 'centro_custo.setor_id')
->whereExists(fn ($q) => $q
->selectRaw(1)
->from('painel_senha_opcao_entrada AS opcao_entrada')
->join(
'painel_senha_opcao_entrada_destino AS opcao_entrada_destino',
'opcao_entrada_destino.opcao_entrada_destino_id',
'opcao_entrada.id'
)
->whereColumn('opcao_entrada.centro_custo_id', 'centro_custo.id')
->where('opcao_entrada_destino.opcao_entrada_origem_id', $params->opcao_entrada_origem_id)
->where('opcao_entrada.modulo_id', $params->modulo_id)
)
->select(
'centro_custo.id',
'setor.nome AS setor_nome'
)
->orderBy('setor.nome')
->get();
}
private static function getOpcoesEntradaEncaminhamento($params)
{
return DB::table('painel_senha_opcao_entrada AS opcao_entrada')
->join(
'painel_senha_opcao_entrada_destino AS opcao_entrada_destino',
'opcao_entrada_destino.opcao_entrada_destino_id',
'opcao_entrada.id'
)
->where('opcao_entrada_destino.opcao_entrada_origem_id', $params->opcao_entrada_origem_id)
->where('opcao_entrada.modulo_id', $params->modulo_id)
->where('opcao_entrada.centro_custo_id', $params->centro_custo_id)
->select(
'opcao_entrada.id',
'opcao_entrada.nome',
'opcao_entrada.prioridade_obrigatoria'
)
->orderBy('opcao_entrada.nome')
->get();
}
public static function store()
{
self::validateStore();
$centroCusto = self::getCurrentCentroCusto();
$senha = (
Fila::where('opcao_entrada_id', request()->opcao_entrada_id)
->whereRaw('emitido_em = CURRENT_DATE')
->max('senha') ?? 0
) + 1;
$fila = Fila::create([
'paciente_id' => request()->paciente_id,
'centro_custo_id' => $centroCusto->id,
'opcao_entrada_id' => request()->opcao_entrada_id,
'prioridade_id' => request()->prioridade_id,
'status_id' => Status::EM_ESPERA,
'senha' => $senha,
]);
self::dispatch($fila->opcaoEntradaAtual->id, $fila->centro_custo_id);
return [$fila, Response::HTTP_CREATED];
}
public static function edit($id)
{
$fila = Fila::findOrFail($id);
return [
'form' => [
'opcoes_entrada' => self::getOpcoesEntrada(),
'prioridades' => self::getPrioridades(),
],
'model' => [
'id' => $fila->id,
'paciente' => $fila->paciente ? [
'id' => $fila->paciente->id,
'nome' => $fila->paciente->cidadao->nome,
'cns' => $fila->paciente->cidadao->cns,
] : null,
'opcao_entrada_id' => $fila->opcao_entrada_id,
'prioridade_id' => $fila->prioridade_id,
],
];
}
public static function update($id)
{
self::validateUpdate();
$fila = Fila::findOrFail($id);
$fila->update([
'paciente_id' => request()->paciente_id,
'prioridade_id' => request()->prioridade_id,
]);
self::dispatch($fila->opcaoEntradaAtual->id, $fila->centro_custo_id);
return $fila->fresh();
}
public static function list()
{
return [
'form' => [
'tempos_espera' => self::getTemposEspera(),
'opcoes_entrada' => self::getOpcoesEntrada(),
'prioridades' => self::getPrioridades(),
'status' => self::getStatus(),
'salas' => self::getSalas(),
'telas' => self::getTelas(),
],
'model' => [
'tempo_espera_id' => null,
'opcao_entrada_id' => null,
'prioridade_id' => null,
'status_id' => Status::EM_ESPERA,
'fila' => self::index(),
],
];
}
public static function autocompletePaciente()
{
return DB::table('cadastro_paciente')
->select([
'cadastro_paciente.id',
'cadastro_cidadao.nome',
'cadastro_cidadao.cns',
])
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id');
}
public static function evade($id)
{
$fila = Fila::findOrFail($id);
self::validateEvade();
$fila->update([
'evadido' => true,
'motivo_evasao' => request()->motivo,
'motivo_cancelamento_evasao' => null,
'finalizado' => true,
]);
self::dispatch($fila->opcaoEntradaAtual->id, $fila->centro_custo_id);
}
public static function answer($id)
{
$fila = Fila::findOrFail($id);
$fila->update(['status_id' => Status::EM_ATENDIMENTO]);
self::dispatch($fila->opcaoEntradaAtual->id, $fila->centro_custo_id);
}
public static function sendBack($id)
{
$fila = Fila::findOrFail($id);
$fila->update(['status_id' => Status::EM_ESPERA]);
self::dispatch($fila->opcaoEntradaAtual->id, $fila->centro_custo_id);
}
public static function forward($id)
{
$fila = Fila::findOrFail($id);
self::validateForward();
$opcaoEntradaFrom = $fila->opcaoEntradaAtual;
$centroCustoFrom = CentroCusto::findOrFail($fila->centro_custo_id);
$opcaoEntradaTo = OpcaoEntrada::findOrFail(request()->opcao_entrada_encaminhamento_id);
$centroCustoTo = $opcaoEntradaTo->centroCusto;
$fila->update([
'centro_custo_id' => $centroCustoTo->id,
'opcao_entrada_destino_id' => $opcaoEntradaTo->id,
'prioridade_id' => request()->prioridade_id,
'status_id' => Status::EM_ESPERA,
]);
self::dispatch($opcaoEntradaFrom->id, $centroCustoFrom->id);
if ($opcaoEntradaTo->modulo_id === ModuloService::getId(Modulo::PAINEL_SENHA)) {
PainelSenhaFilaAtendimentoService::dispatch($opcaoEntradaTo->id, $centroCustoTo->id);
}
else if ($opcaoEntradaTo->modulo_id === ModuloService::getId(Modulo::FARMACIA)) {
self::dispatch($opcaoEntradaTo->id, $centroCustoTo->id);
}
else if ($opcaoEntradaTo->modulo_id === ModuloService::getId(Modulo::IMUNIZACAO)) {
ImunizacaoFilaAtendimentoService::dispatch($opcaoEntradaTo->id, $centroCustoTo->id);
}
}
public static function finalize($id)
{
$fila = Fila::findOrFail($id);
$fila->update(['finalizado' => true]);
self::dispatch($fila->opcaoEntradaAtual->id, $fila->centro_custo_id);
}
public static function dispatch($opcaoEntradaId, $centroCustoId)
{
$centroCusto = CentroCusto::findOrFail($centroCustoId);
FilaEvent::dispatch(
$centroCusto->setor->tipo_id,
$centroCusto->id,
Modulo::FARMACIA,
self::index($centroCusto)
);
CentroCustoCompartilhado::where('opcao_entrada_id', $opcaoEntradaId)
->get()
->each(function ($item) {
$centroCusto = CentroCusto::findOrFail($item->centro_custo_id);
FilaEvent::dispatch(
$centroCusto->setor->tipo_id,
$centroCusto->id,
Modulo::FARMACIA,
self::index($centroCusto)
);
});
CentroCustoCompartilhado::where('centro_custo_id', $centroCustoId)
->get()
->each(function ($item) {
$centroCusto = OpcaoEntrada::findOrFail($item->opcao_entrada_id)->centroCusto;
FilaEvent::dispatch(
$centroCusto->setor->tipo_id,
$centroCusto->id,
Modulo::FARMACIA,
self::index($centroCusto)
);
});
}
private static function validateStore()
{
request()->validate([
'paciente_id' => [
'nullable',
'integer',
Rule::exists(Paciente::class, 'id'),
],
'opcao_entrada_id' => [
'required',
'integer',
Rule::exists(OpcaoEntrada::class, 'id'),
],
'prioridade_id' => [
'nullable',
Rule::requiredIf(fn () => OpcaoEntrada::find(request()->opcao_entrada_id)
->prioridade_obrigatoria ?? false
),
Rule::exists(Prioridade::class, 'id'),
],
]);
}
private static function validateUpdate()
{
request()->validate([
'paciente_id' => [
'required',
'integer',
Rule::exists(Paciente::class, 'id'),
],
'prioridade_id' => [
'nullable',
Rule::requiredIf(fn () => OpcaoEntrada::find(request()->opcao_entrada_id)
->prioridade_obrigatoria ?? false
),
Rule::exists(Prioridade::class, 'id'),
],
]);
}
private static function validateForward()
{
request()->validate([
'opcao_entrada_encaminhamento_id' => [
'required',
'integer',
Rule::exists(OpcaoEntrada::class, 'id'),
],
'prioridade_id' => [
'nullable',
Rule::requiredIf(fn () => OpcaoEntrada::find(request()->opcao_entrada_encaminhamento_id)
->prioridade_obrigatoria ?? false
),
Rule::exists(Prioridade::class, 'id'),
],
]);
}
private static function validateEvade()
{
request()->validate([
'motivo' => [
'nullable',
'string',
'max:500',
],
]);
}
private static function getTempoEspera($filaId)
{
$tempoEsperaTotal = DB::table('painel_senha_fila_historico')
->select(
'painel_senha_fila_historico.created_at',
'painel_senha_status.id AS status_id'
)
->join('painel_senha_status', 'painel_senha_status.id', 'painel_senha_fila_historico.status_id')
->where('painel_senha_fila_historico.fila_id', $filaId)
->distinct()
->get()
->reduce(function ($count, $query) use ($filaId) {
if ($query->status_id === Status::EM_ESPERA) {
$proximo = DB::table('painel_senha_fila_historico')
->where('fila_id', $filaId)
->where('created_at', '>', $query->created_at)
->select('created_at')
->first();
return $count + Carbon::create($query->created_at)->diffInMinutes($proximo->created_at ?? Carbon::now());
}
return $count;
}, 1);
$centroCustoLogado = self::getCurrentCentroCusto();
$tempoEspera = DB::table('painel_senha_tempo_espera')
->select(
'id',
'cor'
)
->whereNull('deleted_at')
->where('tempo', '<=', $tempoEsperaTotal)
->where('infraestrutura_id', $centroCustoLogado->infraestrutura_id)
->orderByDesc('tempo')
->first();
if (is_null($tempoEspera)) {
$tempoEspera = DB::table('painel_senha_tempo_espera')
->select(
'id',
'cor'
)
->whereNull('deleted_at')
->where('tempo', '>=', $tempoEsperaTotal)
->where('infraestrutura_id', $centroCustoLogado->infraestrutura_id)
->orderBy('tempo')
->first();
}
$tempoEsperaTotal = Carbon::now()->subMinutes($tempoEsperaTotal)->diff(Carbon::now());
return [
'id' => $tempoEspera->id ?? null,
'cor' => $tempoEspera->cor ?? null,
'total' => [
'dias' => (int) $tempoEsperaTotal->format('%d') > 0 ? (int) $tempoEsperaTotal->format('%d') : null,
'horas' => (int) $tempoEsperaTotal->format('%h') ?? null,
'minutos' => (int) $tempoEsperaTotal->format('%i') ?? null,
],
];
}
private static function getTemposEspera()
{
return DB::table('painel_senha_tempo_espera')
->select([
'painel_senha_tempo_espera.id',
DB::raw("CONCAT(painel_senha_tempo_espera.tempo, ' MINUTO(S)') AS minutos"),
])
->whereNull('painel_senha_tempo_espera.deleted_at')
->whereExists(fn ($q) => $q->select(DB::raw(1))
->from('cadastro_infraestrutura')
->whereNull('cadastro_infraestrutura.deleted_at')
->whereExists(fn ($q) => $q->select(DB::raw(1))
->from('cadastro_centro_custo')
->whereNull('cadastro_centro_custo.deleted_at')
->where('cadastro_centro_custo.id', self::getCurrentCentroCusto()->id)
->whereColumn('cadastro_centro_custo.infraestrutura_id', 'cadastro_infraestrutura.id')
)
->whereColumn('cadastro_infraestrutura.id', 'painel_senha_tempo_espera.infraestrutura_id')
)
->orderBy('painel_senha_tempo_espera.tempo')
->get();
}
private static function getOpcoesEntrada()
{
$centroCusto = self::getCurrentCentroCusto();
return DB::table('painel_senha_opcao_entrada')
->select([
'painel_senha_opcao_entrada.id',
'painel_senha_opcao_entrada.nome',
'painel_senha_opcao_entrada.prioridade_obrigatoria',
])
->whereNull('painel_senha_opcao_entrada.deleted_at')
->where('painel_senha_opcao_entrada.modulo_id', ModuloService::getId(Modulo::FARMACIA))
->where(fn ($q) => $q->where('painel_senha_opcao_entrada.centro_custo_id', $centroCusto->id)
->orWhereExists(fn ($q) => $q->select(DB::raw(1))
->from('painel_senha_centro_custo_compartilhado')
->where('painel_senha_centro_custo_compartilhado.centro_custo_id', $centroCusto->id)
->whereColumn('painel_senha_centro_custo_compartilhado.opcao_entrada_id', 'painel_senha_opcao_entrada.id')
)
)
->orderBy('painel_senha_opcao_entrada.nome')
->get();
}
private static function getPrioridades()
{
return DB::table('painel_senha_prioridade')
->select([
'painel_senha_prioridade.id',
'painel_senha_prioridade.nome',
])
->orderBy('painel_senha_prioridade.nome')
->get();
}
private static function getStatus()
{
return DB::table('painel_senha_status')
->select([
'id',
'nome',
])
->orderBy('painel_senha_status.nome')
->get();
}
private static function getSalas()
{
return DB::table('cadastro_sala')
->select([
'cadastro_sala.id',
'cadastro_sala.nome',
])
->whereNull('cadastro_sala.deleted_at')
->where('centro_custo_id', self::getCurrentCentroCusto()->id)
->orderBy('cadastro_sala.nome')
->get();
}
private static function getTelas()
{
return DB::table('painel_senha_tela')
->select([
'painel_senha_tela.id',
'painel_senha_tela.nome',
])
->whereNull('painel_senha_tela.deleted_at')
->whereExists(fn ($q) => $q->select(DB::raw(1))
->from('painel_senha_opcao_chamada')
->whereNull('painel_senha_opcao_chamada.deleted_at')
->where('painel_senha_opcao_chamada.centro_custo_id', self::getCurrentCentroCusto()->id)
->whereColumn('painel_senha_opcao_chamada.tela_id', 'painel_senha_tela.id')
)
->orderBy('painel_senha_tela.nome')
->get();
}
}

View File

@@ -0,0 +1,164 @@
<?php
namespace App\Services\Farmacia;
use App\Enums\Cadastro\Material\LivroRegistro as LivroRegistroEnum;
use App\Enums\Cadastro\Material\LivroRegistroTipo as LivroRegistroTipoEnum;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\Farmacia\Livro;
use App\Models\Farmacia\LivroPagina;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class LivroPsicotropicoService extends Service
{
public static $livroRegistroIds = [
LivroRegistroEnum::ENTORPECENTES,
LivroRegistroEnum::PSICOTROPICOS,
LivroRegistroEnum::CONTROLE_ESPECIAL,
LivroRegistroEnum::IMUNOSSUPRESSORES,
LivroRegistroEnum::ANTI_RETROVIRAIS,
LivroRegistroEnum::ANABOLIZANTE,
LivroRegistroEnum::ANTIMICROBIANOS,
];
public static $livroRegistroTipoIds = [
LivroRegistroTipoEnum::A1,
LivroRegistroTipoEnum::A2,
LivroRegistroTipoEnum::A3,
LivroRegistroTipoEnum::B1,
LivroRegistroTipoEnum::B2,
LivroRegistroTipoEnum::C1,
LivroRegistroTipoEnum::C2,
LivroRegistroTipoEnum::C3,
LivroRegistroTipoEnum::C4,
LivroRegistroTipoEnum::C5,
];
public static function datatable()
{
return LivroService::datatable(self::$livroRegistroIds, self::$livroRegistroTipoIds, true);
}
public static function list()
{
return LivroService::list(self::$livroRegistroIds, self::$livroRegistroTipoIds, true);
}
public static function create()
{
return LivroService::create(self::$livroRegistroIds, self::$livroRegistroTipoIds);
}
public static function edit($id)
{
$livro = Livro::findOrFail($id);
return LivroService::edit($livro, self::$livroRegistroIds, self::$livroRegistroTipoIds);
}
public static function getLinhas($paginaId)
{
$pagina = LivroPagina::findOrFail($paginaId);
return LivroService::getLinhas($pagina);
}
public static function store()
{
self::validate();
$livro = null;
DB::transaction(function () use (&$livro) {
$livro = LivroService::store(self::getStoreParams());
});
return $livro;
}
private static function getStoreParams()
{
$params = request()->except(['numero', 'status_id']);
$params['aberto_em'] = Carbon::createFromFormat('d/m/Y', $params['aberto_em']);
return $params;
}
public static function update($id)
{
$livro = Livro::findOrFail($id);
DB::transaction(function () use ($livro) {
LivroService::updateMovimentacoes($livro);
});
return $livro;
}
public static function fecharLivro($id)
{
$livro = Livro::findOrFail($id);
DB::transaction(function () use ($livro) {
LivroService::fecharLivro($livro);
});
return $livro->fresh();
}
public static function validate()
{
$rules = [
'aberto_em' => [
'required',
'date_format:d/m/Y'
],
'livro_registro_id' => [
'required',
'integer',
Rule::in(self::$livroRegistroIds),
],
'livro_registro_tipo_id' => [
'nullable',
Rule::requiredIf(fn () => request()->livro_registro_id !== LivroRegistroEnum::ANTIMICROBIANOS),
'integer',
Rule::in(self::$livroRegistroTipoIds),
],
'quantidade_paginas' => [
'required',
'integer',
'between:1,999',
],
'registro' => [
'required',
'string',
'max:100',
],
'usuario_farmaceutico_id' => [
'required',
'integer',
Rule::exists(Usuario::class, 'id'),
],
'inscricao_estadual' => [
'nullable',
'digits_between:8,14',
],
'autoridade_sanitaria' => [
'required',
'string',
'max:100',
],
];
$messages = [];
request()->validate($rules, $messages);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,149 @@
<?php
namespace App\Services\Farmacia;
use App\Enums\Cadastro\Material\LivroRegistro as LivroRegistroEnum;
use App\Enums\Cadastro\Material\LivroRegistroTipo as LivroRegistroTipoEnum;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\Farmacia\Livro;
use App\Models\Farmacia\LivroPagina;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class LivroTalidomidaService extends Service
{
private static $livroRegistroIds = [
LivroRegistroEnum::TALIDOMIDA,
];
private static $livroRegistroTipoIds = [
LivroRegistroTipoEnum::A_BASE,
LivroRegistroTipoEnum::ESPECIFICO,
];
public static function datatable()
{
return LivroService::datatable(self::$livroRegistroIds, self::$livroRegistroTipoIds);
}
public static function list()
{
return LivroService::list(self::$livroRegistroIds, self::$livroRegistroTipoIds);
}
public static function create()
{
return LivroService::create(self::$livroRegistroIds, self::$livroRegistroTipoIds);
}
public static function edit($id)
{
$livro = Livro::findOrFail($id);
return LivroService::edit($livro, self::$livroRegistroIds, self::$livroRegistroTipoIds);
}
public static function getLinhas($paginaId)
{
$pagina = LivroPagina::findOrFail($paginaId);
return LivroService::getLinhas($pagina);
}
public static function store()
{
self::validate();
$livro = null;
DB::transaction(function () use (&$livro) {
$livro = LivroService::store(self::getStoreParams());
});
return $livro;
}
private static function getStoreParams()
{
$params = request()->except(['numero', 'status_id']);
$params['aberto_em'] = Carbon::createFromFormat('d/m/Y', $params['aberto_em']);
return $params;
}
public static function update($id)
{
$livro = Livro::findOrFail($id);
DB::transaction(function () use ($livro) {
LivroService::updateMovimentacoes($livro);
});
return $livro;
}
public static function fecharLivro($id)
{
$livro = Livro::findOrFail($id);
DB::transaction(function () use ($livro) {
LivroService::fecharLivro($livro);
});
return $livro->fresh();
}
public static function validate()
{
$rules = [
'aberto_em' => [
'required',
'date_format:d/m/Y'
],
'livro_registro_id' => [
'required',
'integer',
Rule::in(self::$livroRegistroIds),
],
'livro_registro_tipo_id' => [
'required',
'integer',
Rule::in(self::$livroRegistroTipoIds),
],
'quantidade_paginas' => [
'required',
'integer',
'between:1,999',
],
'registro' => [
'required',
'string',
'max:100',
],
'usuario_farmaceutico_id' => [
'required',
'integer',
Rule::exists(Usuario::class, 'id'),
],
'inscricao_estadual' => [
'nullable',
'digits_between:8,14',
],
'autoridade_sanitaria' => [
'required',
'string',
'max:100',
],
];
$messages = [];
request()->validate($rules, $messages);
}
}

View File

@@ -0,0 +1,109 @@
<?php
namespace App\Services\Farmacia;
use App\Models\Farmacia\ParametrizacaoAppCidadao;
use App\Models\Farmacia\ParametrizacaoDispensacao;
use App\Models\Farmacia\ParametrizacaoMedicamentoSupervisor;
use App\Models\Farmacia\ParametrizacaoPosologia;
use App\Models\Farmacia\ParametrizacaoLimitePrescricaoMedicamento;
use App\Services\Service;
use Illuminate\Support\Facades\DB;
class ParametrizacaoService extends Service
{
public static function create()
{
$medicamentoSupervisor = ParametrizacaoMedicamentoSupervisor::first();
$parametrizacaoPosologia = ParametrizacaoPosologia::first();
$parametrizacaoDispensacao = ParametrizacaoDispensacao::first();
$limitePrescricaoMedicamento = ParametrizacaoLimitePrescricaoMedicamento::first();
$appCidadao = ParametrizacaoAppCidadao::first();
return [
'medicamento_supervisor' => [
'dispensar' => $medicamentoSupervisor->dispensar ?? false,
],
'posologia' => [
'is_obrigatorio' => $parametrizacaoPosologia->is_obrigatorio ?? false,
],
'dispensacao' => [
'prazo_receita_dias' => $parametrizacaoDispensacao->prazo_receita_dias ?? null,
'utiliza_solicitacao_medicamentos_ambulatorio' => $parametrizacaoDispensacao->utiliza_solicitacao_medicamentos_ambulatorio ?? false,
],
'limite_prescricao_medicamento' => [
'limite_dias' => $limitePrescricaoMedicamento->limite_dias ?? null
],
'app_cidadao' => [
'permite_envio_receitas_medicas' => $appCidadao->permite_envio_receitas_medicas ?? false,
],
];
}
public static function store()
{
self::validate();
DB::transaction(function () {
ParametrizacaoMedicamentoSupervisor::updateOrCreate(
['id' => ParametrizacaoMedicamentoSupervisor::first()->id ?? null],
request()->medicamento_supervisor,
);
ParametrizacaoPosologia::updateOrCreate(
['id' => ParametrizacaoPosologia::first()->id ?? null],
request()->posologia,
);
ParametrizacaoDispensacao::updateOrCreate(
['id' => ParametrizacaoDispensacao::first()->id ?? null],
request()->dispensacao,
);
ParametrizacaoAppCidadao::updateOrCreate(
['id' => ParametrizacaoAppCidadao::first()->id ?? null],
request()->app_cidadao,
);
if (is_null(request()->limite_prescricao_medicamento['limite_dias'])) {
$limitePrescricao = ParametrizacaoLimitePrescricaoMedicamento::first();
if (!is_null($limitePrescricao)) {
$limitePrescricao->delete();
}
} else {
ParametrizacaoLimitePrescricaoMedicamento::updateOrCreate(
['id' => ParametrizacaoLimitePrescricaoMedicamento::first()->id ?? null],
request()->limite_prescricao_medicamento,
);
}
});
}
public static function validate()
{
$rules = [
'dispensacao.prazo_receita_dias' => [
'nullable',
'integer',
'max:999',
],
'dispensacao.utiliza_solicitacao_medicamentos_ambulatorio' => [
'required',
'boolean',
],
'limite_prescricao_medicamento.limite_dias' => [
'nullable',
'integer',
'max:730',
],
'app_cidadao.permite_envio_receitas_medicas' => [
'required',
'boolean',
],
];
$messages = [];
request()->validate($rules, $messages);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -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();
}
}

View File

@@ -0,0 +1,303 @@
<?php
namespace App\Services\Farmacia;
use App\Enums\Farmacia\AltoCusto\ProcessoItemMesStatus;
use App\Models\Cadastro\Estabelecimento\CentroCusto;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Sigtap\Cid;
use App\Services\Service;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class RelatorioAltoCustoEstatisticoCidService extends Service
{
public static function index()
{
$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)
];
$totalizadores = (object) ['quantidade_processos' => 0];
$meses = DB::table('farmacia_alto_custo_processo as processo')
->join(
'cadastro_centro_custo as centro_custo',
'centro_custo.id',
'processo.created_centro_custo_id'
)
->join(
'cadastro_infraestrutura as infraestrutura',
'infraestrutura.id',
'centro_custo.infraestrutura_id'
)
->join(
'sigtap.cid as cid',
'cid.id',
'processo.cid_id'
)
->whereBetween('processo.solicitado_em', $periodo)
->when(request()->unidade_id, fn ($q, $id) => $q->where('infraestrutura.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))
->select(DB::raw("
DATE_FORMAT(processo.solicitado_em, '%m/%Y') as mes_ano,
cid.codigo as cid_codigo,
cid.nome as cid_nome,
COUNT(processo.id) as quantidade_processos
"))
->groupBy(DB::raw("
DATE_FORMAT(processo.solicitado_em, '%m/%Y'),
cid.codigo,
cid.nome
"))
->get();
$meses->each(function ($mes) use ($totalizadores) {
$mes->cid = MaskUtil::getCidMasked($mes->cid_codigo) . " - {$mes->cid_nome}";
unset($mes->cid_codigo, $mes->cid_nome);
$totalizadores->quantidade_processos += $mes->quantidade_processos;
});
return compact('meses', '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'] = $params->unidade_id = $unidadesData['model'];
},
'infraestrutura' => function () use ($data, $params) {
$infraestruturasData = self::getInfraestruturasData($params);
$data->form['infraestruturas'] = $infraestruturasData['form'];
$data->model['infraestrutura_id'] = $params->infraestrutura_id = $infraestruturasData['model'];
},
'centro_custo' => function () use ($data, $params) {
$centrosCustoData = self::getCentrosDeCustoData($params);
$data->form['centros_custo'] = $centrosCustoData['form'];
$data->model['centro_custo_id'] = $params->centro_custo_id = $centrosCustoData['model'];
},
'cid' => function () use ($data) {
$data->model['cid'] = 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 = (object) request()->only([
'periodo',
'unidade_id',
'infraestrutura_id',
'centro_custo_id',
'cid_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;
}
return $params;
}
private static function getUnidadesData($params)
{
$unidades = collect();
$id = null;
if (!is_null($params->periodo)) {
$unidades = Unidade::setEagerLoads([])
->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::setEagerLoads([])
->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::setEagerLoads([])
->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()->setEagerLoads([])->first(['nome'])->nome
])
->sortBy('setor_nome')
->values();
}
return ['form' => $centrosCusto, 'model' => $id];
}
private static function setWhereForFilterCentroCusto($query, $params)
{
return $query->whereHas('farmaciaAltoCustoProcessos', fn ($q) => $q
->whereBetween('solicitado_em', $params->periodo)
->whereNotNull('cid_id')
);
}
public static function autocompleteCid()
{
return DB::table('sigtap.cid as cid')
->whereExists(function ($query) {
$params = self::getParams();
$query->select(DB::raw(1))
->from('farmacia_alto_custo_processo as processo')
->join(
'cadastro_centro_custo as centro_custo',
'centro_custo.id',
'processo.created_centro_custo_id'
)
->join(
'cadastro_infraestrutura as infraestrutura',
'infraestrutura.id',
'centro_custo.infraestrutura_id'
)
->whereColumn('processo.cid_id', 'cid.id')
->whereBetween('processo.solicitado_em', $params->periodo)
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('infraestrutura.id', $id))
->when($params->centro_custo_id, fn ($q, $id) => $q->where('centro_custo.id', $id));
})
->select(DB::raw("
cid.id,
cid.codigo,
cid.nome
"));
}
public static function getPrintExportData()
{
$resultado = self::index();
$itens = $resultado['meses'];
$unidade = Unidade::find(request()->unidade_id);
$infraestrutura = Infraestrutura::find(request()->infraestrutura_id);
$centroCusto = CentroCusto::find(request()->centro_custo_id);
$cid = Cid::find(request()->cid_id);
if (!is_null($cid)) {
$cid = MaskUtil::getCidMasked($cid->codigo) . " - {$cid->nome}";
}
return [
'inicio' => request()->periodo['start'],
'fim' => request()->periodo['end'],
'unidade' => $unidade->nome_fantasia ?? 'Todas',
'infraestrutura' => $infraestrutura->nome ?? 'Todos',
'setor' => $centroCusto->setor->nome ?? 'Todos',
'cid' => $cid ?? 'Todos',
'colunas' => collect(request()->selectedColumns),
'itens' => $itens,
'totalizadores' => $resultado['totalizadores']
];
}
}

View File

@@ -0,0 +1,406 @@
<?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\Material\Material;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Services\Cadastro\Material\MaterialService;
use App\Services\Service;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class RelatorioAltoCustoProcessoPacienteService extends Service
{
public static function index()
{
$pacientes = collect();
$retiradas = DB::table('farmacia_alto_custo_processo_item_mes as mes')
->join(
'farmacia_alto_custo_processo_item as item',
'item.id',
'mes.item_id'
)
->join(
'cadastro_material as material',
'material.id',
'item.material_id'
)
->join(
'cadastro_apresentacao as apresentacao',
'apresentacao.id',
'material.apresentacao_id'
)
->join(
'farmacia_alto_custo_processo as processo',
'processo.id',
'item.processo_id'
)
->join(
'cadastro_centro_custo as centro_custo',
'centro_custo.id',
'processo.created_centro_custo_id'
)
->join(
'cadastro_infraestrutura as infraestrutura',
'infraestrutura.id',
'centro_custo.infraestrutura_id'
)
->join(
'cadastro_paciente as paciente',
'paciente.id',
'processo.paciente_id'
)
->join(
'cadastro_cidadao as cidadao',
'cidadao.id',
'paciente.cidadao_id'
)
->leftJoin(
'cadastro_unidade_medida as apresentacao_unidade_medida',
'apresentacao_unidade_medida.id',
'material.apresentacao_unidade_medida_id'
)
->leftJoin('cadastro_prontuario_unidade as prontuario_unidade', function ($join) {
$join->on('prontuario_unidade.paciente_id', 'paciente.id')
->where('prontuario_unidade.unidade_id', self::getCurrentCentroCusto()->infraestrutura->unidade_id);
})
->whereNotNull('mes.retirado_paciente_em')
->when(request()->unidade_id, fn ($q, $id) => $q->where('infraestrutura.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()->material_id, fn ($q, $id) => $q->where('item.material_id', $id))
->when(request()->paciente_id, fn ($q, $id) => $q->where('paciente.id', $id))
->select(DB::raw("
paciente.id as paciente_id,
cidadao.nome as paciente_nome,
LPAD(paciente.prontuario, 6, '0') as paciente_prontuario,
prontuario_unidade.prontuario as paciente_prontuario_unidade,
material.id as material_id,
" . MaterialService::getDescricaoCompletaRaw(
'material',
'apresentacao',
'apresentacao_unidade_medida'
) . " as material_descricao,
DATE_FORMAT(mes.retirado_paciente_em, '%d/%m/%Y') as retirado_paciente_em
"))
->orderBy('mes.retirado_paciente_em')
->get()
->each(function ($data) use ($pacientes) {
$paciente = $pacientes->where('id', $data->paciente_id)->first();
if (is_null($paciente)) {
$paciente = (object) [
'id' => $data->paciente_id,
'paciente_nome' => $data->paciente_nome,
'paciente_prontuario' => $data->paciente_prontuario,
'paciente_prontuario_unidade' => $data->paciente_prontuario_unidade,
'materiais' => collect(),
];
$pacientes->push($paciente);
}
$material = $paciente->materiais->where('id', $data->material_id)->first();
if (is_null($material)) {
$material = (object) [
'id' => $data->material_id,
'material_descricao' => $data->material_descricao,
'data_primeira_retirada' => $data->retirado_paciente_em,
'retiradas' => collect(),
];
$paciente->materiais->push($material);
}
$material->retiradas->push($data->retirado_paciente_em);
});
$pacientes->each(fn ($paciente) => $paciente->materiais = $paciente->materiais
->sortBy('material_descricao')->values());
return compact('pacientes');
}
public static function list()
{
$data = (object) [
'form' => [],
'model' => [],
];
$params = self::getParams();
$sets = [
'unidade' => function () use ($data, $params) {
$unidadesData = self::getUnidadesData();
$data->form['unidades'] = $unidadesData['form'];
$data->model['unidade_id'] = $params->unidade_id = $unidadesData['model'];
},
'infraestrutura' => function () use ($data, $params) {
$infraestruturasData = self::getInfraestruturasData($params);
$data->form['infraestruturas'] = $infraestruturasData['form'];
$data->model['infraestrutura_id'] = $params->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'] = $params->centro_custo_id = $centrosDeCustoData['model'];
},
'material' => function () use ($data) {
$data->model['material'] = null;
},
'paciente' => function () use ($data) {
$data->model['paciente'] = null;
},
];
$load = is_null(request()->load_from);
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()
{
return (object) request()->only([
'unidade_id',
'infraestrutura_id',
'centro_custo_id',
'material_id',
]);
}
private static function getUnidadesData()
{
$unidades = Unidade::setEagerLoads([])
->whereHas('infraestruturas', fn ($q) => $q
->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCusto($q))
)
->orderBy('nome_fantasia')
->get(['id', 'nome_fantasia']);
return ['form' => $unidades, 'model' => null];
}
private static function getInfraestruturasData($params)
{
$infraestruturas = collect();
$id = null;
if (!is_null($params->unidade_id)) {
$infraestruturas = Infraestrutura::setEagerLoads([])
->where('unidade_id', $params->unidade_id)
->whereHas('centrosCusto', fn ($q) => self::setWhereForFilterCentroCusto($q))
->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->infraestrutura_id)) {
$centrosCusto = CentroCusto::setEagerLoads([])
->where('infraestrutura_id', $params->infraestrutura_id)
->where(fn ($q) => self::setWhereForFilterCentroCusto($q))
->get(['id', 'setor_id'])
->map(fn ($cc) => [
'id' => $cc->id,
'setor_nome' => $cc->setor()->setEagerLoads([])->first(['nome'])->nome
])
->sortBy('setor_nome')
->values();
}
return ['form' => $centrosCusto, 'model' => $id];
}
private static function setWhereForFilterCentroCusto($query)
{
return $query->whereHas('farmaciaAltoCustoProcessos', fn ($q) => $q
->whereHas('itens', fn ($q) => $q
->whereHas('meses', fn ($q) => $q
->whereNotNull('retirado_paciente_em')
)
)
);
}
public static function autocompleteMaterial()
{
$materiais = DB::table('cadastro_material as material')
->join(
'cadastro_apresentacao as apresentacao',
'apresentacao.id',
'material.apresentacao_id'
)
->leftJoin(
'cadastro_unidade_medida as apresentacao_unidade_medida',
'apresentacao_unidade_medida.id',
'material.apresentacao_unidade_medida_id'
)
->whereExists(function ($query) {
$params = self::getParams();
$query->select(DB::raw(1))
->from('farmacia_alto_custo_processo_item as item')
->join(
'farmacia_alto_custo_processo_item_mes as mes',
'mes.item_id',
'item.id'
)
->join(
'farmacia_alto_custo_processo as processo',
'processo.id',
'item.processo_id'
)
->join(
'cadastro_centro_custo as centro_custo',
'centro_custo.id',
'processo.created_centro_custo_id'
)
->join(
'cadastro_infraestrutura as infraestrutura',
'infraestrutura.id',
'centro_custo.infraestrutura_id'
)
->whereColumn('item.material_id', 'material.id')
->whereNotNull('mes.retirado_paciente_em')
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('infraestrutura.id', $id))
->when($params->centro_custo_id, fn ($q, $id) => $q->where('centro_custo.id', $id));
})
->select(
'material.id',
DB::raw(MaterialService::getDescricaoCompletaRaw(
'material',
'apresentacao',
'apresentacao_unidade_medida'
) . " AS descricao")
);
return $materiais;
}
public static function autocompletePaciente()
{
return DB::table('cadastro_paciente as paciente')
->join(
'cadastro_cidadao as cidadao',
'cidadao.id',
'paciente.cidadao_id'
)
->leftJoin('cadastro_prontuario_unidade as prontuario_unidade', function ($join) {
$join->on('prontuario_unidade.paciente_id', 'paciente.id')
->where('prontuario_unidade.unidade_id', self::getCurrentCentroCusto()->infraestrutura->unidade_id);
})
->whereExists(function ($query) {
$params = self::getParams();
$query->select(DB::raw(1))
->from('farmacia_alto_custo_processo as processo')
->join(
'farmacia_alto_custo_processo_item as item',
'item.processo_id',
'processo.id'
)
->join(
'farmacia_alto_custo_processo_item_mes as mes',
'mes.item_id',
'item.id'
)
->join(
'cadastro_centro_custo as centro_custo',
'centro_custo.id',
'processo.created_centro_custo_id'
)
->join(
'cadastro_infraestrutura as infraestrutura',
'infraestrutura.id',
'centro_custo.infraestrutura_id'
)
->whereColumn('processo.paciente_id', 'paciente.id')
->whereNotNull('mes.retirado_paciente_em')
->when($params->unidade_id, fn ($q, $id) => $q->where('infraestrutura.unidade_id', $id))
->when($params->infraestrutura_id, fn ($q, $id) => $q->where('infraestrutura.id', $id))
->when($params->centro_custo_id, fn ($q, $id) => $q->where('centro_custo.id', $id))
->when($params->material_id, fn ($q, $id) => $q->where('item.material_id', $id));
})
->select(DB::raw("
paciente.id,
cidadao.nome
"));
}
public static function getPrintExportData()
{
$resultado = self::index();
$itens = $resultado['pacientes'];
$unidade = Unidade::find(request()->unidade_id);
$infraestrutura = Infraestrutura::find(request()->infraestrutura_id);
$centroCusto = CentroCusto::find(request()->centro_custo_id);
$material = Material::find(request()->material_id);
$paciente = Paciente::find(request()->paciente_id);
return [
'unidade' => $unidade->nome_fantasia ?? 'Todas',
'infraestrutura' => $infraestrutura->nome ?? 'Todos',
'setor' => $centroCusto->setor->nome ?? 'Todos',
'material' => $material->descricao_completa ?? 'Todos',
'paciente' => $paciente->cidadao->nome ?? 'Todos',
'colunas' => collect(request()->selectedColumns),
'itens' => $itens,
];
}
}

View File

@@ -0,0 +1,599 @@
<?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\SujeitoAtencao\Paciente;
use App\Models\Farmacia\AltoCusto\ProcessoSubtipo;
use App\Models\Farmacia\AltoCusto\ProcessoTipo;
use App\Services\Cadastro\Material\MaterialService;
use App\Services\Service;
use App\Utils\DataUtil;
use App\Utils\MaskUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class RelatorioAltoCustoProcessoService extends Service
{
public static function index()
{
$totalizadores = (object) [
'pacientes' => 0,
'processos' => 0,
'medicamentos' => 0,
];
$processos = collect();
$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_alto_custo_processo_item_mes as mes')
->join(
'farmacia_alto_custo_processo_item as item',
'item.id',
'mes.item_id'
)
->join(
'cadastro_material as material',
'material.id',
'item.material_id'
)
->join(
'cadastro_apresentacao as apresentacao',
'apresentacao.id',
'material.apresentacao_id'
)
->join(
'farmacia_alto_custo_processo as processo',
'processo.id',
'item.processo_id'
)
->join(
'cadastro_centro_custo as centro_custo',
'centro_custo.id',
'processo.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(
'cadastro_paciente as paciente',
'paciente.id',
'processo.paciente_id'
)
->join(
'cadastro_cidadao as cidadao',
'cidadao.id',
'paciente.cidadao_id'
)
->join(
'farmacia_alto_custo_processo_tipo as tipo',
'tipo.id',
'processo.tipo_id'
)
->leftJoin(
'farmacia_alto_custo_processo_subtipo as subtipo',
'subtipo.id',
'processo.subtipo_id'
)
->leftJoin(
'cadastro_unidade_medida as apresentacao_unidade_medida',
'apresentacao_unidade_medida.id',
'material.apresentacao_unidade_medida_id'
)
->leftJoin(
'cadastro_unidade as unidade_referencia',
'unidade_referencia.id',
'paciente.unidade_id'
)
->leftJoin(
'cadastro_domicilio as domicilio',
'domicilio.id',
'cidadao.domicilio_id'
)
->leftJoin(
'cadastro_endereco as endereco',
'endereco.id',
'domicilio.endereco_id'
)
->leftJoin(
'cadastro_logradouro as logradouro',
'logradouro.id',
'endereco.logradouro_id'
)
->leftJoin(
'cadastro_logradouro_tipo as logradouro_tipo',
'logradouro_tipo.id',
'logradouro.tipo_id'
)
->leftJoin(
'cadastro_bairro as bairro',
'bairro.id',
'logradouro.bairro_id'
)
->leftJoin(
'intranet.cadastro_municipio as municipio',
'municipio.id',
'logradouro.municipio_id'
)
->leftJoin(
'intranet.cadastro_estado as estado',
'estado.id',
'municipio.estado_id'
)
->whereBetween('mes.enviado_drs_em', $periodo)
->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()->tipo_id, fn ($q, $id) => $q->where('tipo.id', $id))
->when(request()->subtipo_id, fn ($q, $id) => $q->where('subtipo.id', $id))
->when(request()->paciente_id, fn ($q, $id) => $q->where('paciente.id', $id))
->select(DB::raw("
processo.id as processo_id,
unidade.nome_fantasia as unidade,
COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura,
setor.nome as setor,
paciente.id as paciente_id,
cidadao.nome as paciente_nome,
cidadao.cpf as paciente_cpf,
cidadao.cns as paciente_cns,
unidade_referencia.nome_fantasia as paciente_unidade_referencia,
CONCAT(
logradouro_tipo.descricao,
' ',
logradouro.nome,
', ',
IF(endereco.numero IS NULL, 'S/N', endereco.numero),
' - ',
bairro.nome,
', ',
municipio.nome,
' - ',
estado.uf
) as paciente_endereco,
tipo.nome as tipo,
subtipo.nome as subtipo,
material.id as material_id,
" . MaterialService::getDescricaoCompletaRaw(
'material',
'apresentacao',
'apresentacao_unidade_medida'
) . " as material_descricao,
mes.quantidade_solicitada
"));
$addSortBy = false;
if (collect(['processo.id', 'cidadao.cpf', 'cidadao.cns'])->contains(request()->sortBy)) {
$addSortBy = true;
} else {
self::setOrderBy($dispensacoes);
}
$query = $dispensacoes->get()->each(function ($data) use ($processos, $totalizadores) {
$processo = $processos->where('id', $data->processo_id)->first();
if (is_null($processo)) {
$processo = (object) [
'id' => $data->processo_id,
'unidade' => $data->unidade,
'infraestrutura' => $data->infraestrutura,
'setor' => $data->setor,
'paciente_id' => $data->paciente_id,
'paciente_nome' => $data->paciente_nome,
'paciente_cpf' => MaskUtil::getCpfMasked($data->paciente_cpf),
'paciente_cns' => MaskUtil::getCnsMasked($data->paciente_cns),
'paciente_unidade_referencia' => $data->paciente_unidade_referencia,
'paciente_endereco' => $data->paciente_endereco,
'tipo' => $data->tipo,
'subtipo' => $data->subtipo,
'materiais' => collect(),
];
$processos->push($processo);
}
$material = $processo->materiais->where('id', $data->material_id)->first();
if (is_null($material)) {
$material = (object) [
'id' => $data->material_id,
'material_descricao' => $data->material_descricao,
'quantidade_solicitada' => 0,
];
$processo->materiais->push($material);
$totalizadores->medicamentos++;
}
$material->quantidade_solicitada += $data->quantidade_solicitada;
});
$processos->each(fn ($processo) => $processo->materiais = $processo->materiais
->sortBy('material_descricao')->values());
$totalizadores->processos = $processos->count();
$totalizadores->pacientes = $processos->unique('paciente_id')->values()->count();
if ($addSortBy) {
$dispensacoes = $dispensacoes->sortBy([[
request()->sortBy,
DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc) ? 'desc' : 'asc'
]])->values();
}
return compact('processos', 'totalizadores');
}
private static function setOrderBy($builder)
{
$columns = [
'paciente_nome' => 'cidadao.nome',
'paciente_cpf' => 'cidadao.cpf',
'paciente_cns' => 'cidadao.cns',
'paciente_unidade_referencia' => 'unidade_referencia.nome_fantasia',
'paciente_endereco' => 'paciente_endereco',
'unidade' => 'unidade.nome_fantasia',
'infraestrutura' => 'COALESCE(infraestrutura.nome, unidade.nome_fantasia)',
'tipo' => 'tipo.nome',
'subtipo' => 'subtipo.nome',
'setor' => 'setor.nome',
];
if (is_null(request()->sortBy)) {
$builder->orderByRaw(join(', ', $columns));
return;
}
$column = $columns[request()->sortBy];
$direction = DataUtil::getBooleanValueFromStringBoolean(request()->sortDesc) ? 'DESC' : 'ASC';
unset($columns[request()->sortBy]);
$builder->orderByRaw(
"{$column} {$direction}, " . join(', ', $columns)
);
}
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'] = $params->unidade_id = $unidadesData['model'];
},
'infraestrutura' => function () use ($data, $params) {
$infraestruturasData = self::getInfraestruturasData($params);
$data->form['infraestruturas'] = $infraestruturasData['form'];
$data->model['infraestrutura_id'] = $params->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'] = $params->centro_custo_id = $centrosDeCustoData['model'];
},
'tipo' => function () use ($data, $params) {
$tiposData = self::getTiposData($params);
$data->form['tipos'] = $tiposData['form'];
$data->model['tipo_id'] = $params->tipo_id = $tiposData['model'];
},
'subtipo' => function () use ($data, $params) {
$subtiposData = self::getSubtiposData($params);
$data->form['subtipos'] = $subtiposData['form'];
$data->model['subtipo_id'] = $params->subtipo_id = $subtiposData['model'];
},
'paciente' => function () use ($data, $params) {
$pacientesData = self::getPacientesData($params);
$data->form['pacientes'] = $pacientesData['form'];
$data->model['paciente_id'] = $params->paciente_id = $pacientesData['model'];
},
];
$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 = (object) request()->only([
'periodo',
'unidade_id',
'infraestrutura_id',
'centro_custo_id',
'tipo_id',
'subtipo_id',
'paciente_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;
}
return $params;
}
private static function getUnidadesData($params)
{
$unidades = collect();
$id = null;
if (!is_null($params->periodo)) {
$unidades = Unidade::setEagerLoads([])
->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::setEagerLoads([])
->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::setEagerLoads([])
->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()->setEagerLoads([])->first(['nome'])->nome
])
->sortBy('setor_nome')
->values();
}
return ['form' => $centrosCusto, 'model' => $id];
}
private static function setWhereForFilterCentroCusto($query, $params)
{
return $query->whereHas('farmaciaAltoCustoProcessos', fn ($q) => $q
->whereHas('itens', fn ($q) => $q
->whereHas('meses', fn ($q) => $q
->whereBetween('enviado_drs_em', $params->periodo)
)
)
);
}
private static function getTiposData($params)
{
$tipos = collect();
$id = null;
if (!is_null($params->periodo)) {
$tipos = ProcessoTipo::setEagerLoads([])
->whereHas('processos', fn ($q) =>
self::setWhereForSelectedCentroCusto($q, $params)
->whereHas('itens', fn ($q) => $q
->whereHas('meses', fn ($q) => $q
->whereBetween('enviado_drs_em', $params->periodo)
)
)
)
->orderBy('nome')
->get(['id', 'nome']);
}
return ['form' => $tipos, 'model' => $id];
}
private static function getSubtiposData($params)
{
$tipos = collect();
$id = null;
if (!is_null($params->tipo_id)) {
$tipos = ProcessoSubtipo::setEagerLoads([])
->whereHas('processos', fn ($q) =>
self::setWhereForSelectedCentroCusto($q, $params)
->where('tipo_id', $params->tipo_id)
->whereHas('itens', fn ($q) => $q
->whereHas('meses', fn ($q) => $q
->whereBetween('enviado_drs_em', $params->periodo)
)
)
)
->orderBy('nome')
->get(['id', 'nome']);
}
return ['form' => $tipos, 'model' => $id];
}
private static function getPacientesData($params)
{
$pacientes = collect();
$id = null;
if (!is_null($params->periodo)) {
$pacientes = Paciente::setEagerLoads([])
->whereHas('farmaciaAltoCustoProcessos', fn ($q) =>
self::setWhereForSelectedCentroCusto($q, $params)
->when($params->tipo_id, fn ($q, $id) => $q->where('tipo_id', $id))
->when($params->subtipo_id, fn ($q, $id) => $q->where('subtipo_id', $id))
->whereHas('itens', fn ($q) => $q
->whereHas('meses', fn ($q) => $q
->whereBetween('enviado_drs_em', $params->periodo)
)
)
)
->get(['id', 'cidadao_id'])
->map(fn ($p) => [
'id' => $p->id,
'nome' => $p->cidadao()->setEagerLoads([])->first(['nome'])->nome
])
->sortBy('nome')
->values();
}
return ['form' => $pacientes, 'model' => $id];
}
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 getPrintExportData()
{
$resultado = self::index();
$itens = $resultado['processos'];
$unidade = Unidade::find(request()->unidade_id);
$infraestrutura = Infraestrutura::find(request()->infraestrutura_id);
$centroCusto = CentroCusto::find(request()->centro_custo_id);
$tipo = ProcessoTipo::find(request()->tipo_id);
$subtipo = ProcessoSubtipo::find(request()->subtipo_id);
$paciente = Paciente::find(request()->paciente_id);
return [
'inicio' => request()->periodo['start'],
'fim' => request()->periodo['end'],
'unidade' => $unidade->nome_fantasia ?? 'Todas',
'infraestrutura' => $infraestrutura->nome ?? 'Todos',
'setor' => $centroCusto->setor->nome ?? 'Todos',
'tipo' => $tipo->nome ?? 'Todos',
'subtipo' => $subtipo->nome ?? 'Todos',
'paciente' => $paciente->cidadao->nome ?? 'Todos',
'colunas' => collect(request()->selectedColumns),
'itens' => $itens,
'totalizadores' => $resultado['totalizadores'],
];
}
}

View File

@@ -0,0 +1,387 @@
<?php
namespace App\Services\Farmacia;
use App\Enums\Farmacia\AltoCusto\ProcessoItemMesStatus;
use App\Models\Cadastro\Estabelecimento\CentroCusto;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\Material\Material;
use App\Models\Cadastro\SujeitoAtencao\Paciente;
use App\Services\Cadastro\Material\MaterialService;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class RelatorioAltoCustoRetiradaPendenteService extends Service
{
public static function index()
{
$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)
];
$processos = DB::table('farmacia_alto_custo_processo_item_mes as mes')
->join(
'farmacia_alto_custo_processo_item as item',
'item.id',
'mes.item_id'
)
->join(
'cadastro_material as material',
'material.id',
'item.material_id'
)
->join(
'cadastro_apresentacao as apresentacao',
'apresentacao.id',
'material.apresentacao_id'
)
->join(
'farmacia_alto_custo_processo as processo',
'processo.id',
'item.processo_id'
)
->join(
'cadastro_paciente as paciente',
'paciente.id',
'processo.paciente_id'
)
->join(
'cadastro_cidadao as cidadao',
'cidadao.id',
'paciente.cidadao_id'
)
->leftJoin(
'cadastro_unidade_medida as apresentacao_unidade_medida',
'apresentacao_unidade_medida.id',
'material.apresentacao_unidade_medida_id'
)
->where('mes.status_id', ProcessoItemMesStatus::PENDENTE_RETIRADA_PACIENTE)
->whereBetween(request()->periodo_tipo === 'solicitacao'
? 'processo.solicitado_em' : 'mes.retirado_drs_em', $periodo)
->when(request()->centro_custo_id, fn ($q, $id) => $q->where('processo.created_centro_custo_id', $id))
->when(request()->paciente_id, fn ($q, $id) => $q->where('paciente.id', $id))
->when(request()->material_id, fn ($q, $id) => $q->where('material.id', $id))
->select(DB::raw("
cidadao.nome as paciente,
LPAD(paciente.prontuario, 6, '0') as prontuario,
mes.retirado_drs_em,
" . MaterialService::getDescricaoCompletaRaw(
'material',
'apresentacao',
'apresentacao_unidade_medida'
) . " as material
"))
->addSelect([
'prontuario_unidade' => function ($query) {
$query->select('prontuario_unidade.prontuario')
->from('cadastro_prontuario_unidade as prontuario_unidade')
->whereColumn('prontuario_unidade.paciente_id', 'paciente.id')
->where('prontuario_unidade.unidade_id', request()->unidade_id)
->limit(1);
}
])
->when(request()->order_by, fn ($q, $orderBy) => $q->orderBy($orderBy))
->get();
return compact('processos');
}
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'] = $params->unidade_id = $unidadesData['model'];
},
'infraestrutura' => function () use ($data, $params) {
$infraestruturasData = self::getInfraestruturasData($params);
$data->form['infraestruturas'] = $infraestruturasData['form'];
$data->model['infraestrutura_id'] = $params->infraestrutura_id = $infraestruturasData['model'];
},
'centro_custo' => function () use ($data, $params) {
$centrosCustoData = self::getCentrosDeCustoData($params);
$data->form['centros_custo'] = $centrosCustoData['form'];
$data->model['centro_custo_id'] = $params->centro_custo_id = $centrosCustoData['model'];
},
'paciente' => function () use ($data, $params) {
$pacientesData = self::getPacientesData($params);
$data->form['pacientes'] = $pacientesData['form'];
$data->model['paciente_id'] = $params->paciente_id = $pacientesData['model'];
},
'material' => function () use ($data) {
$data->model['material'] = null;
}
];
$load = is_null(request()->load_from);
if ($load) {
$data->form['periodo_tipos'] = self::getTiposPeriodo();
$data->model['periodo_tipo'] = 'solicitacao';
$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 getTiposPeriodo()
{
return collect([
(object) ['value' => 'retirada_drs', 'text' => 'Retirada DRS'],
(object) ['value' => 'solicitacao', 'text' => 'Solicitação'],
]);
}
private static function getParams()
{
$params = (object) request()->only([
'periodo_tipo',
'periodo',
'unidade_id',
'infraestrutura_id',
'centro_custo_id',
'paciente_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;
}
return $params;
}
private static function getUnidadesData()
{
$unidades = collect();
$id = self::getCurrentCentroCusto()->infraestrutura->unidade_id;
$unidades = Unidade::where('id', $id)
->orderBy('nome_fantasia')
->get(['id', 'nome_fantasia']);
return ['form' => $unidades, 'model' => $id];
}
private static function getInfraestruturasData($params)
{
$infraestruturas = collect();
$id = self::getCurrentCentroCusto()->infraestrutura_id;
if (!is_null($params->unidade_id)) {
$infraestruturas = Infraestrutura::where('id', $id)
->where('unidade_id', $params->unidade_id)
->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 = self::getCurrentCentroCusto()->id;
if (!is_null($params->infraestrutura_id)) {
$centrosCusto = CentroCusto::where('id', $id)
->where('infraestrutura_id', $params->infraestrutura_id)
->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 getPacientesData($params)
{
$pacientes = collect();
$id = null;
if (!is_null($params->periodo)) {
$pacientes = Paciente::whereHas('farmaciaAltoCustoProcessos', fn ($q) =>
self::setWhereForSelectedCentroCusto($q, $params)
->when($params->periodo_tipo === 'solicitacao', fn ($q) => $q
->whereBetween('solicitado_em', $params->periodo)
)
->whereHas('itens', fn ($q) => $q
->whereHas('meses', fn ($q) => $q
->when($params->periodo_tipo === 'retirada_drs', fn ($q) => $q
->whereBetween('retirado_drs_em', $params->periodo)
)
->where('status_id', ProcessoItemMesStatus::PENDENTE_RETIRADA_PACIENTE)
)
)
)
->get(['id', 'cidadao_id'])
->map(fn ($p) => ['id' => $p->id, 'nome' => $p->cidadao->nome])
->sortBy('nome')
->values();
}
return ['form' => $pacientes, 'model' => $id];
}
public static function setWhereForFilterMaterial($query, $params)
{
$query->whereHas('farmaciaProcessoItens', fn ($q) => $q
->whereHas('processo', fn ($q) =>
self::setWhereForSelectedCentroCusto($q, $params)
->when($params->periodo_tipo === 'solicitacao', fn ($q) => $q
->whereBetween('solicitado_em', $params->periodo)
)
->when(request()->paciente_id, fn ($q, $id) => $q->where('paciente_id', $id))
)
->whereHas('meses', fn ($q) => $q
->when($params->periodo_tipo === 'retirada_drs', fn ($q) => $q
->whereBetween('retirado_drs_em', $params->periodo)
)
->where('status_id', ProcessoItemMesStatus::PENDENTE_RETIRADA_PACIENTE)
)
);
}
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::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['processos'];
$itens->each(function ($item) {
$item->retirado_drs_em = (new Carbon($item->retirado_drs_em))->format('d/m/Y');
});
$periodoTipo = self::getTiposPeriodo()->where('value', request()->periodo_tipo)->first();
$unidade = Unidade::find(request()->unidade_id);
$infraestrutura = Infraestrutura::find(request()->infraestrutura_id);
$centroCusto = CentroCusto::find(request()->centro_custo_id);
$paciente = Paciente::find(request()->paciente_id);
$material = Material::find(request()->material_id);
return [
'periodoTipo' => $periodoTipo->text,
'inicio' => request()->periodo['start'],
'fim' => request()->periodo['end'],
'unidade' => $unidade->nome_fantasia ?? 'Todas',
'infraestrutura' => $infraestrutura->nome ?? 'Todos',
'setor' => $centroCusto->setor->nome ?? 'Todos',
'paciente' => $paciente->cidadao->nome ?? 'Todos',
'material' => $material->descricao_completa ?? 'Todos',
'colunas' => collect(request()->selectedColumns),
'itens' => $itens,
];
}
}

View File

@@ -0,0 +1,267 @@
<?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();
}
}

View File

@@ -0,0 +1,639 @@
<?php
namespace App\Services\Farmacia;
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\Medicamento\ReceitaTipo;
use App\Models\Cadastro\Subgrupo\Subgrupo;
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;
class RelatorioDispensacaoPacienteService extends Service
{
public static function index()
{
$params = self::getParams();
$entregas = DB::table('farmacia_receita_item_entrega')
->select([
'farmacia_receita.id AS receita_id',
'farmacia_receita_item_entrega.id AS entrega_id',
'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("DATE_FORMAT(cadastro_cidadao.data_nascimento, '%d/%m/%Y') AS paciente_data_nascimento"),
'cadastro_cidadao.cns AS paciente_cns',
DB::raw("
CONCAT(
cadastro_logradouro_tipo.descricao, ' ',
cadastro_logradouro.nome, ' ',
COALESCE(cadastro_endereco.numero, 'S/N'), ' - ',
cadastro_bairro.nome, ', ',
cadastro_municipio.nome, ' - ',
cadastro_estado.uf
) AS paciente_endereco
"),
'farmacia_receita.created_at AS data_dispensacao',
'farmacia_receita.created_at AS data_hora_registro',
'cadastro_cidadao_dispensador.nome AS profissional_dispensador_nome',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome'),
'cadastro_cidadao_prescritor.nome AS profissional_prescritor_nome',
'cadastro_material.id AS material_id',
DB::raw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'apresentacao_unidade_medida'
) . " AS material_descricao"),
'almoxarifado_entrada_item.valor_unitario',
'almoxarifado_entrada_item.lote',
DB::raw("DATE_FORMAT(almoxarifado_entrada_item.validade_lote, '%d/%m/%Y') AS data_validade"),
'almoxarifado_saida_item_entrada_item.quantidade_saida AS quantidade',
])
->join('farmacia_receita_item', 'farmacia_receita_item.id', 'farmacia_receita_item_entrega.receita_item_id')
->join('almoxarifado_saida_item_entrada_item', 'almoxarifado_saida_item_entrada_item.saida_item_id', 'farmacia_receita_item_entrega.saida_item_id')
->join('almoxarifado_entrada_item', 'almoxarifado_entrada_item.id', 'almoxarifado_saida_item_entrada_item.entrada_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')
->join('cadastro_material', 'cadastro_material.id', 'farmacia_receita_item.material_id')
->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id')
->join('cadastro_lotacao AS cadastro_lotacao_dispensador', 'cadastro_lotacao_dispensador.id', 'farmacia_receita.created_lotacao_id')
->join('cadastro_usuario AS cadastro_usuario_dispensador', 'cadastro_usuario_dispensador.id', 'cadastro_lotacao_dispensador.usuario_id')
->join('cadastro_cidadao AS cadastro_cidadao_dispensador', 'cadastro_cidadao_dispensador.id', 'cadastro_usuario_dispensador.cidadao_id')
->join('cadastro_usuario AS cadastro_usuario_prescritor', 'cadastro_usuario_prescritor.id', 'farmacia_receita.usuario_id')
->join('cadastro_cidadao AS cadastro_cidadao_prescritor', 'cadastro_cidadao_prescritor.id', 'cadastro_usuario_prescritor.cidadao_id')
->leftJoin(
'cadastro_unidade_medida as apresentacao_unidade_medida',
'apresentacao_unidade_medida.id',
'cadastro_material.apresentacao_unidade_medida_id'
)
->leftJoin('cadastro_domicilio', 'cadastro_domicilio.id', 'cadastro_cidadao.domicilio_id')
->leftJoin('cadastro_endereco', 'cadastro_endereco.id', 'cadastro_domicilio.endereco_id')
->leftJoin('cadastro_logradouro', 'cadastro_logradouro.id', 'cadastro_endereco.logradouro_id')
->leftJoin('cadastro_logradouro_tipo', 'cadastro_logradouro_tipo.id', 'cadastro_logradouro.tipo_id')
->leftJoin('cadastro_bairro', 'cadastro_bairro.id', 'cadastro_logradouro.bairro_id')
->leftJoin('intranet.cadastro_municipio', 'cadastro_municipio.id', 'cadastro_logradouro.municipio_id')
->leftJoin('intranet.cadastro_estado', 'cadastro_estado.id', 'cadastro_municipio.estado_id')
->whereBetween('farmacia_receita_item_entrega.created_at', $params->periodo)
->where('farmacia_receita_item_entrega.pendente', false)
->where('farmacia_receita_item_entrega.estornado', false)
->when($params->unidade_id, fn ($q) => $q
->where('cadastro_infraestrutura.unidade_id', $params->unidade_id)
)
->when($params->infraestrutura_id, fn ($q) => $q
->where('cadastro_infraestrutura.id', $params->infraestrutura_id)
)
->when($params->usuario_id, fn ($q) => $q
->where('farmacia_receita.usuario_id', $params->usuario_id)
)
->when($params->receita_tipo_id, fn ($q) => $q
->where('cadastro_material.receita_tipo_id', $params->receita_tipo_id)
)
->when($params->grupo_id, fn ($q) => $q
->where('cadastro_material.grupo_id', $params->grupo_id)
)
->when($params->subgrupo_id, fn ($q) => $q
->where('cadastro_material.subgrupo_id', $params->subgrupo_id)
)
->when($params->material_id, fn ($q) => $q
->where('cadastro_material.id', $params->material_id)
)
->when($params->paciente_id, fn ($q) => $q
->where('cadastro_paciente.id', $params->paciente_id)
)
->get();
$pacientes = collect();
$totalizadores = (object) ['pacientes' => 0, 'atendimentos' => 0, 'medicamentos' => 0, 'valor_total' => 0];
$materiaisIds = collect();
foreach ($entregas as $entrega) {
$pid = $entrega->paciente_id;
if (!$pacientes->has($pid)) {
$pacientes->put($pid, (object)[
'paciente_id' => $entrega->paciente_id,
'paciente_prontuario' => $entrega->paciente_prontuario,
'paciente_nome' => $entrega->paciente_nome,
'paciente_data_nascimento' => $entrega->paciente_data_nascimento,
'paciente_cns' => $entrega->paciente_cns,
'paciente_endereco' => $entrega->paciente_endereco,
'atendimentos' => 0,
'medicamentos' => 0,
'valor_total' => 0,
'entregas' => collect(),
]);
}
$paciente = $pacientes->get($pid);
$hasReceita = $paciente->entregas->contains(fn($e) => $e->receita_id === $entrega->receita_id);
if (!$hasReceita) {
$paciente->atendimentos++;
}
$hasMaterial = $paciente->entregas->contains(fn($e) => $e->material_id === $entrega->material_id);
if (!$hasMaterial) {
$paciente->medicamentos++;
}
$entregaKey = $entrega->receita_id . '_' . $entrega->material_id;
$pacienteEntrega = $paciente->entregas->firstWhere('entrega_id', $entrega->entrega_id);
if (!$pacienteEntrega) {
$pacienteEntrega = (object)[
'receita_id' => $entrega->receita_id,
'entrega_id' => $entrega->entrega_id,
'data_dispensacao' => $entrega->data_dispensacao,
'data_hora_registro' => $entrega->data_hora_registro,
'infraestrutura_nome' => $entrega->infraestrutura_nome,
'material_id' => $entrega->material_id,
'material_descricao' => $entrega->material_descricao,
'profissional_dispensador_nome' => $entrega->profissional_dispensador_nome,
'profissional_prescritor_nome' => $entrega->profissional_prescritor_nome,
'unidade_nome_fantasia' => $entrega->unidade_nome_fantasia,
'lotes' => collect(),
];
$paciente->entregas->push($pacienteEntrega);
}
$pacienteEntrega->lotes->push((object) [
'quantidade' => $entrega->quantidade,
'lote' => $entrega->lote ?? '-',
'data_validade' => $entrega->data_validade ?? '-',
'valor_unitario' => number_format($entrega->valor_unitario, 6, ',', '.'),
]);
$paciente->valor_total += $entrega->valor_unitario * $entrega->quantidade;
}
$pacientes->each(function($paciente) use ($totalizadores, $materiaisIds) {
$totalizadores->pacientes++;
$totalizadores->atendimentos += $paciente->atendimentos;
$totalizadores->valor_total += $paciente->valor_total;
$paciente->valor_total = number_format($paciente->valor_total, 2, ',', '.');
$paciente->entregas->each(function($entrega) use ($materiaisIds, $totalizadores) {
if (!$materiaisIds->contains($entrega->material_id)) {
$materiaisIds->push($entrega->material_id);
$totalizadores->medicamentos++;
}
});
});
$totalizadores->valor_total = number_format($totalizadores->valor_total, 2, ',', '.');
return [
'pacientes' => $pacientes->values(),
'totalizadores' => $totalizadores,
];
}
public static function create()
{
return [
'additionals' => self::getAdditionals(),
'form' => self::getForm(),
'model' => self::getModel(),
];
}
public static function list()
{
$params = self::getParams();
switch (request()->listar) {
case 'unidades': {
return [
'unidades' => self::getUnidades($params),
'infraestruturas' => self::getInfraestruturas($params),
'usuarios' => self::getUsuarios($params),
'receita_tipos' => self::getReceitaTipos($params),
'grupos' => self::getGrupos($params),
'subgrupos' => self::getSubgrupos($params),
];
}
case 'infraestruturas': {
return [
'infraestruturas' => self::getInfraestruturas($params),
'usuarios' => self::getUsuarios($params),
'receita_tipos' => self::getReceitaTipos($params),
'grupos' => self::getGrupos($params),
'subgrupos' => self::getSubgrupos($params),
];
}
case 'usuarios': {
return [
'usuarios' => self::getUsuarios($params),
'receita_tipos' => self::getReceitaTipos($params),
'grupos' => self::getGrupos($params),
'subgrupos' => self::getSubgrupos($params),
];
}
case 'receita-tipos': {
return [
'receita_tipos' => self::getReceitaTipos($params),
'grupos' => self::getGrupos($params),
'subgrupos' => self::getSubgrupos($params),
];
}
case 'grupos': {
return [
'grupos' => self::getGrupos($params),
'subgrupos' => self::getSubgrupos($params),
];
}
case 'subgrupos': {
return [
'subgrupos' => self::getSubgrupos($params),
];
}
}
}
public static function autocompletePaciente()
{
$params = self::getParams();
return DB::table('cadastro_paciente')
->select([
'cadastro_paciente.id',
'cadastro_cidadao.nome',
])
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->whereExists(fn ($q) => $q
->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_material', 'cadastro_material.id', 'farmacia_receita_item.material_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')
->whereColumn('farmacia_receita.paciente_id', 'cadastro_paciente.id')
->whereBetween('farmacia_receita_item_entrega.dispensado_em', $params->periodo)
->where('farmacia_receita_item_entrega.pendente', false)
->where('farmacia_receita_item_entrega.estornado', false)
->when($params->unidade_id, fn ($q, $unidadeId) => $q
->where('cadastro_infraestrutura.unidade_id', $unidadeId)
)
->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q
->where('cadastro_infraestrutura.id', $infraestruturaId)
)
->when($params->usuario_id, fn ($q, $usuarioId) => $q
->where('farmacia_receita.usuario_id', $usuarioId)
)
->when($params->receita_tipo_id, fn ($q, $receitaTipoId) => $q
->where('cadastro_material.receita_tipo_id', $receitaTipoId)
)
->when($params->grupo_id, fn ($q, $grupoId) => $q
->where('cadastro_material.grupo_id', $grupoId)
)
->when($params->subgrupo_id, fn ($q, $subgrupoId) => $q
->where('cadastro_material.subgrupo_id', $subgrupoId)
)
->when($params->material_id, fn ($q, $materialId) => $q
->where('cadastro_material.id', $materialId)
)
);
}
public static function autocompleteMaterial()
{
$params = self::getParams();
return DB::table('cadastro_material')
->select([
'cadastro_material.id',
DB::raw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'apresentacao_unidade_medida'
) . " as descricao"),
])
->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'
)
->when($params->receita_tipo_id, fn ($q, $receitaTipoId) => $q
->where('cadastro_material.receita_tipo_id', $receitaTipoId)
)
->when($params->grupo_id, fn ($q, $grupoId) => $q
->where('cadastro_material.grupo_id', $grupoId)
)
->when($params->subgrupo_id, fn ($q, $subgrupoId) => $q
->where('cadastro_material.subgrupo_id', $subgrupoId)
)
->whereExists(fn ($q) => $q
->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')
->whereColumn('farmacia_receita_item.material_id', 'cadastro_material.id')
->whereBetween('farmacia_receita_item_entrega.dispensado_em', $params->periodo)
->where('farmacia_receita_item_entrega.pendente', false)
->where('farmacia_receita_item_entrega.estornado', false)
->when($params->unidade_id, fn ($q, $unidadeId) => $q
->where('cadastro_infraestrutura.unidade_id', $unidadeId)
)
->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q
->where('cadastro_infraestrutura.id', $infraestruturaId)
)
->when($params->usuario_id, fn ($q, $usuarioId) => $q
->where('farmacia_receita.usuario_id', $usuarioId)
)
);
}
public static function getPrintData()
{
$data = self::index();
$data['pacientes']->each(function ($paciente) {
$paciente->entregas->each(function ($entrega) {
$entrega->data_dispensacao = (new Carbon($entrega->data_dispensacao))->format('d/m/Y');
$entrega->data_hora_registro = (new Carbon($entrega->data_hora_registro))->format('d/m/Y H:i');
});
});
$unidade = Unidade::find(request()->get('unidade_id'));
$infraestrutura = Infraestrutura::find(request()->get('infraestrutura_id'));
$profissionalPrescritor = Usuario::find(request()->get('usuario_id'));
$receitaTipo = ReceitaTipo::find(request()->get('receita_tipo_id'));
$grupo = Grupo::find(request()->get('grupo_id'));
$subgrupo = Subgrupo::find(request()->get('subgrupo_id'));
$material = Material::find(request()->get('material_id'));
$paciente = Paciente::find(request()->get('paciente_id'));
return [
'start_date' => request()->periodo['start'],
'end_date' => request()->periodo['end'],
'unidade_nome_fantasia' => $unidade->nome_fantasia ?? 'Todas',
'infraestrutura_nome' => $infraestrutura->nome ?? 'Todos',
'profissional_prescritor_nome' => $profissionalPrescritor->cidadao->nome ?? 'Todos',
'receita_tipo_nome' => $receitaTipo->nome ?? 'Todos',
'paciente_nome' => $paciente->cidadao->nome ?? 'Todos',
'grupo_nome' => $grupo->nome ?? 'Todos',
'subgrupo_nome' => $subgrupo->nome ?? 'Todos',
'material_descricao' => $material->descricao_completa ?? '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' => [],
'usuarios' => [],
'receita_tipos' => [],
'grupos' => [],
'subgrupos' => [],
];
}
private static function getModel()
{
return [
'periodo' => [
'start' => null,
'end' => null,
],
'unidade_id' => null,
'infraestrutura_id' => null,
'usuario_id' => null,
'receita_tipo_id' => null,
'grupo_id' => null,
'subgrupo_id' => null,
'material' => null,
'paciente' => null,
];
}
private static function getParams()
{
return (object) [
'periodo' => [
'start' => Carbon::createFromFormat('d/m/Y', request()->get('periodo')['start'])->setTime(0, 0, 0),
'end' => Carbon::createFromFormat('d/m/Y', request()->get('periodo')['end'])->setTime(23, 59, 59)
],
'unidade_id' => request()->get('unidade_id'),
'infraestrutura_id' => request()->get('infraestrutura_id'),
'usuario_id' => request()->get('usuario_id'),
'receita_tipo_id' => request()->get('receita_tipo_id'),
'grupo_id' => request()->get('grupo_id'),
'subgrupo_id' => request()->get('subgrupo_id'),
'material_id' => request()->get('material_id'),
'paciente_id' => request()->get('paciente_id'),
];
}
private static function getUnidades($params)
{
return DB::table('cadastro_unidade')
->select([
'id',
'nome_fantasia'
])
->whereExists(fn ($q) => $q
->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')
->whereColumn('cadastro_infraestrutura.unidade_id', 'cadastro_unidade.id')
->whereBetween('farmacia_receita_item_entrega.dispensado_em', $params->periodo)
->where('farmacia_receita_item_entrega.pendente', false)
->where('farmacia_receita_item_entrega.estornado', false)
)
->orderBy('cadastro_unidade.nome_fantasia')
->get();
}
private static function getInfraestruturas($params)
{
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', $params->unidade_id)
->whereExists(fn ($q) => $q
->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')
->whereColumn('cadastro_centro_custo.infraestrutura_id', 'cadastro_infraestrutura.id')
->whereBetween('farmacia_receita_item_entrega.dispensado_em', $params->periodo)
->where('farmacia_receita_item_entrega.pendente', false)
->where('farmacia_receita_item_entrega.estornado', false)
)
->orderByRaw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)')
->get();
}
private static function getUsuarios($params)
{
return DB::table('cadastro_usuario')
->select([
'cadastro_usuario.id',
'cadastro_cidadao.nome',
])
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_usuario.cidadao_id')
->whereExists(fn ($q) => $q
->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')
->whereColumn('farmacia_receita.usuario_id', 'cadastro_usuario.id')
->whereBetween('farmacia_receita_item_entrega.dispensado_em', $params->periodo)
->where('farmacia_receita_item_entrega.pendente', false)
->where('farmacia_receita_item_entrega.estornado', false)
->when($params->unidade_id, fn ($q, $unidadeId) => $q
->where('cadastro_infraestrutura.unidade_id', $unidadeId)
)
->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q
->where('cadastro_infraestrutura.id', $infraestruturaId)
)
)
->orderBy('cadastro_cidadao.nome')
->get();
}
private static function getReceitaTipos($params)
{
return DB::table('cadastro_receita_tipo')
->select([
'cadastro_receita_tipo.id',
'cadastro_receita_tipo.nome',
])
->whereExists(fn ($q) => $q
->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_material', 'cadastro_material.id', 'farmacia_receita_item.material_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')
->whereColumn('cadastro_material.receita_tipo_id', 'cadastro_receita_tipo.id')
->whereBetween('farmacia_receita_item_entrega.dispensado_em', $params->periodo)
->where('farmacia_receita_item_entrega.pendente', false)
->where('farmacia_receita_item_entrega.estornado', false)
->when($params->unidade_id, fn ($q, $unidadeId) => $q
->where('cadastro_infraestrutura.unidade_id', $unidadeId)
)
->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q
->where('cadastro_infraestrutura.id', $infraestruturaId)
)
->when($params->usuario_id, fn ($q, $usuarioId) => $q
->where('farmacia_receita.usuario_id', $usuarioId)
)
)
->orderBy('cadastro_receita_tipo.nome')
->get();
}
private static function getGrupos($params)
{
return DB::table('cadastro_grupo')
->select([
'cadastro_grupo.id',
'cadastro_grupo.nome',
])
->whereExists(fn ($q) => $q
->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_material', 'cadastro_material.id', 'farmacia_receita_item.material_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')
->whereBetween('farmacia_receita_item_entrega.dispensado_em', $params->periodo)
->where('farmacia_receita_item_entrega.pendente', false)
->where('farmacia_receita_item_entrega.estornado', false)
->whereColumn('cadastro_grupo.id', 'cadastro_material.grupo_id')
->when($params->unidade_id, fn ($q, $unidadeId) => $q
->where('cadastro_infraestrutura.unidade_id', $unidadeId)
)
->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q
->where('cadastro_infraestrutura.id', $infraestruturaId)
)
->when($params->usuario_id, fn ($q, $usuarioId) => $q
->where('farmacia_receita.usuario_id', $usuarioId)
)
->when($params->receita_tipo_id, fn ($q, $receitaTipoId) => $q
->where('cadastro_material.receita_tipo_id', $receitaTipoId)
)
)
->orderBy('cadastro_grupo.nome')
->get();
}
private static function getSubgrupos($params)
{
return DB::table('cadastro_subgrupo')
->select([
'cadastro_subgrupo.id',
'cadastro_subgrupo.nome',
])
->whereExists(fn ($q) => $q
->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_material', 'cadastro_material.id', 'farmacia_receita_item.material_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')
->whereColumn('cadastro_subgrupo.id', 'cadastro_material.subgrupo_id')
->whereBetween('farmacia_receita_item_entrega.dispensado_em', $params->periodo)
->where('farmacia_receita_item_entrega.pendente', false)
->where('farmacia_receita_item_entrega.estornado', false)
->when($params->unidade_id, fn ($q, $unidadeId) => $q
->where('cadastro_infraestrutura.unidade_id', $unidadeId)
)
->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q
->where('cadastro_infraestrutura.id', $infraestruturaId)
)
->when($params->usuario_id, fn ($q, $usuarioId) => $q
->where('farmacia_receita.usuario_id', $usuarioId)
)
->when($params->receita_tipo_id, fn ($q, $receitaTipoId) => $q
->where('cadastro_material.receita_tipo_id', $receitaTipoId)
)
->when($params->grupo_id, fn ($q, $grupoId) => $q
->where('cadastro_material.grupo_id', $grupoId)
)
)
->orderBy('cadastro_subgrupo.nome')
->get();
}
}

View File

@@ -0,0 +1,248 @@
<?php
namespace App\Services\Farmacia;
use App\Services\Cadastro\Material\MaterialService;
use App\Services\Service;
use App\Utils\DataUtil;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
class RelatorioDispensacaoRemedioCasaService extends Service
{
public static function index()
{
$params = self::getParams();
$itens = DB::table('farmacia_receita_item_entrega')
->select([
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome'),
DB::raw("DATE_FORMAT(farmacia_receita.created_at, '%d/%m/%Y') AS data_dispensacao"),
DB::raw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'cadastro_unidade_medida'
) . " AS material_descricao"),
'cadastro_cidadao.nome AS paciente_nome',
'almoxarifado_saida_item_entrada_item.quantidade_saida AS quantidade',
])
->join('farmacia_receita_item', 'farmacia_receita_item.id', 'farmacia_receita_item_entrega.receita_item_id')
->join('almoxarifado_saida_item_entrada_item', 'almoxarifado_saida_item_entrada_item.saida_item_id', 'farmacia_receita_item_entrega.saida_item_id')
->join('almoxarifado_entrada_item', 'almoxarifado_entrada_item.id', 'almoxarifado_saida_item_entrada_item.entrada_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')
->join('cadastro_material', 'cadastro_material.id', 'farmacia_receita_item.material_id')
->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id')
->leftJoin('cadastro_unidade_medida', 'cadastro_unidade_medida.id', 'cadastro_material.apresentacao_unidade_medida_id')
->where('farmacia_receita.is_remedio_em_casa', true)
->where('farmacia_receita_item_entrega.pendente', false)
->where('farmacia_receita_item_entrega.estornado', false)
->whereBetween('farmacia_receita_item_entrega.created_at', $params->periodo)
->when($params->unidade_id, fn ($q) => $q->where('cadastro_infraestrutura.unidade_id', $params->unidade_id))
->when($params->infraestrutura_id, fn ($q) => $q->where('cadastro_infraestrutura.id', $params->infraestrutura_id))
->when($params->material_id, fn ($q) => $q->where('cadastro_material.id', $params->material_id))
->when($params->paciente_id, fn ($q) => $q->where('cadastro_paciente.id', $params->paciente_id));
self::setOrderBy($itens);
$itens = $itens->get();
return ['itens' => $itens];
}
public static function create()
{
return [
'additionals' => [
'data_atual' => Carbon::now()->format('d/m/Y'),
],
'form' => [
'unidades' => [],
'infraestruturas' => [],
],
'model' => [
'periodo' => [
'start' => null,
'end' => null,
],
'unidade_id' => null,
'infraestrutura_id' => null,
'material' => null,
'paciente' => null,
],
];
}
public static function list()
{
$params = self::getParams();
switch (request()->listar) {
case 'unidades': {
return [
'unidades' => self::getUnidades($params),
'infraestruturas' => self::getInfraestruturas($params),
];
}
case 'infraestruturas': {
return [
'infraestruturas' => self::getInfraestruturas($params),
];
}
}
}
public static function autocompleteMaterial()
{
$params = self::getParams();
return DB::table('cadastro_material')
->select([
'cadastro_material.id',
DB::raw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'cadastro_unidade_medida'
) . " as descricao"),
])
->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id')
->leftJoin('cadastro_unidade_medida', 'cadastro_unidade_medida.id', 'cadastro_material.apresentacao_unidade_medida_id')
->where('cadastro_material.is_programa_remedio_em_casa', true)
->whereExists(fn ($q) => $q
->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')
->whereBetween('farmacia_receita_item_entrega.dispensado_em', $params->periodo)
->where('farmacia_receita_item_entrega.pendente', false)
->where('farmacia_receita_item_entrega.estornado', false)
->when($params->unidade_id, fn ($q, $unidadeId) => $q->where('cadastro_infraestrutura.unidade_id', $unidadeId))
->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q->where('cadastro_infraestrutura.id', $infraestruturaId))
->whereColumn('farmacia_receita_item.material_id', 'cadastro_material.id')
);
}
public static function autocompletePaciente()
{
$params = self::getParams();
return DB::table('cadastro_paciente')
->select([
'cadastro_paciente.id',
'cadastro_cidadao.nome',
])
->join('cadastro_cidadao', 'cadastro_cidadao.id', 'cadastro_paciente.cidadao_id')
->whereExists(fn ($q) => $q
->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_material', 'cadastro_material.id', 'farmacia_receita_item.material_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')
->whereBetween('farmacia_receita_item_entrega.dispensado_em', $params->periodo)
->where('cadastro_material.is_programa_remedio_em_casa', true)
->where('farmacia_receita_item_entrega.pendente', false)
->where('farmacia_receita_item_entrega.estornado', false)
->when($params->unidade_id, fn ($q, $unidadeId) => $q->where('cadastro_infraestrutura.unidade_id', $unidadeId))
->when($params->infraestrutura_id, fn ($q, $infraestruturaId) => $q->where('cadastro_infraestrutura.id', $infraestruturaId))
->when($params->material_id, fn ($q, $materialId) => $q->where('cadastro_material.id', $materialId))
->whereColumn('farmacia_receita.paciente_id', 'cadastro_paciente.id')
);
}
private static function getParams()
{
return (object) [
'periodo' => [
'start' => Carbon::createFromFormat('d/m/Y', request()->get('periodo')['start'])->setTime(0, 0, 0),
'end' => Carbon::createFromFormat('d/m/Y', request()->get('periodo')['end'])->setTime(23, 59, 59)
],
'unidade_id' => request()->get('unidade_id'),
'infraestrutura_id' => request()->get('infraestrutura_id'),
'material_id' => request()->get('material_id'),
'paciente_id' => request()->get('paciente_id'),
];
}
private static function getUnidades($params)
{
return DB::table('cadastro_unidade')
->select([
'id',
'nome_fantasia'
])
->whereExists(fn ($q) => $q
->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')
->join('cadastro_material', 'cadastro_material.id', 'farmacia_receita_item.material_id')
->whereBetween('farmacia_receita_item_entrega.dispensado_em', $params->periodo)
->where('cadastro_material.is_programa_remedio_em_casa', true)
->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($params)
{
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', $params->unidade_id)
->whereExists(fn ($q) => $q
->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_material', 'cadastro_material.id', 'farmacia_receita_item.material_id')
->whereBetween('farmacia_receita_item_entrega.dispensado_em', $params->periodo)
->where('cadastro_material.is_programa_remedio_em_casa', true)
->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 setOrderBy($builder)
{
$columns = [
'unidade_nome_fantasia' => 'unidade_nome_fantasia',
'infraestrutura_nome' => 'infraestrutura_nome',
'data_dispensacao' => 'data_dispensacao',
'material_descricao' => 'material_descricao',
'paciente_nome' => 'paciente_nome',
];
if (is_null(request()->sort_by)) {
$builder->orderByRaw(join(', ', $columns));
return;
}
$column = $columns[request()->sort_by];
$direction = DataUtil::getBooleanValueFromStringBoolean(request()->sort_desc) ? 'DESC' : 'ASC';
unset($columns[request()->sort_by]);
$builder->orderByRaw("{$column} {$direction}, " . join(', ', $columns));
}
}

View File

@@ -0,0 +1,529 @@
<?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'],
];
}
}

View File

@@ -0,0 +1,264 @@
<?php
namespace App\Services\Farmacia;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\Material\Material;
use App\Services\Cadastro\Material\MaterialService;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class RelatorioEstornoDispensacaoService extends Service
{
public static function index()
{
return DB::table('farmacia_receita_item_entrega')
->select([
'farmacia_receita_item_entrega.dispensado_em AS data_dispensacao',
'almoxarifado_saida_item.estornado_em AS data_estorno',
'cadastro_unidade.nome_fantasia AS unidade_nome_fantasia',
DB::raw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia) AS infraestrutura_nome'),
DB::raw('
(
SELECT cadastro_cidadao.nome
FROM cadastro_lotacao
INNER JOIN cadastro_usuario
ON cadastro_usuario.id = cadastro_lotacao.usuario_id
INNER JOIN cadastro_cidadao
ON cadastro_cidadao.id = cadastro_usuario.cidadao_id
WHERE cadastro_lotacao.id = farmacia_receita_item_entrega.created_lotacao_id
LIMIT 1
) AS profissional_dispensador_nome
'),
DB::raw('
(
SELECT cadastro_cidadao.nome
FROM almoxarifado_saida_item_entrada_item
INNER JOIN almoxarifado_entrada_item
ON almoxarifado_entrada_item.id = almoxarifado_saida_item_entrada_item.entrada_item_estornado_id
INNER JOIN cadastro_lotacao
ON cadastro_lotacao.id = almoxarifado_entrada_item.created_lotacao_id
INNER JOIN cadastro_usuario
ON cadastro_usuario.id = cadastro_lotacao.usuario_id
INNER JOIN cadastro_cidadao
ON cadastro_cidadao.id = cadastro_usuario.cidadao_id
WHERE almoxarifado_saida_item_entrada_item.saida_item_id = almoxarifado_saida_item.id
LIMIT 1
) AS profissional_estorno_nome
'),
DB::raw("LPAD(cadastro_paciente.prontuario, 7, '0') AS paciente_prontuario"),
'cadastro_cidadao.nome AS paciente_nome',
DB::raw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'apresentacao_unidade_medida'
) . " AS material_descricao"),
'farmacia_receita_item_entrega.quantidade',
])
->join('almoxarifado_saida_item', 'almoxarifado_saida_item.id', 'farmacia_receita_item_entrega.saida_item_id')
->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')
->join('cadastro_material', 'cadastro_material.id', 'farmacia_receita_item.material_id')
->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'
)
->whereRaw("CAST(almoxarifado_saida_item.estornado_em AS DATE) >= '" . request()->get('start_date') . "'")
->whereRaw("CAST(almoxarifado_saida_item.estornado_em AS DATE) <= '" . request()->get('end_date') . "'")
->whereNotNull('almoxarifado_saida_item.estornado_em')
->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('material_id'), function ($query) {
$query->where('cadastro_material.id', request()->get('material_id'));
})
->get();
}
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;
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")
])
->when(request()->get('grupo_id'), function ($query) {
$query->where('cadastro_material.grupo_id', request()->get('grupo_id'));
})
->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('farmacia_receita_item_entrega')
->join('almoxarifado_saida_item', 'almoxarifado_saida_item.id', 'farmacia_receita_item_entrega.saida_item_id')
->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(almoxarifado_saida_item.estornado_em AS DATE) >= '" . request()->get('start_date') . "'")
->whereRaw("CAST(almoxarifado_saida_item.estornado_em AS DATE) <= '" . request()->get('end_date') . "'")
->whereNotNull('almoxarifado_saida_item.estornado_em')
->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'));
})
->whereColumn('farmacia_receita_item.material_id', 'cadastro_material.id');
});
}
public static function getPrintData()
{
$data = self::index();
$data->each(function ($data) {
$data->data_dispensacao = (new Carbon($data->data_dispensacao))->format('d/m/Y');
$data->data_estorno = (new Carbon($data->data_estorno))->format('d/m/Y');
});
$unidade = Unidade::find(request()->get('unidade_id'));
$infraestrutura = Infraestrutura::find(request()->get('infraestrutura_id'));
$material = Material::find(request()->get('material_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',
'material_descricao' => $material->descricao_completa ?? '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' => [],
'grupos' => [],
];
}
private static function getModel()
{
return [
'periodo' => [
'start' => null,
'end' => null,
],
'unidade_id' => null,
'infraestrutura_id' => null,
'grupo_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_receita_item_entrega')
->join('almoxarifado_saida_item', 'almoxarifado_saida_item.id', 'farmacia_receita_item_entrega.saida_item_id')
->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(almoxarifado_saida_item.estornado_em AS DATE) >= '" . $startDate . "'")
->whereRaw("CAST(almoxarifado_saida_item.estornado_em AS DATE) <= '" . $endDate . "'")
->whereNotNull('almoxarifado_saida_item.estornado_em')
->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('almoxarifado_saida_item', 'almoxarifado_saida_item.id', 'farmacia_receita_item_entrega.saida_item_id')
->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(almoxarifado_saida_item.estornado_em AS DATE) >= '" . $startDate . "'")
->whereRaw("CAST(almoxarifado_saida_item.estornado_em AS DATE) <= '" . $endDate . "'")
->whereNotNull('almoxarifado_saida_item.estornado_em')
->whereColumn('cadastro_centro_custo.infraestrutura_id', 'cadastro_infraestrutura.id');
})
->orderByRaw('COALESCE(cadastro_infraestrutura.nome, cadastro_unidade.nome_fantasia)')
->get();
}
}

View File

@@ -0,0 +1,567 @@
<?php
namespace App\Services\Farmacia;
use App\Enums\Almoxarifado\EntradaTipo;
use App\Enums\Almoxarifado\SaidaTipo;
use App\Models\Cadastro\Estabelecimento\CentroCusto;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\Material\Material;
use App\Services\Cadastro\Material\MaterialService;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class RelatorioMovimentacaoPsicotropicoService extends Service
{
public static function index()
{
$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)
];
$movimentacoes = DB::query()
->fromSub(DB::table('almoxarifado_entrada_item as entrada_item')
->join(
'almoxarifado_entrada as entrada',
'entrada.id',
'entrada_item.entrada_id'
)
->where('entrada_item.material_id', request()->material_id)
->where('entrada.finalizada', true)
->where('entrada.centro_custo_id', request()->centro_custo_id)
->whereBetween('entrada.created_at', $periodo)
->select(DB::raw("
entrada.created_at,
(
CASE entrada.tipo_id
WHEN " . EntradaTipo::REQUISICAO . " THEN 'ENTRADA (REQUISIÇÃO)'
WHEN " . EntradaTipo::TRANSFERENCIA . " THEN 'ENTRADA (TRANSFERÊNCIA)'
ELSE 'ENTRADA'
END
) as tipo,
CONCAT(
IF(entrada_item.estornado_em IS NULL, '', '(ESTORNADO) '),
(
CASE entrada.tipo_id
WHEN " . EntradaTipo::REQUISICAO . " THEN (
SELECT CONCAT(
'ORIGEM: ',
u.nome_fantasia,
' (Local de atendimento: ',
COALESCE(i.nome, u.nome_fantasia),
' - ',
'Setor: ',
s.nome,
')'
)
FROM almoxarifado_requisicao_resposta_item_entrada_item riei
JOIN almoxarifado_requisicao_resposta_item ri
ON ri.id = riei.requisicao_resposta_item_id
JOIN cadastro_centro_custo as cc
ON cc.id = ri.created_centro_custo_id
JOIN cadastro_setor s
ON s.id = cc.setor_id
JOIN cadastro_infraestrutura as i
ON i.id = cc.infraestrutura_id
JOIN cadastro_unidade as u
ON u.id = i.unidade_id
WHERE riei.entrada_item_id = entrada_item.id
)
WHEN " . EntradaTipo::TRANSFERENCIA . " THEN (
SELECT CONCAT(
'ORIGEM: ',
u.nome_fantasia,
' (Local de atendimento: ',
COALESCE(i.nome, u.nome_fantasia),
' - ',
'Setor: ',
s.nome,
')'
)
FROM cadastro_centro_custo as cc
JOIN cadastro_setor s ON s.id = cc.setor_id
JOIN cadastro_infraestrutura as i ON i.id = cc.infraestrutura_id
JOIN cadastro_unidade as u ON u.id = i.unidade_id
WHERE cc.id = entrada.created_centro_custo_id
)
WHEN " . EntradaTipo::INVENTARIO . " THEN 'AJUSTE DE ESTOQUE'
WHEN " . EntradaTipo::ESTORNO . " THEN 'ESTORNO DE SAÍDA'
ELSE ''
END
)
) as historico,
(
SELECT SUM(
almoxarifado_entrada_item.quantidade
-
COALESCE((
SELECT SUM(almoxarifado_saida_item_entrada_item.quantidade_saida)
FROM almoxarifado_saida_item_entrada_item
JOIN almoxarifado_saida_item
ON almoxarifado_saida_item.id = almoxarifado_saida_item_entrada_item.saida_item_id
JOIN almoxarifado_saida
ON almoxarifado_saida.id = almoxarifado_saida_item.saida_id
WHERE almoxarifado_saida_item_entrada_item.entrada_item_id = almoxarifado_entrada_item.id
AND almoxarifado_saida.finalizada = 1
AND almoxarifado_saida.centro_custo_id = " . request()->centro_custo_id . "
AND almoxarifado_saida.created_at <= entrada.created_at
), 0)
)
FROM almoxarifado_entrada_item
JOIN almoxarifado_entrada
ON almoxarifado_entrada.id = almoxarifado_entrada_item.entrada_id
WHERE almoxarifado_entrada.finalizada = 1
AND almoxarifado_entrada.centro_custo_id = " . request()->centro_custo_id . "
AND almoxarifado_entrada_item.material_id = entrada_item.material_id
AND almoxarifado_entrada.created_at <= entrada.created_at
) as estoque,
CONCAT('+ ', entrada_item.quantidade) as quantidade
"))
->unionAll(DB::table('almoxarifado_saida_item as saida_item')
->join(
'almoxarifado_saida as saida',
'saida.id',
'saida_item.saida_id'
)
->where('saida_item.material_id', request()->material_id)
->where('saida.finalizada', true)
->where('saida.centro_custo_id', request()->centro_custo_id)
->whereBetween('saida.created_at', $periodo)
->select(DB::raw("
saida.created_at,
(
CASE saida.tipo_id
WHEN " . SaidaTipo::REQUISICAO . " THEN 'SAÍDA (REQUISIÇÃO)'
WHEN " . SaidaTipo::TRANSFERENCIA . " THEN 'SAÍDA (TRANSFERÊNCIA)'
WHEN " . SaidaTipo::DISPENSACAO_FARMACIA . " THEN 'SAÍDA (DISPENSAÇÃO)'
WHEN " . SaidaTipo::BAIXA . " THEN 'BAIXA'
WHEN " . SaidaTipo::MANUAL . " THEN 'SAÍDA (MANUAL)'
ELSE 'SAÍDA'
END
) as tipo,
CONCAT(
IF(saida_item.estornado_em IS NULL, '', '(ESTORNADO) '),
(
CASE saida.tipo_id
WHEN " . SaidaTipo::REQUISICAO . " THEN (
SELECT CONCAT(
'DESTINO: ',
u.nome_fantasia,
' (Local de atendimento: ',
COALESCE(i.nome, u.nome_fantasia),
' - ',
'Setor: ',
s.nome,
')'
)
FROM almoxarifado_requisicao_resposta_item ri
JOIN almoxarifado_requisicao_item reqi
ON reqi.id = ri.requisicao_item_id
JOIN cadastro_centro_custo as cc
ON cc.id = reqi.created_centro_custo_id
JOIN cadastro_setor s
ON s.id = cc.setor_id
JOIN cadastro_infraestrutura as i
ON i.id = cc.infraestrutura_id
JOIN cadastro_unidade as u
ON u.id = i.unidade_id
WHERE ri.saida_item_id = saida_item.id
)
WHEN " . SaidaTipo::TRANSFERENCIA . " THEN (
SELECT CONCAT(
'DESTINO: ',
u.nome_fantasia,
' (Local de atendimento: ',
COALESCE(i.nome, u.nome_fantasia),
' - ',
'Setor: ',
s.nome,
')'
)
FROM almoxarifado_saida_transferencia as st
JOIN cadastro_centro_custo as cc ON cc.id = st.centro_custo_id
JOIN cadastro_setor as s ON s.id = cc.setor_id
JOIN cadastro_infraestrutura as i ON i.id = cc.infraestrutura_id
JOIN cadastro_unidade as u ON u.id = i.unidade_id
WHERE st.saida_id = saida.id
)
WHEN " . SaidaTipo::DISPENSACAO_FARMACIA . " THEN (
SELECT c.nome
FROM farmacia_receita_item_entrega as rie
JOIN farmacia_receita_item as ri ON ri.id = rie.receita_item_id
JOIN farmacia_receita as r ON r.id = ri.receita_id
JOIN cadastro_paciente as p ON p.id = r.paciente_id
JOIN cadastro_cidadao as c ON c.id = p.cidadao_id
WHERE rie.saida_item_id = saida_item.id
)
WHEN " . SaidaTipo::BAIXA . " THEN (
SELECT m.descricao
FROM almoxarifado_saida_baixa as b
JOIN almoxarifado_motivo_baixa as m ON m.id = b.motivo_id
WHERE b.saida_id = saida.id
)
WHEN " . SaidaTipo::MANUAL . " THEN (
SELECT CONCAT(
'DESTINO: ',
u.nome_fantasia,
' (Local de atendimento: ',
COALESCE(i.nome, u.nome_fantasia),
' - ',
'Setor: ',
s.nome,
')'
)
FROM almoxarifado_saida_requisicao as sr
JOIN cadastro_centro_custo as cc ON cc.id = sr.centro_custo_id
JOIN cadastro_setor as s ON s.id = cc.setor_id
JOIN cadastro_infraestrutura as i ON i.id = cc.infraestrutura_id
JOIN cadastro_unidade as u ON u.id = i.unidade_id
WHERE sr.saida_id = saida.id
)
WHEN " . SaidaTipo::INVENTARIO . " THEN 'AJUSTE DE ESTOQUE'
WHEN " . SaidaTipo::ESTORNO . " THEN 'ESTORNO DE ENTRADA'
ELSE ''
END
)
) as historico,
(
SELECT SUM(
almoxarifado_entrada_item.quantidade
-
COALESCE((
SELECT SUM(almoxarifado_saida_item_entrada_item.quantidade_saida)
FROM almoxarifado_saida_item_entrada_item
JOIN almoxarifado_saida_item
ON almoxarifado_saida_item.id = almoxarifado_saida_item_entrada_item.saida_item_id
JOIN almoxarifado_saida
ON almoxarifado_saida.id = almoxarifado_saida_item.saida_id
WHERE almoxarifado_saida_item_entrada_item.entrada_item_id = almoxarifado_entrada_item.id
AND almoxarifado_saida.finalizada = 1
AND almoxarifado_saida.centro_custo_id = " . request()->centro_custo_id . "
AND almoxarifado_saida.created_at <= saida.created_at
), 0)
)
FROM almoxarifado_entrada_item
JOIN almoxarifado_entrada
ON almoxarifado_entrada.id = almoxarifado_entrada_item.entrada_id
WHERE almoxarifado_entrada.finalizada = 1
AND almoxarifado_entrada.centro_custo_id = " . request()->centro_custo_id . "
AND almoxarifado_entrada_item.material_id = saida_item.material_id
AND almoxarifado_entrada.created_at <= saida.created_at
) as estoque
"))
->addSelect([
'quantidade' => function ($query) {
$query->select(DB::raw("CONCAT('- ', SUM(saida_item_entrada_item.quantidade_saida))"))
->from('almoxarifado_saida_item_entrada_item as saida_item_entrada_item')
->whereColumn('saida_item_entrada_item.saida_item_id', 'saida_item.id');
}
])
)
, 'sub')
->select(DB::raw("
DATE_FORMAT(sub.created_at, '%d/%m/%Y') as data,
sub.tipo,
sub.historico,
sub.quantidade,
sub.estoque
"))
->orderBy('sub.created_at')
->get();
$estoqueAnterior = DB::select("
SELECT COALESCE(SUM(
almoxarifado_entrada_item.quantidade
-
COALESCE((
SELECT SUM(almoxarifado_saida_item_entrada_item.quantidade_saida)
FROM almoxarifado_saida_item_entrada_item
JOIN almoxarifado_saida_item
ON almoxarifado_saida_item.id = almoxarifado_saida_item_entrada_item.saida_item_id
JOIN almoxarifado_saida
ON almoxarifado_saida.id = almoxarifado_saida_item.saida_id
WHERE almoxarifado_saida_item_entrada_item.entrada_item_id = almoxarifado_entrada_item.id
AND almoxarifado_saida.finalizada = 1
AND almoxarifado_saida.centro_custo_id = " . request()->centro_custo_id . "
AND almoxarifado_saida.created_at < '" . $periodo['start']->format('Y-m-d H:i:s') . "'
), 0)
), 0) as estoque
FROM almoxarifado_entrada_item
JOIN almoxarifado_entrada
ON almoxarifado_entrada.id = almoxarifado_entrada_item.entrada_id
WHERE almoxarifado_entrada.finalizada = 1
AND almoxarifado_entrada.centro_custo_id = " . request()->centro_custo_id . "
AND almoxarifado_entrada_item.material_id = " . request()->material_id . "
AND almoxarifado_entrada.created_at < '" . $periodo['start']->format('Y-m-d H:i:s') . "';
")[0]->estoque;
return [
'movimentacoes' => $movimentacoes,
'estoque_anterior' => $estoqueAnterior,
];
}
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'] = $params->unidade_id = $unidadesData['model'];
},
'infraestrutura' => function () use ($data, $params) {
$infraestruturasData = self::getInfraestruturasData($params);
$data->form['infraestruturas'] = $infraestruturasData['form'];
$data->model['infraestrutura_id'] = $params->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'] = $params->centro_custo_id = $centrosDeCustoData['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 = (object) request()->only([
'periodo',
'unidade_id',
'infraestrutura_id',
'centro_custo_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;
}
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']);
if ($unidades->count() === 1) {
$id = $unidades->first()->id;
}
}
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) => (object) ['id' => $i->id, 'nome' => $i->nome])
->sortBy('nome')
->values();
if ($infraestruturas->count() === 1) {
$id = $infraestruturas->first()->id;
}
}
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) => (object) ['id' => $cc->id, 'setor_nome' => $cc->setor->nome])
->sortBy('setor_nome')
->values();
if ($centrosCusto->count() === 1) {
$id = $centrosCusto->first()->id;
}
}
return ['form' => $centrosCusto, 'model' => $id];
}
private static function setWhereForFilterCentroCusto($query, $params)
{
$query->whereHas('almoxarifadoEntradas', fn ($q) => $q
->where('finalizada', true)
->whereBetween('created_at', $params->periodo)
->whereHas('itens', fn ($q) => $q
->whereHas('material', fn ($q) => $q
->whereIn('livro_registro_id', LivroPsicotropicoService::$livroRegistroIds)
)
)
)
->orWhereHas('almoxarifadoSaidas', fn ($q) => $q
->where('finalizada', true)
->whereBetween('created_at', $params->periodo)
->whereHas('itens', fn ($q) => $q
->whereHas('material', fn ($q) => $q
->whereIn('livro_registro_id', LivroPsicotropicoService::$livroRegistroIds)
)
)
);
}
public static function autocompleteMaterial()
{
$params = self::getParams();
$materiais = Material::whereIn('livro_registro_id', LivroPsicotropicoService::$livroRegistroIds)
->where(fn ($q) => $q
->whereHas('almoxarifadoEntradaItens', fn ($q) => $q
->whereHas('entrada', fn ($q) => $q
->where('finalizada', true)
->where('centro_custo_id', $params->centro_custo_id)
->whereBetween('created_at', $params->periodo)
)
)
->orWhereHas('almoxarifadoSaidaItens', fn ($q) => $q
->whereHas('saida', fn ($q) => $q
->where('finalizada', true)
->where('centro_custo_id', $params->centro_custo_id)
->whereBetween('created_at', $params->periodo)
)
)
)
->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['movimentacoes'];
$unidade = Unidade::find(request()->unidade_id);
$infraestrutura = Infraestrutura::find(request()->infraestrutura_id);
$centroCusto = CentroCusto::find(request()->centro_custo_id);
$material = Material::find(request()->material_id);
return [
'inicio' => request()->periodo['start'],
'fim' => request()->periodo['end'],
'unidade' => $unidade->nome_fantasia,
'infraestrutura' => $infraestrutura->nome,
'setor' => $centroCusto->setor->nome,
'material' => $material->descricao_completa,
'colunas' => collect(request()->selectedColumns),
'itens' => $itens,
'estoqueAnterior' => $resultado['estoque_anterior'],
];
}
}

View File

@@ -0,0 +1,310 @@
<?php
namespace App\Services\Farmacia;
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\Services\Cadastro\Material\MaterialService;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class RelatorioPacienteAtendidoService extends Service
{
public static function index()
{
$pacientes = collect();
$totalizadores = (object) ['dispensacoes' => 0];
DB::table('farmacia_receita_item_entrega')
->select([
'cadastro_paciente.id AS paciente_id',
DB::raw("LPAD(cadastro_paciente.prontuario, 7, '0') AS paciente_prontuario"),
'cadastro_cidadao.nome AS paciente_nome',
'farmacia_receita_item_entrega.dispensado_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'),
DB::raw(MaterialService::getDescricaoCompletaRaw(
'cadastro_material',
'cadastro_apresentacao',
'apresentacao_unidade_medida'
) . " AS material_descricao"),
'cadastro_grupo.nome AS grupo_nome',
'farmacia_receita_item_entrega.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')
->join('cadastro_material', 'cadastro_material.id', 'farmacia_receita_item.material_id')
->join('cadastro_apresentacao', 'cadastro_apresentacao.id', 'cadastro_material.apresentacao_id')
->join('cadastro_grupo', 'cadastro_grupo.id', 'cadastro_material.grupo_id')
->leftJoin(
'cadastro_unidade_medida as apresentacao_unidade_medida',
'apresentacao_unidade_medida.id',
'cadastro_material.apresentacao_unidade_medida_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('grupo_id'), function ($query) {
$query->where('cadastro_material.grupo_id', request()->get('grupo_id'));
})
->when(request()->get('material_id'), function ($query) {
$query->where('cadastro_material.id', request()->get('material_id'));
})
->get()
->each(function($query) use ($pacientes, $totalizadores) {
$paciente = $pacientes->where('paciente_id', $query->paciente_id)->first();
if (is_null($paciente)) {
$paciente = (object) [
'paciente_id' => $query->paciente_id,
'paciente_prontuario' => $query->paciente_prontuario,
'paciente_nome' => $query->paciente_nome,
'dispensacoes' => 0,
'entregas' => collect(),
];
$pacientes->push($paciente);
}
$entrega = (object) [
'data_dispensacao' => $query->data_dispensacao,
'unidade_nome_fantasia' => $query->unidade_nome_fantasia,
'infraestrutura_nome' => $query->infraestrutura_nome,
'material_descricao' => $query->material_descricao,
'grupo_nome' => $query->grupo_nome,
'quantidade' => $query->quantidade,
];
$paciente->entregas->push($entrega);
$paciente->dispensacoes++;
$totalizadores->dispensacoes++;
});
return compact('pacientes', '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 'grupos':
return self::getGrupos(request()->get('start_date'), request()->get('end_date'), request()->get('infraestrutura_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"),
])
->when(request()->get('grupo_id'), function ($query) {
$query->where('cadastro_material.grupo_id', request()->get('grupo_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'));
})
->whereColumn('farmacia_receita_item.material_id', 'cadastro_material.id');
});
}
public static function getPrintData()
{
$data = self::index();
$data['pacientes']->each(function ($paciente) {
$paciente->entregas->each(function ($entrega) {
$entrega->data_dispensacao = (new Carbon($entrega->data_dispensacao))->format('d/m/Y');
});
});
$unidade = Unidade::find(request()->get('unidade_id'));
$infraestrutura = Infraestrutura::find(request()->get('infraestrutura_id'));
$grupo = Grupo::find(request()->get('grupo_id'));
$material = Material::find(request()->get('material_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',
'grupo_nome' => $grupo->nome ?? 'Todos',
'material_descricao' => $material->descricao_completa ?? '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' => [],
'grupos' => [],
];
}
private static function getModel()
{
return [
'periodo' => [
'start' => null,
'end' => null,
],
'unidade_id' => null,
'infraestrutura_id' => null,
'grupo_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_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 getGrupos($startDate, $endDate, $infraestruturaId)
{
return DB::table('cadastro_grupo')
->select([
'cadastro_grupo.id',
'cadastro_grupo.nome',
])
->whereExists(function ($query) use ($startDate, $endDate, $infraestruturaId) {
$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_material', 'cadastro_material.id', 'farmacia_receita_item.material_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)
->where('cadastro_centro_custo.infraestrutura_id', $infraestruturaId)
->whereColumn('cadastro_material.grupo_id', 'cadastro_grupo.id');
})
->orderBy('cadastro_grupo.nome')
->get();
}
}

View File

@@ -0,0 +1,462 @@
<?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\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 RelatorioQuantitativoDispensacaoService 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)
];
$materiais = DB::table('cadastro_material as material')
->join(
'cadastro_apresentacao as apresentacao',
'apresentacao.id',
'material.apresentacao_id'
)
->join(
'cadastro_grupo as grupo',
'grupo.id',
'material.grupo_id'
)
->leftJoin(
'cadastro_subgrupo as subgrupo',
'subgrupo.id',
'material.subgrupo_id'
)
->leftJoin(
'cadastro_unidade_medida as apresentacao_unidade_medida',
'apresentacao_unidade_medida.id',
'material.apresentacao_unidade_medida_id'
)
->when(request()->material_id, fn ($q, $id) => $q->where('material.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))
->whereExists(function ($query) use ($periodo) {
$query->select(DB::raw(1))
->from('farmacia_receita_item_entrega as entrega')
->join(
'farmacia_receita_item as item',
'item.id',
'entrega.receita_item_id'
)
->join(
'cadastro_centro_custo',
'cadastro_centro_custo.id',
'entrega.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'
)
->whereColumn('item.material_id', 'material.id')
->where('entrega.pendente', false)
->where('entrega.estornado', false)
->when(request()->unidade_id, fn ($q, $unidade_id) => $q->where('cadastro_unidade.id', $unidade_id))
->whereBetween('entrega.dispensado_em', $periodo);
})
->select(DB::raw("
" . MaterialService::getDescricaoCompletaRaw(
'material',
'apresentacao',
'apresentacao_unidade_medida'
) . " as material,
subgrupo.nome as subgrupo,
grupo.nome as grupo
"))
->addSelect([
'quantidade' => function ($query) use ($periodo) {
$query->select(DB::raw("SUM(entrega.quantidade)"))
->from('farmacia_receita_item_entrega as entrega')
->join(
'farmacia_receita_item as item',
'item.id',
'entrega.receita_item_id'
)
->join(
'cadastro_centro_custo',
'cadastro_centro_custo.id',
'entrega.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'
)
->whereColumn('item.material_id', 'material.id')
->where('entrega.pendente', false)
->where('entrega.estornado', false)
->when(request()->unidade_id, fn ($q, $unidade_id) => $q->where('cadastro_unidade.id', $unidade_id))
->whereBetween('entrega.created_at', $periodo);
}
]);
self::setOrderBy($materiais);
$materiais = $materiais->get();
$materiais->each(function ($material) use ($totalizadores) {
$totalizadores->quantidade += $material->quantidade;
});
return compact('materiais', 'totalizadores');
}
private static function setOrderBy($builder)
{
$columns = [
'material' => 'material',
'grupo' => 'grupo.nome',
'subgrupo' => 'subgrupo.nome',
'quantidade' => 'quantidade',
];
if (is_null(request()->sort_by) || !isset($columns[request()->sort_by])) {
$builder->orderBy('grupo.nome')
->orderBy('subgrupo.nome')
->orderBy('material');
return;
}
$column = $columns[request()->sort_by];
$direction = DataUtil::getBooleanValueFromStringBoolean(request()->sort_desc) ? 'DESC' : 'ASC';
$builder->orderBy($column, $direction);
foreach ($columns as $key => $col) {
if ($key !== request()->sort_by) {
$builder->orderBy($col);
}
}
}
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'] = $params->unidade_id = $unidadesData['model'];
},
'infraestrutura' => function () use ($data, $params) {
$infraestruturasData = self::getInfraestruturasData($params);
$data->form['infraestruturas'] = $infraestruturasData['form'];
$data->model['infraestrutura_id'] = $params->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'] = $params->centro_custo_id = $centrosDeCustoData['model'];
},
'grupo' => function () use ($data, $params) {
$gruposData = self::getGruposData($params);
$data->form['grupos'] = $gruposData['form'];
$data->model['grupo_id'] = $params->grupo_id = $gruposData['model'];
},
'subgrupo' => function () use ($data, $params) {
$subgruposData = self::getSubgruposData($params);
$data->form['subgrupos'] = $subgruposData['form'];
$data->model['subgrupo_id'] = $params->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 = (object) request()->only([
'periodo',
'unidade_id',
'infraestrutura_id',
'centro_custo_id',
'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;
}
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 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)
)
);
}
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['materiais'];
$unidade = Unidade::find(request()->unidade_id);
$infraestrutura = Infraestrutura::find(request()->infraestrutura_id);
$centroCusto = CentroCusto::find(request()->centro_custo_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',
'grupo' => $grupo->nome ?? 'Todos',
'subgrupo' => $subgrupo->nome ?? 'Todos',
'material' => $material->descricao_completa ?? 'Todos',
'colunas' => collect(request()->selectedColumns),
'itens' => $itens,
'totalizadores' => $resultado['totalizadores'],
];
}
}

View File

@@ -0,0 +1,205 @@
<?php
namespace App\Services\Farmacia;
use App\Models\Cadastro\Estabelecimento\Infraestrutura;
use App\Models\Cadastro\Estabelecimento\Unidade;
use App\Models\Cadastro\SujeitoAtencao\Usuario;
use App\Models\Farmacia\Supervisor;
use App\Services\Service;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class SupervisorService extends Service
{
public static function datatable()
{
return DB::table('farmacia_supervisor as supervisor')
->join(
'cadastro_infraestrutura as infraestrutura',
'infraestrutura.id',
'supervisor.infraestrutura_id'
)
->join(
'cadastro_unidade as unidade',
'unidade.id',
'infraestrutura.unidade_id'
)
->join(
'cadastro_usuario as usuario',
'usuario.id',
'supervisor.usuario_id'
)
->join(
'cadastro_cidadao as cidadao',
'cidadao.id',
'usuario.cidadao_id'
)
->select(
'supervisor.id',
DB::raw('unidade.nome_fantasia as unidade'),
DB::raw('COALESCE(infraestrutura.nome, unidade.nome_fantasia) as infraestrutura'),
DB::raw('cidadao.nome as usuario'),
);
}
public static function isSupervisor($usuarioId)
{
return Supervisor::where('usuario_id', $usuarioId)
->where('infraestrutura_id', self::getCurrentCentroCusto()->infraestrutura_id)
->exists();
}
public static function isUsuarioLogadoSupervisor()
{
$lotacaoLogada = self::getCurrentLotacao();
return Supervisor::where('infraestrutura_id', $lotacaoLogada->infraestrutura_id)
->where('usuario_id', $lotacaoLogada->usuario_id)
->exists();
}
public static function create()
{
return [
'form' => [
'unidades' => self::getUnidades(),
'infraestruturas' => [],
'usuarios' => [],
],
'model' => [
'unidade_id' => null,
'infraestrutura_id' => null,
'usuario_id' => null,
]
];
}
public static function edit($id)
{
$supervisor = Supervisor::findOrFail($id);
$params = (object) [
'unidade_id' => $supervisor->infraestrutura->unidade_id,
'infraestrutura_id' => $supervisor->infraestrutura_id
];
return [
'form' => [
'unidades' => self::getUnidades($supervisor->infraestrutura->unidade_id),
'infraestruturas' => self::getInfraestruturas($params, $supervisor->infraestrutura_id),
'usuarios' => self::getUsuarios($params),
],
'model' => [
'unidade_id' => $supervisor->infraestrutura->unidade_id,
'infraestrutura_id' => $supervisor->infraestrutura_id,
'usuario_id' => $supervisor->usuario_id,
]
];
}
public static function list()
{
$params = (object) request()->all();
switch (request()->listar) {
case 'infraestruturas': {
return self::getInfraestruturas($params);
}
case 'usuarios': {
return self::getUsuarios($params);
}
}
}
private static function getUnidades($unidadeId = null)
{
return Unidade::where(fn ($q) => $q
->when($unidadeId, fn ($q, $id) => $q->where('id', $id))
->orWhereHas('infraestruturas', fn ($q) => $q
->whereHas('lotacoes')
)
)
->orderBy('nome_fantasia')
->get(['id', 'nome_fantasia']);
}
private static function getInfraestruturas($params, $infraestruturaId = null)
{
return Infraestrutura::setEagerLoads([])
->where('unidade_id', $params->unidade_id)
->where(fn ($q) => $q
->when($infraestruturaId, fn ($q, $id) => $q->where('id', $id))
)
->whereHas('lotacoes')
->get(['id', 'unidade_id', 'nome', 'principal'])
->map(fn ($infraestrutura) => [
'id' => $infraestrutura->id,
'nome' => $infraestrutura->nome
])
->sortBy('nome')
->values();
}
private static function getUsuarios($params)
{
return Usuario::setEagerLoads([])
->whereHas('lotacoes', fn ($q) => $q
->where('infraestrutura_id', $params->infraestrutura_id)
)
->get(['id', 'cidadao_id'])
->map(fn ($usuario) => [
'id' => $usuario->id,
'nome' => $usuario->cidadao()->setEagerLoads([])->first('nome')->nome,
])
->sortBy('nome')
->values();
}
public static function store()
{
self::validate();
return Supervisor::create(request()->all())->fresh();
}
public static function update($id)
{
self::validate();
return (tap(Supervisor::findOrFail($id))->update(request()->all()))->fresh();
}
public static function validate()
{
$rules = [
'infraestrutura_id' => [
'required',
'integer',
Rule::exists(Infraestrutura::class, 'id'),
],
'usuario_id' => [
'required',
'integer',
Rule::exists(Usuario::class, 'id'),
Rule::unique(Supervisor::class, 'usuario_id')
->where('infraestrutura_id', request()->infraestrutura_id)
->ignore(request()->route('supervisor'))
],
];
$messages = [
'usuario_id.unique' => 'O local de atendimento e o profissional já foram inseridos anteriormente.',
];
request()->validate($rules, $messages);
}
public static function destroy($id)
{
Supervisor::findOrFail($id)->delete();
}
}