join( 'cadastro_lotacao AS lotacao', 'lotacao.id', 'internacao.created_lotacao_id' ) ->join( 'cadastro_paciente AS paciente', 'paciente.id', 'internacao.paciente_id' ) ->join( 'cadastro_cidadao AS cidadao', 'cidadao.id', 'paciente.cidadao_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( 'intranet.cadastro_municipio AS municipio', 'municipio.id', 'logradouro.municipio_id' ) ->join( 'pronto_atendimento_aih_internacao_procedimento AS procedimento', 'procedimento.internacao_id', 'internacao.id' ) ->leftJoin( 'pronto_atendimento_faa AS faa', 'faa.id', 'internacao.faa_id' ) ->whereNull('internacao.deleted_at') ->where('lotacao.infraestrutura_id', self::getCurrentLotacao()->infraestrutura_id) ->select( 'internacao.id', 'procedimento.data_solicitacao', 'internacao.faa_id', 'faa.numero AS faa_numero', 'cidadao.nome AS paciente_nome', 'cidadao.nome_social AS paciente_nome_social', 'cidadao.preferencia_nome_id as paciente_preferencia_nome_id', 'cidadao.data_nascimento AS paciente_data_nascimento', 'cidadao.nome_mae AS paciente_nome_mae', 'cidadao.caracteristicas_fisicas AS paciente_caracteristicas_fisicas', 'paciente.prontuario AS paciente_prontuario', 'paciente.sequencial_desconhecido_em AS paciente_sequencial_desconhecido_em', 'municipio.nome AS municipio', ); return datatables() ->of($builder) ->setRowData([ 'paciente_prefere_nome_social' => function ($data) { return $data->paciente_preferencia_nome_id === PreferenciaNome::NOME_SOCIAL; }, 'paciente_is_desconhecido' => function ($data) { return !is_null($data->paciente_sequencial_desconhecido_em); } ]) ->editColumn('paciente_data_nascimento', function ($data) { return is_null($data->paciente_data_nascimento) ? 'Não informada' : (new Carbon($data->paciente_data_nascimento))->format('d/m/Y'); }) ->editColumn('paciente_nome_mae', function ($data) { return $data->paciente_nome_mae ?? 'Não informado'; }) ->editColumn('paciente_caracteristicas_fisicas', function ($data) { return $data->paciente_caracteristicas_fisicas ?? 'Não informado'; }) ->removeColumn([ 'paciente_preferencia_nome_id', 'paciente_sequencial_desconhecido_em' ]) ->addColumn('impressoes', self::getImpressoes()) ->filterColumn('procedimento.data_solicitacao', function ($query, $keyword) { $query ->whereRaw("DATE_FORMAT(procedimento.data_solicitacao, '%d/%m/%Y') like ?", ["%{$keyword}%"]) ->orWhereRaw( "CONCAT( SUBSTR(procedimento.data_solicitacao,9,2), SUBSTR(procedimento.data_solicitacao,6,2), SUBSTR(procedimento.data_solicitacao,1,4) ) like ?", ["%{$keyword}%"] ); }); } public static function index() { return Internacao::where(self::getWhereFromQueryString(['paciente_id', 'finalizada']))->get(); } public static function create($pacienteId = null) { $internacao = new Internacao; $internacao->paciente_id = $pacienteId; return [ 'form' => self::getFormData($internacao->paciente), 'model' => self::getModelData($internacao), 'additionals' => self::getAdditionalsData() ]; } public static function list() { $lotacao = self::getCurrentLotacao(); $permissaoUsuario = ParametrizacaoPermissaoUsuario::where('usuario_id', $lotacao->usuario_id) ->where('infraestrutura_id', $lotacao->infraestrutura_id) ->first(); $countUsuario = ParametrizacaoPermissaoUsuario::count(); $classificacoes = $permissaoUsuario ? PacienteClassificacao::orderBy('descricao') ->get() ->filter(function ($classificacao) use ($permissaoUsuario) { $exibe = false; switch ($classificacao->id) { case Classificacao::MUNICIPE: $exibe = $permissaoUsuario->municipe; break; case Classificacao::PROVISORIO: $exibe = $permissaoUsuario->provisorio; break; case Classificacao::OUTRO_MUNICIPIO: $exibe = $permissaoUsuario->outro_municipio; break; } return $exibe ? [ 'id' => $classificacao->id, 'descricao' => $classificacao->descricao ] : null; }) ->values() : []; return [ 'classificacoes' => $classificacoes, 'is_permissao_cadastro' => $countUsuario === 0 ? true : false, ]; } public static function store() { AihValidator::validateSave(); $internacao = new Internacao(); DB::transaction(function () use ($internacao) { $params = self::getParams(); self::save($internacao, $params); }); $internacao->impressoes = self::getImpressoes(); return $internacao; } private static function getImpressoes() { return [ [ 'value' => 'laudo', 'text' => 'Laudo', 'disabled' => false, ], [ 'value' => 'termoResponsabilidade', 'text' => 'Termo de responsabilidade', 'disabled' => false, ] ]; } public static function edit($id) { $internacao = Internacao::findOrFail($id); return [ 'form' => self::getFormData($internacao->paciente), 'model' => self::getModelData($internacao), 'additionals' => self::getAdditionalsData() ]; } private static function getFormData($paciente = null) { $identificacao = null; $faas = []; if ($paciente) { $identificacao = [ 'nome_paciente' => $paciente->cidadao->nome, 'nome_mae' => $paciente->cidadao->nome_mae ?? '', 'data_nascimento' => $paciente && $paciente->cidadao->data_nascimento ? $paciente->cidadao->data_nascimento->format('d/m/Y') : null, 'cpf' => $paciente && $paciente->cidadao->cpf ? MaskUtil::getCpfMasked($paciente->cidadao->cpf) : '', 'cns' => $paciente && $paciente->cidadao->cns ? MaskUtil::getCnsMasked($paciente->cidadao->cns) : '', 'idade' => [ 'anos' => $paciente->cidadao->idade['anos'] ?? 'Não informada', 'meses' => $paciente->cidadao->idade['meses'] ?? 'Não informada', 'dias' => $paciente->cidadao->idade['dias'] ?? 'Não informada', ], 'sexo' => [ 'id' => $paciente->cidadao->sexo->id, 'descricao' => $paciente->cidadao->sexo->descricao, ], 'nome_social' => $paciente->cidadao->nome_social, 'preferencia_nome_id' => $paciente->cidadao->preferencia_nome_id ?? null, ]; $faas = Faa::where('paciente_id', $paciente->id) ->orderByDesc('id') ->take(5) ->get() ->map(fn ($faa) => [ 'id' => $faa->id, 'data' => (new Carbon($faa->atendimentos->first()->recepcao->atendido_em))->format('d/m/Y') ]); } return [ 'paciente' => [ 'identificacao' => $identificacao, 'desconhecido' => [ 'sexos' => Sexo::orderBy('descricao')->get(['id', 'descricao']) ] ], 'unidades' => Unidade::orderBy('nome_fantasia')->get(['id', 'nome_fantasia']), 'unidade_internacao' => self::getCurrentCentroCusto()->infraestrutura->unidade->nome_fantasia, 'faas' => $faas, 'procedimento' => [ 'clinicas' => Clinica::orderBy('nome')->get(['id', 'nome']), 'caraters_internacao' => CaraterInternacao::orderBy('nome')->get(['id', 'nome']), 'documentos' => DocumentoTipo::orderBy('nome')->whereIn('id', [ DocumentoTipoEnum::CPF, DocumentoTipoEnum::CNS ])->get(['id', 'nome']), ], 'causa_externa' => [ 'causas_externas' => CausaExterna::orderBy('nome')->get(['id', 'nome']) ->prepend(['id' => null, 'nome' => 'NÃO INFORMADO']), 'vinculos_previdencia' => VinculoPrevidencia::orderBy('nome')->get(['id', 'nome']) ->prepend(['id' => null, 'nome' => 'NÃO INFORMADO']), ], 'autorizacao' => [ 'documentos' => DocumentoTipo::orderBy('nome')->whereIn('id', [ DocumentoTipoEnum::CPF, DocumentoTipoEnum::CNS ])->get(['id', 'nome']), ] ]; } private static function getModelData($internacao) { return [ 'id' => $internacao->id, 'paciente' => [ 'sexo_id' => null, 'caracteristicas_fisicas' => '' ], 'paciente_id' => $internacao->paciente_id, 'unidade_solicitante_id' => $internacao->unidade_solicitante_id, 'cid_principal' => $internacao->cidPrincipal, 'cid_secundario' => $internacao->cidSecundario, 'cid_causas_associadas' => $internacao->cidCausasAssociadas, 'faa_id' => $internacao->faa_id, 'principais_sinais_sintomas_clinicos' => $internacao->principais_sinais_sintomas_clinicos ?? '', 'condicoes_que_justificam_internacao' => $internacao->condicoes_que_justificam_internacao ?? '', 'principais_resultados_de_provas_diagnosticas' => $internacao->principais_resultados_de_provas_diagnosticas ?? '', 'procedimento' => [ 'procedimento_solicitado' => $internacao->procedimento->procedimentoSolicitado ?? null, 'data_solicitacao' => $internacao->procedimento && $internacao->procedimento->data_solicitacao ? (new Carbon($internacao->procedimento->data_solicitacao))->format('d/m/Y') : null, 'clinica_id' => $internacao->procedimento->clinica_id ?? null, 'carater_internacao_id' => $internacao->procedimento->carater_internacao_id ?? null, 'profissional_solicitante_assistente' => $internacao->procedimento ? [ 'id' => $internacao->procedimento->profissionalSolicitanteAssistente->id, 'cidadao_nome' => $internacao->procedimento->profissionalSolicitanteAssistente->cidadao->nome, 'cidadao_cns' => $internacao->procedimento->profissionalSolicitanteAssistente->cidadao->cns, 'cidadao_cpf' => $internacao->procedimento->profissionalSolicitanteAssistente->cidadao->cpf, ] : null, 'documento_tipo_id' => $internacao->procedimento->documento_tipo_id ?? null, 'documento_numero' => $internacao->procedimento->documento_numero ?? '', ], 'causa_externa' => [ 'causa_externa_id' => $internacao->causaExterna->causa_externa_id ?? null, 'cnpj_seguradora' => $internacao->causaExterna && $internacao->causaExterna->cnpj_seguradora ? MaskUtil::getCnpjMasked($internacao->causaExterna->cnpj_seguradora) : '', 'numero_bilhete' => $internacao->causaExterna->numero_bilhete ?? '', 'serie' => $internacao->causaExterna->serie ?? '', 'cnpj_empresa' => $internacao->causaExterna && $internacao->causaExterna->cnpj_empresa ? MaskUtil::getCnpjMasked($internacao->causaExterna->cnpj_empresa) : '', 'cnae_empresa' => $internacao->causaExterna->cnae_empresa ?? '', 'cbor' => $internacao->causaExterna->cbor ?? '', 'vinculo_previdencia_id' => $internacao->causaExterna->vinculo_previdencia_id ?? null ], 'autorizacao' => [ 'profissional_autorizador' => $internacao->autorizacao ? [ 'id' => $internacao->autorizacao->profissionalAutorizador->id, 'cidadao_nome' => $internacao->autorizacao->profissionalAutorizador->cidadao->nome, 'cidadao_cns' => $internacao->autorizacao->profissionalAutorizador->cidadao->cns, 'cidadao_cpf' => $internacao->autorizacao->profissionalAutorizador->cidadao->cpf, ] : null, 'documento_tipo_id' => $internacao->autorizacao->documento_tipo_id ?? null, 'documento_numero' => $internacao->autorizacao->documento_numero ?? '', 'data_autorizacao' => $internacao->autorizacao && $internacao->autorizacao->data_autorizacao ? (new Carbon($internacao->autorizacao->data_autorizacao))->format('d/m/Y') : null, 'codigo_orgao_emissor' => $internacao->autorizacao->codigo_orgao_emissor ?? '' ], 'finalizada' => $internacao->finalizada ?? false ]; } private static function getAdditionalsData() { return [ 'data_atual' => Carbon::now()->format('d/m/Y'), 'termos_invalidos' => TermoInvalido::pluck('descricao'), ]; } public static function update($id) { AihValidator::validateSave(); $internacao = Internacao::findOrFail($id); DB::transaction(function () use ($internacao) { $params = self::getParams(); self::save($internacao, $params); }); return $internacao; } private static function getParams() { $params = request()->except(['procedimento', 'causa_externa', 'autorizacao']); $params['paciente'] = isset($params['paciente_id']) ? null : self::getParamsPaciente(); $params['unidade_internacao_id'] = self::getCurrentCentroCusto()->infraestrutura->unidade_id; $params['procedimento'] = self::getParamsProcedimento(); $params['causa_externa'] = self::getParamsCausaExterna(); $params['autorizacao'] = self::getParamsAutorizacao(); return $params; } private static function getParamsPaciente() { return request()->get('paciente'); } private static function getParamsProcedimento() { $params = request()->get('procedimento'); if (!DataUtil::hasData($params)) { return null; } if (isset($params['data_solicitacao'])) { $params['data_solicitacao'] = Carbon::createFromFormat('d/m/Y', $params['data_solicitacao']); } return $params; } private static function getParamsCausaExterna() { $params = request()->get('causa_externa'); if (!DataUtil::hasData($params)) { return null; } return $params; } private static function getParamsAutorizacao() { $params = request()->get('autorizacao'); if (!DataUtil::hasData($params) || !isset($params['profissional_autorizador_id'])) { return null; } if (isset($params['data_autorizacao'])) { $params['data_autorizacao'] = Carbon::createFromFormat('d/m/Y', $params['data_autorizacao']); } return $params; } private static function save($internacao, $params) { $internacao->fill($params); self::savePaciente($internacao, $params['paciente']); $internacao->save(); self::saveChild($internacao, 'procedimento', $params['procedimento']); self::saveChild($internacao, 'causaExterna', $params['causa_externa']); self::saveChild($internacao, 'autorizacao', $params['autorizacao']); } private static function savePaciente($internacao, $params) { if (is_null($params)) { return; } $internacao->paciente_id = (new PacienteDesconhecidoSaveService( Carbon::now()->format('Y-m-d H:i:s'), $params['sexo_id'], $params['caracteristicas_fisicas'] ))->save()->id; } private static function saveChild($internacao, $relationName, $params) { if (is_null($params)) { if ($internacao->{$relationName}) { $internacao->{$relationName}->delete(); } } else { $internacao->{$relationName}()->updateOrCreate(['internacao_id' => $internacao->id], $params); } } }