This commit is contained in:
239
api/app/Services/Almoxarifado/DispensacaoService.php
Normal file
239
api/app/Services/Almoxarifado/DispensacaoService.php
Normal file
@@ -0,0 +1,239 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Almoxarifado;
|
||||
|
||||
use App\Models\Almoxarifado\Dispensacao;
|
||||
use App\Models\Almoxarifado\DispensacaoItem;
|
||||
use App\Models\Cadastro\SujeitoAtencao\Paciente;
|
||||
use App\Models\Intranet\Cliente;
|
||||
use App\Services\Service;
|
||||
use App\Utils\MaskUtil;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class DispensacaoService extends Service
|
||||
{
|
||||
public static function create($pacienteId)
|
||||
{
|
||||
$receita = new Dispensacao();
|
||||
$receita->fill(array_fill_keys($receita->getFillable(), null));
|
||||
$item = new DispensacaoItem();
|
||||
$item->fill(array_fill_keys($item->getFillable(), null));
|
||||
$item->id = null;
|
||||
$item->entregue = null;
|
||||
$item->continuo = false;
|
||||
$item->estoque = 0;
|
||||
$item->escolheu_entrada_item_manualmente = false;
|
||||
$item->entrada_itens = [];
|
||||
$item->possui_entrada_com_lote = false;
|
||||
$item->supervisor_id = null;
|
||||
$paciente = self::getPaciente($pacienteId);
|
||||
$currentLotacao = self::getCurrentLotacao();
|
||||
$cliente = Cliente::where('link', app('config')->get('database.default'))->firstOrFail();
|
||||
return [
|
||||
'form' => [
|
||||
'data_atual' => Carbon::now()->format('d/m/Y'),
|
||||
'centro_custo_id' => self::getCurrentCentroCusto()->id,
|
||||
'paciente' => $paciente,
|
||||
'historico' => self::getHistorico($pacienteId),
|
||||
'cliente' => [
|
||||
'sistema' => [
|
||||
'ramo_atividade' => [
|
||||
'nome' => $cliente->sistema->ramoAtividade->nome ?? null,
|
||||
],
|
||||
'nome' => $cliente->sistema->nome ?? null,
|
||||
'versao' => $cliente->sistema->versao ?? null,
|
||||
],
|
||||
'municipio' => [
|
||||
'estado' => [
|
||||
'uf' => $cliente->municipio->estado->uf ?? null,
|
||||
],
|
||||
'nome' => $cliente->municipio->nome ?? null,
|
||||
],
|
||||
'nome' => $cliente->nome ?? null,
|
||||
'email' => $cliente->email ?? null,
|
||||
'site' => $cliente->site ?? null,
|
||||
'logotipo' => $cliente->logotipo ?? null,
|
||||
],
|
||||
'usuario' => $currentLotacao->usuario->cidadao->nome,
|
||||
'unidade' => $currentLotacao->infraestrutura->unidade->nome_fantasia,
|
||||
'telefone' => MaskUtil::getPhoneMasked($currentLotacao->infraestrutura->telefone)
|
||||
],
|
||||
'model' => [
|
||||
'medico_solicitante' => null,
|
||||
'item' => $item->toArray(),
|
||||
'items' => [],
|
||||
'paciente' => [
|
||||
'id' => $paciente->id,
|
||||
'observacao' => $paciente->observacao,
|
||||
'save' => null,
|
||||
],
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
public static function getHistorico($id)
|
||||
{
|
||||
$dispensacoes = Dispensacao::where('paciente_id', $id)
|
||||
->select(
|
||||
'*',
|
||||
DB::raw('almoxarifado_dispensacao.id AS id')
|
||||
)
|
||||
->join('cadastro_lotacao', 'cadastro_lotacao.id', 'almoxarifado_dispensacao.created_lotacao_id')
|
||||
->join('cadastro_infraestrutura', 'cadastro_infraestrutura.id', 'cadastro_lotacao.infraestrutura_id')
|
||||
->join('cadastro_unidade', 'cadastro_unidade.id', 'cadastro_infraestrutura.unidade_id')
|
||||
->when(!request()->complete, fn($q) => $q->whereHas('itens', fn($q) => $q->where('dispensado_em', '>=', Carbon::now()->subMonth(6)->startOfDay())))
|
||||
->orderByDesc('data_dispensacao')
|
||||
->get();
|
||||
|
||||
return $dispensacoes->map(function($dispensacao) {
|
||||
return [
|
||||
'id' => $dispensacao->id,
|
||||
'data_dispensacao' => Carbon::parse($dispensacao->data_dispensacao)->format('d/m/Y'),
|
||||
'nome_fantasia' => $dispensacao->nome_fantasia,
|
||||
'infraestrutura' => $dispensacao->nome,
|
||||
'medico_solicitante' => $dispensacao->usuario->nome,
|
||||
'observacao' => $dispensacao->observacao,
|
||||
'items' => self::getHistoricoItems($dispensacao->id),
|
||||
];
|
||||
})->values()->all();
|
||||
}
|
||||
|
||||
private static function getHistoricoItems($id)
|
||||
{
|
||||
return DispensacaoItem::where('dispensacao_id', $id)->get()->map(function($item) {
|
||||
return [
|
||||
'id' => $item->id,
|
||||
'material' => [
|
||||
'descricao' => $item->material->descricao
|
||||
],
|
||||
'dispensado_em' => Carbon::parse($item->dispensado_em)->format('d/m/Y'),
|
||||
'usuario_nome' => $item->dispensacao->usuario->nome,
|
||||
'estornado' => $item->estornado,
|
||||
'estorno_salvo' => $item->estornado
|
||||
];
|
||||
})->values()->all();
|
||||
}
|
||||
|
||||
private static function getPaciente($id)
|
||||
{
|
||||
return Paciente::with('unidade')->findOrFail($id);
|
||||
}
|
||||
|
||||
public static function store()
|
||||
{
|
||||
self::validate();
|
||||
$dispensacao = null;
|
||||
DB::transaction(function() use(&$dispensacao) {
|
||||
$params = request()->all();
|
||||
if(count($params['items']) > 0) {
|
||||
$params['items'] = collect($params['items']);
|
||||
$dispensacao = Dispensacao::create($params)->fresh();
|
||||
$dispensacaoItems = collect();
|
||||
$params['items']->each(function($item) use($dispensacao, &$dispensacaoItems) {
|
||||
$item['dispensacao_id'] = $dispensacao->id;
|
||||
$now = Carbon::now();
|
||||
$dispensadoEm = new Carbon($item['dispensado_em']);
|
||||
$dispensadoEm->setTime($now->hour, $now->minute, $now->second);
|
||||
$item['dispensado_em'] = $dispensadoEm;
|
||||
$dispensacaoItem = DispensacaoItem::create($item)->fresh();
|
||||
$dispensacaoItems[] = [
|
||||
'dispensacao_item_id' => $dispensacaoItem->id,
|
||||
'material_id' => $dispensacaoItem->material_id,
|
||||
'quantidade' => $dispensacaoItem->quantidade,
|
||||
'escolheu_entrada_item_manualmente' => false,
|
||||
];
|
||||
});
|
||||
$saidaItens = AlmoxarifadoService::saveSaidaDeDispensacaoDoAlmoxarifado($dispensacaoItems);
|
||||
$saidaItens->each(function($data) {
|
||||
DispensacaoItem::findOrFail($data['dispensacao_item_id'])
|
||||
->update(['saida_item_id' => $data['saida_item_id']]);
|
||||
});
|
||||
}
|
||||
if(count($params['estornados']) > 0) {
|
||||
self::estornar($params['estornados']);
|
||||
}
|
||||
});
|
||||
return $dispensacao;
|
||||
}
|
||||
|
||||
private static function estornar($estornados)
|
||||
{
|
||||
foreach($estornados as $id) {
|
||||
$item = DispensacaoItem::findOrFail($id);
|
||||
AlmoxarifadoService::estornarSaidaItens(collect([['id' => $item->saida_item_id]]));
|
||||
$item->update(['estornado' => true]);
|
||||
}
|
||||
}
|
||||
|
||||
public static function print($id)
|
||||
{
|
||||
$dispensacao = Dispensacao::find($id);
|
||||
return [
|
||||
'nome_medico_solicitante' => $dispensacao->usuario->nome,
|
||||
'itens' => $dispensacao->itens->map(function($item) {
|
||||
return [
|
||||
'material' => [
|
||||
'descricao_completa' => $item->material->descricao
|
||||
],
|
||||
'quantidade' => $item->quantidade
|
||||
];
|
||||
}),
|
||||
'dispensado_em' => $dispensacao->data_dispensacao
|
||||
];
|
||||
}
|
||||
|
||||
private static function validate()
|
||||
{
|
||||
$params = request()->all();
|
||||
|
||||
$rules = [
|
||||
'usuario_id' => [
|
||||
'nullable',
|
||||
'integer',
|
||||
Rule::requiredIf(fn() => count($params['items']))
|
||||
],
|
||||
'data_dispensacao' => [
|
||||
'nullable',
|
||||
'date_format:Y-m-d',
|
||||
'before_or_equal:now',
|
||||
Rule::requiredIf(fn() => count($params['items']))
|
||||
],
|
||||
'observacao' => [
|
||||
'nullable',
|
||||
'string',
|
||||
'between:3,300'
|
||||
],
|
||||
'items' => [
|
||||
'nullable',
|
||||
'array'
|
||||
],
|
||||
'items.*.dispensacao_id' => [
|
||||
'nullable',
|
||||
'integer',
|
||||
],
|
||||
'items.*.material_id' => [
|
||||
'required',
|
||||
'integer'
|
||||
],
|
||||
'dispensado_em' => [
|
||||
'nullable',
|
||||
'date_format:Y-m-d H:i',
|
||||
'before_or_equal:now',
|
||||
],
|
||||
'items.*.quantidade' => [
|
||||
'nullable',
|
||||
'numeric',
|
||||
'min:0.01',
|
||||
],
|
||||
'items.*.observacao' => [
|
||||
'nullable',
|
||||
'string',
|
||||
'between:3,300'
|
||||
],
|
||||
];
|
||||
$messages = [];
|
||||
request()->validate($rules, $messages);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user